1- import { msg , warn } from '@ solid-devtools/shared/utils '
1+ import * as s from 'solid-js '
22import { scheduleIdle , throttle } from '@solid-primitives/scheduled'
3- import { type Accessor , createEffect , createMemo , onCleanup } from 'solid-js '
3+ import { msg , warn } from '@ solid-devtools/shared/utils '
44import { ObjectType , getObjectById } from '../main/id.ts'
55import { addSolidUpdateListener } from '../main/observe.ts'
6- import { type InspectedState , type Mapped , type OutputEmit , type Solid , type ValueItemID } from '../main/types.ts'
6+ import { type InspectedState , type Mapped , type NodeID , type OutputEmit , type Solid , type ValueItemID } from '../main/types.ts'
77import { onOwnerDispose } from '../main/utils.ts'
8+ import setup from '../main/setup.ts'
9+ import { UNOWNED_ROOT } from '../main/roots.ts'
810import { type ObservedPropsMap , ValueNodeMap , clearOwnerObservers , collectOwnerDetails } from './inspector.ts'
911import { encodeValue } from './serialize.ts'
1012import { type StoreNodeProperty , type StoreUpdateData , observeStoreNode , setOnStoreNodeUpdate } from './store.ts'
@@ -18,8 +20,8 @@ export type ToggleInspectedValueData = {id: ValueItemID; selected: boolean}
1820 * Plugin module
1921 */
2022export function createInspector ( props : {
21- inspectedState : Accessor < InspectedState >
22- enabled : Accessor < boolean >
23+ inspectedState : s . Accessor < InspectedState >
24+ enabled : s . Accessor < boolean >
2325 resetInspectedNode : VoidFunction
2426 emit : OutputEmit
2527} ) {
@@ -145,49 +147,63 @@ export function createInspector(props: {
145147
146148 let clearPrevDisposeListener : VoidFunction | undefined
147149
148- const inspectedOwnerId = createMemo (
149- ( ) => props . enabled ( )
150- ? props . inspectedState ( ) . ownerId
151- : null
152- )
153- createEffect ( ( ) => {
154- const id = inspectedOwnerId ( )
150+
155151
152+ function inspectOwnerId ( id : NodeID | null ) : void {
153+
156154 const owner = id && getObjectById ( id , ObjectType . Owner )
157155 if ( inspectedOwner ) clearOwnerObservers ( inspectedOwner , propsMap )
158156 inspectedOwner = owner
159157
160158 valueMap . reset ( )
161159 clearUpdates ( )
162-
160+
163161 if ( owner ) {
164162 const result = collectOwnerDetails ( owner , {
165- onValueUpdate : pushValueUpdate ,
163+ onValueUpdate : pushValueUpdate ,
166164 onPropStateChange : pushPropState ,
167- observedPropsMap : propsMap ,
165+ observedPropsMap : propsMap ,
168166 } )
169-
167+
170168 props . emit ( msg ( 'InspectedNodeDetails' , result . details ) )
171-
169+
172170 valueMap = result . valueMap
173171 lastDetails = result . details
174172 checkProxyProps = result . checkProxyProps || null
175173 } else {
176174 lastDetails = undefined
177175 checkProxyProps = null
178176 }
179-
177+
180178 clearPrevDisposeListener ?.( )
181179 clearPrevDisposeListener = owner
182180 ? onOwnerDispose ( owner , props . resetInspectedNode )
183181 : undefined
182+ }
183+
184+ const inspectedOwnerId = s . createMemo (
185+ ( ) => props . enabled ( )
186+ ? props . inspectedState ( ) . ownerId
187+ : null
188+ )
189+ s . createEffect ( ( ) => {
190+ let id = inspectedOwnerId ( )
191+ s . untrack ( ( ) => inspectOwnerId ( id ) )
184192 } )
185193
186- createEffect ( ( ) => {
194+ function onUnownedRootChange ( ) {
195+ if ( inspectedOwner === UNOWNED_ROOT ) {
196+ inspectOwnerId ( inspectedOwnerId ( ) )
197+ }
198+ }
199+ setup . unowned . onSignalAdded = onUnownedRootChange
200+ setup . unowned . onSignalRemoved = onUnownedRootChange
201+
202+ s . createEffect ( ( ) => {
187203 if ( ! props . enabled ( ) ) return
188204
189205 // Check if proxy props have changed keys after each update queue
190- onCleanup ( addSolidUpdateListener ( ( ) => checkProxyProps && triggerPropsCheck ( ) ) )
206+ s . onCleanup ( addSolidUpdateListener ( ( ) => checkProxyProps && triggerPropsCheck ( ) ) )
191207 } )
192208
193209 return {
0 commit comments