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.
- package/package.json +2 -2
- package/template/package.json +1 -5
- package/template/src/assets/icons/index.ts +40 -135
- package/template/src/components/common/Icon.tsx +43 -38
- package/template/src/components/common/SafeAreaWrapper.tsx +11 -5
- package/template/src/constants/strings.ts +6 -71
- package/template/src/constants/theme.ts +12 -0
- package/template/src/navigation/BottomTabNavigator.tsx +85 -0
- package/template/src/navigation/MainStack.tsx +15 -12
- package/template/src/navigation/RootNavigator.tsx +31 -1
- package/template/src/navigation/index.ts +1 -0
- package/template/src/screens/DetailsScreen.tsx +53 -45
- package/template/src/screens/HomeScreen.tsx +627 -413
- package/template/src/screens/ProfileScreen.tsx +144 -142
- package/template/src/screens/SettingsScreen.tsx +178 -174
- package/template/src/screens/auth/LoginScreen.tsx +18 -37
- package/template/src/screens/index.ts +2 -4
- package/template/src/services/api.ts +5 -9
- package/template/src/services/authService.ts +10 -16
- package/template/src/services/mainServices.ts +14 -4
- package/template/src/stores/authStore.ts +60 -73
- package/template/src/stores/index.ts +3 -0
- package/template/src/stores/themeStore.ts +61 -0
- package/template/src/types/navigation.ts +28 -16
- package/template/src/utils/storage.ts +10 -11
- package/template/src/assets/icons/BG.svg +0 -33
- package/template/src/assets/icons/arrow-left-white.svg +0 -4
- package/template/src/assets/icons/arrow-left.svg +0 -4
- package/template/src/assets/icons/bottomSheetIcone.svg +0 -3
- package/template/src/assets/icons/call.svg +0 -4
- package/template/src/assets/icons/camera.svg +0 -0
- package/template/src/assets/icons/check.svg +0 -4
- package/template/src/assets/icons/check_Radio.svg +0 -4
- package/template/src/assets/icons/clubDefauldImage.png +0 -0
- package/template/src/assets/icons/defaultClub.png +0 -0
- package/template/src/assets/icons/emptyUser.svg +0 -5
- package/template/src/assets/icons/ic_Calendar.svg +0 -14
- package/template/src/assets/icons/ic_Calendar_blue.svg +0 -12
- package/template/src/assets/icons/ic_Calendar_white.svg +0 -12
- package/template/src/assets/icons/ic_Chat.svg +0 -14
- package/template/src/assets/icons/ic_ChatAppleGreen.svg +0 -21
- package/template/src/assets/icons/ic_ChatAppleWhite.svg +0 -21
- package/template/src/assets/icons/ic_Download.svg +0 -6
- package/template/src/assets/icons/ic_Events.svg +0 -6
- package/template/src/assets/icons/ic_HeadCoachIcon.svg +0 -3
- package/template/src/assets/icons/ic_Membership.svg +0 -10
- package/template/src/assets/icons/ic_Notification.svg +0 -6
- package/template/src/assets/icons/ic_Raffles.svg +0 -14
- package/template/src/assets/icons/ic_Referral_Members.svg +0 -12
- package/template/src/assets/icons/ic_Shop.svg +0 -13
- package/template/src/assets/icons/ic_Teams.svg +0 -8
- package/template/src/assets/icons/ic_Volunteer.svg +0 -9
- package/template/src/assets/icons/ic_add.svg +0 -3
- package/template/src/assets/icons/ic_addCircle.svg +0 -5
- package/template/src/assets/icons/ic_chatSend.svg +0 -4
- package/template/src/assets/icons/ic_chat_blue_bg.svg +0 -22
- package/template/src/assets/icons/ic_clock_blue.svg +0 -4
- package/template/src/assets/icons/ic_more.svg +0 -5
- package/template/src/assets/icons/ic_mute.svg +0 -10
- package/template/src/assets/icons/ic_pdf.svg +0 -3
- package/template/src/assets/icons/ic_pending_AppleGreen.svg +0 -11
- package/template/src/assets/icons/ic_right_appleGreen.svg +0 -11
- package/template/src/assets/icons/ic_unread_chat_blue_bg.svg +0 -23
- package/template/src/assets/icons/ic_volunteer_Member.svg +0 -8
- package/template/src/assets/icons/location-blue.svg +0 -4
- package/template/src/assets/icons/location-white.svg +0 -4
- package/template/src/assets/icons/profile-appleGreen.svg +0 -6
- package/template/src/assets/icons/search.svg +0 -3
- package/template/src/assets/icons/success.svg +0 -4
- package/template/src/assets/icons/unCheck_Radio.svg +0 -3
- package/template/src/assets/icons/uncheck.svg +0 -3
- package/template/src/assets/icons/upload_Image.svg +0 -6
- 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.
|
|
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
|
+
}
|
package/template/package.json
CHANGED
|
@@ -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
|
|
2
|
-
import
|
|
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
|
|
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
|
|
43
|
-
import
|
|
44
|
-
import
|
|
45
|
-
import
|
|
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
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
|
2
|
-
import { Text, View } from
|
|
3
|
-
import { SvgProps } from
|
|
4
|
-
import { theme } from
|
|
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,
|
|
8
|
-
|
|
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(
|
|
12
|
-
UserIcon = require(
|
|
13
|
-
SettingsIcon = require(
|
|
14
|
-
EyeIcon = require(
|
|
15
|
-
EyeOffIcon = require(
|
|
16
|
-
MailIcon = require(
|
|
17
|
-
LockIcon = require(
|
|
18
|
-
ChevronRightIcon = require(
|
|
19
|
-
LogOutIcon = require(
|
|
20
|
-
BellIcon = require(
|
|
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(
|
|
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
|
-
|
|
39
|
+
"eye-off": EyeOffIcon,
|
|
32
40
|
mail: MailIcon,
|
|
33
41
|
lock: LockIcon,
|
|
34
|
-
|
|
35
|
-
|
|
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 }> = ({
|
|
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:
|
|
56
|
-
justifyContent:
|
|
67
|
+
alignItems: "center",
|
|
68
|
+
justifyContent: "center",
|
|
57
69
|
}}
|
|
58
70
|
>
|
|
59
|
-
<Text style={{ color:
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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 !==
|
|
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
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
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
|
|
15
|
+
backgroundColor,
|
|
15
16
|
}) => {
|
|
17
|
+
const theme = useTheme();
|
|
18
|
+
const bgColor = backgroundColor ?? theme.colors.background;
|
|
19
|
+
|
|
16
20
|
return (
|
|
17
|
-
<SafeAreaView
|
|
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
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
|
2
|
-
import { createNativeStackNavigator } from
|
|
3
|
-
import { MainStackParamList } from
|
|
4
|
-
import {
|
|
5
|
-
|
|
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="
|
|
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:
|
|
26
|
+
headerBackTitle: "",
|
|
27
|
+
animation: "fade",
|
|
28
28
|
headerShadowVisible: false,
|
|
29
29
|
}}
|
|
30
30
|
>
|
|
31
|
-
<Stack.Screen
|
|
32
|
-
|
|
31
|
+
<Stack.Screen
|
|
32
|
+
name="BottomTabs"
|
|
33
|
+
component={BottomTabNavigator}
|
|
34
|
+
options={{ headerShown: false }}
|
|
35
|
+
/>
|
|
33
36
|
</Stack.Navigator>
|
|
34
37
|
);
|
|
35
38
|
};
|