11import { NodeKind , NodeState } from "../../node.types" ;
2- import { useNodes } from "../../nodes.context" ;
3- import { allUnits } from "../../unit-conversion" ;
2+ import { allUnits , Unit } from "../../unit-conversion" ;
43import { DataField } from "../DataField" ;
54import "./NodeSettings.css" ;
65
7- export type NodeSettingsProps = {
8- nodeId : string ;
9- onChange : ( settingsKey : string , value : unknown ) => void ;
6+ export type NodeSettingsProps < T extends NodeKind > = {
7+ node : NodeState < T > ;
8+ onChange : < K extends keyof NodeState < T > [ "settings" ] > (
9+ settingsKey : K ,
10+ value : NodeState < T > [ "settings" ] [ K ]
11+ ) => void ;
1012} ;
1113
12- export function NodeSettings ( props : NodeSettingsProps ) {
13- const { getNode } = useNodes ( ) ;
14-
15- const { kind, settings } = getNode ( props . nodeId ) ! ;
14+ type NodeSettingsComponentProps < T extends NodeKind > = {
15+ settings : NodeState < T > [ "settings" ] ;
16+ onChange : < K extends keyof NodeState < T > [ "settings" ] > (
17+ settingsKey : K ,
18+ value : NodeState < T > [ "settings" ] [ K ]
19+ ) => void ;
20+ } ;
1621
17- switch ( kind ) {
22+ export function NodeSettings < T extends NodeKind > ( props : NodeSettingsProps < T > ) {
23+ switch ( props . node . kind ) {
1824 case "param:slider" :
19- return < SliderParamNodeSettings settings = { settings } onChange = { props . onChange } /> ;
25+ return (
26+ < SliderParamNodeSettings
27+ settings = { props . node . settings as NodeSettingsComponentProps < "param:slider" > [ "settings" ] }
28+ onChange = { props . onChange as NodeSettingsComponentProps < "param:slider" > [ "onChange" ] }
29+ />
30+ ) ;
2031 case "param:button" :
21- return < ButtonParamNodeSettings settings = { settings } onChange = { props . onChange } /> ;
32+ return (
33+ < ButtonParamNodeSettings
34+ settings = { props . node . settings as NodeSettingsComponentProps < "param:button" > [ "settings" ] }
35+ onChange = { props . onChange as NodeSettingsComponentProps < "param:button" > [ "onChange" ] }
36+ />
37+ ) ;
2238 case "param:input" :
23- return < InputParamNodeSettings settings = { settings } onChange = { props . onChange } /> ;
39+ return (
40+ < InputParamNodeSettings
41+ settings = { props . node . settings as NodeSettingsComponentProps < "param:input" > [ "settings" ] }
42+ onChange = { props . onChange as NodeSettingsComponentProps < "param:input" > [ "onChange" ] }
43+ />
44+ ) ;
2445 }
2546}
2647
27- type NodeSettingsComponentProps < T extends NodeKind > = {
28- settings : NodeState < T > [ "settings" ] ;
29- onChange : ( settingsKey : string , value : unknown ) => void ;
30- } ;
31-
3248function SliderParamNodeSettings ( props : NodeSettingsComponentProps < "param:slider" > ) {
3349 return (
3450 < div className = "nodesettings" >
@@ -39,7 +55,7 @@ function SliderParamNodeSettings(props: NodeSettingsComponentProps<"param:slider
3955 name = "unit"
4056 id = "pet-select"
4157 value = { props . settings . unit }
42- onChange = { ( ev ) => props . onChange ( "unit" , ev . target . value ) }
58+ onChange = { ( ev ) => props . onChange ( "unit" , ev . target . value as Unit ) }
4359 >
4460 { allUnits . map ( ( unit ) => (
4561 < option key = { unit } value = { unit } >
@@ -56,9 +72,7 @@ function SliderParamNodeSettings(props: NodeSettingsComponentProps<"param:slider
5672 type = "number"
5773 step = { 1 }
5874 value = { props . settings . min }
59- onChange = { ( ev ) => {
60- props . onChange ( "min" , parseFloat ( ev . target . value ) ) ;
61- } }
75+ onChange = { ( ev ) => props . onChange ( "min" , parseFloat ( ev . target . value ) ) }
6276 />
6377 }
6478 />
@@ -69,9 +83,7 @@ function SliderParamNodeSettings(props: NodeSettingsComponentProps<"param:slider
6983 type = "number"
7084 step = { 1 }
7185 value = { props . settings . max }
72- onChange = { ( ev ) => {
73- props . onChange ( "max" , parseFloat ( ev . target . value ) ) ;
74- } }
86+ onChange = { ( ev ) => props . onChange ( "max" , parseFloat ( ev . target . value ) ) }
7587 />
7688 }
7789 />
@@ -82,9 +94,7 @@ function SliderParamNodeSettings(props: NodeSettingsComponentProps<"param:slider
8294 type = "number"
8395 step = { 0.01 }
8496 value = { props . settings . step }
85- onChange = { ( ev ) => {
86- props . onChange ( "step" , parseFloat ( ev . target . value ) ) ;
87- } }
97+ onChange = { ( ev ) => props . onChange ( "step" , parseFloat ( ev . target . value ) ) }
8898 />
8999 }
90100 />
@@ -102,7 +112,7 @@ function ButtonParamNodeSettings(props: NodeSettingsComponentProps<"param:button
102112 name = "unit"
103113 id = "pet-select"
104114 value = { props . settings . unit }
105- onChange = { ( ev ) => props . onChange ( "unit" , ev . target . value ) }
115+ onChange = { ( ev ) => props . onChange ( "unit" , ev . target . value as Unit ) }
106116 >
107117 { allUnits . map ( ( unit ) => (
108118 < option key = { unit } value = { unit } >
@@ -126,7 +136,7 @@ function InputParamNodeSettings(props: NodeSettingsComponentProps<"param:input">
126136 name = "unit"
127137 id = "pet-select"
128138 value = { props . settings . unit }
129- onChange = { ( ev ) => props . onChange ( "unit" , ev . target . value ) }
139+ onChange = { ( ev ) => props . onChange ( "unit" , ev . target . value as Unit ) }
130140 >
131141 { allUnits . map ( ( unit ) => (
132142 < option key = { unit } value = { unit } >
0 commit comments