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,979 +0,0 @@
1
- import React, { useState, useEffect, useCallback, useRef } from 'react';
2
- import { View, Text, StyleSheet, FlatList, StatusBar, Platform, TouchableOpacity, Image, ScrollView, ActivityIndicator } from 'react-native';
3
- import { MyTeamDetailsScreenProps } from '../../types/navigation';
4
- import { Strings, theme } from '../../constants';
5
- import { moderateScale, width } from '../../utils/scaling';
6
- import { Fonts } from '../../constants/Fonts';
7
- import SVG from '../../assets/icons';
8
- import { SafeAreaView } from 'react-native-safe-area-context';
9
- import { Button } from '../../components/common';
10
- import { useTeamDetails } from '../../services/mainServices';
11
- import { getApiErrorInfo, useGetImageUrl } from '../../services/authService';
12
- import ToastManager from '../../components/common/ToastManager';
13
-
14
- export const MyTeamDetailsScreen: React.FC<MyTeamDetailsScreenProps> = ({ navigation, route }) => {
15
- // const { club, selectedClub } = route?.params ?? {};
16
- // const teamId = club?.teamId;
17
-
18
-
19
- const { club, selectedClub, selectedMember }: any = route?.params ?? {};
20
-
21
- const teamDetail = route?.params ?? {}
22
- const teamId = club?.teamId;
23
- console.log("teamDetail===>>>", teamDetail);
24
-
25
-
26
- const { data, isLoading, error, refetch } = useTeamDetails(teamId);
27
-
28
- const TeamDetails: any = data?.data?.data;
29
- console.log("Team Details:", route?.params);
30
-
31
- const getImageUrlMutation = useGetImageUrl();
32
-
33
- const [teamImageUrl, setTeamImageUrl] = useState<string>('');
34
- const [memberImages, setMemberImages] = useState<{ [key: string]: string }>({});
35
- const [imageLoading, setImageLoading] = useState<{ [key: string]: boolean }>({});
36
- const [activeTab, setActiveTab] = useState<'details' | 'schedule'>('details');
37
-
38
- // Function to get team profile image URL
39
- const handleGetTeamImageUrl = () => {
40
- if (!TeamDetails?.teamDetail?.teamProfileImage) return;
41
-
42
- const teamImageName = TeamDetails.teamDetail.teamProfileImage;
43
-
44
- // Check if it contains a folder path
45
- let containerName = 'teams'; // default container
46
- let blobName = teamImageName;
47
-
48
- if (teamImageName.includes('/')) {
49
- const [folder, blob] = teamImageName.split('/');
50
- containerName = folder;
51
- blobName = blob;
52
- }
53
-
54
- setImageLoading(prev => ({ ...prev, teamProfile: true }));
55
-
56
- getImageUrlMutation.mutate({
57
- containerName: containerName,
58
- blobName: blobName
59
- }, {
60
- onSuccess: (response) => {
61
- const imageUrl = response?.data?.data?.url;
62
- setTeamImageUrl(imageUrl);
63
- console.log('Team Image URL response', response.data);
64
- setImageLoading(prev => ({ ...prev, teamProfile: false }));
65
- },
66
- onError: (error) => {
67
- const errorInfo = getApiErrorInfo(error);
68
- ToastManager.error(errorInfo?.message);
69
- console.error('Failed to get team image URL:', error);
70
- setTeamImageUrl('');
71
- setImageLoading(prev => ({ ...prev, teamProfile: false }));
72
- }
73
- });
74
- };
75
-
76
- // Function to get member image URL
77
- const handleGetMemberImageUrl = (memberImage: string, memberId: string) => {
78
- if (!memberImage) return;
79
-
80
- let containerName = 'members'; // default container
81
- let blobName = memberImage;
82
-
83
- if (memberImage.includes('/')) {
84
- const [folder, blob] = memberImage.split('/');
85
- containerName = folder;
86
- blobName = blob;
87
- }
88
-
89
- setImageLoading(prev => ({ ...prev, [memberId]: true }));
90
-
91
- getImageUrlMutation.mutate({
92
- containerName: containerName,
93
- blobName: blobName
94
- }, {
95
- onSuccess: (response) => {
96
- const imageUrl = response?.data?.data?.url;
97
- setMemberImages(prev => ({ ...prev, [memberId]: imageUrl }));
98
- setImageLoading(prev => ({ ...prev, [memberId]: false }));
99
- },
100
- onError: (error) => {
101
- const errorInfo = getApiErrorInfo(error);
102
- console.error('Failed to get member image URL:', error);
103
- setImageLoading(prev => ({ ...prev, [memberId]: false }));
104
- }
105
- });
106
- };
107
-
108
- // Effect to load team profile image
109
- useEffect(() => {
110
- if (TeamDetails?.teamDetail?.teamProfileImage) {
111
- handleGetTeamImageUrl();
112
- }
113
- }, [TeamDetails?.teamDetail?.teamProfileImage]);
114
-
115
- // Effect to load member images
116
- useEffect(() => {
117
- if (TeamDetails?.memberDetailList) {
118
- console.log('Processing member images:', TeamDetails.memberDetailList);
119
- TeamDetails.memberDetailList.forEach((member: any) => {
120
- console.log('Member:', member.memberName, 'Image:', member.memberImage, 'Has image:', member.memberImage && member.memberImage.trim() !== '');
121
- if (member.memberImage && member.memberImage.trim() !== '') {
122
- handleGetMemberImageUrl(member.memberImage, member.memberId.toString());
123
- }
124
- });
125
- }
126
- }, [TeamDetails?.memberDetailList]);
127
-
128
-
129
-
130
-
131
- // Function to generate date data for horizontal picker
132
- const generateDateData = () => {
133
- const dates = [];
134
- const today = new Date();
135
- const dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
136
-
137
- // Generate 14 days (7 before and 7 after today)
138
- for (let i = -7; i <= 7; i++) {
139
- const date = new Date(today);
140
- date.setDate(today.getDate() + i);
141
-
142
- dates.push({
143
- id: i,
144
- date: date.getDate(),
145
- month: date.getMonth() + 1,
146
- dayName: dayNames[date.getDay()],
147
- isToday: i === 0,
148
- fullDate: date
149
- });
150
- }
151
-
152
- return dates;
153
- };
154
-
155
- // Function to render date item
156
- const renderDateItem = ({ item }: { item: any }) => {
157
- return (
158
- <TouchableOpacity style={[
159
- styles.dateItem,
160
- item.isToday && styles.activeDateItem
161
- ]}>
162
- <Text style={[
163
- styles.dateNumber,
164
- item.isToday && styles.activeDateText
165
- ]}>
166
- {item.date}
167
- </Text>
168
- <Text style={[
169
- styles.dayName,
170
- item.isToday && styles.activeDateText
171
- ]}>
172
- {item.dayName}
173
- </Text>
174
- </TouchableOpacity>
175
- );
176
- };
177
-
178
- // Function to render individual player card
179
- const renderPlayerCard = (player: any) => {
180
-
181
- return (
182
- <View key={player.memberId} style={styles.playerCard}>
183
- {player?.memberImage ? (
184
- <Image
185
- source={{ uri: player?.memberImage }}
186
- style={styles.playerImage}
187
- />
188
- ) : (
189
- <View style={styles.playerPlaceholder}>
190
- <SVG.emptyUser
191
- width={moderateScale(50)}
192
- height={moderateScale(50)}
193
- />
194
- </View>
195
- )}
196
- {/* {isLoadingMemberImage && (
197
- <View style={styles.memberImageLoader}>
198
- <ActivityIndicator
199
- size="small"
200
- color={theme.colors.appleGreen}
201
- />
202
- </View>
203
- )} */}
204
- <View style={styles.playerNameOverlay}>
205
- <Text style={styles.playerName}>{player.memberName || 'Unknown Player'}</Text>
206
- </View>
207
- </View>
208
- );
209
- };
210
-
211
- if (!club) {
212
- return (
213
- <View style={styles.container}>
214
- <SafeAreaView style={styles.header}>
215
- <View style={styles.headerContent}>
216
- <TouchableOpacity onPress={() => navigation.goBack()}>
217
- <SVG.arrowLeft_white width={moderateScale(25)} height={moderateScale(25)} />
218
- </TouchableOpacity>
219
- <Text style={styles.headerTitle}>Team Details</Text>
220
- </View>
221
- </SafeAreaView>
222
- <View style={styles.errorContainer}>
223
- <Text style={styles.errorText}>No team data available</Text>
224
- <Button
225
- title="Go Back"
226
- onPress={() => navigation.goBack()}
227
- variant="primary"
228
- size="medium"
229
- />
230
- </View>
231
- </View>
232
- );
233
- }
234
-
235
- return (
236
- <SafeAreaView style={styles.container}>
237
- <StatusBar
238
- barStyle="light-content"
239
- backgroundColor={theme.colors.blue}
240
- translucent={Platform.OS === 'android' ? true : false}
241
- />
242
- {Platform.OS === 'ios' && <View style={styles.statusBarBackground} />}
243
-
244
- <View style={styles.header}>
245
- <View style={styles.headerTopRow}>
246
-
247
- <TouchableOpacity onPress={() => navigation.goBack()}>
248
- <SVG.arrowLeft_white width={moderateScale(25)} height={moderateScale(25)} />
249
- </TouchableOpacity>
250
-
251
-
252
- <View style={{ flexDirection: 'row' }}>
253
- <View style={styles.userConSty}>
254
- {!!selectedClub?.clubImage ? (
255
- <Image
256
- source={{ uri: selectedClub?.clubImage }} style={styles.userDetailsSty} resizeMode='cover' />
257
- // onLoadEnd={() => setIsLoading(false)}
258
- // onLoad={() => setIsLoading(true)}
259
- // onLoadStart={() => setIsLoading(true)}
260
- ) : (
261
- <View style={styles.placeholderLogoHeader}>
262
- <SVG.UsersIcon width={moderateScale(20)} height={moderateScale(20)} />
263
- </View>
264
- )}
265
- </View>
266
- <Text style={styles.userNameSty}>{selectedClub?.clubName || 'Unknown Club'}</Text>
267
- </View>
268
-
269
- </View>
270
-
271
- {/* Club Image Centered */}
272
- <View style={styles.centerImageContainer}>
273
- {TeamDetails?.teamDetail?.teamProfileImage ? (
274
- <Image
275
- source={{ uri: TeamDetails?.teamDetail?.teamProfileImage }}
276
- style={styles.centerClubImage}
277
- />
278
- ) : (
279
- <View style={styles.centerPlaceholderImage}>
280
- <SVG.emptyUser width={moderateScale(60)} height={moderateScale(60)} />
281
- </View>
282
- )}
283
- </View>
284
-
285
- {/* Club Name Centered */}
286
- <View style={styles.centerTextContainer}>
287
- <Text style={styles.centerClubName} numberOfLines={2}>
288
- {TeamDetails?.teamDetail?.teamName || 'Unknown Team'}
289
- </Text>
290
- </View>
291
-
292
- {/* Total Members */}
293
- <View style={styles.centerMemberInfo}>
294
- <View style={styles.totalMembersContainer}>
295
- <SVG.profileAppleGreen width={moderateScale(16)} height={moderateScale(16)} />
296
- <Text style={styles.totalMembersText}>
297
- {TeamDetails?.teamDetail?.totalMembers || 0} {(TeamDetails?.teamDetail?.totalMembers || 0) === 1 ? 'member' : 'members'}
298
- </Text>
299
- </View>
300
- </View>
301
-
302
- {/* Chat Button */}
303
- <View style={styles.chatButtonContainer}>
304
- <TouchableOpacity style={styles.chatButton} onPress={() => {
305
- const navigationData = {
306
- team: club,
307
- selectedMember: selectedMember,
308
- selectedClub: selectedClub
309
- }
310
- navigation.navigate('ChatThreads', navigationData);
311
- }}>
312
- <SVG.chatAppleGreen width={moderateScale(18)} height={moderateScale(18)} color={theme.colors.appleGreen} />
313
- <Text style={styles.chatButtonText}>Chat</Text>
314
- </TouchableOpacity>
315
- </View>
316
- </View>
317
-
318
- <ScrollView style={styles.content} showsVerticalScrollIndicator={false}>
319
- {/* Tab Bar */}
320
- <View style={styles.tabContainer}>
321
- <TouchableOpacity
322
- style={[styles.tabButton, activeTab === 'details' && styles.activeTabButton]}
323
- onPress={() => setActiveTab('details')}
324
- >
325
- <Text style={[styles.tabButtonText, activeTab === 'details' && styles.activeTabButtonText]}>
326
- Team Details
327
- </Text>
328
- </TouchableOpacity>
329
- <TouchableOpacity
330
- style={[styles.tabButton, activeTab === 'schedule' && styles.activeTabButton]}
331
- onPress={() => setActiveTab('schedule')}
332
- >
333
- <Text style={[styles.tabButtonText, activeTab === 'schedule' && styles.activeTabButtonText]}>
334
- Team Schedule
335
- </Text>
336
- </TouchableOpacity>
337
- </View>
338
-
339
- {/* Tab Content */}
340
- {activeTab === 'details' ? (
341
- <View style={styles.tabContent}>
342
- {/* Team Info Section */}
343
- <View style={styles.sectionContainer}>
344
- <Text style={styles.sectionHeading}>TEAM INFO</Text>
345
- <Text style={styles.sectionContent}>
346
- {TeamDetails?.teamDetail?.teamDescription || 'No team description available.'}
347
- </Text>
348
- </View>
349
-
350
- {/* Head Coach Section */}
351
- <View style={styles.sectionContainer}>
352
- <Text style={styles.sectionHeading}>HEAD COACH</Text>
353
- <View style={styles.coachCard}>
354
- <View style={styles.coachImageContainer}>
355
- <SVG.HeadCoachIcon width={moderateScale(27)} height={moderateScale(28)} />
356
- </View>
357
- <View style={styles.coachDetails}>
358
- <Text style={styles.coachName}>{TeamDetails?.teamDetail?.headCoachName || 'Unknown Coach'}</Text>
359
- {/* <Text style={styles.coachTitle}>
360
- ? Head Coach since {TeamDetails?.teamDetail?.createdOn ? new Date(TeamDetails.teamDetail.createdOn).getFullYear() : 'Unknown'}
361
- </Text> */}
362
- </View>
363
- </View>
364
- </View>
365
-
366
-
367
- <View style={styles.sectionContainer}>
368
- <Text style={styles.sectionHeading}>TEAM PLAYERS</Text>
369
- {/* Team Players Grid */}
370
- <View style={styles.playersGrid}>
371
- <FlatList
372
- data={TeamDetails?.memberDetailList || []}
373
- renderItem={({ item }) => renderPlayerCard(item)}
374
- numColumns={3}
375
- keyExtractor={(item) => item?.memberId?.toString() || Math.random().toString()}
376
- columnWrapperStyle={styles.playersRow}
377
- scrollEnabled={false}
378
- showsVerticalScrollIndicator={false}
379
- />
380
- </View>
381
- </View>
382
- </View>
383
- ) : (
384
- <View style={styles.tabContent}>
385
- {/* Team Schedule Content */}
386
- <View style={styles.sectionContainer}>
387
- {/* <View style={styles.horizontalLine} />
388
- <FlatList
389
- data={generateDateData()}
390
- renderItem={renderDateItem}
391
- horizontal
392
- showsHorizontalScrollIndicator={false}
393
- keyExtractor={(item) => item.id.toString()}
394
- contentContainerStyle={styles.datePickerContainer}
395
- style={styles.datePicker}
396
- />
397
- <View style={styles.horizontalLine} /> */}
398
- <Text style={styles.sectionHeading}>UPCOMING MATCHES</Text>
399
- <Text style={styles.sectionContent}>
400
- Schedule Matches will be displayed here Soon.
401
- </Text>
402
- </View>
403
- </View>
404
- )}
405
- </ScrollView>
406
- </SafeAreaView>
407
- );
408
- };
409
-
410
- const styles = StyleSheet.create({
411
- container: {
412
- flex: 1,
413
- backgroundColor: theme.colors.blue,
414
- },
415
- statusBarBackground: {
416
- position: 'absolute',
417
- top: 0,
418
- left: 0,
419
- right: 0,
420
- height: Platform.OS === 'ios' ? 44 : 0,
421
- backgroundColor: theme.colors.blue,
422
- zIndex: 1000,
423
- },
424
- header: {
425
- backgroundColor: theme.colors.blue,
426
- paddingTop: theme.spacing.xs,
427
- paddingBottom: theme.spacing.xl,
428
-
429
- },
430
- headerContent: {
431
- flexDirection: 'row',
432
- alignItems: 'center',
433
- paddingHorizontal: theme.spacing.lg,
434
- gap: theme.spacing.md,
435
- },
436
- headerTitleContainer: {
437
- flex: 1,
438
- },
439
- headerTitle: {
440
- fontFamily: Fonts.outfitMedium,
441
- fontSize: moderateScale(22),
442
- color: theme.colors.white,
443
- },
444
- headerSubtitle: {
445
- fontFamily: Fonts.outfitRegular,
446
- fontSize: moderateScale(14),
447
- color: theme.colors.white,
448
- opacity: 0.8,
449
- marginTop: moderateScale(2),
450
- },
451
- content: {
452
- flex: 1,
453
- backgroundColor: theme.colors.background,
454
- borderTopLeftRadius: moderateScale(30),
455
- borderTopRightRadius: moderateScale(30),
456
- marginTop: -theme.spacing.md,
457
- },
458
- teamImageContainer: {
459
- alignItems: 'center',
460
- paddingVertical: theme.spacing.xl,
461
- paddingTop: theme.spacing.xl,
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(36),
482
- height: moderateScale(36),
483
- borderRadius: moderateScale(18),
484
-
485
- },
486
- userDefaultIcone: {
487
- width: moderateScale(30),
488
- height: moderateScale(30),
489
- borderRadius: moderateScale(10)
490
- },
491
- placeholderLogoHeader: {
492
- width: moderateScale(20),
493
- height: moderateScale(20),
494
- borderRadius: moderateScale(10),
495
- alignItems: 'center',
496
- justifyContent: 'center'
497
- },
498
-
499
- teamImage: {
500
- width: moderateScale(120),
501
- height: moderateScale(120),
502
- borderRadius: moderateScale(60),
503
- backgroundColor: theme.colors.background,
504
- },
505
- placeholderImage: {
506
- width: moderateScale(120),
507
- height: moderateScale(120),
508
- borderRadius: moderateScale(60),
509
- backgroundColor: theme.colors.border,
510
- justifyContent: 'center',
511
- alignItems: 'center',
512
- },
513
- teamInfoContainer: {
514
- paddingHorizontal: theme.spacing.lg,
515
- paddingBottom: theme.spacing.xl,
516
- },
517
- teamName: {
518
- fontFamily: Fonts.outfitSemiBold,
519
- fontSize: moderateScale(24),
520
- color: theme.colors.text,
521
- textAlign: 'center',
522
- marginBottom: theme.spacing.lg,
523
- },
524
- infoRow: {
525
- flexDirection: 'row',
526
- justifyContent: 'space-between',
527
- alignItems: 'flex-start',
528
- paddingVertical: theme.spacing.sm,
529
- borderBottomWidth: 1,
530
- borderBottomColor: theme.colors.border,
531
- },
532
- infoLabel: {
533
- fontFamily: Fonts.outfitMedium,
534
- fontSize: moderateScale(14),
535
- color: theme.colors.textSecondary,
536
- flex: 1,
537
- },
538
- infoValue: {
539
- fontFamily: Fonts.outfitSemiBold,
540
- fontSize: moderateScale(14),
541
- color: theme.colors.text,
542
- flex: 2,
543
- textAlign: 'right',
544
- },
545
- actionsContainer: {
546
- paddingHorizontal: theme.spacing.lg,
547
- paddingBottom: theme.spacing.xl,
548
- },
549
- actionButton: {
550
- width: '100%',
551
- marginBottom: theme.spacing.md,
552
- },
553
- secondaryActions: {
554
- marginTop: theme.spacing.lg,
555
- gap: theme.spacing.sm,
556
- },
557
- secondaryButton: {
558
- flexDirection: 'row',
559
- alignItems: 'center',
560
- justifyContent: 'center',
561
- backgroundColor: 'transparent',
562
- borderWidth: 1.5,
563
- borderColor: theme.colors.primary,
564
- borderRadius: theme.borderRadius.xxl,
565
- paddingVertical: theme.spacing.sm,
566
- paddingHorizontal: theme.spacing.lg,
567
- gap: theme.spacing.sm,
568
- },
569
- secondaryButtonText: {
570
- fontFamily: Fonts.outfitMedium,
571
- fontSize: theme.typography.fontSize.md,
572
- color: theme.colors.primary,
573
- },
574
- leaveButton: {
575
- borderColor: theme.colors.error,
576
- },
577
- leaveButtonText: {
578
- color: theme.colors.error,
579
- },
580
- errorContainer: {
581
- flex: 1,
582
- backgroundColor: theme.colors.background,
583
- justifyContent: 'center',
584
- alignItems: 'center',
585
- paddingHorizontal: theme.spacing.lg,
586
- borderTopLeftRadius: moderateScale(30),
587
- borderTopRightRadius: moderateScale(30),
588
- },
589
- errorText: {
590
- fontFamily: Fonts.outfitMedium,
591
- fontSize: moderateScale(16),
592
- color: theme.colors.error,
593
- textAlign: 'center',
594
- marginBottom: theme.spacing.lg,
595
- },
596
- // Member Information Styles
597
- memberInfoContainer: {
598
- paddingHorizontal: theme.spacing.lg,
599
- paddingBottom: theme.spacing.lg,
600
- },
601
- sectionTitle: {
602
- fontFamily: Fonts.outfitSemiBold,
603
- fontSize: moderateScale(18),
604
- color: theme.colors.text,
605
- marginBottom: theme.spacing.md,
606
- },
607
- memberCard: {
608
- flexDirection: 'row',
609
- backgroundColor: theme.colors.surface,
610
- borderRadius: theme.borderRadius.lg,
611
- padding: theme.spacing.md,
612
- alignItems: 'center',
613
- },
614
- memberImageContainer: {
615
- marginRight: theme.spacing.md,
616
- },
617
- memberImage: {
618
- width: moderateScale(60),
619
- height: moderateScale(60),
620
- borderRadius: moderateScale(30),
621
- },
622
- placeholderMemberImage: {
623
- width: moderateScale(60),
624
- height: moderateScale(60),
625
- borderRadius: moderateScale(30),
626
- backgroundColor: theme.colors.border,
627
- justifyContent: 'center',
628
- alignItems: 'center',
629
- },
630
- memberDetails: {
631
- flex: 1,
632
- },
633
- memberName: {
634
- fontFamily: Fonts.outfitSemiBold,
635
- fontSize: moderateScale(16),
636
- color: theme.colors.text,
637
- marginBottom: moderateScale(4),
638
- },
639
- memberRelation: {
640
- fontFamily: Fonts.outfitMedium,
641
- fontSize: moderateScale(14),
642
- color: theme.colors.textSecondary,
643
- marginBottom: moderateScale(2),
644
- },
645
- memberBirthDate: {
646
- fontFamily: Fonts.outfitRegular,
647
- fontSize: moderateScale(12),
648
- color: theme.colors.textSecondary,
649
- marginBottom: moderateScale(4),
650
- },
651
- ownerBadge: {
652
- backgroundColor: theme.colors.primary,
653
- paddingHorizontal: moderateScale(8),
654
- paddingVertical: moderateScale(4),
655
- borderRadius: moderateScale(12),
656
- alignSelf: 'flex-start',
657
- },
658
- ownerBadgeText: {
659
- fontFamily: Fonts.outfitMedium,
660
- fontSize: moderateScale(10),
661
- color: theme.colors.white,
662
- },
663
- headerTopRow: {
664
- flexDirection: 'row',
665
- alignItems: 'center',
666
- paddingHorizontal: theme.spacing.lg,
667
- paddingBottom: theme.spacing.sm,
668
- },
669
- clubInfoRow: {
670
- flexDirection: 'row',
671
- alignItems: 'center',
672
- paddingHorizontal: theme.spacing.lg,
673
- marginBottom: theme.spacing.md,
674
- },
675
- headerClubImageContainer: {
676
- marginRight: theme.spacing.md,
677
- },
678
- headerClubImage: {
679
- width: moderateScale(60),
680
- height: moderateScale(60),
681
- borderRadius: moderateScale(30),
682
- backgroundColor: theme.colors.background,
683
- },
684
- headerPlaceholderImage: {
685
- width: moderateScale(60),
686
- height: moderateScale(60),
687
- borderRadius: moderateScale(30),
688
- backgroundColor: 'rgba(255, 255, 255, 0.2)',
689
- justifyContent: 'center',
690
- alignItems: 'center',
691
- },
692
- headerTextContainer: {
693
- flex: 1,
694
- },
695
- headerClubName: {
696
- fontFamily: Fonts.outfitSemiBold,
697
- fontSize: moderateScale(20),
698
- color: theme.colors.white,
699
- marginBottom: moderateScale(4),
700
- },
701
- headerMemberText: {
702
- fontFamily: Fonts.outfitMedium,
703
- fontSize: moderateScale(14),
704
- color: theme.colors.appleGreen,
705
- opacity: 0.8,
706
- },
707
- memberInfoRow: {
708
- flexDirection: 'row',
709
- alignItems: 'center',
710
- justifyContent: 'space-between',
711
- marginBottom: theme.spacing.sm,
712
- },
713
- memberCountContainer: {
714
- flexDirection: 'row',
715
- alignItems: 'center',
716
- },
717
- memberCount: {
718
- fontFamily: Fonts.outfitRegular,
719
- fontSize: moderateScale(14),
720
- color: theme.colors.appleGreen,
721
- marginLeft: theme.spacing.xs,
722
- },
723
- chatButtonContainer: {
724
- paddingHorizontal: theme.spacing.lg,
725
- paddingBottom: theme.spacing.xs,
726
- },
727
- chatButton: {
728
- flexDirection: 'row',
729
- alignItems: 'center',
730
- justifyContent: 'center',
731
- backgroundColor: 'transparent',
732
- borderWidth: 1.5,
733
- borderColor: theme.colors.appleGreen,
734
- borderRadius: theme.borderRadius.xxl,
735
- paddingVertical: theme.spacing.sm,
736
- paddingHorizontal: theme.spacing.lg,
737
- gap: theme.spacing.sm,
738
- },
739
- chatButtonText: {
740
- fontFamily: Fonts.outfitMedium,
741
- fontSize: theme.typography.fontSize.md,
742
- color: theme.colors.appleGreen,
743
- },
744
- centerImageContainer: {
745
- alignItems: 'center',
746
- marginBottom: theme.spacing.xs,
747
- },
748
- centerClubImage: {
749
- width: moderateScale(120),
750
- height: moderateScale(120),
751
- borderRadius: moderateScale(60),
752
- backgroundColor: theme.colors.background,
753
- borderWidth: 1,
754
- borderColor: theme.colors.imageBorder,
755
-
756
- },
757
- centerPlaceholderImage: {
758
- width: moderateScale(100),
759
- height: moderateScale(100),
760
- borderRadius: moderateScale(50),
761
- backgroundColor: 'rgba(255, 255, 255, 0.2)',
762
- justifyContent: 'center',
763
- alignItems: 'center',
764
- },
765
- centerTextContainer: {
766
- alignItems: 'center',
767
- marginBottom: theme.spacing.sm,
768
- },
769
- centerClubName: {
770
- fontFamily: Fonts.outfitSemiBold,
771
- fontSize: moderateScale(22),
772
- color: theme.colors.white,
773
- textAlign: 'center',
774
- },
775
- centerMemberInfo: {
776
- alignItems: 'center',
777
- marginBottom: theme.spacing.md,
778
- },
779
- totalMembersContainer: {
780
- flexDirection: 'row',
781
- alignItems: 'center',
782
- gap: theme.spacing.xs,
783
- },
784
- totalMembersText: {
785
- fontFamily: Fonts.outfitMedium,
786
- fontSize: moderateScale(12),
787
- color: theme.colors.appleGreen,
788
- opacity: 0.8,
789
- },
790
- tabContainer: {
791
- flexDirection: 'row',
792
- gap: theme.spacing.xs,
793
- height: moderateScale(40),
794
- backgroundColor: theme.colors.background,
795
- borderRadius: moderateScale(29),
796
- padding: moderateScale(2),
797
- marginHorizontal: theme.spacing.md,
798
- marginBottom: theme.spacing.md,
799
- marginTop: theme.spacing.md
800
- },
801
- tabButton: {
802
- flex: 1,
803
- paddingVertical: theme.spacing.sm,
804
- paddingHorizontal: theme.spacing.md,
805
- backgroundColor: theme.colors.lightLavenderGray,
806
- borderRadius: theme.borderRadius.xxl,
807
- alignItems: 'center',
808
- },
809
- activeTabButton: {
810
- backgroundColor: theme.colors.blue,
811
- },
812
- tabButtonText: {
813
- fontFamily: Fonts.outfitSemiBold,
814
- fontSize: moderateScale(14),
815
- color: theme.colors.blue,
816
- },
817
- activeTabButtonText: {
818
- color: theme.colors.white,
819
- fontSize: moderateScale(14),
820
- fontFamily: Fonts.outfitSemiBold,
821
- },
822
- tabContent: {
823
- paddingHorizontal: theme.spacing.lg,
824
- },
825
- sectionContainer: {
826
- marginBottom: theme.spacing.sm,
827
- },
828
- sectionHeading: {
829
- fontFamily: Fonts.outfitLight,
830
- fontSize: moderateScale(11.67),
831
- color: theme.colors.blue,
832
- marginVertical: theme.spacing.xs,
833
- },
834
- sectionContent: {
835
- fontFamily: Fonts.outfitLight,
836
- fontSize: moderateScale(13),
837
- color: theme.colors.paraText,
838
- lineHeight: moderateScale(20),
839
- },
840
- coachCard: {
841
- flexDirection: 'row',
842
- backgroundColor: theme.colors.lightLavenderGray,
843
- borderRadius: theme.borderRadius.lg,
844
- padding: theme.spacing.sm,
845
- alignItems: 'center',
846
- },
847
- coachImageContainer: {
848
- width: moderateScale(60),
849
- height: moderateScale(60),
850
- borderRadius: moderateScale(35),
851
- backgroundColor: theme.colors.white,
852
- justifyContent: 'center',
853
- alignItems: 'center',
854
- marginLeft: moderateScale(8),
855
- marginRight: theme.spacing.md,
856
- opacity: 1,
857
- },
858
- coachDetails: {
859
- flex: 1,
860
- },
861
- coachName: {
862
- fontFamily: Fonts.outfitSemiBold,
863
- fontSize: moderateScale(16),
864
- color: theme.colors.text,
865
- marginBottom: moderateScale(4),
866
- },
867
- coachTitle: {
868
- fontFamily: Fonts.outfitLight,
869
- fontSize: moderateScale(12),
870
- color: theme.colors.appleGreen,
871
- marginBottom: moderateScale(2),
872
- },
873
- coachExperience: {
874
- fontFamily: Fonts.outfitRegular,
875
- fontSize: moderateScale(12),
876
- color: theme.colors.textSecondary,
877
- },
878
- playersGrid: {
879
- marginHorizontal: -theme.spacing.sm, // To counteract the gap in rows
880
- },
881
- playersRow: {
882
- flexDirection: 'row',
883
- justifyContent: 'flex-start',
884
- alignItems: 'center',
885
- marginVertical: theme.spacing.sm,
886
- gap: theme.spacing.sm,
887
- },
888
- playerCard: {
889
- position: 'relative',
890
- width: width / 3 - theme.spacing.md,
891
- height: moderateScale(113.49),
892
- borderRadius: moderateScale(19.09),
893
- borderWidth: moderateScale(1.06),
894
- borderColor: theme.colors.border,
895
- overflow: 'hidden',
896
- },
897
- playerImage: {
898
- width: '100%',
899
- height: '100%',
900
- borderRadius: moderateScale(19.09),
901
- },
902
- playerNameOverlay: {
903
- position: 'absolute',
904
- bottom: 0,
905
- width: '100%',
906
- paddingHorizontal: theme.spacing.xs,
907
- paddingVertical: moderateScale(4),
908
- backgroundColor: 'rgba(0, 0, 0, 0.2)',
909
- },
910
- playerName: {
911
- fontFamily: Fonts.outfitBold,
912
- fontSize: moderateScale(12),
913
- alignSelf: 'center',
914
- color: theme.colors.white,
915
- opacity: 1,
916
- textAlign: 'left',
917
- textShadowColor: 'rgba(0,0,0,0.6)',
918
- textShadowOffset: { width: 0, height: 1 },
919
- textShadowRadius: 2,
920
- },
921
- playerPlaceholder: {
922
- width: '100%',
923
- height: '100%',
924
- backgroundColor: theme.colors.white,
925
- justifyContent: 'center',
926
- alignItems: 'center',
927
- borderRadius: moderateScale(19.09),
928
- },
929
- // Date Picker Styles
930
- horizontalLine: {
931
- height: moderateScale(1),
932
- backgroundColor: theme.colors.border,
933
- marginVertical: moderateScale(1),
934
- },
935
- datePicker: {
936
- marginVertical: theme.spacing.xs,
937
- },
938
- datePickerContainer: {
939
- paddingHorizontal: theme.spacing.sm,
940
- },
941
- dateItem: {
942
- alignItems: 'center',
943
- justifyContent: 'center',
944
- paddingHorizontal: theme.spacing.md,
945
- paddingVertical: theme.spacing.sm,
946
- marginHorizontal: theme.spacing.xs,
947
- borderRadius: moderateScale(8),
948
- // minWidth: moderateScale(40),
949
- },
950
- activeDateItem: {
951
- backgroundColor: theme.colors.appleGreen,
952
- height: moderateScale(42),
953
- },
954
- dateNumber: {
955
- fontFamily: Fonts.outfitMedium,
956
- fontSize: moderateScale(12),
957
- color: theme.colors.appleGreen,
958
- marginBottom: moderateScale(2),
959
- },
960
- dayName: {
961
- fontFamily: Fonts.outfitRegular,
962
- fontSize: moderateScale(10),
963
- color: theme.colors.textSecondary,
964
- },
965
- activeDateText: {
966
- color: theme.colors.white,
967
- fontSize: moderateScale(14),
968
- },
969
- memberImageLoader: {
970
- position: 'absolute',
971
- top: '50%',
972
- left: '50%',
973
- marginTop: -10,
974
- marginLeft: -10,
975
- backgroundColor: 'rgba(255, 255, 255, 0.8)',
976
- borderRadius: moderateScale(10),
977
- padding: moderateScale(5),
978
- },
979
- });