11import type { DevToolsDockEntry } from '@vitejs/devtools-kit'
2- import type { DevToolsRpcClient , DockEntryState , DockPanelStorage , DocksContext } from '@vitejs/devtools-kit/client'
2+ import type { DevToolsRpcClient , DockEntryState , DockEntryStateEvents , DockPanelStorage , DocksContext } from '@vitejs/devtools-kit/client'
33import type { Ref } from 'vue'
4- import { computed , reactive , ref , shallowRef } from 'vue'
4+ import { createNanoEvents } from 'nanoevents'
5+ import { computed , markRaw , reactive , ref , shallowRef , watch } from 'vue'
56
67export function DEFAULT_DOCK_PANEL_STORE ( ) : DockPanelStorage {
78 return {
@@ -15,6 +16,42 @@ export function DEFAULT_DOCK_PANEL_STORE(): DockPanelStorage {
1516 }
1617}
1718
19+ function createDockEntryState (
20+ entry : DevToolsDockEntry ,
21+ selected : Ref < DevToolsDockEntry | null > ,
22+ ) : DockEntryState {
23+ const events = createNanoEvents < DockEntryStateEvents > ( )
24+ const state : DockEntryState = reactive ( {
25+ entryMeta : entry ,
26+ get isActive ( ) {
27+ return selected . value ?. id === entry . id
28+ } ,
29+ domElements : { } ,
30+ events : markRaw ( events ) ,
31+ } )
32+
33+ watch ( ( ) => selected . value ?. id , ( newSelectedId ) => {
34+ if ( newSelectedId === entry . id ) {
35+ events . emit ( 'entry:activated' )
36+ }
37+ else {
38+ events . emit ( 'entry:deactivated' )
39+ }
40+ } )
41+
42+ watch ( ( ) => state . domElements . iframe , ( newIframe ) => {
43+ if ( newIframe )
44+ events . emit ( 'dom:iframe:mounted' , newIframe )
45+ } )
46+
47+ watch ( ( ) => state . domElements . panel , ( newPanel ) => {
48+ if ( newPanel )
49+ events . emit ( 'dom:panel:mounted' , newPanel )
50+ } )
51+
52+ return state
53+ }
54+
1855export async function createDocksContext (
1956 clientType : 'embedded' | 'standalone' ,
2057 rpc : DevToolsRpcClient ,
@@ -25,17 +62,12 @@ export async function createDocksContext(
2562 // eslint-disable-next-line no-console
2663 console . log ( '[VITE DEVTOOLS] Docks Entries' , [ ...dockEntries . value ] )
2764 // TODO: get board case from rpc when entries updates
28- const dockEntryStateMap = reactive ( new Map < string , DockEntryState > ( ) )
65+ const dockEntryStateMap : Map < string , DockEntryState > = reactive ( new Map ( ) )
2966 for ( const entry of dockEntries . value ) {
67+ // TODO: handle update
3068 dockEntryStateMap . set (
3169 entry . id ,
32- reactive ( {
33- entryMeta : entry ,
34- get isActive ( ) {
35- return selected . value ?. id === entry . id
36- } ,
37- domElements : { } ,
38- } ) ,
70+ createDockEntryState ( entry , selected ) ,
3971 )
4072 }
4173
@@ -51,7 +83,7 @@ export async function createDocksContext(
5183 docks : {
5284 selected,
5385 entries : dockEntries . value ,
54- entryToStateMap : dockEntryStateMap ,
86+ entryToStateMap : markRaw ( dockEntryStateMap ) ,
5587 getStateById : ( id : string ) => dockEntryStateMap . get ( id ) ,
5688 switchEntry : async ( id : string | null ) => {
5789 if ( id === null ) {
0 commit comments