1
- import React from 'react' ;
2
- import { View , Text , SafeAreaView } from 'react-native' ;
1
+ import React , { useState } from 'react' ;
2
+ import { View , Text , SafeAreaView , StyleSheet , ScrollView } from 'react-native' ;
3
3
import AppleHeader from 'react-native-apple-header' ;
4
- import BouncyCheckboxGroup , { CheckboxButton } from './lib/BouncyCheckboxGroup' ;
4
+ import BouncyCheckboxGroup , { CheckboxButton } from './lib/BouncyCheckboxGroup' ;
5
5
6
6
const _iconStyle = ( borderColor : string ) => ( {
7
7
height : 50 ,
@@ -10,12 +10,55 @@ const _iconStyle = (borderColor: string) => ({
10
10
borderColor : borderColor ,
11
11
} ) ;
12
12
13
- const styles = {
14
- container : { marginTop : 24 } ,
15
- verticalStyle : { marginTop : 16 } ,
16
- textStyle : { textDecorationLine : 'none' } ,
17
- iconImageStyle : { height : 20 , width : 20 } ,
18
- } ;
13
+ const styles = StyleSheet . create ( {
14
+ container : {
15
+ flex : 1 ,
16
+ } ,
17
+ verticalStyle : {
18
+ marginTop : 16 ,
19
+ } ,
20
+ textStyle : {
21
+ textDecorationLine : 'none' ,
22
+ fontSize : 16 ,
23
+ } ,
24
+ iconImageStyle : {
25
+ height : 20 ,
26
+ width : 20 ,
27
+ } ,
28
+ sectionTitle : {
29
+ color : '#a8a8ac' ,
30
+ fontWeight : '500' ,
31
+ fontSize : 16 ,
32
+ marginLeft : 32 ,
33
+ marginTop : 24 ,
34
+ } ,
35
+ checkboxContainer : {
36
+ marginTop : 16 ,
37
+ alignItems : 'center' ,
38
+ justifyContent : 'center' ,
39
+ } ,
40
+ verticalCheckboxContainer : {
41
+ marginTop : 16 ,
42
+ marginLeft : 32 ,
43
+ justifyContent : 'center' ,
44
+ } ,
45
+ scrollView : {
46
+ paddingBottom : 48 ,
47
+ } ,
48
+ selected : {
49
+ marginLeft : 32 ,
50
+ marginTop : 8 ,
51
+ fontSize : 14 ,
52
+ color : '#555' ,
53
+ } ,
54
+ description : {
55
+ marginLeft : 32 ,
56
+ marginTop : 4 ,
57
+ fontSize : 12 ,
58
+ color : '#888' ,
59
+ maxWidth : '90%' ,
60
+ } ,
61
+ } ) ;
19
62
20
63
const staticData : CheckboxButton [ ] = [
21
64
{
@@ -109,73 +152,147 @@ const verticalStaticData: CheckboxButton[] = [
109
152
] ;
110
153
111
154
const App = ( ) => {
155
+ const [ singleSelected , setSingleSelected ] = useState < CheckboxButton | null > ( null ) ;
156
+ const [ multipleSelected , setMultipleSelected ] = useState < CheckboxButton [ ] > ( [ ] ) ;
157
+ const [ verticalSelected , setVerticalSelected ] = useState < CheckboxButton | null > ( null ) ;
158
+ const [ fastAnimationSelected , setFastAnimationSelected ] = useState < CheckboxButton | null > ( null ) ;
159
+ const [ alwaysSelected , setAlwaysSelected ] = useState < CheckboxButton | null > ( null ) ;
160
+
112
161
const imageSource = {
113
162
uri : 'https://images.unsplash.com/photo-1499482125586-91609c0b5fd4?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=987&q=80' ,
114
163
} ;
115
164
116
165
const horizontalCheckboxGroupContainer = ( ) => (
117
166
< >
118
- < View style = { { marginLeft : 32 } } >
119
- < Text style = { { color : '#a8a8ac' , fontWeight : '500' , fontSize : 16 } } >
120
- Pick your favorite color
121
- </ Text >
122
- </ View >
123
- < View
124
- style = { {
125
- marginTop : 16 ,
126
- alignItems : 'center' ,
127
- justifyContent : 'center' ,
128
- } } >
167
+ < Text style = { styles . sectionTitle } >
168
+ Single Select - Pick your favorite color
169
+ </ Text >
170
+ < View style = { styles . checkboxContainer } >
129
171
< BouncyCheckboxGroup
130
172
data = { staticData }
173
+ spacing = { 8 }
174
+ initial = { 0 }
131
175
onChange = { ( selectedItem : CheckboxButton ) => {
132
- console . log ( 'SelectedItem: ' , JSON . stringify ( selectedItem ) ) ;
176
+ setSingleSelected ( selectedItem ) ;
177
+ console . log ( 'Single Selected: ' , JSON . stringify ( selectedItem ) ) ;
133
178
} }
134
179
/>
135
180
</ View >
181
+ { singleSelected && (
182
+ < Text style = { styles . selected } >
183
+ Selected: { singleSelected . id }
184
+ </ Text >
185
+ ) }
136
186
</ >
137
187
) ;
138
188
139
- const verticalCheckboxGroupContainer = ( ) => (
189
+ const alwaysSelectCheckboxGroupContainer = ( ) => (
140
190
< >
141
- < View style = { { marginLeft : 32 , marginTop : 24 } } >
142
- < Text style = { { color : '#a8a8ac' , fontWeight : '500' , fontSize : 16 } } >
143
- Pick your favorite color (Horizontal Style)
191
+ < Text style = { styles . sectionTitle } >
192
+ Always Selected Mode - Can't deselect
193
+ </ Text >
194
+ < Text style = { styles . description } >
195
+ Once an option is selected, it can't be deselected. You must select another option to change.
196
+ </ Text >
197
+ < View style = { styles . checkboxContainer } >
198
+ < BouncyCheckboxGroup
199
+ data = { staticData }
200
+ spacing = { 8 }
201
+ initial = { 0 }
202
+ alwaysSelect = { true }
203
+ onChange = { ( selectedItem : CheckboxButton ) => {
204
+ setAlwaysSelected ( selectedItem ) ;
205
+ console . log ( 'Always Selected: ' , JSON . stringify ( selectedItem ) ) ;
206
+ } }
207
+ />
208
+ </ View >
209
+ { alwaysSelected && (
210
+ < Text style = { styles . selected } >
211
+ Selected: { alwaysSelected . id }
144
212
</ Text >
213
+ ) }
214
+ </ >
215
+ ) ;
216
+
217
+ const multiSelectCheckboxGroupContainer = ( ) => (
218
+ < >
219
+ < Text style = { styles . sectionTitle } >
220
+ Multi Select - Choose multiple colors
221
+ </ Text >
222
+ < View style = { styles . checkboxContainer } >
223
+ < BouncyCheckboxGroup
224
+ data = { staticData }
225
+ spacing = { 8 }
226
+ multiple = { true }
227
+ initial = { [ 1 , 3 ] }
228
+ onChange = { ( selectedItems : CheckboxButton [ ] ) => {
229
+ setMultipleSelected ( selectedItems ) ;
230
+ console . log ( 'Multiple Selected: ' , JSON . stringify ( selectedItems ) ) ;
231
+ } }
232
+ />
145
233
</ View >
146
- < View
147
- style = { {
148
- marginTop : 16 ,
149
- marginLeft : 32 ,
150
- justifyContent : 'center' ,
151
- } } >
234
+ { multipleSelected . length > 0 && (
235
+ < Text style = { styles . selected } >
236
+ Selected: { multipleSelected . map ( item => item . id ) . join ( ', ' ) }
237
+ </ Text >
238
+ ) }
239
+ </ >
240
+ ) ;
241
+
242
+ const verticalCheckboxGroupContainer = ( ) => (
243
+ < >
244
+ < Text style = { styles . sectionTitle } >
245
+ Vertical Layout - Pick your favorite color
246
+ </ Text >
247
+ < View style = { styles . verticalCheckboxContainer } >
152
248
< BouncyCheckboxGroup
153
249
data = { verticalStaticData }
154
- style = { { flexDirection : 'column' } }
250
+ style = { { flexDirection : 'column' } }
251
+ spacing = { 0 }
155
252
onChange = { ( selectedItem : CheckboxButton ) => {
156
- console . log ( 'SelectedItem: ' , JSON . stringify ( selectedItem ) ) ;
253
+ setVerticalSelected ( selectedItem ) ;
254
+ console . log ( 'Vertical Selected: ' , JSON . stringify ( selectedItem ) ) ;
157
255
} }
158
256
/>
159
257
</ View >
258
+ { verticalSelected && (
259
+ < Text style = { styles . selected } >
260
+ Selected: { verticalSelected . text }
261
+ </ Text >
262
+ ) }
160
263
</ >
161
264
) ;
162
265
163
- return (
266
+ const fastAnimationCheckboxGroupContainer = ( ) => (
164
267
< >
165
- < SafeAreaView >
166
- < AppleHeader
167
- dateTitle = "Apr 19, 2024"
168
- largeTitle = "Welcome"
169
- imageSource = { imageSource }
170
- onPress = { ( ) => { } }
268
+ < Text style = { styles . sectionTitle } >
269
+ Custom Animation Speed (100ms)
270
+ </ Text >
271
+ < View style = { styles . checkboxContainer } >
272
+ < BouncyCheckboxGroup
273
+ data = { staticData }
274
+ spacing = { 8 }
275
+ animationDuration = { 100 }
276
+ onChange = { ( selectedItem : CheckboxButton ) => {
277
+ setFastAnimationSelected ( selectedItem ) ;
278
+ } }
171
279
/>
172
- < View style = { styles . container } >
173
- { horizontalCheckboxGroupContainer ( ) }
174
- { verticalCheckboxGroupContainer ( ) }
175
- </ View >
176
- </ SafeAreaView >
280
+ </ View >
177
281
</ >
178
282
) ;
283
+
284
+ return (
285
+ < SafeAreaView style = { { flex : 1 } } >
286
+
287
+ < ScrollView style = { styles . container } contentContainerStyle = { styles . scrollView } >
288
+ { horizontalCheckboxGroupContainer ( ) }
289
+ { alwaysSelectCheckboxGroupContainer ( ) }
290
+ { multiSelectCheckboxGroupContainer ( ) }
291
+ { verticalCheckboxGroupContainer ( ) }
292
+ { fastAnimationCheckboxGroupContainer ( ) }
293
+ </ ScrollView >
294
+ </ SafeAreaView >
295
+ ) ;
179
296
} ;
180
297
181
298
export default App ;
0 commit comments