1
1
// CARET
2
- import React , {
3
- Component ,
4
- useState ,
5
- useContext ,
6
- useEffect ,
7
- useCallback
8
- } from 'react' ;
2
+ import React , { useState , useContext } from 'react' ;
9
3
import {
10
4
createStyles ,
11
5
makeStyles ,
@@ -31,53 +25,79 @@ import StateContext from '../../context/context';
31
25
import ComponentPanelItem from './ComponentPanelItem' ;
32
26
import ComponentPanelRoutingItem from './ComponentPanelRoutingItem' ;
33
27
28
+ import TableStateProps from './TableStateProps' ;
29
+
34
30
const StatePropsPanel = ( { isThemeLight } ) : JSX . Element => {
35
31
const classes = useStyles ( ) ;
36
32
const [ state , dispatch ] = useContext ( StateContext ) ;
37
- const [ compName , setCompName ] = useState ( '' ) ;
38
33
const [ newStateProp , setNewStateProp ] = useState ( { } ) ;
39
- const [ isRoot , setIsRoot ] = useState ( false ) ;
40
34
41
35
const debug = ( ) => {
42
- console . log ( 'state:' , state ) ;
43
- console . log ( 'state.canvasFocus:' , state . canvasFocus ) ;
44
36
const currentId = state . canvasFocus . componentId ;
37
+ const currentComponent = state . components [ currentId - 1 ] ;
38
+ console . log ( 'currentComponent:' , currentComponent ) ;
39
+ console . log ( 'currentComponent.stateProps:' , currentComponent . stateProps ) ;
45
40
console . log (
46
- 'state.canvasFocus.components[currentId-1] :' ,
47
- state . components [ currentId - 1 ]
41
+ 'currentComponent.useStateCodes :' ,
42
+ currentComponent . useStateCodes
48
43
) ;
49
- console . log ( 'key' , document . getElementById ( 'textfield-key' ) . value ) ;
50
- console . log ( 'value' , document . getElementById ( 'textfield-value' ) . value ) ;
51
- console . log ( document . getElementById ( 'type-input' ) . innerHTML ) ;
52
- console . log ( 'newStateProp:' , newStateProp ) ;
44
+ } ;
45
+
46
+ const typeConversion = ( value , type ) => {
47
+ // based on user input for value, convert value to correct type
48
+ switch ( type ) {
49
+ case 'String' :
50
+ return String ( value ) ;
51
+ case 'Number' :
52
+ return Number ( value ) ;
53
+ case 'Boolean' :
54
+ return Boolean ( value ) ;
55
+ default :
56
+ return value ;
57
+ }
53
58
} ;
54
59
55
60
const submitNewState = ( ) => {
56
61
// currently focused component's id
57
62
const currentId = state . canvasFocus . componentId ;
58
-
59
63
// current component
60
64
const currentComponent = state . components [ currentId - 1 ] ;
61
65
// grab user inputs for key, value, type
62
66
const key = document . getElementById ( 'textfield-key' ) . value ;
63
67
const value = document . getElementById ( 'textfield-value' ) . value ;
64
68
const type = document . getElementById ( 'type-input' ) . innerHTML ;
65
69
66
- // FOR CONSIDERING USER INPUT DATA VISUALIZATION:
67
- // case 1: [{ name: 'John Doe'}, {age: 99}, {alive: true}]
68
- // case 2: [{ key: 'name', value: 'John Doe', type: 'string'}, {key: 'age', value: 99, type: 'number'}, {key: 'alive', value: true, type: 'boolean'}]
69
-
70
- // store key, value, type in newStateProp obj
70
+ // store key, value, type in newStateProp object
71
71
newStateProp . key = key ;
72
- newStateProp . value = value ;
73
- newStateProp . type = type ;
72
+ newStateProp . type = type . charAt ( 0 ) . toLowerCase ( ) + type . slice ( 1 ) ;
73
+ newStateProp . value = typeConversion ( value , type ) ;
74
74
75
+ // update newStateProp after storing key, value, type
75
76
setNewStateProp ( newStateProp ) ;
76
77
// store this newStateProp obj to our Component's stateProps array
77
78
currentComponent . stateProps . push ( newStateProp ) ;
78
- // set newStateProp to empty for any new state prop entries
79
+ // reset newStateProp to empty for future new state prop entries
79
80
setNewStateProp ( { } ) ;
80
- console . log ( 'currentComponent.stateProps:' , currentComponent . stateProps ) ;
81
+ updateUseStateCodes ( ) ;
82
+ } ;
83
+
84
+ const updateUseStateCodes = ( ) => {
85
+ // currently focused component's id
86
+ const currentId = state . canvasFocus . componentId ;
87
+ // current component
88
+ const currentComponent = state . components [ currentId - 1 ] ;
89
+
90
+ const localStateCode = [ ] ;
91
+ // iterate thru current component's state props to generate code expression for each new state prop entry
92
+ currentComponent . stateProps . forEach ( el => {
93
+ const useStateCode = `const [${ el . key } , set${ el . key
94
+ . charAt ( 0 )
95
+ . toUpperCase ( ) + el . key . slice ( 1 ) } ] = useState<${
96
+ el . type
97
+ } | undefined>(${ JSON . stringify ( el . value ) } )`;
98
+ localStateCode . push ( useStateCode ) ;
99
+ } ) ;
100
+ currentComponent . useStateCodes = localStateCode ;
81
101
} ;
82
102
83
103
return (
@@ -99,22 +119,22 @@ const StatePropsPanel = ({ isThemeLight }): JSX.Element => {
99
119
< MenuItem value = "" >
100
120
< em > Types</ em >
101
121
</ MenuItem >
102
- < MenuItem id = "type-selector" value = { ` string` } >
122
+ < MenuItem id = "type-selector" value = { ' string' } >
103
123
String
104
124
</ MenuItem >
105
- < MenuItem id = "type-selector" value = { ` number` } >
125
+ < MenuItem id = "type-selector" value = { ' number' } >
106
126
Number
107
127
</ MenuItem >
108
- < MenuItem id = "type-selector" value = { ` boolean` } >
128
+ < MenuItem id = "type-selector" value = { ' boolean' } >
109
129
Boolean
110
130
</ MenuItem >
111
- < MenuItem id = "type-selector" value = { ` array` } >
131
+ < MenuItem id = "type-selector" value = { ' array' } >
112
132
Array
113
133
</ MenuItem >
114
- < MenuItem id = "type-selector" value = { ` undefined` } >
134
+ < MenuItem id = "type-selector" value = { ' undefined' } >
115
135
Undefined
116
136
</ MenuItem >
117
- < MenuItem id = "type-selector" value = { ` any` } >
137
+ < MenuItem id = "type-selector" value = { ' any' } >
118
138
Any
119
139
</ MenuItem >
120
140
</ Select >
@@ -141,13 +161,17 @@ const StatePropsPanel = ({ isThemeLight }): JSX.Element => {
141
161
< label >
142
162
Name: { state . components [ state . canvasFocus . componentId - 1 ] . name }
143
163
</ label >
164
+ { /* CARET - HANGING TABLE STATE PROPS */ }
165
+ < div style = { { border : `${ 3 } px solid green` } } >
166
+ < TableStateProps />
167
+ </ div >
144
168
</ div >
145
169
</ div >
146
170
) ;
147
171
} ;
148
172
149
- const useStyles = makeStyles ( ( theme : Theme ) => {
150
- return createStyles ( {
173
+ const useStyles = makeStyles ( ( theme : Theme ) =>
174
+ createStyles ( {
151
175
inputField : {
152
176
marginTop : '10px' ,
153
177
borderRadius : '5px' ,
@@ -254,8 +278,8 @@ const useStyles = makeStyles((theme: Theme) => {
254
278
selectEmpty : {
255
279
marginTop : theme . spacing ( 2 )
256
280
}
257
- } ) ;
258
- } ) ;
281
+ } )
282
+ ) ;
259
283
260
284
const MyButton = styled ( Button ) ( {
261
285
background : 'linear-gradient(45deg, #FE6B8B 30%, #FF8E53 90%)' ,
0 commit comments