Colors, fix family view, updated version

This commit is contained in:
Milan Paunovic
2024-10-10 02:00:14 +02:00
parent 2c099740a2
commit ca0b55c494
12 changed files with 547 additions and 661 deletions

View File

@ -1,5 +1,5 @@
<resources> <resources>
<string name="app_name">Kali - Family Planner</string> <string name="app_name">Cally - Family Planner</string>
<string name="expo_splash_screen_resize_mode" translatable="false">contain</string> <string name="expo_splash_screen_resize_mode" translatable="false">contain</string>
<string name="expo_splash_screen_status_bar_translucent" translatable="false">false</string> <string name="expo_splash_screen_status_bar_translucent" translatable="false">false</string>
<string name="expo_system_ui_user_interface_style" translatable="false">light</string> <string name="expo_system_ui_user_interface_style" translatable="false">light</string>

View File

@ -1,4 +1,4 @@
rootProject.name = 'Kali - Family Planner' rootProject.name = 'Cally - Family Planner'
dependencyResolutionManagement { dependencyResolutionManagement {
versionCatalogs { versionCatalogs {

View File

@ -1,6 +1,6 @@
{ {
"expo": { "expo": {
"name": "Kali - Family Planner", "name": "Cally - Family Planner",
"slug": "cally", "slug": "cally",
"version": "1.0.0", "version": "1.0.0",
"orientation": "portrait", "orientation": "portrait",
@ -16,7 +16,7 @@
"supportsTablet": true, "supportsTablet": true,
"bundleIdentifier": "com.cally.app", "bundleIdentifier": "com.cally.app",
"googleServicesFile": "./ios/GoogleService-Info.plist", "googleServicesFile": "./ios/GoogleService-Info.plist",
"buildNumber": "18" "buildNumber": "19"
}, },
"android": { "android": {
"adaptiveIcon": { "adaptiveIcon": {

View File

@ -1,189 +1,176 @@
import React, { useEffect, useRef, useState } from "react"; import React, {useRef, useState} from "react";
import { LayoutChangeEvent, StyleSheet } from "react-native"; import {LayoutChangeEvent, StyleSheet} from "react-native";
import { Calendar } from "react-native-big-calendar"; import {Calendar} from "react-native-big-calendar";
import { import {Picker, PickerModes, SegmentedControl, View} from "react-native-ui-lib";
Picker, import {MaterialIcons} from "@expo/vector-icons";
PickerModes, import {AddEventDialog} from "@/components/pages/calendar/AddEventDialog";
SegmentedControl,
View,
Text
} from "react-native-ui-lib";
import { MaterialIcons } from "@expo/vector-icons";
import { AddEventDialog } from "@/components/pages/calendar/AddEventDialog";
import { useAuthContext } from "@/contexts/AuthContext";
import HeaderTemplate from "@/components/shared/HeaderTemplate"; import HeaderTemplate from "@/components/shared/HeaderTemplate";
import CalendarViewSwitch from "@/components/pages/calendar/CalendarViewSwitch"; import CalendarViewSwitch from "@/components/pages/calendar/CalendarViewSwitch";
import { ManuallyAddEventModal } from "@/components/pages/calendar/ManuallyAddEventModal"; import {ManuallyAddEventModal} from "@/components/pages/calendar/ManuallyAddEventModal";
import { CalendarEvent, useCalendarContext } from "@/contexts/CalendarContext"; import {CalendarEvent} from "@/contexts/CalendarContext";
import { useSettingsContext } from "@/contexts/SettingsContext"; import {useSettingsContext} from "@/contexts/SettingsContext";
import EditEventDialog from "./EditEventDialog"; import EditEventDialog from "./EditEventDialog";
import {useGetEvents} from "@/hooks/firebase/useGetEvents"; import {useGetEvents} from "@/hooks/firebase/useGetEvents";
const modeMap = new Map([ const modeMap = new Map([
[0, "day"], [0, "day"],
[1, "week"], [1, "week"],
[2, "month"], [2, "month"],
]); ]);
const months = [ const months = [
"January", "January",
"February", "February",
"March", "March",
"April", "April",
"May", "May",
"June", "June",
"July", "July",
"August", "August",
"September", "September",
"October", "October",
"November", "November",
"December", "December",
]; ];
export default function CalendarPage() { export default function CalendarPage() {
const { calendarColor } = useSettingsContext(); const {calendarColor} = useSettingsContext();
const [editVisible, setEditVisible] = useState<boolean>(false); const [editVisible, setEditVisible] = useState<boolean>(false);
const [eventForEdit, setEventForEdit] = useState<CalendarEvent>(); const [eventForEdit, setEventForEdit] = useState<CalendarEvent>();
const styles = StyleSheet.create({ const styles = StyleSheet.create({
segmentslblStyle: { segmentslblStyle: {
fontSize: 14, fontSize: 14,
}, },
calHeader: { calHeader: {
borderWidth: 0, borderWidth: 0,
}, },
}); });
const { profileData } = useAuthContext(); const [isFamilyView, setIsFamilyView] = useState<boolean>(true);
const [isFamilyView, setIsFamilyView] = useState<boolean>(true); const [calendarHeight, setCalendarHeight] = useState(0);
const [calendarHeight, setCalendarHeight] = useState(0); const [mode, setMode] = useState<"week" | "month" | "day">("week");
const [mode, setMode] = useState<"week" | "month" | "day">("week"); const [selectedDate, setSelectedDate] = useState<Date>(new Date());
const [selectedDate, setSelectedDate] = useState<Date>(new Date()); const [selectedNewEventDate, setSelectedNewEndDate] = useState<
const [selectedNewEventDate, setSelectedNewEndDate] = useState< Date | undefined
Date | undefined >(undefined);
>(undefined);
const calendarContainerRef = useRef(null); const calendarContainerRef = useRef(null);
// const { events, familyEvents } = useCalendarContext(); const {data: events} = useGetEvents(isFamilyView)
const {data: events} = useGetEvents()
const onLayout = (event: LayoutChangeEvent) => { const onLayout = (event: LayoutChangeEvent) => {
const { height } = event.nativeEvent.layout; const {height} = event.nativeEvent.layout;
setCalendarHeight(height); setCalendarHeight(height);
}; };
const handleSegmentChange = (index: number) => { const handleSegmentChange = (index: number) => {
const selectedMode = modeMap.get(index); const selectedMode = modeMap.get(index);
if (selectedMode) { if (selectedMode) {
setMode(selectedMode as "day" | "week" | "month"); setMode(selectedMode as "day" | "week" | "month");
} }
}; };
const handleMonthChange = (month: string) => { const handleMonthChange = (month: string) => {
// Get the current day and year const currentDay = selectedDate.getDate();
const currentDay = selectedDate.getDate(); const currentYear = selectedDate.getFullYear();
const currentYear = selectedDate.getFullYear();
// Find the new month index const newMonthIndex = months.indexOf(month);
const newMonthIndex = months.indexOf(month);
// Create a new Date object with the selected month, preserving day and year const updatedDate = new Date(currentYear, newMonthIndex, currentDay);
const updatedDate = new Date(currentYear, newMonthIndex, currentDay);
// Update both selectedDate and activeDate in the Calendar component setSelectedDate(updatedDate);
setSelectedDate(updatedDate); };
};
return ( return (
<View style={{ flex: 1, height: "100%", padding: 10 }}> <View style={{flex: 1, height: "100%", padding: 10}}>
<HeaderTemplate <HeaderTemplate
message={"Let's get your week started!"} message={"Let's get your week started!"}
isWelcome={true} isWelcome={true}
/> />
<View <View
style={{ flex: 1, backgroundColor: "#fff", borderRadius: 30 }} style={{flex: 1, backgroundColor: "#fff", borderRadius: 30}}
ref={calendarContainerRef} ref={calendarContainerRef}
onLayout={onLayout} onLayout={onLayout}
> >
<View <View
style={{ style={{
flexDirection: "row", flexDirection: "row",
justifyContent: "space-between", justifyContent: "space-between",
alignItems: "center", alignItems: "center",
paddingHorizontal: 10, paddingHorizontal: 10,
paddingVertical: 8, paddingVertical: 8,
borderRadius: 20, borderRadius: 20,
borderBottomLeftRadius: 0, borderBottomLeftRadius: 0,
borderBottomRightRadius: 0, borderBottomRightRadius: 0,
backgroundColor: "white", backgroundColor: "white",
marginBottom: 10, marginBottom: 10,
}} }}
> >
<Picker <Picker
value={months[selectedDate.getMonth()]} // Get the month from the date value={months[selectedDate.getMonth()]} // Get the month from the date
placeholder={"Select Month"} placeholder={"Select Month"}
mode={PickerModes.SINGLE} mode={PickerModes.SINGLE}
onChange={(itemValue) => handleMonthChange(itemValue as string)} onChange={(itemValue) => handleMonthChange(itemValue as string)}
trailingAccessory={<MaterialIcons name={"keyboard-arrow-down"} />} trailingAccessory={<MaterialIcons name={"keyboard-arrow-down"}/>}
> >
{months.map((month) => ( {months.map((month) => (
<Picker.Item key={month} label={month} value={month} /> <Picker.Item key={month} label={month} value={month}/>
))} ))}
</Picker> </Picker>
<View> <View>
<SegmentedControl <SegmentedControl
segments={[{ label: "D" }, { label: "W" }, { label: "M" }]} segments={[{label: "D"}, {label: "W"}, {label: "M"}]}
backgroundColor="#ececec" backgroundColor="#ececec"
inactiveColor="#919191" inactiveColor="#919191"
activeBackgroundColor="#ea156c" activeBackgroundColor="#ea156c"
activeColor="white" activeColor="white"
outlineColor="white" outlineColor="white"
outlineWidth={3} outlineWidth={3}
style={{ backgroundColor: "green" }} style={{backgroundColor: "green"}}
segmentLabelStyle={styles.segmentslblStyle} segmentLabelStyle={styles.segmentslblStyle}
onChangeIndex={handleSegmentChange} onChangeIndex={handleSegmentChange}
initialIndex={mode === "day" ? 0 : mode === "week" ? 1 : 2} initialIndex={mode === "day" ? 0 : mode === "week" ? 1 : 2}
/>
</View>
</View>
{calendarHeight > 0 && (
<Calendar
bodyContainerStyle={styles.calHeader}
mode={mode}
events={isFamilyView ? events ?? [] : events ?? []}
eventCellStyle={(event) => ({backgroundColor: event.eventColor})}
onPressEvent={(event) => {
setEditVisible(true);
setEventForEdit(event);
}}
height={calendarHeight}
activeDate={selectedDate}
date={selectedDate}
onPressCell={setSelectedNewEndDate}
/>
)}
</View>
<CalendarViewSwitch viewSwitch={setIsFamilyView}/>
<AddEventDialog/>
{eventForEdit && (
<EditEventDialog
isVisible={editVisible}
setIsVisible={() => {
setEditVisible(!editVisible);
}}
event={eventForEdit}
/>
)}
<ManuallyAddEventModal
key={`${selectedNewEventDate}`}
initialDate={selectedNewEventDate}
show={!!selectedNewEventDate}
close={() => setSelectedNewEndDate(undefined)}
/> />
</View>
</View> </View>
);
{calendarHeight > 0 && (
<Calendar
bodyContainerStyle={styles.calHeader}
mode={mode}
events={isFamilyView ? events ?? [] : events ?? []}
eventCellStyle={{ backgroundColor: isFamilyView ? '#46a80a' : calendarColor }}
onPressEvent={(event) => {
setEditVisible(true);
setEventForEdit(event);
}}
height={calendarHeight}
activeDate={selectedDate}
date={selectedDate}
onPressCell={setSelectedNewEndDate}
/>
)}
</View>
<CalendarViewSwitch viewSwitch={setIsFamilyView} />
<AddEventDialog />
{eventForEdit && (
<EditEventDialog
isVisible={editVisible}
setIsVisible={() => {
setEditVisible(!editVisible);
}}
event={eventForEdit}
/>
)}
<ManuallyAddEventModal
key={`${selectedNewEventDate}`}
initialDate={selectedNewEventDate}
show={!!selectedNewEventDate}
close={() => setSelectedNewEndDate(undefined)}
/>
</View>
);
} }

View File

@ -1,5 +1,5 @@
import {AntDesign, Ionicons} from "@expo/vector-icons"; import {AntDesign, Ionicons} from "@expo/vector-icons";
import React, {useState} from "react"; import React, {useCallback, useState} from "react";
import {Button, Checkbox, Text, View} from "react-native-ui-lib"; import {Button, Checkbox, Text, View} from "react-native-ui-lib";
import {ScrollView, StyleSheet} from "react-native"; import {ScrollView, StyleSheet} from "react-native";
import {colorMap} from "@/contexts/SettingsContext"; import {colorMap} from "@/contexts/SettingsContext";
@ -11,6 +11,7 @@ import {useAuthContext} from "@/contexts/AuthContext";
import {useUpdateUserData} from "@/hooks/firebase/useUpdateUserData"; import {useUpdateUserData} from "@/hooks/firebase/useUpdateUserData";
import {GoogleSignin} from "@react-native-google-signin/google-signin"; import {GoogleSignin} from "@react-native-google-signin/google-signin";
import * as AuthSession from "expo-auth-session"; import * as AuthSession from "expo-auth-session";
import debounce from "debounce";
GoogleSignin.configure({ GoogleSignin.configure({
webClientId: webClientId:
@ -40,10 +41,12 @@ const microsoftConfig = {
const CalendarSettingsPage = (props: { const CalendarSettingsPage = (props: {
setSelectedPage: (page: number) => void; setSelectedPage: (page: number) => void;
}) => { }) => {
const [selectedColor, setSelectedColor] = useState<string>(colorMap.pink);
const [startDate, setStartDate] = useState<boolean>(true); const [startDate, setStartDate] = useState<boolean>(true);
const {profileData} = useAuthContext(); const {profileData} = useAuthContext();
const [selectedColor, setSelectedColor] = useState<string>(profileData?.eventColor ?? colorMap.pink);
const [previousSelectedColor, setPreviousSelectedColor] = useState<string>(profileData?.eventColor ?? colorMap.pink);
const {mutateAsync: createEventFromProvider} = useCreateEventFromProvider(); const {mutateAsync: createEventFromProvider} = useCreateEventFromProvider();
const {mutateAsync: updateUserData} = useUpdateUserData(); const {mutateAsync: updateUserData} = useUpdateUserData();
@ -162,6 +165,28 @@ const CalendarSettingsPage = (props: {
} }
}; };
const debouncedUpdateUserData = useCallback(
debounce(async (color: string) => {
try {
await updateUserData({
newUserData: {
eventColor: color
}
});
} catch (error) {
console.error("Failed to update color:", error);
setSelectedColor(previousSelectedColor)
}
}, 500),
[]
);
const handleChangeColor = (color: string) => {
setPreviousSelectedColor(selectedColor)
setSelectedColor(color);
debouncedUpdateUserData(color);
};
return ( return (
<ScrollView> <ScrollView>
<View marginH-30> <View marginH-30>
@ -179,35 +204,35 @@ const CalendarSettingsPage = (props: {
Event Color Preference Event Color Preference
</Text> </Text>
<View row spread> <View row spread>
<TouchableOpacity onPress={() => setSelectedColor(colorMap.pink)}> <TouchableOpacity onPress={() => handleChangeColor(colorMap.pink)}>
<View style={styles.colorBox} backgroundColor={colorMap.pink}> <View style={styles.colorBox} backgroundColor={colorMap.pink}>
{selectedColor == colorMap.pink && ( {selectedColor == colorMap.pink && (
<AntDesign name="check" size={30} color="white"/> <AntDesign name="check" size={30} color="white"/>
)} )}
</View> </View>
</TouchableOpacity> </TouchableOpacity>
<TouchableOpacity onPress={() => setSelectedColor(colorMap.orange)}> <TouchableOpacity onPress={() => handleChangeColor(colorMap.orange)}>
<View style={styles.colorBox} backgroundColor={colorMap.orange}> <View style={styles.colorBox} backgroundColor={colorMap.orange}>
{selectedColor == colorMap.orange && ( {selectedColor == colorMap.orange && (
<AntDesign name="check" size={30} color="white"/> <AntDesign name="check" size={30} color="white"/>
)} )}
</View> </View>
</TouchableOpacity> </TouchableOpacity>
<TouchableOpacity onPress={() => setSelectedColor(colorMap.green)}> <TouchableOpacity onPress={() => handleChangeColor(colorMap.green)}>
<View style={styles.colorBox} backgroundColor={colorMap.green}> <View style={styles.colorBox} backgroundColor={colorMap.green}>
{selectedColor == colorMap.green && ( {selectedColor == colorMap.green && (
<AntDesign name="check" size={30} color="white"/> <AntDesign name="check" size={30} color="white"/>
)} )}
</View> </View>
</TouchableOpacity> </TouchableOpacity>
<TouchableOpacity onPress={() => setSelectedColor(colorMap.teal)}> <TouchableOpacity onPress={() => handleChangeColor(colorMap.teal)}>
<View style={styles.colorBox} backgroundColor={colorMap.teal}> <View style={styles.colorBox} backgroundColor={colorMap.teal}>
{selectedColor == colorMap.teal && ( {selectedColor == colorMap.teal && (
<AntDesign name="check" size={30} color="white"/> <AntDesign name="check" size={30} color="white"/>
)} )}
</View> </View>
</TouchableOpacity> </TouchableOpacity>
<TouchableOpacity onPress={() => setSelectedColor(colorMap.purple)}> <TouchableOpacity onPress={() => handleChangeColor(colorMap.purple)}>
<View style={styles.colorBox} backgroundColor={colorMap.purple}> <View style={styles.colorBox} backgroundColor={colorMap.purple}>
{selectedColor == colorMap.purple && ( {selectedColor == colorMap.purple && (
<AntDesign name="check" size={30} color="white"/> <AntDesign name="check" size={30} color="white"/>
@ -344,34 +369,34 @@ const CalendarSettingsPage = (props: {
const styles = StyleSheet.create({ const styles = StyleSheet.create({
addCalBtn: { addCalBtn: {
backgroundColor: "#ffffff", backgroundColor: "#ffffff",
marginBottom: 15, marginBottom: 15,
justifyContent: "flex-start", justifyContent: "flex-start",
paddingLeft: 25, paddingLeft: 25,
}, },
backBtn: { backBtn: {
backgroundColor: "red", backgroundColor: "red",
marginLeft: -2, marginLeft: -2,
justifyContent: "flex-start", justifyContent: "flex-start",
}, },
card: { card: {
backgroundColor: "white", backgroundColor: "white",
width: "100%", width: "100%",
padding: 20, padding: 20,
paddingBottom: 30, paddingBottom: 30,
marginTop: 20, marginTop: 20,
borderRadius: 20, borderRadius: 20,
}, },
colorBox: { colorBox: {
aspectRatio: 1, aspectRatio: 1,
justifyContent: "center", justifyContent: "center",
alignItems: "center", alignItems: "center",
width: 50, width: 50,
borderRadius: 12, borderRadius: 12,
}, },
checkbox: { checkbox: {
borderRadius: 50, borderRadius: 50,
}, },
}); });
export default CalendarSettingsPage; export default CalendarSettingsPage;

View File

@ -19,6 +19,7 @@ export interface UserProfile {
uid?: string; uid?: string;
googleToken?: string; googleToken?: string;
microsoftToken?: string; microsoftToken?: string;
eventColor?: string
} }
export interface ParentProfile extends UserProfile { export interface ParentProfile extends UserProfile {

View File

@ -1,31 +1,43 @@
import {useQuery} from "react-query"; import {useQuery} from "react-query";
import firestore from "@react-native-firebase/firestore"; import firestore from "@react-native-firebase/firestore";
import {ReactElement} from "react";
import {useAuthContext} from "@/contexts/AuthContext"; import {useAuthContext} from "@/contexts/AuthContext";
import {ICalendarEventBase} from "react-native-big-calendar"; import {colorMap} from "@/contexts/SettingsContext";
export const useGetEvents = () => { export const useGetEvents = (isFamilyView: boolean) => {
const {user} = useAuthContext() const { user, profileData } = useAuthContext();
return useQuery({ return useQuery({
queryKey: ["events", user?.uid], queryKey: ["events", user?.uid, isFamilyView],
queryFn: async () => { queryFn: async () => {
const snapshot = await firestore() const eventsQuery = firestore()
.collection("Events") .collection("Events")
.where("creatorId", "==", user?.uid) .where("creatorId", "==", user?.uid);
.get();
const events: ICalendarEventBase[] = snapshot.docs.map((doc) => { if (isFamilyView) {
eventsQuery.where("familyID", "==", profileData?.familyId);
}
const snapshot = await eventsQuery.get();
return await Promise.all(snapshot.docs.map(async (doc) => {
const data = doc.data(); const data = doc.data();
const profileSnapshot = await firestore()
.collection("Profiles")
.doc(data.creatorId)
.get();
const profileData = profileSnapshot.data();
const eventColor: string = profileData?.eventColor || colorMap.pink // Default color if not found
return { return {
title: data.title, title: data.title,
start: new Date(data.startDate.seconds * 1000), start: new Date(data.startDate.seconds * 1000),
end: new Date(data.endDate.seconds * 1000), end: new Date(data.endDate.seconds * 1000),
hideHours: data.allDay, hideHours: data.allDay,
eventColor: eventColor,
}; };
}); }));
},
return events; });
} };
})
}

View File

@ -5,7 +5,7 @@ import {UserProfile} from "@/hooks/firebase/types/profileTypes";
import {FirebaseAuthTypes} from "@react-native-firebase/auth"; import {FirebaseAuthTypes} from "@react-native-firebase/auth";
export const useUpdateUserData = () => { export const useUpdateUserData = () => {
const {user: currentUser, setProfileData, refreshProfileData} = useAuthContext(); const {user: currentUser, refreshProfileData} = useAuthContext();
return useMutation({ return useMutation({
mutationKey: ["updateUserData"], mutationKey: ["updateUserData"],

View File

@ -437,7 +437,7 @@
); );
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
PRODUCT_BUNDLE_IDENTIFIER = com.cally.app; PRODUCT_BUNDLE_IDENTIFIER = com.cally.app;
PRODUCT_NAME = "KaliFamilyPlanner"; PRODUCT_NAME = "CallyFamilyPlanner";
SWIFT_OBJC_BRIDGING_HEADER = "cally/cally-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "cally/cally-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@ -468,7 +468,7 @@
); );
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";
PRODUCT_BUNDLE_IDENTIFIER = com.cally.app; PRODUCT_BUNDLE_IDENTIFIER = com.cally.app;
PRODUCT_NAME = "KaliFamilyPlanner"; PRODUCT_NAME = "CallyFamilyPlanner";
SWIFT_OBJC_BRIDGING_HEADER = "cally/cally-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "cally/cally-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";

View File

@ -7,7 +7,7 @@
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string> <string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
<string>Kali - Family Planner</string> <string>Cally - Family Planner</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string> <string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
@ -45,7 +45,7 @@
</dict> </dict>
</array> </array>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>18</string> <string>19</string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
<true/> <true/>
<key>NSAppTransportSecurity</key> <key>NSAppTransportSecurity</key>
@ -81,6 +81,7 @@
<string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string> <string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string> <string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string> <string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string>
</array> </array>
<key>UILaunchStoryboardName</key> <key>UILaunchStoryboardName</key>
<string>SplashScreen</string> <string>SplashScreen</string>

View File

@ -39,6 +39,7 @@
"@react-navigation/drawer": "^6.7.2", "@react-navigation/drawer": "^6.7.2",
"@react-navigation/native": "^6.0.2", "@react-navigation/native": "^6.0.2",
"date-fns": "^3.6.0", "date-fns": "^3.6.0",
"debounce": "^2.1.1",
"expo": "~51.0.24", "expo": "~51.0.24",
"expo-auth-session": "^5.5.2", "expo-auth-session": "^5.5.2",
"expo-barcode-scanner": "~13.0.1", "expo-barcode-scanner": "~13.0.1",

735
yarn.lock

File diff suppressed because it is too large Load Diff