1- import React , { useEffect } from 'react' ;
1+ import React , { useState } from 'react' ;
22import { makeStyles } from '@material-ui/styles' ;
33import DrawerLayout from 'src/layouts/DrawerLayout' ;
44import {
@@ -7,9 +7,13 @@ import {
77 Box ,
88 Typography ,
99 InputBase ,
10- TextField
10+ TextField ,
11+ LinearProgress
1112} from '@material-ui/core' ;
1213import ImageUploader from 'react-images-upload' ;
14+ import { useSelector } from 'react-redux' ;
15+ import { firebase } from 'src/services/authService' ;
16+ import { useHistory } from 'react-router' ;
1317
1418const useStyles = makeStyles ( theme => ( {
1519 root : {
@@ -40,7 +44,7 @@ const useStyles = makeStyles(theme => ({
4044 width : '200px' ,
4145 height : '38px' ,
4246 borderRadius : '20px' ,
43- marginRight : '15px'
47+ marginRight : '15px' ,
4448 } ,
4549 createbtn : {
4650 marginTop : '60px' ,
@@ -56,7 +60,7 @@ const useStyles = makeStyles(theme => ({
5660 width : '200px' ,
5761 height : '38px' ,
5862 borderRadius : '20px' ,
59- marginRight : '60px'
63+ marginRight : '60px' ,
6064 } ,
6165 inputDiv : {
6266 background : 'rgba(42, 23, 89, 0.25)' ,
@@ -193,18 +197,74 @@ const useStyles = makeStyles(theme => ({
193197
194198function CreateNewEvent ( ) {
195199 const classes = useStyles ( ) ;
196-
197- // file upload
200+ let history = useHistory ( ) ;
201+ const user = useSelector ( state => state . account . user ) ;
202+ const [ speaker , setSpeaker ] = useState ( [ { } ] ) ;
203+ const [ imageURL , setImageURL ] = useState ( '' ) ;
204+ const initialFieldValues = {
205+ eventName : '' ,
206+ description : '' ,
207+ date : '' ,
208+ time : '' ,
209+ eventLink : ''
210+ } ;
211+ const [ formData , setFormData ] = useState ( initialFieldValues ) ;
198212
199213 const handleChange = e => {
200- // let selectedFile = e.target.files[0];
214+ let { name, value } = e . target ;
215+ setFormData ( { ...formData , [ name ] : value } ) ;
201216 } ;
202217
203- function onDrop ( picture ) {
204- console . log ( picture ) ;
205- }
218+ const handleSpeakerChange = e => {
219+ let { id, name, value } = e . target ;
220+ let s = [ ...speaker ] ;
221+ s [ parseInt ( id ) ] [ name ] = value ;
222+ setSpeaker ( s ) ;
223+ } ;
224+
225+ const addSpeaker = ( ) => {
226+ setSpeaker ( [ ...speaker , { } ] ) ;
227+ } ;
228+
229+ const removeSpeaker = ( ) => {
230+ speaker . pop ( ) ;
231+ setSpeaker ( [ ...speaker ] ) ;
232+ } ;
233+
234+ const onDrop = async picture => {
235+ if ( picture . length === 0 ) return ;
236+ // For the Loader
237+ setImageURL ( null ) ;
238+ let userId = user . uid ;
239+ let file = picture [ 0 ] ;
240+ let storageRef = firebase . storage ( ) . ref ( ) ;
241+ let fileRef = storageRef . child ( `${ userId } /${ file . name } ` ) ;
242+ await fileRef . put ( file ) ;
243+ setImageURL ( await fileRef . getDownloadURL ( ) ) ;
244+ } ;
245+
246+ const handleSubmit = ( ) => {
247+ let userId = user . uid ;
248+ formData . speakers = speaker ;
249+ formData . createdBy = userId ;
250+ formData . bannerImg = imageURL ;
251+
252+ let db = firebase . firestore ( ) ;
253+ let ref = db . collection ( 'events' ) ;
254+
255+ ref
256+ . add ( formData )
257+ . then ( ( ) => {
258+ console . log ( 'Document written' ) ;
259+ setFormData ( initialFieldValues ) ;
260+ setSpeaker ( [ { } ] ) ;
261+ history . push ( '/events/individual-event' ) ;
262+ } )
263+ . catch ( error => {
264+ console . error ( 'Error adding document: ' , error ) ;
265+ } ) ;
266+ } ;
206267
207- useEffect ( ( ) => { } , [ ] ) ;
208268 return (
209269 < DrawerLayout >
210270 < div className = { classes . root } >
@@ -224,7 +284,7 @@ function CreateNewEvent() {
224284 className = { classes . textField }
225285 fullWidth
226286 name = "eventName"
227- type = " eventName"
287+ value = { formData . eventName }
228288 variant = "outlined"
229289 onChange = { handleChange }
230290 />
@@ -233,9 +293,10 @@ function CreateNewEvent() {
233293 placeholder = "Add Description of the event"
234294 className = { classes . textField }
235295 multiline
296+ rows = { 4 }
236297 fullWidth
237- name = "email "
238- type = "email"
298+ name = "description "
299+ value = { formData . description }
239300 variant = "outlined"
240301 onChange = { handleChange }
241302 />
@@ -246,7 +307,10 @@ function CreateNewEvent() {
246307 id = "date"
247308 type = "date"
248309 defaultValue = "2017-05-24"
310+ name = "date"
311+ value = { formData . date }
249312 className = { classes . date }
313+ onChange = { handleChange }
250314 InputLabelProps = { {
251315 shrink : true
252316 } }
@@ -257,9 +321,9 @@ function CreateNewEvent() {
257321 < TextField
258322 fullWidth
259323 className = { classes . input1 }
260- placeholder = "Event Time"
261- name = "time"
262324 type = "time"
325+ name = "time"
326+ value = { formData . time }
263327 id = "time"
264328 defaultValue = "07:30"
265329 variant = "outlined"
@@ -272,39 +336,63 @@ function CreateNewEvent() {
272336 fullWidth
273337 className = { classes . textField }
274338 placeholder = "Event link / Registration link"
275- name = "link "
276- type = "link"
339+ name = "eventLink "
340+ value = { formData . eventLink }
277341 variant = "outlined"
278342 onChange = { handleChange }
279343 />
280- < fieldset className = { classes . socialLinks } >
281- < InputBase
282- className = { classes . social }
283- fullWidth
284- placeholder = "Speaker Name"
285- />
286- < InputBase
287- className = { classes . social }
288- fullWidth
289- placeholder = "Speaker LinkedIn Profile Link"
290- />
291- </ fieldset >
344+ { speaker . map ( ( item , idx ) => (
345+ < fieldset className = { classes . socialLinks } >
346+ < InputBase
347+ className = { classes . social }
348+ fullWidth
349+ id = { idx . toString ( ) }
350+ name = "speakerName"
351+ value = { speaker . speakerName }
352+ placeholder = "Speaker Name"
353+ onChange = { handleSpeakerChange }
354+ />
355+ < InputBase
356+ className = { classes . social }
357+ fullWidth
358+ id = { idx . toString ( ) }
359+ name = "speakerLinkedIn"
360+ value = { speaker . speakerLinkedIn }
361+ placeholder = "Speaker LinkedIn Profile Link"
362+ onChange = { handleSpeakerChange }
363+ />
364+ </ fieldset >
365+ ) ) }
292366
293- < Button className = { classes . button } > Add Speaker</ Button >
367+ { speaker . length > 1 && (
368+ < Button className = { classes . button } onClick = { removeSpeaker } >
369+ Remove Speaker
370+ </ Button >
371+ ) }
372+ < Button className = { classes . button } onClick = { addSpeaker } >
373+ Add Speaker
374+ </ Button >
294375 { /* </div> */ }
295376 </ Grid >
296377 </ Grid >
297378 < div className = { classes . createbtn } >
298- < Button className = { classes . cancelbtn } > Cancel</ Button >
299- < Button className = { classes . addbtn } > Create</ Button >
379+ < Button
380+ className = { classes . cancelbtn }
381+ onClick = { ( ) => history . push ( '/events' ) }
382+ >
383+ Cancel
384+ </ Button >
385+ < Button className = { classes . addbtn } onClick = { handleSubmit } >
386+ Create
387+ </ Button >
300388 </ div >
301389 </ Box >
302390 < Box maxWidth = "28em" minWidth = "24em" className = { classes . paddingRight } >
303391 < ImageUploader
304392 withIcon = { true }
305393 buttonText = "Choose image"
306394 onChange = { onDrop }
307- withPreview
395+ withPreview = { imageURL !== null }
308396 singleImage
309397 imgExtension = { [ '.jpg' , '.gif' , '.png' , '.gif' ] }
310398 maxFileSize = { 5242880 }
@@ -313,6 +401,7 @@ function CreateNewEvent() {
313401 } }
314402 className = { classes . imagePreview }
315403 />
404+ { imageURL === null && < LinearProgress aria-label = "Uploading" /> }
316405 < img
317406 src = "/static/images/event_img.svg"
318407 alt = "gallery-icon"
0 commit comments