1
1
import React , { useState } from 'react' ;
2
- import { View , Text , StyleSheet , ImageBackground , TouchableOpacity , TextInput , Modal , Dimensions , Image } from 'react-native' ;
3
- import { Picker } from '@react-native-picker/picker'
2
+ import { View , Text , StyleSheet , TouchableOpacity , TextInput , Modal , Dimensions , Image } from 'react-native' ;
3
+
4
+ import { MaterialIcons } from '@expo/vector-icons' ;
4
5
5
6
const widowWidth = Dimensions . get ( 'window' ) . width ;
6
7
const windowHeight = Dimensions . get ( 'window' ) . height ;
7
8
8
9
import * as ImagePicker from 'expo-image-picker' ;
10
+ import DateTimePicker from '@react-native-community/datetimepicker' ;
11
+ import { Picker } from '@react-native-picker/picker'
9
12
10
13
11
- const ModalComponent = ( { isVisible, setIsVisible, user } ) => {
14
+ const ModalComponent = ( { isVisible, setIsVisible, user, loadEvents } ) => {
12
15
const [ eventTitle , setEventTitle ] = useState ( null )
13
16
const [ eventDescription , setEventDescription ] = useState ( null )
14
17
const [ eventPrice , setEventPrice ] = useState ( null )
15
18
const [ eventSport , setEventSport ] = useState ( 'Running' )
19
+ const [ eventDate , setEventDate ] = useState ( new Date ( ) )
16
20
const [ image , setImage ] = useState ( null )
17
21
18
-
19
22
const pickImage = async ( ) => {
20
23
const result = await ImagePicker . launchImageLibraryAsync ( {
21
24
mediaTypes : ImagePicker . MediaTypeOptions . All ,
@@ -31,6 +34,50 @@ const ModalComponent = ({ isVisible, setIsVisible, user }) => {
31
34
}
32
35
} ;
33
36
37
+ const submitEventHandler = async ( ) => {
38
+ const localUri = image ;
39
+ const filename = localUri . split ( '/' ) . pop ( )
40
+ const match = / \. ( \w + ) $ / . exec ( filename )
41
+ const type = match ? `image/${ match [ 1 ] } ` : `image` ;
42
+
43
+ const data = new FormData ( )
44
+
45
+ data . append ( 'thumbnail' , { uri : localUri , name : filename , type } )
46
+ data . append ( 'title' , eventTitle )
47
+ data . append ( 'description' , eventDescription )
48
+ data . append ( 'price' , eventPrice )
49
+ data . append ( 'date' , eventDate )
50
+ data . append ( 'sport' , eventSport )
51
+
52
+ try {
53
+ await fetch ( `http://localhost:8080/api/event` , {
54
+ method : 'POST' ,
55
+ body : data ,
56
+ headers : { user : user }
57
+ } )
58
+ loadEvents ( )
59
+ cancelEventHandler ( )
60
+ } catch ( error ) {
61
+ console . log ( '🚀 -------------------------------------------------------------------------' )
62
+ console . log ( '🚀 ~ file: ModalComponent.js ~ line 60 ~ submitEventHandler ~ error' , error )
63
+ console . log ( '🚀 -------------------------------------------------------------------------' )
64
+
65
+ }
66
+ }
67
+
68
+ const onChange = ( event , selectedDate ) => {
69
+ const currentDate = selectedDate || eventDate ;
70
+ setEventDate ( currentDate ) ;
71
+ } ;
72
+
73
+ const cancelEventHandler = ( ) => {
74
+ setIsVisible ( ! isVisible )
75
+ setImage ( null )
76
+ setEventTitle ( null )
77
+ setEventDescription ( null )
78
+ setEventDate ( new Date ( ) )
79
+ setEventSport ( 'Running' )
80
+ }
34
81
return (
35
82
< Modal
36
83
animationType = "slide"
@@ -43,42 +90,55 @@ const ModalComponent = ({ isVisible, setIsVisible, user }) => {
43
90
>
44
91
< View style = { styles . centeredView } >
45
92
< View style = { styles . modalView } >
46
- < Text style = { styles . modalText } > Create a New Event</ Text >
47
93
< View style = { styles . form } >
48
94
< View >
49
- < TouchableOpacity
50
- style = { [ styles . button , styles . buttonClose ] }
51
- onPress = { pickImage }
52
- >
53
- < Text > Pick an Image!</ Text >
54
- </ TouchableOpacity >
55
- { image && < Image source = { { uri : image } } style = { { width : 200 , height : 200 } } /> }
95
+
96
+ { image ? < TouchableOpacity onPress = { pickImage } >
97
+ < Image source = { { uri : image } } style = { styles . loadedImage } />
98
+ </ TouchableOpacity > :
99
+ < TouchableOpacity
100
+ style = { styles . addImage }
101
+ onPress = { pickImage }
102
+ >
103
+ < MaterialIcons name = "add-a-photo" size = { 56 } color = "black" />
104
+ </ TouchableOpacity > }
56
105
</ View >
57
106
< View >
58
107
< Text style = { styles . label } > Event Title:</ Text >
59
- < TextInput style = { styles . input } placeholder = { "Event Title" } autoCapitalize = 'none' autoCorrect = { false } value = { eventTitle } onChangeText = { text => console . log ( text ) } />
108
+ < TextInput style = { styles . input } placeholder = { "Event Title" } autoCapitalize = 'none' autoCorrect = { false } value = { eventTitle } onChangeText = { text => setEventTitle ( text ) } />
60
109
< Text style = { styles . label } > Event Description:</ Text >
61
- < TextInput style = { styles . input } placeholder = { "Event Description" } autoCapitalize = 'none' autoCorrect = { false } value = { eventDescription } onChangeText = { text => console . log ( text ) } />
110
+ < TextInput style = { styles . input } placeholder = { "Event Description" } autoCapitalize = 'none' autoCorrect = { false } value = { eventDescription } onChangeText = { text => setEventDescription ( text ) } />
62
111
< Text style = { styles . label } > Event Price:</ Text >
63
- < TextInput style = { styles . input } placeholder = { "Price in $00,00" } autoCapitalize = 'none' autoCorrect = { false } value = { eventPrice } onChangeText = { text => console . log ( text ) } />
112
+ < TextInput style = { styles . input } placeholder = { "Price in $00,00" } autoCapitalize = 'none' autoCorrect = { false } value = { eventPrice } onChangeText = { text => setEventPrice ( text ) } />
113
+ </ View >
114
+ < View >
115
+ < Text style = { styles . label } > Event Date:</ Text >
116
+ < DateTimePicker
117
+ value = { eventDate }
118
+ mode = 'date'
119
+ onChange = { onChange }
120
+ />
64
121
</ View >
65
122
< View >
66
123
< Text style = { styles . label } > Sport: { eventSport } </ Text >
67
- < Picker selectedValue = { eventSport } onValueChange = { value => setEventSport ( value ) } >
124
+ < Picker mode = { "dialog" } style = { styles . sportPicker } selectedValue = { eventSport } onValueChange = { value => setEventSport ( value ) } >
68
125
< Picker . Item label = { 'Running' } value = { 'Running' } />
69
126
< Picker . Item label = { 'Cycling' } value = { 'Cycling' } />
70
127
< Picker . Item label = { 'Swimming' } value = { 'Swimming' } />
71
128
</ Picker >
72
-
73
129
</ View >
74
-
75
-
76
130
</ View >
77
131
< TouchableOpacity
78
- style = { [ styles . button , styles . buttonClose ] }
79
- onPress = { ( ) => setIsVisible ( ! isVisible ) }
132
+ style = { styles . primaryBtn }
133
+ onPress = { submitEventHandler }
80
134
>
81
- < Text style = { styles . textStyle } > Hide Modal</ Text >
135
+ < Text style = { styles . textStyle } > Submit Event</ Text >
136
+ </ TouchableOpacity >
137
+ < TouchableOpacity
138
+ style = { styles . secondaryBtn }
139
+ onPress = { cancelEventHandler }
140
+ >
141
+ < Text style = { styles . textStyle } > Cancel</ Text >
82
142
</ TouchableOpacity >
83
143
</ View >
84
144
</ View >
@@ -92,16 +152,15 @@ const styles = StyleSheet.create({
92
152
centeredView : {
93
153
flex : 1 ,
94
154
justifyContent : "center" ,
95
- alignItems : "center" ,
96
- marginTop : 22
155
+ alignItems : "center"
97
156
} ,
98
157
modalView : {
99
158
margin : 20 ,
100
159
height : windowHeight ,
101
160
width : widowWidth ,
102
161
backgroundColor : "white" ,
103
162
borderRadius : 20 ,
104
- padding : 35 ,
163
+ padding : 25 ,
105
164
alignItems : "center" ,
106
165
shadowColor : "#000" ,
107
166
shadowOffset : {
@@ -112,30 +171,14 @@ const styles = StyleSheet.create({
112
171
shadowRadius : 4 ,
113
172
elevation : 5
114
173
} ,
115
- button : {
116
- borderRadius : 20 ,
117
- padding : 10 ,
118
- elevation : 2
119
- } ,
120
- buttonOpen : {
121
- backgroundColor : "#F194FF" ,
122
- } ,
123
- buttonClose : {
124
- backgroundColor : "#2196F3" ,
125
- } ,
126
174
textStyle : {
127
175
color : "white" ,
128
176
fontWeight : "bold" ,
129
177
textAlign : "center"
130
178
} ,
131
- modalText : {
132
- marginBottom : 15 ,
133
- textAlign : "center"
134
- } ,
135
179
form : {
136
180
alignSelf : "stretch" ,
137
- paddingHorizontal : 30 ,
138
- marginTop : 30
181
+ marginTop : 16
139
182
} ,
140
183
label : {
141
184
fontSize : 16 ,
@@ -152,24 +195,42 @@ const styles = StyleSheet.create({
152
195
fontWeight : "400" ,
153
196
height : 44 ,
154
197
shadowColor : '#000000' ,
155
- marginBottom : 30 ,
198
+ marginBottom : 15 ,
156
199
borderRadius : 4
157
200
} ,
158
201
primaryBtn : {
159
202
height : 42 ,
203
+ width : '100%' ,
160
204
backgroundColor : '#007bff' ,
161
205
justifyContent : 'center' ,
162
206
alignItems : 'center' ,
163
207
borderRadius : 4 ,
164
- marginTop : 20
208
+ marginTop : 10
165
209
} ,
166
210
secondaryBtn : {
167
211
height : 42 ,
212
+ width : '100%' ,
168
213
backgroundColor : '#f04a5b' ,
169
214
justifyContent : 'center' ,
170
215
alignItems : 'center' ,
171
216
borderRadius : 4 ,
172
- marginTop : 20
217
+ marginTop : 10
218
+ } ,
219
+ addImage : {
220
+ justifyContent : 'center' ,
221
+ alignItems : 'center' ,
222
+ marginBottom : 28 ,
223
+ width : '100%' ,
224
+ height : 150
225
+ } ,
226
+ loadedImage : {
227
+ width : '100%' ,
228
+ height : 150 ,
229
+ justifyContent : 'center' ,
230
+ alignItems : 'center' ,
231
+ } ,
232
+ sportPicker : {
233
+
173
234
}
174
235
} ) ;
175
236
0 commit comments