@@ -27,24 +27,56 @@ import { getShapeId } from "../../utils/misc";
2727// Radios
2828import { Radios } from ".." ;
2929
30+ // Component
3031const ExportShape = ( { show, setShow, shape } ) => {
3132 console . log ( { shape } ) ;
32- const [ exportType , setExportType ] = useState ( ) ;
33+
34+ // state object to hold the export data
35+ const [ exportData , setExportData ] = useState ( ) ;
36+ const [ loaded , setLoaded ] = useState ( false ) ;
3337
3438 useEffect ( ( ) => {
35- setExportType ( 'png' ) ;
39+ setExportData ( {
40+ 'name' : shape . name ,
41+ 'type' : 'png' ,
42+ 'width' : '300' ,
43+ 'height' : '300' ,
44+ 'backgroundColor' : shape . backgroundColor
45+ } ) ;
46+ setLoaded ( true ) ;
3647 } , [ show ] )
3748
38- const handleTypeChange = ( event ) => {
39- const { value } = event . target ;
49+ // Handles the input changes and update
50+ // the state object
51+ const handleChange = ( evt ) => {
52+ evt . preventDefault ( ) ;
53+
54+ const name = evt . target . name ;
55+ let value =
56+ evt . target . type === "number"
57+ ? evt . target . valueAsNumber
58+ : evt . target . value ;
4059
41- console . log ( `selected export type ${ value } ` ) ;
42- setExportType ( value ) ;
60+ if ( value < 0 ) {
61+ return ;
62+ }
63+
64+ if ( Number . isNaN ( value ) ) {
65+ value = "" ;
66+ }
67+
68+ setExportData ( {
69+ ...exportData ,
70+ [ name ] : value
71+ } ) ;
72+
73+ console . log ( { exportData} ) ;
4374 } ;
4475
76+ // Export method
4577 const doExport = ( id , name ) => {
46- console . log ( `Save as ${ exportType } ` ) ;
47- switch ( exportType ) {
78+ console . log ( `Save as ${ exportData . type } ` ) ;
79+ switch ( exportData . type ) {
4880 case "png" :
4981 exportAsPNG ( id , name ) ;
5082 break ;
@@ -86,7 +118,7 @@ const ExportShape = ({ show, setShow, shape }) => {
86118 } ;
87119 return (
88120 < >
89- { shape && (
121+ { loaded && (
90122 < Modal
91123 size = "lg"
92124 aria-labelledby = "contained-modal-title-vcenter"
@@ -95,37 +127,81 @@ const ExportShape = ({ show, setShow, shape }) => {
95127 centered
96128 >
97129 < Modal . Header closeButton >
98- < Modal . Title > Export { shape . name } </ Modal . Title >
130+ < Modal . Title > Export { exportData . name } </ Modal . Title >
99131 </ Modal . Header >
100132 < Modal . Body >
101133 < div >
102134 < Shape
103- name = { shape . name }
135+ name = { exportData . name }
104136 formula = { shape . formula }
105- width = "300px"
106- height = "300px"
107- backgroundColor = { shape . backgroundColor }
108- id = { getShapeId ( shape . name , true ) }
109- />
110- </ div >
111- < div >
112- < Radios
113- groupName = "export-type"
114- heading = "Export as:"
115- options = { [
116- { value : "png" , displayValue : "png" } ,
117- { value : "jpeg" , displayValue : "jpeg" } ,
118- { value : "svg" , displayValue : "svg" } ,
119- ] }
120- selectedOption = { exportType }
121- onValueChange = { handleTypeChange }
137+ width = { `${ exportData . width } px` }
138+ height = { `${ exportData . height } px` }
139+ backgroundColor = { exportData . backgroundColor }
140+ id = { getShapeId ( exportData . name , true ) }
122141 />
123142 </ div >
143+ < form >
144+ < div >
145+ < label htmlFor = "export-name" > Name</ label >
146+ < input
147+ type = "text"
148+ name = "name"
149+ id = "export-name"
150+ value = { exportData . name }
151+ onChange = { handleChange } />
152+ </ div >
153+
154+ < div >
155+ < label htmlFor = "export-color" > Color</ label >
156+ < input
157+ type = "color"
158+ name = "backgroundColor"
159+ id = "export-color"
160+ value = { exportData . backgroundColor }
161+ onChange = { handleChange } />
162+ </ div >
163+
164+ < div >
165+ < label htmlFor = "export-width" > Set a width(in px)</ label >
166+ < input
167+ type = "range"
168+ min = "100"
169+ max = "700"
170+ value = { exportData . width }
171+ id = "export-width"
172+ name = "width"
173+ onChange = { handleChange } />
174+
175+ < label htmlFor = "export-height" > Set a height(in px)</ label >
176+ < input
177+ type = "range"
178+ min = "100"
179+ max = "700"
180+ value = { exportData . height }
181+ id = "export-height"
182+ name = "height"
183+ onChange = { handleChange } />
184+ </ div >
185+
186+ < div >
187+ < Radios
188+ groupName = "type"
189+ heading = "Export as:"
190+ options = { [
191+ { value : "png" , displayValue : "png" } ,
192+ { value : "jpeg" , displayValue : "jpeg" } ,
193+ { value : "svg" , displayValue : "svg" } ,
194+ ] }
195+ selectedOption = { exportData . type }
196+ onValueChange = { handleChange }
197+ />
198+ </ div >
199+ </ form >
124200 </ Modal . Body >
125201
126202 < Modal . Footer >
127203 < Button
128- onClick = { ( ) => doExport ( getShapeId ( shape . name , true ) , shape . name ) }
204+ onClick = { ( ) => doExport ( getShapeId ( exportData . name , true ) , exportData . name ) }
129205 >
130206 Export
131207 </ Button >
0 commit comments