1- import { For , createEffect } from 'solid-js'
1+ import { For , createEffect , createMemo , createSignal } from 'solid-js'
22import clsx from 'clsx'
33import { useDrawContext } from '../context/draw-context'
44import { usePlugins } from '../context/use-devtools-context'
55import { useStyles } from '../styles/use-styles'
66import { PLUGIN_CONTAINER_ID , PLUGIN_TITLE_CONTAINER_ID } from '../constants'
77
88export const PluginsTab = ( ) => {
9- const { plugins, activePlugin , setActivePlugin } = usePlugins ( )
9+ const { plugins, activePlugins , toggleActivePlugins } = usePlugins ( )
1010 const { expanded, hoverUtils, animationMs } = useDrawContext ( )
11- let activePluginRef : HTMLDivElement | undefined
11+
12+ const [ pluginRefs , setPluginRefs ] = createSignal (
13+ new Map < string , HTMLDivElement > ( ) ,
14+ )
15+
16+ const styles = useStyles ( )
1217
1318 createEffect ( ( ) => {
14- const currentActivePlugin = plugins ( ) ?. find (
15- ( plugin ) => plugin . id === activePlugin ( ) ,
19+ const currentActivePlugins = plugins ( ) ?. filter ( ( plugin ) =>
20+ activePlugins ( ) . includes ( plugin . id ! ) ,
1621 )
17- if ( activePluginRef && currentActivePlugin ) {
18- currentActivePlugin . render ( activePluginRef )
19- }
22+
23+ currentActivePlugins ?. forEach ( ( plugin ) => {
24+ const ref = pluginRefs ( ) . get ( plugin . id ! )
25+
26+ if ( ref ) {
27+ plugin . render ( ref )
28+ }
29+ } )
2030 } )
21- const styles = useStyles ( )
2231
2332 return (
2433 < div class = { styles ( ) . pluginsTabPanel } >
@@ -30,12 +39,8 @@ export const PluginsTab = () => {
3039 } ,
3140 styles ( ) . pluginsTabDrawTransition ( animationMs ) ,
3241 ) }
33- onMouseEnter = { ( ) => {
34- hoverUtils . enter ( )
35- } }
36- onMouseLeave = { ( ) => {
37- hoverUtils . leave ( )
38- } }
42+ onMouseEnter = { ( ) => hoverUtils . enter ( ) }
43+ onMouseLeave = { ( ) => hoverUtils . leave ( ) }
3944 >
4045 < div
4146 class = { clsx (
@@ -56,11 +61,18 @@ export const PluginsTab = () => {
5661 : plugin . name ( pluginHeading )
5762 }
5863 } )
64+
65+ const isActive = createMemo ( ( ) =>
66+ activePlugins ( ) . includes ( plugin . id ! ) ,
67+ )
68+
5969 return (
6070 < div
61- onClick = { ( ) => setActivePlugin ( plugin . id ! ) }
71+ onClick = { ( ) => {
72+ toggleActivePlugins ( plugin . id ! )
73+ } }
6274 class = { clsx ( styles ( ) . pluginName , {
63- active : activePlugin ( ) === plugin . id ,
75+ active : isActive ( ) ,
6476 } ) }
6577 >
6678 < h3 id = { PLUGIN_TITLE_CONTAINER_ID } ref = { pluginHeading } />
@@ -71,11 +83,21 @@ export const PluginsTab = () => {
7183 </ div >
7284 </ div >
7385
74- < div
75- id = { PLUGIN_CONTAINER_ID }
76- ref = { activePluginRef }
77- class = { styles ( ) . pluginsTabContent }
78- > </ div >
86+ < For each = { activePlugins ( ) } >
87+ { ( pluginId ) => (
88+ < div
89+ id = { `${ PLUGIN_CONTAINER_ID } -${ pluginId } ` }
90+ ref = { ( el ) =>
91+ setPluginRefs ( ( prev ) => {
92+ const updated = new Map ( prev )
93+ updated . set ( pluginId , el )
94+ return updated
95+ } )
96+ }
97+ class = { styles ( ) . pluginsTabContent }
98+ />
99+ ) }
100+ </ For >
79101 </ div >
80102 )
81103}
0 commit comments