create-gufran-expo-app 2.0.6 → 2.0.7

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 (73) hide show
  1. package/package.json +2 -2
  2. package/template/package.json +1 -5
  3. package/template/src/assets/icons/index.ts +40 -135
  4. package/template/src/components/common/Icon.tsx +43 -38
  5. package/template/src/components/common/SafeAreaWrapper.tsx +11 -5
  6. package/template/src/constants/strings.ts +6 -71
  7. package/template/src/constants/theme.ts +12 -0
  8. package/template/src/navigation/BottomTabNavigator.tsx +85 -0
  9. package/template/src/navigation/MainStack.tsx +15 -12
  10. package/template/src/navigation/RootNavigator.tsx +31 -1
  11. package/template/src/navigation/index.ts +1 -0
  12. package/template/src/screens/DetailsScreen.tsx +53 -45
  13. package/template/src/screens/HomeScreen.tsx +627 -413
  14. package/template/src/screens/ProfileScreen.tsx +144 -142
  15. package/template/src/screens/SettingsScreen.tsx +178 -174
  16. package/template/src/screens/auth/LoginScreen.tsx +18 -37
  17. package/template/src/screens/index.ts +2 -4
  18. package/template/src/services/api.ts +5 -9
  19. package/template/src/services/authService.ts +10 -16
  20. package/template/src/services/mainServices.ts +14 -4
  21. package/template/src/stores/authStore.ts +60 -73
  22. package/template/src/stores/index.ts +3 -0
  23. package/template/src/stores/themeStore.ts +61 -0
  24. package/template/src/types/navigation.ts +28 -16
  25. package/template/src/utils/storage.ts +10 -11
  26. package/template/src/assets/icons/BG.svg +0 -33
  27. package/template/src/assets/icons/arrow-left-white.svg +0 -4
  28. package/template/src/assets/icons/arrow-left.svg +0 -4
  29. package/template/src/assets/icons/bottomSheetIcone.svg +0 -3
  30. package/template/src/assets/icons/call.svg +0 -4
  31. package/template/src/assets/icons/camera.svg +0 -0
  32. package/template/src/assets/icons/check.svg +0 -4
  33. package/template/src/assets/icons/check_Radio.svg +0 -4
  34. package/template/src/assets/icons/clubDefauldImage.png +0 -0
  35. package/template/src/assets/icons/defaultClub.png +0 -0
  36. package/template/src/assets/icons/emptyUser.svg +0 -5
  37. package/template/src/assets/icons/ic_Calendar.svg +0 -14
  38. package/template/src/assets/icons/ic_Calendar_blue.svg +0 -12
  39. package/template/src/assets/icons/ic_Calendar_white.svg +0 -12
  40. package/template/src/assets/icons/ic_Chat.svg +0 -14
  41. package/template/src/assets/icons/ic_ChatAppleGreen.svg +0 -21
  42. package/template/src/assets/icons/ic_ChatAppleWhite.svg +0 -21
  43. package/template/src/assets/icons/ic_Download.svg +0 -6
  44. package/template/src/assets/icons/ic_Events.svg +0 -6
  45. package/template/src/assets/icons/ic_HeadCoachIcon.svg +0 -3
  46. package/template/src/assets/icons/ic_Membership.svg +0 -10
  47. package/template/src/assets/icons/ic_Notification.svg +0 -6
  48. package/template/src/assets/icons/ic_Raffles.svg +0 -14
  49. package/template/src/assets/icons/ic_Referral_Members.svg +0 -12
  50. package/template/src/assets/icons/ic_Shop.svg +0 -13
  51. package/template/src/assets/icons/ic_Teams.svg +0 -8
  52. package/template/src/assets/icons/ic_Volunteer.svg +0 -9
  53. package/template/src/assets/icons/ic_add.svg +0 -3
  54. package/template/src/assets/icons/ic_addCircle.svg +0 -5
  55. package/template/src/assets/icons/ic_chatSend.svg +0 -4
  56. package/template/src/assets/icons/ic_chat_blue_bg.svg +0 -22
  57. package/template/src/assets/icons/ic_clock_blue.svg +0 -4
  58. package/template/src/assets/icons/ic_more.svg +0 -5
  59. package/template/src/assets/icons/ic_mute.svg +0 -10
  60. package/template/src/assets/icons/ic_pdf.svg +0 -3
  61. package/template/src/assets/icons/ic_pending_AppleGreen.svg +0 -11
  62. package/template/src/assets/icons/ic_right_appleGreen.svg +0 -11
  63. package/template/src/assets/icons/ic_unread_chat_blue_bg.svg +0 -23
  64. package/template/src/assets/icons/ic_volunteer_Member.svg +0 -8
  65. package/template/src/assets/icons/location-blue.svg +0 -4
  66. package/template/src/assets/icons/location-white.svg +0 -4
  67. package/template/src/assets/icons/profile-appleGreen.svg +0 -6
  68. package/template/src/assets/icons/search.svg +0 -3
  69. package/template/src/assets/icons/success.svg +0 -4
  70. package/template/src/assets/icons/unCheck_Radio.svg +0 -3
  71. package/template/src/assets/icons/uncheck.svg +0 -3
  72. package/template/src/assets/icons/upload_Image.svg +0 -6
  73. package/template/src/screens/SportHubScreen.tsx +0 -280
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-gufran-expo-app",
3
- "version": "2.0.6",
3
+ "version": "2.0.7",
4
4
  "description": "🚀 Ultimate Expo React Native Boilerplate - Create production-ready Expo apps instantly with Firebase, Navigation, TypeScript, and more. No git clone needed, works offline!",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -50,4 +50,4 @@
50
50
  "README.md",
51
51
  "LICENSE"
52
52
  ]
53
- }
53
+ }
@@ -15,12 +15,11 @@
15
15
  "postinstall": "patch-package"
16
16
  },
17
17
  "dependencies": {
18
- "@likashefqet/react-native-image-zoom": "^4.3.0",
19
- "@microsoft/signalr": "^9.0.6",
20
18
  "@notifee/react-native": "9.0.2",
21
19
  "@react-native-community/netinfo": "^11.4.1",
22
20
  "@react-native-firebase/app": "^23.4.0",
23
21
  "@react-native-firebase/messaging": "^23.4.0",
22
+ "@react-navigation/bottom-tabs": "^7.9.0",
24
23
  "@react-navigation/native": "^7.1.17",
25
24
  "@react-navigation/native-stack": "^7.3.26",
26
25
  "@sentry/react-native": "6.20.0",
@@ -28,7 +27,6 @@
28
27
  "axios": "^1.12.2",
29
28
  "expo": "~54.0.7",
30
29
  "expo-build-properties": "^1.0.9",
31
- "expo-camera": "17.0.8",
32
30
  "expo-font": "^14.0.8",
33
31
  "expo-image-picker": "16.1.4",
34
32
  "expo-splash-screen": "~31.0.10",
@@ -41,7 +39,6 @@
41
39
  "react-native-date-picker": "5.0.13",
42
40
  "react-native-flash-message": "^0.4.2",
43
41
  "react-native-gesture-handler": "2.28.0",
44
- "react-native-gifted-chat": "^2.8.1",
45
42
  "react-native-image-picker": "^8.2.1",
46
43
  "react-native-keyboard-aware-scroll-view": "^0.9.5",
47
44
  "react-native-keyboard-controller": "^1.18.6",
@@ -49,7 +46,6 @@
49
46
  "react-native-otp-entry": "^1.8.5",
50
47
  "react-native-permissions": "^5.4.2",
51
48
  "react-native-reanimated": "~4.1.1",
52
- "react-native-render-html": "^6.3.4",
53
49
  "react-native-safe-area-context": "~5.6.0",
54
50
  "react-native-screens": "~4.16.0",
55
51
  "react-native-svg": "^15.13.0",
@@ -1,144 +1,49 @@
1
- import home from "./home.svg";
2
- import login_logo from "./login_logo.svg";
1
+ import chatAppleGreenBG from "./chatAppleGreenBG.svg";
2
+ import chevronRight from "./chevron-right.svg";
3
+ import curvViewImage from "./curvBackgroundView.svg";
4
+ import Delete from "./ic_delete.svg";
3
5
  import Email from "./email.svg";
4
- import Password from "./password.svg";
5
- import OR_separator from "./or_saprater.svg";
6
6
  import eye from "./eye.svg";
7
7
  import eyeOff from "./eye-Hide.svg";
8
- import phone from "./call.svg";
9
- import user from "./user.svg";
10
- import uncheck from "./uncheck.svg";
11
- import check from "./check.svg";
12
- import uploadImageProfile from "./upload_Image.svg";
13
- import uploadImageMember from "./upload_Image_Member.svg";
14
- import arrowLeft from "./arrow-left.svg";
15
- import arrowLeft_white from "./arrow-left-white.svg";
16
8
  import gallery from "./gallery.svg";
17
- import curvViewImage from "./curvBackgroundView.svg";
18
- import SuccessIcone from "./success.svg";
19
- import NotificationIcon from "./ic_Notification.svg";
20
- import UsersIcon from "./Ic_Users.svg";
21
9
  import locationIcon from "./location.svg";
22
- import locationWhite from "./location-white.svg";
23
- import locationBlue from "./location-blue.svg";
24
- import icAdd from "./ic_add.svg";
25
- import uncheckRadio from "./unCheck_Radio.svg";
26
- import checkRadio from "./check_Radio.svg";
27
- import bottomSheetIcone from "./bottomSheetIcone.svg";
28
- import search from "./search.svg";
29
- import profileAppleGreen from "./profile-appleGreen.svg";
30
- import emptyUser from "./emptyUser.svg";
31
- import Teams from "./ic_Teams.svg";
32
- import Calendar from "./ic_Calendar.svg";
33
- import CalendarWhite from "./ic_Calendar_white.svg";
34
- import CalendarBlue from "./ic_Calendar_blue.svg";
35
- import Raffles from "./ic_Raffles.svg";
36
- import Chat from "./ic_Chat.svg";
37
- import Shop from "./ic_Shop.svg";
38
- import Events from "./ic_Events.svg";
39
- import Volunteer from "./ic_Volunteer.svg";
40
- import Membership from "./ic_Membership.svg";
10
+ import login_logo from "./login_logo.svg";
41
11
  import no_wifi from "./wifi.svg";
42
- import chatAppleGreen from "./ic_ChatAppleGreen.svg";
43
- import chatAppleWhite from "./ic_ChatAppleWhite.svg";
44
- import HeadCoachIcon from "./ic_HeadCoachIcon.svg";
45
- import chatAppleGreenBG from "./chatAppleGreenBG.svg";
46
- import chatBlueBG from "./ic_chat_blue_bg.svg";
47
- import more from "./ic_more.svg";
48
- import addCircle from "./ic_addCircle.svg";
49
- import chatSend from "./ic_chatSend.svg";
50
- import mute from "./ic_mute.svg";
51
- import ReferralMembers from "./ic_Referral_Members.svg";
52
- import DownloadBlue from "./ic_Download.svg";
53
- import PDFAppleGreen from "./ic_pdf.svg";
54
- import volunteerMember from "./ic_volunteer_Member.svg";
55
- import rightAppleGreen from "./ic_right_appleGreen.svg";
56
- import PendingAppleGreen from "./ic_pending_AppleGreen.svg";
57
- import Delete from "./ic_delete.svg";
58
- import Clock_Blue from "./ic_clock_blue.svg";
59
- import UNREAD_CHAT_BLUE_BG from "./ic_unread_chat_blue_bg.svg";
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
- import mail from "./mail.svg";
70
- import lock from "./lock.svg";
71
- import bell from "./bell.svg";
72
- import settings from "./settings.svg";
12
+ import OR_separator from "./or_saprater.svg";
13
+ import Password from "./password.svg";
14
+ import uploadImageMember from "./upload_Image_Member.svg";
15
+ import UsersIcon from "./Ic_Users.svg";
73
16
  import logOut from "./log-out.svg";
74
- import chevronRight from "./chevron-right.svg";
17
+ import settings from "./settings.svg";
18
+ import user from "./user.svg";
19
+ import bell from "./bell.svg";
20
+ import lock from "./lock.svg";
21
+ import home from "./home.svg";
22
+ import mail from "./mail.svg";
75
23
 
76
24
  const SVG = {
77
- login_logo,
78
- Email,
79
- Password,
80
- OR_separator,
81
- user,
82
- phone,
83
- eye,
84
- check,
85
- uncheck,
86
- home,
87
- mail,
88
- lock,
89
- eyeOff,
90
- bell,
91
- settings,
92
- logOut,
93
- chevronRight,
94
- uploadImageProfile,
95
- uploadImageMember,
96
- arrowLeft,
97
- gallery,
98
- curvViewImage,
99
- SuccessIcone,
100
- NotificationIcon,
101
- UsersIcon,
102
- locationIcon,
103
- icAdd,
104
- uncheckRadio,
105
- checkRadio,
106
- bottomSheetIcone,
107
- arrowLeft_white,
108
- search,
109
- profileAppleGreen,
110
- locationWhite,
111
- emptyUser,
112
- Teams,
113
- Calendar,
114
- Raffles,
115
- Chat,
116
- Shop,
117
- Events,
118
- Volunteer,
119
- Membership,
120
- no_wifi,
121
- chatAppleGreen,
122
- chatAppleWhite,
123
- HeadCoachIcon,
124
- chatAppleGreenBG,
125
- more,
126
- addCircle,
127
- chatSend,
128
- mute,
129
- locationBlue,
130
- CalendarBlue,
131
- CalendarWhite,
132
- ReferralMembers,
133
- DownloadBlue,
134
- PDFAppleGreen,
135
- volunteerMember,
136
- chatBlueBG,
137
- rightAppleGreen,
138
- PendingAppleGreen,
139
- Delete,
140
- Clock_Blue,
141
- UNREAD_CHAT_BLUE_BG
142
- }
143
-
144
- export default SVG;
25
+ login_logo,
26
+ Email,
27
+ Password,
28
+ OR_separator,
29
+ eye,
30
+ eyeOff,
31
+ uploadImageMember,
32
+ gallery,
33
+ curvViewImage,
34
+ UsersIcon,
35
+ locationIcon,
36
+ chevronRight,
37
+ no_wifi,
38
+ chatAppleGreenBG,
39
+ Delete,
40
+ logOut,
41
+ settings,
42
+ user,
43
+ bell,
44
+ lock,
45
+ home,
46
+ mail,
47
+ };
48
+
49
+ export default SVG;
@@ -1,25 +1,33 @@
1
- import React from 'react';
2
- import { Text, View } from 'react-native';
3
- import { SvgProps } from 'react-native-svg';
4
- import { theme } from '../../constants';
1
+ import React from "react";
2
+ import { Text, View } from "react-native";
3
+ import { SvgProps } from "react-native-svg";
4
+ import { theme } from "../../constants";
5
5
 
6
6
  // Try to import SVG icons with fallback
7
- let HomeIcon: any, UserIcon: any, SettingsIcon: any, EyeIcon: any, EyeOffIcon: any;
8
- let MailIcon: any, LockIcon: any, ChevronRightIcon: any, LogOutIcon: any, BellIcon: any;
7
+ let HomeIcon: any,
8
+ UserIcon: any,
9
+ SettingsIcon: any,
10
+ EyeIcon: any,
11
+ EyeOffIcon: any;
12
+ let MailIcon: any,
13
+ LockIcon: any,
14
+ ChevronRightIcon: any,
15
+ LogOutIcon: any,
16
+ BellIcon: any;
9
17
 
10
18
  try {
11
- HomeIcon = require('../../assets/icons/home.svg').default;
12
- UserIcon = require('../../assets/icons/user.svg').default;
13
- SettingsIcon = require('../../assets/icons/settings.svg').default;
14
- EyeIcon = require('../../assets/icons/eye.svg').default;
15
- EyeOffIcon = require('../../assets/icons/eye-off.svg').default;
16
- MailIcon = require('../../assets/icons/mail.svg').default;
17
- LockIcon = require('../../assets/icons/lock.svg').default;
18
- ChevronRightIcon = require('../../assets/icons/chevron-right.svg').default;
19
- LogOutIcon = require('../../assets/icons/log-out.svg').default;
20
- BellIcon = require('../../assets/icons/bell.svg').default;
19
+ HomeIcon = require("../../assets/icons/home.svg").default;
20
+ UserIcon = require("../../assets/icons/user.svg").default;
21
+ SettingsIcon = require("../../assets/icons/settings.svg").default;
22
+ EyeIcon = require("../../assets/icons/eye.svg").default;
23
+ EyeOffIcon = require("../../assets/icons/eye-hide.svg").default;
24
+ MailIcon = require("../../assets/icons/mail.svg").default;
25
+ LockIcon = require("../../assets/icons/lock.svg").default;
26
+ ChevronRightIcon = require("../../assets/icons/chevron-right.svg").default;
27
+ LogOutIcon = require("../../assets/icons/log-out.svg").default;
28
+ BellIcon = require("../../assets/icons/bell.svg").default;
21
29
  } catch (error) {
22
- console.warn('SVG icons could not be loaded, using fallback');
30
+ console.warn("SVG icons could not be loaded, using fallback");
23
31
  }
24
32
 
25
33
  // Icon mapping
@@ -28,11 +36,11 @@ const iconMap = {
28
36
  user: UserIcon,
29
37
  settings: SettingsIcon,
30
38
  eye: EyeIcon,
31
- 'eye-off': EyeOffIcon,
39
+ "eye-off": EyeOffIcon,
32
40
  mail: MailIcon,
33
41
  lock: LockIcon,
34
- 'chevron-right': ChevronRightIcon,
35
- 'log-out': LogOutIcon,
42
+ "chevron-right": ChevronRightIcon,
43
+ "log-out": LogOutIcon,
36
44
  bell: BellIcon,
37
45
  } as const;
38
46
 
@@ -45,18 +53,22 @@ export interface IconProps extends SvgProps {
45
53
  }
46
54
 
47
55
  // Fallback icon component
48
- const FallbackIcon: React.FC<{ name: string; size: number; color: string }> = ({ name, size, color }) => (
56
+ const FallbackIcon: React.FC<{ name: string; size: number; color: string }> = ({
57
+ name,
58
+ size,
59
+ color,
60
+ }) => (
49
61
  <View
50
62
  style={{
51
63
  width: size,
52
64
  height: size,
53
65
  backgroundColor: color,
54
66
  borderRadius: size / 4,
55
- alignItems: 'center',
56
- justifyContent: 'center',
67
+ alignItems: "center",
68
+ justifyContent: "center",
57
69
  }}
58
70
  >
59
- <Text style={{ color: 'white', fontSize: size * 0.4, fontWeight: 'bold' }}>
71
+ <Text style={{ color: "white", fontSize: size * 0.4, fontWeight: "bold" }}>
60
72
  {name.charAt(0).toUpperCase()}
61
73
  </Text>
62
74
  </View>
@@ -71,23 +83,16 @@ export const Icon: React.FC<IconProps> = ({
71
83
  const IconComponent = iconMap[name];
72
84
 
73
85
  // Debug log to see what we're getting
74
- if (__DEV__) {
75
- console.log('Icon name:', name);
76
- console.log('IconComponent:', IconComponent);
77
- console.log('typeof IconComponent:', typeof IconComponent);
78
- }
86
+ // if (__DEV__) {
87
+ // console.log('Icon name:', name);
88
+ // console.log('IconComponent:', IconComponent);
89
+ // console.log('typeof IconComponent:', typeof IconComponent);
90
+ // }
79
91
 
80
- if (!IconComponent || typeof IconComponent !== 'function') {
92
+ if (!IconComponent || typeof IconComponent !== "function") {
81
93
  console.warn(`Icon "${name}" not found or invalid, using fallback`);
82
94
  return <FallbackIcon name={name} size={size} color={color} />;
83
95
  }
84
96
 
85
- return (
86
- <IconComponent
87
- width={size}
88
- height={size}
89
- color={color}
90
- {...props}
91
- />
92
- );
97
+ return <IconComponent width={size} height={size} color={color} {...props} />;
93
98
  };
@@ -1,6 +1,7 @@
1
- import React from 'react';
2
- import { SafeAreaView, StyleSheet, ViewStyle } from 'react-native';
3
- import { theme } from '../../constants';
1
+ import React from "react";
2
+ import { StyleSheet, ViewStyle } from "react-native";
3
+ import { SafeAreaView } from "react-native-safe-area-context";
4
+ import { useTheme } from "../../stores/themeStore";
4
5
 
5
6
  interface SafeAreaWrapperProps {
6
7
  children: React.ReactNode;
@@ -11,10 +12,15 @@ interface SafeAreaWrapperProps {
11
12
  export const SafeAreaWrapper: React.FC<SafeAreaWrapperProps> = ({
12
13
  children,
13
14
  style,
14
- backgroundColor = theme.colors.background,
15
+ backgroundColor,
15
16
  }) => {
17
+ const theme = useTheme();
18
+ const bgColor = backgroundColor ?? theme.colors.background;
19
+
16
20
  return (
17
- <SafeAreaView style={[styles.container, { backgroundColor }, style]}>
21
+ <SafeAreaView
22
+ style={[styles.container, { backgroundColor: bgColor }, style]}
23
+ >
18
24
  {children}
19
25
  </SafeAreaView>
20
26
  );
@@ -129,81 +129,16 @@ export class Strings {
129
129
  FEATURE_UTILITIES: '✅ Utility Functions',
130
130
  };
131
131
 
132
- // MARK: - Profile Screen Strings
133
- static readonly PROFILE = {
134
- TITLE: 'Profile',
135
- EDIT_PROFILE: 'Edit Profile',
136
- LOGOUT: 'Logout',
137
- ACCOUNT_SETTINGS: 'Account Settings',
138
- PERSONAL_INFO: 'Personal Information',
139
- SECURITY: 'Security',
140
- NOTIFICATIONS: 'Notifications',
141
- PRIVACY: 'Privacy',
142
- };
143
132
 
144
- // MARK: - Settings Screen Strings
145
- static readonly SETTINGS = {
146
- TITLE: 'Settings',
147
- GENERAL: 'General',
148
- APPEARANCE: 'Appearance',
149
- LANGUAGE: 'Language',
150
- ABOUT: 'About',
151
- VERSION: 'Version',
152
- TERMS_OF_SERVICE: 'Terms of Service',
153
- PRIVACY_POLICY: 'Privacy Policy',
154
- CONTACT_SUPPORT: 'Contact Support',
155
- };
156
133
 
157
- // MARK: - Details Screen Strings
158
- static readonly DETAILS = {
159
- TITLE: 'Details',
160
- DESCRIPTION: 'Description',
161
- MORE_INFO: 'More Information',
162
- RELATED_ITEMS: 'Related Items',
163
- SHARE: 'Share',
164
- BOOKMARK: 'Bookmark',
165
- };
166
134
 
167
- // MARK: - Alert Messages
168
- static readonly ALERTS = {
169
- CONFIRM_LOGOUT: 'Are you sure you want to logout?',
170
- CONFIRM_DELETE: 'Are you sure you want to delete this item?',
171
- NETWORK_ERROR: 'Network error. Please check your connection.',
172
- SERVER_ERROR: 'Server error. Please try again later.',
173
- UNKNOWN_ERROR: 'An unknown error occurred.',
174
- };
175
135
 
176
- // MARK: - Accessibility Strings
177
- static readonly ACCESSIBILITY = {
178
- LOGIN_BUTTON: 'Login button',
179
- SIGNUP_BUTTON: 'Sign up button',
180
- EMAIL_INPUT: 'Email input field',
181
- PASSWORD_INPUT: 'Password input field',
182
- FORGOT_PASSWORD_LINK: 'Forgot password link',
183
- MENU_BUTTON: 'Menu button',
184
- BACK_BUTTON: 'Back button',
185
- CLOSE_BUTTON: 'Close button',
186
- };
187
- static readonly Teams = {
188
- TEAMS: 'Teams',
189
- JOIN_TEAM_SUBTITLE: 'Join Team',
190
- PENDING_REQUEST: 'Pending Request',
191
- MY_TEAMS_SECTION_TITLE: 'MY TEAMS',
192
- SEARCH_AND_JOIN_TEAM:'Search and join team to explore the events, matches, and activities and more.',
193
- UNIQUE_CODE_AND_CLUB_NAME:'Unique code and club name',
194
- SEARCH_BY_TEAM_NAME:'Search by team name'
195
- };
196
- static readonly Announcements = {
197
- ANNOUNCEMENTS: 'Announcements'
198
- };
199
- static readonly VolunteerOpportunities = {
200
- VOLUNTEER_OPPORTUNITIES: 'Volunteer Opportunities',
201
- TOTAL_HOURS: "Total Hours",
202
- HOURS: " Hours",
203
- NEXT_SHIFT: "Next Shift",
204
- THIS_MONTH: "This Month",
205
- VIEW_MORE_DETAILS: "View Details",
206
- };
136
+
137
+
138
+
139
+
140
+
141
+
207
142
 
208
143
  }
209
144
 
@@ -61,11 +61,23 @@ export const darkTheme: Theme = {
61
61
  ...lightTheme,
62
62
  colors: {
63
63
  ...lightTheme.colors,
64
+ primary: '#0A84FF',
65
+ secondary: '#5E5CE6',
64
66
  background: '#000000',
65
67
  surface: '#1C1C1E',
66
68
  text: '#FFFFFF',
67
69
  textSecondary: '#8E8E93',
68
70
  border: '#38383A',
71
+ success: '#30D158',
72
+ warning: '#FF9F0A',
73
+ error: '#FF453A',
74
+ blue: '#3B82F6',
75
+ DarkGray: '#B0B0B0',
76
+ lightLavenderGray: '#1C1C1E',
77
+ imageBorder: '#2C2C2E',
78
+ paraText: '#D1D1D6',
79
+ white: '#FFFFFF',
80
+ black: '#000000',
69
81
  },
70
82
  };
71
83
 
@@ -0,0 +1,85 @@
1
+ import React, { useMemo } from 'react';
2
+ import { StyleSheet, Platform } from 'react-native';
3
+ import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
4
+ import { BottomTabParamList } from '../types';
5
+ import { HomeScreen, ProfileScreen, SettingsScreen } from '../screens';
6
+ import { Icon } from '../components/common';
7
+ import { useTheme } from '../stores/themeStore';
8
+ import { Theme } from '../types';
9
+
10
+ const Tab = createBottomTabNavigator<BottomTabParamList>();
11
+
12
+ export const BottomTabNavigator: React.FC = () => {
13
+ const theme = useTheme();
14
+ const styles = useMemo(() => createStyles(theme), [theme]);
15
+
16
+ return (
17
+ <Tab.Navigator
18
+ id={undefined}
19
+ initialRouteName="Home"
20
+ screenOptions={{
21
+ headerShown: false,
22
+ tabBarActiveTintColor: theme.colors.primary,
23
+ tabBarInactiveTintColor: theme.colors.textSecondary,
24
+ tabBarStyle: styles.tabBar,
25
+ tabBarLabelStyle: styles.tabBarLabel,
26
+ tabBarItemStyle: styles.tabBarItem,
27
+ }}
28
+ >
29
+ <Tab.Screen
30
+ name="Home"
31
+ component={HomeScreen}
32
+ options={{
33
+ tabBarLabel: 'Home',
34
+ tabBarIcon: ({ color, size }) => (
35
+ <Icon name="home" size={size} color={color} />
36
+ ),
37
+ }}
38
+ />
39
+ <Tab.Screen
40
+ name="Settings"
41
+ component={SettingsScreen}
42
+ options={{
43
+ tabBarLabel: 'Settings',
44
+ tabBarIcon: ({ color, size }) => (
45
+ <Icon name="settings" size={size} color={color} />
46
+ ),
47
+ }}
48
+ />
49
+ <Tab.Screen
50
+ name="Profile"
51
+ component={ProfileScreen}
52
+ options={{
53
+ tabBarLabel: 'Profile',
54
+ tabBarIcon: ({ color, size }) => (
55
+ <Icon name="user" size={size} color={color} />
56
+ ),
57
+ }}
58
+ />
59
+ </Tab.Navigator>
60
+ );
61
+ };
62
+
63
+ const createStyles = (theme: Theme) =>
64
+ StyleSheet.create({
65
+ tabBar: {
66
+ backgroundColor: theme.colors.background,
67
+ borderTopColor: theme.colors.border,
68
+ borderTopWidth: StyleSheet.hairlineWidth,
69
+ paddingTop: theme.spacing.xs,
70
+ height: Platform.OS === 'ios' ? 88 : 64,
71
+ elevation: 8,
72
+ shadowColor: theme.colors.black,
73
+ shadowOffset: { width: 0, height: -2 },
74
+ shadowOpacity: 0.08,
75
+ shadowRadius: 8,
76
+ },
77
+ tabBarLabel: {
78
+ fontSize: theme.typography.fontSize.xs,
79
+ fontWeight: theme.typography.fontWeight.medium,
80
+ marginTop: 2,
81
+ },
82
+ tabBarItem: {
83
+ paddingVertical: theme.spacing.xs,
84
+ },
85
+ });
@@ -1,18 +1,18 @@
1
- import React from 'react';
2
- import { createNativeStackNavigator } from '@react-navigation/native-stack';
3
- import { MainStackParamList } from '../types';
4
- import {
5
- HomeScreen,
6
- } from '../screens';
7
- import { theme } from '../constants/theme';
1
+ import React from "react";
2
+ import { createNativeStackNavigator } from "@react-navigation/native-stack";
3
+ import { MainStackParamList } from "../types";
4
+ import { BottomTabNavigator } from "./BottomTabNavigator";
5
+ import { useTheme } from "../stores/themeStore";
8
6
 
9
7
  const Stack = createNativeStackNavigator<MainStackParamList>();
10
8
 
11
9
  export const MainStack: React.FC = () => {
10
+ const theme = useTheme();
11
+
12
12
  return (
13
13
  <Stack.Navigator
14
14
  id={undefined}
15
- initialRouteName="Home"
15
+ initialRouteName="BottomTabs"
16
16
  screenOptions={{
17
17
  headerShown: false,
18
18
  headerStyle: {
@@ -23,13 +23,16 @@ export const MainStack: React.FC = () => {
23
23
  fontWeight: theme.typography.fontWeight.semibold,
24
24
  fontSize: theme.typography.fontSize.lg,
25
25
  },
26
- headerBackTitle: '',
27
- animation: 'fade',
26
+ headerBackTitle: "",
27
+ animation: "fade",
28
28
  headerShadowVisible: false,
29
29
  }}
30
30
  >
31
- <Stack.Screen name="Home" component={HomeScreen} options={{ title: 'Club Yakka', headerLargeTitle: true }} />
32
-
31
+ <Stack.Screen
32
+ name="BottomTabs"
33
+ component={BottomTabNavigator}
34
+ options={{ headerShown: false }}
35
+ />
33
36
  </Stack.Navigator>
34
37
  );
35
38
  };