@@ -4,40 +4,47 @@ import type { UseControlsReturn } from "~/hooks/use-controls"
44
55export function Controls ( { store } : { store : UseControlsReturn } ) {
66 const { config, state, setState } = store
7+ const items = createMemo ( ( ) => {
8+ const keys = Object . keys ( store . config )
9+ return keys . map ( ( key ) => {
10+ const { type, label = key , options, placeholder, min, max } = ( config [ key ] ?? { } ) as any
11+ const value = createMemo ( ( ) => deepGet ( state ( ) , key ) )
12+ return { key, type, label, options, placeholder, min, max, value }
13+ } )
14+ } )
15+
716 return (
817 < div class = "controls-container" >
9- < For each = { Object . keys ( store . config ) } >
10- { ( key ) => {
11- const { type, label = key , options, placeholder, min, max } = ( config [ key ] ?? { } ) as any
12- const value = createMemo ( ( ) => deepGet ( state ( ) , key ) )
13- switch ( type ) {
18+ < For each = { items ( ) } >
19+ { ( item ) => {
20+ switch ( item . type ) {
1421 case "boolean" :
1522 return (
1623 < div class = "checkbox" >
1724 < input
18- data-testid = { key }
19- id = { label }
25+ data-testid = { item . key }
26+ id = { item . label }
2027 type = "checkbox"
21- checked = { value ( ) }
28+ checked = { item . value ( ) }
2229 onChange = { ( e ) => {
23- setState ( key , e . currentTarget . checked )
30+ setState ( item . key , e . currentTarget . checked )
2431 } }
2532 />
26- < label for = { label } > { label } </ label >
33+ < label for = { item . label } > { item . label } </ label >
2734 </ div >
2835 )
2936 case "string" :
3037 return (
3138 < div class = "text" >
32- < label style = { { "margin-right" : "10px" } } > { label } </ label >
39+ < label style = { { "margin-right" : "10px" } } > { item . label } </ label >
3340 < input
34- data-testid = { key }
41+ data-testid = { item . key }
3542 type = "text"
36- placeholder = { placeholder }
37- value = { value ( ) }
43+ placeholder = { item . placeholder }
44+ value = { item . value ( ) }
3845 onKeyDown = { ( e ) => {
3946 if ( e . key === "Enter" ) {
40- setState ( key , e . currentTarget . value )
47+ setState ( item . key , e . currentTarget . value )
4148 }
4249 } }
4350 />
@@ -46,39 +53,39 @@ export function Controls({ store }: { store: UseControlsReturn }) {
4653 case "select" :
4754 return (
4855 < div class = "text" >
49- < label for = { label } style = { { "margin-right" : "10px" } } >
50- { label }
56+ < label for = { item . label } style = { { "margin-right" : "10px" } } >
57+ { item . label }
5158 </ label >
5259 < select
53- data-testid = { key }
54- id = { label }
55- value = { value ( ) }
60+ data-testid = { item . key }
61+ id = { item . label }
62+ value = { item . value ( ) }
5663 onChange = { ( e ) => {
57- setState ( key , e . currentTarget . value )
64+ setState ( item . key , e . currentTarget . value )
5865 } }
5966 >
6067 < option > -----</ option >
61- < For each = { options as any [ ] } > { ( option ) => < option value = { option } > { option } </ option > } </ For >
68+ < For each = { item . options as any [ ] } > { ( option ) => < option value = { option } > { option } </ option > } </ For >
6269 </ select >
6370 </ div >
6471 )
6572 case "number" :
6673 return (
6774 < div class = "text" >
68- < label for = { label } style = { { "margin-right" : "10px" } } >
69- { label }
75+ < label for = { item . label } style = { { "margin-right" : "10px" } } >
76+ { item . label }
7077 </ label >
7178 < input
72- data-testid = { key }
73- id = { label }
79+ data-testid = { item . key }
80+ id = { item . label }
7481 type = "number"
75- min = { min }
76- max = { max }
77- value = { value ( ) }
82+ min = { item . min }
83+ max = { item . max }
84+ value = { item . value ( ) }
7885 onKeyDown = { ( e ) => {
7986 if ( e . key === "Enter" ) {
8087 const val = parseFloat ( e . currentTarget . value )
81- setState ( key , isNaN ( val ) ? 0 : val )
88+ setState ( item . key , isNaN ( val ) ? 0 : val )
8289 }
8390 } }
8491 />
0 commit comments