create-gufran-expo-app 2.0.4 → 2.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +60 -321
  2. package/bin/cli.js +0 -1
  3. package/package.json +4 -3
  4. package/template/src/navigation/AuthStack.tsx +6 -25
  5. package/template/src/navigation/MainStack.tsx +0 -148
  6. package/template/src/navigation/RootNavigator.tsx +4 -26
  7. package/template/src/navigation/index.ts +0 -1
  8. package/template/src/navigation/navigationRef.ts +1 -1
  9. package/template/src/screens/HomeScreen.tsx +3 -215
  10. package/template/src/screens/auth/LoginScreen.tsx +13 -13
  11. package/template/src/screens/auth/index.ts +1 -6
  12. package/template/src/screens/index.ts +0 -35
  13. package/template/src/services/api.ts +5 -5
  14. package/template/src/services/authService.ts +3 -299
  15. package/template/src/services/mainServices.ts +19 -1914
  16. package/template/src/types/navigation.ts +5 -155
  17. package/template/src/utils/index.ts +5 -8
  18. package/template/src/navigation/MiddleStack.tsx +0 -35
  19. package/template/src/screens/auth/AddMamber.tsx +0 -428
  20. package/template/src/screens/auth/ForgotPasswordScreen.tsx +0 -176
  21. package/template/src/screens/auth/OTPVerifyScreen.tsx +0 -359
  22. package/template/src/screens/auth/RegisterScreen.tsx +0 -430
  23. package/template/src/screens/auth/SuccessScreen.tsx +0 -201
  24. package/template/src/screens/chat/ChatScreen.tsx +0 -1819
  25. package/template/src/screens/chat/ChatThreadsScreen.tsx +0 -360
  26. package/template/src/screens/chat/ReportMessageScreen.tsx +0 -238
  27. package/template/src/screens/clubs/Announcements.tsx +0 -426
  28. package/template/src/screens/clubs/BuyRaffleTicketsScreen.tsx +0 -568
  29. package/template/src/screens/clubs/ClubDeteils.tsx +0 -497
  30. package/template/src/screens/clubs/JoinClub.tsx +0 -841
  31. package/template/src/screens/events/EventScreen.tsx +0 -460
  32. package/template/src/screens/raffles/MyReferralMembersScreen.tsx +0 -758
  33. package/template/src/screens/raffles/RaffleDetailsScreen.tsx +0 -762
  34. package/template/src/screens/raffles/RafflesScreen.tsx +0 -495
  35. package/template/src/screens/raffles/SetRaffleReminderScreen.tsx +0 -390
  36. package/template/src/screens/teams/JoinTeamScreen.tsx +0 -464
  37. package/template/src/screens/teams/MyTeamDetailsScreen.tsx +0 -979
  38. package/template/src/screens/teams/MyTeamScreen.tsx +0 -568
  39. package/template/src/screens/teams/PendingRequestsScreen.tsx +0 -426
  40. package/template/src/screens/volunteerOpportunities/SetReminderScreen.tsx +0 -631
  41. package/template/src/screens/volunteerOpportunities/VolunteerOpportunitiesDetailsScreen.tsx +0 -1049
  42. package/template/src/screens/volunteerOpportunities/VolunteerOpportunitiesScreen.tsx +0 -608
  43. package/template/src/utils/ClubSearchManager.ts +0 -222
@@ -1,762 +0,0 @@
1
- import React, { useState } from 'react';
2
- import {
3
- View,
4
- Text,
5
- StyleSheet,
6
- StatusBar,
7
- Platform,
8
- TouchableOpacity,
9
- ScrollView,
10
- Image,
11
- ActivityIndicator,
12
- Modal,
13
- useWindowDimensions,
14
- Alert,
15
- Linking,
16
- } from 'react-native';
17
- import { SafeAreaView } from 'react-native-safe-area-context';
18
- import RenderHtml from 'react-native-render-html';
19
- import { theme } from '../../constants';
20
- import { moderateScale } from '../../utils/scaling';
21
- import { Fonts } from '../../constants/Fonts';
22
- import SVG from '../../assets/icons';
23
- import { NativeStackScreenProps } from '@react-navigation/native-stack';
24
- import { MainStackParamList } from '@navigation';
25
- import { useRaffleDetails } from '../../services/mainServices';
26
- import { Button } from '../../components/common';
27
- import { useFocusEffect } from '@react-navigation/native';
28
-
29
- type RaffleDetailsScreenProps = NativeStackScreenProps<MainStackParamList, 'RaffleDetails'>;
30
-
31
- export const RaffleDetailsScreen: React.FC<RaffleDetailsScreenProps> = ({ navigation, route }) => {
32
- const { selectedClub, selectedMember, raffleId } = route.params;
33
-
34
- // Fetch raffle details from API
35
- const { data: raffleResponse, isLoading, isError, error, refetch } = useRaffleDetails(raffleId);
36
-
37
- useFocusEffect(
38
- React.useCallback(() => {
39
- refetch();
40
- }, [])
41
- );
42
-
43
-
44
- // Get direct API data
45
- const raffleData = raffleResponse?.data?.data;
46
-
47
- // Modal state for description
48
- const [isDescriptionModalVisible, setIsDescriptionModalVisible] = useState(false);
49
-
50
- // Get window dimensions for HTML rendering
51
- const { width } = useWindowDimensions();
52
-
53
- // Loading state
54
- if (isLoading) {
55
- return (
56
- <View style={[styles.container, { justifyContent: 'center', alignItems: 'center' }]}>
57
- <StatusBar barStyle="light-content" backgroundColor={theme.colors.blue} />
58
- <ActivityIndicator size="large" color={theme.colors.blue} />
59
- </View>
60
- );
61
- }
62
-
63
- // Error state
64
- if (isError) {
65
- return (
66
- <View style={[styles.container, { justifyContent: 'center', alignItems: 'center', padding: theme.spacing.lg }]}>
67
- <StatusBar barStyle="light-content" backgroundColor={theme.colors.blue} />
68
- <Text style={styles.title}>Failed to load raffle details</Text>
69
- <TouchableOpacity
70
- style={[styles.buyButton, { marginTop: theme.spacing.md }]}
71
- onPress={() => navigation.goBack()}
72
- >
73
- <Text style={styles.buyButtonText}>Go Back</Text>
74
- </TouchableOpacity>
75
- </View>
76
- );
77
- }
78
-
79
- // Helper to format amount
80
- const formatAmount = (amount: number) => {
81
- return amount > 0 ? `$${amount.toLocaleString()}` : '$0';
82
- };
83
-
84
- // Helper to get ordinal suffix
85
- const getOrdinalSuffix = (rank: number) => {
86
- const lastDigit = rank % 10;
87
- const lastTwoDigits = rank % 100;
88
-
89
- if (lastTwoDigits >= 11 && lastTwoDigits <= 13) {
90
- return 'th';
91
- }
92
-
93
- switch (lastDigit) {
94
- case 1:
95
- return ' st';
96
- case 2:
97
- return ' nd';
98
- case 3:
99
- return ' rd';
100
- default:
101
- return ' th';
102
- }
103
- };
104
-
105
-
106
- const handleOpenMap = (lat: number | undefined, lng: number | undefined, label: string) => {
107
- if (lat && lng && lat !== 0 && lng !== 0) {
108
- const scheme = Platform.select({ ios: 'maps:0,0?q=', android: 'geo:0,0?q=' });
109
- const latLng = `${lat},${lng}`;
110
- const url = Platform.select({
111
- ios: `${scheme}${label}@${latLng}`,
112
- android: `${scheme}${latLng}(${label})`
113
- });
114
- if (url) {
115
- Linking.openURL(url);
116
- }
117
- }
118
- };
119
-
120
-
121
- return (
122
- <View style={styles.container}>
123
- <StatusBar
124
- barStyle="light-content"
125
- backgroundColor={theme.colors.blue}
126
- translucent={Platform.OS === 'android'}
127
- />
128
- {Platform.OS === 'ios' && <View style={styles.statusBarBackground} />}
129
-
130
- <SafeAreaView style={styles.header}>
131
- <View style={{ flexDirection: 'row', paddingHorizontal: theme.spacing.lg }}>
132
- <TouchableOpacity onPress={() => navigation.goBack()}>
133
- <SVG.arrowLeft_white width={moderateScale(25)} height={moderateScale(25)} />
134
- </TouchableOpacity>
135
- <View style={{ flexDirection: 'row' }}>
136
- <View style={styles.userConSty}>
137
- {!!selectedClub?.clubImage ? (
138
- <Image
139
- source={{ uri: selectedClub?.clubImage }}
140
- resizeMode='cover'
141
- style={styles.userDetailsSty}
142
- />
143
- ) : (
144
- <View style={styles.placeholderLogoHeader}>
145
- <SVG.UsersIcon width={moderateScale(20)} height={moderateScale(20)} />
146
- </View>
147
- )}
148
- </View>
149
- <Text style={styles.userNameSty}>{selectedClub?.clubName || 'Club'}</Text>
150
- </View>
151
- </View>
152
-
153
- <View style={styles.content}>
154
- <ScrollView
155
- showsVerticalScrollIndicator={false}
156
- contentContainerStyle={styles.scrollContent}
157
- >
158
- {/* Banner Image */}
159
- {raffleData.bannerImageUrl && (
160
- <View style={styles.imageContainer}>
161
- <Image
162
- source={{ uri: raffleData.bannerImageUrl }}
163
- style={styles.raffleImage}
164
- />
165
- </View>
166
- )}
167
-
168
- <View style={styles.mainContent}>
169
- {/* Title */}
170
- <Text numberOfLines={2} style={styles.title}>{raffleData.raffleTitle}</Text>
171
-
172
- {/* Purchase End Date */}
173
- <Text style={styles.dateRange}>End Date: {raffleData.purchaseEndDate}</Text>
174
-
175
- {/* Buy Tickets Button */}
176
-
177
- {/* Prize Pool */}
178
- <View style={{ backgroundColor: theme.colors.lightLavenderGray, alignItems: 'center', paddingVertical: moderateScale(20), paddingHorizontal: moderateScale(10), borderRadius: moderateScale(10), marginBottom: moderateScale(20) }}>
179
-
180
- <View style={styles.prizePoolContainer}>
181
- <Text style={styles.prizePoolLabel}>Prize Pool: <Text style={styles.prizeAmount}>${raffleData.totalPricePoolAmount}</Text></Text>
182
-
183
- </View>
184
-
185
- {/* Draw Date */}
186
- <View style={styles.drawDateContainer}>
187
- <Text style={styles.drawDate}>
188
- Draw Date: {raffleData?.drawDate}{raffleData?.drawTime && ` ${raffleData?.drawTime}`}
189
- </Text>
190
- </View>
191
- </View>
192
-
193
- {/* View Description Button - Opens modal with HTML description */}
194
- {raffleData.description && (
195
- <Button
196
- title="View Details"
197
- onPress={() => setIsDescriptionModalVisible(true)}
198
- variant='outline'
199
- size='small'
200
- style={{ marginBottom: moderateScale(16), borderColor: theme.colors.blue, borderWidth: 1 }}
201
- textStyle={{ fontFamily: Fonts.outfitBold, fontSize: moderateScale(16), color: theme.colors.blue }}
202
- />
203
- )}
204
-
205
- {/* Terms & Conditions */}
206
- {raffleData?.termsAndConditionFileUrl && (
207
- <TouchableOpacity
208
- style={styles.termsButton}
209
- onPress={async () => {
210
- try {
211
- const url = raffleData.termsAndConditionFileUrl;
212
- const supported = await Linking.canOpenURL(url);
213
-
214
- if (supported) {
215
- await Linking.openURL(url);
216
- } else {
217
- Alert.alert(
218
- 'Error',
219
- 'Unable to open the document URL.',
220
- [{ text: 'OK' }]
221
- );
222
- }
223
- } catch (error) {
224
- console.error('Error opening document:', error);
225
- Alert.alert(
226
- 'Error',
227
- 'Unable to open the document. Please try again later.',
228
- [{ text: 'OK' }]
229
- );
230
- }
231
- }}
232
- >
233
- <SVG.PDFAppleGreen width={moderateScale(20)} height={moderateScale(20)} />
234
- <Text style={styles.termsButtonText}>Terms & Conditions</Text>
235
- <SVG.DownloadBlue width={moderateScale(20)} height={moderateScale(20)} />
236
- </TouchableOpacity>
237
- )}
238
-
239
- {/* The Draw Section */}
240
- <View style={styles.section}>
241
- <Text style={styles.sectionTitle}>The Draw</Text>
242
-
243
- <View style={styles.infoRow}>
244
- <View style={styles.infoRowIconBG}>
245
- <SVG.CalendarBlue width={moderateScale(25)} height={moderateScale(25)} />
246
- </View>
247
- <View style={styles.infoTextContainer}>
248
- <Text style={styles.infoLabel}>Date</Text>
249
- <Text style={styles.infoValue}>{raffleData.drawDate}</Text>
250
- </View>
251
- </View>
252
-
253
- {raffleData.drawTime && (
254
- <View style={styles.infoRow}>
255
- <View style={styles.infoRowIconBG}>
256
- <SVG.Clock_Blue width={moderateScale(25)} height={moderateScale(25)} />
257
- </View>
258
- <View style={styles.infoTextContainer}>
259
- <Text style={styles.infoLabel}>Time</Text>
260
- <Text style={styles.infoValue}>{raffleData.drawTime}</Text>
261
- </View>
262
- </View>
263
- )}
264
-
265
- {raffleData.locationAddress && (
266
- <TouchableOpacity style={styles.infoRow}
267
- onPress={() => handleOpenMap(raffleData.latitude, raffleData.longitude, raffleData.locationAddress)}
268
- >
269
- <View style={styles.infoRowIconBG}>
270
- <SVG.locationBlue width={moderateScale(25)} height={moderateScale(25)} />
271
- </View>
272
- <View style={styles.infoTextContainer}>
273
- <Text style={styles.infoLabel}>Location</Text>
274
- <Text style={styles.infoValue}>{raffleData.locationAddress}</Text>
275
- </View>
276
- </TouchableOpacity>
277
- )}
278
- </View>
279
-
280
- {/* Set Reminders */}
281
- <Button
282
- title="Manage Reminders"
283
- onPress={() => {
284
- navigation.navigate('SetRaffleReminder', {
285
- selectedClub,
286
- selectedMember,
287
- raffle: raffleData,
288
- });
289
- }}
290
- variant='outline'
291
- size='small'
292
- style={{ marginBottom: moderateScale(20), borderColor: theme.colors.blue, borderWidth: 1 }}
293
- textStyle={{ fontFamily: Fonts.outfitBold, fontSize: moderateScale(16), color: theme.colors.blue }}
294
- />
295
-
296
- {/* Prizes Section */}
297
- {raffleData.pricePools && raffleData.pricePools.length > 0 && (
298
- <View style={styles.section}>
299
- <Text style={styles.sectionTitle}>The Prize</Text>
300
- <View style={styles.prizesContainer}>
301
- {raffleData?.pricePools.map((prize, index) => (
302
- <View key={prize.id} style={styles.prizeCard}>
303
- <View style={{
304
- marginRight: moderateScale(12),
305
- alignItems: 'center',
306
- justifyContent: 'center',
307
- width: moderateScale(55),
308
- height: moderateScale(55),
309
- borderRadius: moderateScale(28.5),
310
- backgroundColor: theme.colors.white,
311
- borderWidth: 1.5,
312
- borderColor: theme.colors.lightLavenderGray,
313
- }}>
314
- <Text style={styles.prizePosition}>{prize?.prizeRank}{getOrdinalSuffix(prize?.prizeRank)}</Text>
315
- <Text style={styles.prizeText}>PRIZE</Text>
316
- </View>
317
-
318
- <View style={{ flex: 1, backgroundColor: theme.colors.lightLavenderGray, borderRadius: moderateScale(8), }}>
319
-
320
- {prize?.bannerImageUrl && (
321
- <Image
322
- source={{ uri: prize?.bannerImageUrl }}
323
- style={styles.prizeImage}
324
- />
325
- )}
326
- <View style={{ padding: moderateScale(8) }}>
327
- <Text numberOfLines={5} style={styles.prizeTitle}>{prize?.title} (${prize?.prizeAmount})</Text>
328
- <Text style={styles.prizeAmountText}>{prize?.description}</Text>
329
- </View>
330
- </View>
331
- </View>
332
- ))}
333
- </View>
334
- </View>
335
- )}
336
- </View>
337
- </ScrollView>
338
- </View>
339
- </SafeAreaView>
340
-
341
- {/* Description Modal */}
342
- <Modal
343
- visible={isDescriptionModalVisible}
344
- animationType="fade"
345
- transparent={true}
346
- onRequestClose={() => setIsDescriptionModalVisible(false)}
347
- >
348
- <View style={styles.modalOverlay}>
349
- <TouchableOpacity
350
- style={styles.modalBackdrop}
351
- activeOpacity={1}
352
- onPress={() => setIsDescriptionModalVisible(false)}
353
- />
354
- <View style={styles.modalContainer}>
355
- {/* Drag Handle */}
356
- <View style={styles.dragHandle} />
357
-
358
- {/* Modal Header */}
359
- <View style={styles.modalHeader}>
360
- <Text style={styles.modalTitle}>Raffle Description</Text>
361
- <TouchableOpacity
362
- onPress={() => setIsDescriptionModalVisible(false)}
363
- style={styles.closeButton}
364
- >
365
- <Text style={styles.closeButtonText}>✕</Text>
366
- </TouchableOpacity>
367
- </View>
368
-
369
- {/* HTML Content with ScrollView */}
370
- <ScrollView
371
- style={styles.modalScrollView}
372
- showsVerticalScrollIndicator={false}
373
- >
374
- {raffleData?.description ? (
375
- <RenderHtml
376
- contentWidth={width - moderateScale(80)}
377
- source={{ html: raffleData.description }}
378
- tagsStyles={{
379
- body: {
380
- fontFamily: Fonts.outfitRegular,
381
- fontSize: moderateScale(14),
382
- color: theme.colors.text,
383
- lineHeight: moderateScale(22),
384
- },
385
- p: {
386
- marginBottom: moderateScale(12),
387
- },
388
- h1: {
389
- fontFamily: Fonts.outfitBold,
390
- fontSize: moderateScale(20),
391
- color: theme.colors.text,
392
- marginBottom: moderateScale(12),
393
- },
394
- h2: {
395
- fontFamily: Fonts.outfitBold,
396
- fontSize: moderateScale(18),
397
- color: theme.colors.text,
398
- marginBottom: moderateScale(10),
399
- },
400
- h3: {
401
- fontFamily: Fonts.outfitSemiBold,
402
- fontSize: moderateScale(16),
403
- color: theme.colors.text,
404
- marginBottom: moderateScale(8),
405
- },
406
- strong: {
407
- fontFamily: Fonts.outfitBold,
408
- },
409
- em: {
410
- fontFamily: Fonts.outfitRegular,
411
- fontStyle: 'italic',
412
- },
413
- u: {
414
- textDecorationLine: 'underline',
415
- textDecorationStyle: 'solid',
416
- },
417
- s: {
418
- textDecorationLine: 'line-through',
419
- textDecorationStyle: 'solid',
420
- },
421
- ul: {
422
- marginBottom: moderateScale(12),
423
- },
424
- ol: {
425
- marginBottom: moderateScale(12),
426
- },
427
- li: {
428
- marginBottom: moderateScale(6),
429
- },
430
- }}
431
- />
432
- ) : (
433
- <Text style={styles.noDescriptionText}>No description available</Text>
434
- )}
435
- </ScrollView>
436
- </View>
437
- </View>
438
- </Modal>
439
- </View>
440
- );
441
- };
442
-
443
- const styles = StyleSheet.create({
444
- container: {
445
- flex: 1,
446
- backgroundColor: theme.colors.blue,
447
- },
448
- statusBarBackground: {
449
- position: 'absolute',
450
- top: 0,
451
- left: 0,
452
- right: 0,
453
- height: Platform.OS === 'ios' ? 44 : 0,
454
- backgroundColor: theme.colors.blue,
455
- zIndex: 1000,
456
- },
457
- header: {
458
- flex: 1,
459
- backgroundColor: theme.colors.blue,
460
- paddingVertical: theme.spacing.xs,
461
- paddingTop: Platform.OS === 'android' ? theme.spacing.lg : theme.spacing.xs,
462
- },
463
- userConSty: {
464
- marginHorizontal: moderateScale(10),
465
- width: moderateScale(30),
466
- height: moderateScale(30),
467
- borderRadius: moderateScale(15),
468
- borderWidth: 1.5,
469
- borderColor: theme.colors.imageBorder,
470
- backgroundColor: theme.colors.background,
471
- alignItems: 'center',
472
- justifyContent: 'center',
473
- },
474
- userNameSty: {
475
- marginTop: moderateScale(5),
476
- color: theme.colors.white,
477
- fontFamily: Fonts.outfitMedium,
478
- fontSize: moderateScale(15),
479
- },
480
- userDetailsSty: {
481
- width: moderateScale(30),
482
- height: moderateScale(30),
483
- borderRadius: moderateScale(15),
484
- },
485
- placeholderLogoHeader: {
486
- width: moderateScale(20),
487
- height: moderateScale(20),
488
- borderRadius: moderateScale(10),
489
- alignItems: 'center',
490
- justifyContent: 'center',
491
- },
492
- content: {
493
- flex: 1,
494
- backgroundColor: theme.colors.white,
495
- paddingHorizontal: theme.spacing.lg,
496
- marginTop: theme.spacing.md,
497
- paddingTop: theme.spacing.md,
498
- borderTopLeftRadius: moderateScale(30),
499
- borderTopRightRadius: moderateScale(30),
500
- },
501
- scrollContent: {
502
- paddingBottom: theme.spacing.xl,
503
- },
504
- imageContainer: {
505
- width: '100%',
506
- height: moderateScale(200),
507
- },
508
- raffleImage: {
509
- width: '100%',
510
- height: '100%',
511
- resizeMode: 'cover',
512
- borderRadius: moderateScale(18),
513
- },
514
- mainContent: {
515
- paddingTop: theme.spacing.md,
516
- },
517
- title: {
518
- fontFamily: Fonts.outfitBold,
519
- fontSize: moderateScale(18),
520
- color: theme.colors.text,
521
- marginBottom: moderateScale(8),
522
- },
523
- dateRange: {
524
- fontFamily: Fonts.outfitRegular,
525
- fontSize: moderateScale(13),
526
- color: theme.colors.text,
527
- marginBottom: moderateScale(16),
528
- },
529
- buyButton: {
530
- backgroundColor: theme.colors.blue,
531
- borderRadius: moderateScale(25),
532
- paddingVertical: moderateScale(14),
533
- alignItems: 'center',
534
- justifyContent: 'center',
535
- flexDirection: 'row',
536
- width: '100%',
537
- marginBottom: moderateScale(16),
538
- },
539
- buyButtonDisabled: {
540
- backgroundColor: theme.colors.textSecondary,
541
- opacity: 0.7,
542
- },
543
- buyButtonText: {
544
- fontFamily: Fonts.outfitSemiBold,
545
- fontSize: moderateScale(16),
546
- color: theme.colors.white,
547
- },
548
- prizePoolContainer: {
549
- flexDirection: 'row',
550
- alignItems: 'center',
551
- justifyContent: 'center',
552
- marginBottom: moderateScale(4),
553
- },
554
- prizePoolLabel: {
555
- fontFamily: Fonts.outfitRegular,
556
- fontSize: moderateScale(16),
557
- color: theme.colors.appleGreen,
558
- },
559
- prizeAmount: {
560
- fontFamily: Fonts.outfitSemiBold,
561
- fontSize: moderateScale(16),
562
- color: theme.colors.appleGreen,
563
- },
564
- drawDateContainer: {
565
- alignItems: 'center',
566
- },
567
- drawDate: {
568
- fontFamily: Fonts.outfitRegular,
569
- fontSize: moderateScale(12),
570
- color: theme.colors.textSecondary,
571
- },
572
- section: {
573
- marginBottom: moderateScale(20),
574
- },
575
- sectionTitle: {
576
- fontFamily: Fonts.outfitBold,
577
- fontSize: moderateScale(16),
578
- color: theme.colors.text,
579
- marginBottom: moderateScale(8),
580
- },
581
- description: {
582
- fontFamily: Fonts.outfitRegular,
583
- fontSize: moderateScale(13),
584
- color: theme.colors.text,
585
- lineHeight: moderateScale(20),
586
- marginBottom: moderateScale(12),
587
- },
588
- detailsButton: {
589
- backgroundColor: theme.colors.white,
590
- borderWidth: 1.5,
591
- borderColor: theme.colors.blue,
592
- borderRadius: moderateScale(25),
593
- paddingVertical: moderateScale(14),
594
- alignItems: 'center',
595
- marginBottom: moderateScale(12),
596
- },
597
- detailsButtonText: {
598
- fontFamily: Fonts.outfitSemiBold,
599
- fontSize: moderateScale(14),
600
- color: theme.colors.blue,
601
- },
602
- termsButton: {
603
- flexDirection: 'row',
604
- alignItems: 'center',
605
- justifyContent: 'space-between',
606
- backgroundColor: theme.colors.lightLavenderGray,
607
- borderRadius: theme.borderRadius.lg,
608
- paddingVertical: theme.spacing.md,
609
- paddingHorizontal: theme.spacing.md,
610
- marginBottom: theme.spacing.md,
611
- },
612
- termsButtonText: {
613
- fontFamily: Fonts.outfitSemiBold,
614
- fontSize: moderateScale(14),
615
- color: theme.colors.blue,
616
- flex: 1,
617
- marginLeft: theme.spacing.sm,
618
- },
619
- infoRow: {
620
- flexDirection: 'row',
621
- alignItems: 'center',
622
- backgroundColor: theme.colors.white,
623
- paddingVertical: moderateScale(14),
624
- marginBottom: moderateScale(10),
625
- borderBottomWidth: 1.5,
626
- borderColor: theme.colors.lightLavenderGray,
627
- },
628
- infoRowIconBG: {
629
- backgroundColor: theme.colors.lightLavenderGray,
630
- padding: moderateScale(12),
631
- borderRadius: theme.borderRadius.xxl
632
- },
633
- infoTextContainer: {
634
- marginLeft: moderateScale(16),
635
- flex: 1,
636
- },
637
- infoLabel: {
638
- fontFamily: Fonts.outfitBold,
639
- fontSize: moderateScale(13),
640
- color: theme.colors.text,
641
- marginBottom: moderateScale(2),
642
- },
643
- infoValue: {
644
- fontFamily: Fonts.outfitRegular,
645
- fontSize: moderateScale(13),
646
- color: theme.colors.text,
647
- },
648
- reminderButton: {
649
- backgroundColor: theme.colors.white,
650
- borderRadius: moderateScale(25),
651
- paddingVertical: moderateScale(14),
652
- alignItems: 'center',
653
- marginBottom: moderateScale(20),
654
- borderWidth: 1.5,
655
- borderColor: theme.colors.blue,
656
- },
657
- reminderButtonText: {
658
- fontFamily: Fonts.outfitSemiBold,
659
- fontSize: moderateScale(14),
660
- color: theme.colors.blue,
661
- },
662
- prizesContainer: {
663
- gap: moderateScale(12),
664
- },
665
- prizeCard: {
666
- flex: 1,
667
- flexDirection: 'row',
668
- borderRadius: moderateScale(12),
669
- },
670
- prizePosition: {
671
- fontFamily: Fonts.outfitSemiBold,
672
- fontSize: moderateScale(14),
673
- color: theme.colors.blue,
674
- },
675
- prizeText: {
676
- fontFamily: Fonts.outfitSemiBold,
677
- fontSize: moderateScale(10),
678
- color: theme.colors.paraText,
679
- },
680
- prizeImage: {
681
- width: '100%',
682
- height: moderateScale(120),
683
- borderRadius: moderateScale(8),
684
- },
685
- prizeTitle: {
686
- fontFamily: Fonts.outfitSemiBold,
687
- fontSize: theme.typography.fontSize.md,
688
- color: theme.colors.text,
689
- marginBottom: theme.spacing.sm,
690
- },
691
- prizeAmountText: {
692
- fontFamily: Fonts.outfitRegular,
693
- fontSize: moderateScale(13),
694
- color: theme.colors.black,
695
- },
696
- // Modal Styles (matching JoinClub pattern)
697
- modalOverlay: {
698
- flex: 1,
699
- justifyContent: 'flex-end',
700
- },
701
- modalBackdrop: {
702
- position: 'absolute',
703
- top: 0,
704
- left: 0,
705
- right: 0,
706
- bottom: 0,
707
- backgroundColor: 'rgba(0, 0, 0, 0.5)',
708
- },
709
- modalContainer: {
710
- backgroundColor: theme.colors.white,
711
- borderTopLeftRadius: moderateScale(20),
712
- borderTopRightRadius: moderateScale(20),
713
- paddingHorizontal: theme.spacing.lg,
714
- paddingTop: theme.spacing.sm,
715
- paddingBottom: theme.spacing.xl,
716
- height: '75%',
717
- maxHeight: '75%',
718
- },
719
- dragHandle: {
720
- width: moderateScale(40),
721
- height: moderateScale(4),
722
- backgroundColor: theme.colors.border,
723
- borderRadius: moderateScale(2),
724
- alignSelf: 'center',
725
- marginBottom: theme.spacing.sm,
726
- },
727
- modalHeader: {
728
- flexDirection: 'row',
729
- justifyContent: 'space-between',
730
- alignItems: 'center',
731
- paddingVertical: theme.spacing.sm,
732
- marginBottom: theme.spacing.sm,
733
- },
734
- modalTitle: {
735
- fontFamily: Fonts.outfitBold,
736
- fontSize: moderateScale(18),
737
- color: theme.colors.text,
738
- },
739
- closeButton: {
740
- width: moderateScale(30),
741
- height: moderateScale(30),
742
- borderRadius: moderateScale(15),
743
- backgroundColor: '#F5F7FA',
744
- alignItems: 'center',
745
- justifyContent: 'center',
746
- },
747
- closeButtonText: {
748
- fontSize: moderateScale(20),
749
- color: theme.colors.text,
750
- fontWeight: 'bold',
751
- },
752
- modalScrollView: {
753
- flex: 1,
754
- },
755
- noDescriptionText: {
756
- fontFamily: Fonts.outfitRegular,
757
- fontSize: moderateScale(14),
758
- color: theme.colors.textSecondary,
759
- textAlign: 'center',
760
- marginTop: theme.spacing.xl,
761
- },
762
- });