From 80cc18449808efc93bcafe8ad39f02359892365a Mon Sep 17 00:00:00 2001 From: Dejan Date: Sun, 20 Oct 2024 18:32:16 +0200 Subject: [PATCH 1/8] - Removed console.log - Fixed an issue with title undefined when syncing events --- calendar-integration/google-calendar-utils.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/calendar-integration/google-calendar-utils.js b/calendar-integration/google-calendar-utils.js index 26a0e26..982ab4e 100644 --- a/calendar-integration/google-calendar-utils.js +++ b/calendar-integration/google-calendar-utils.js @@ -1,5 +1,4 @@ export async function fetchGoogleCalendarEvents(token, email, familyId, startDate, endDate) { - console.log(token); const response = await fetch( `https://www.googleapis.com/calendar/v3/calendars/primary/events?single_events=true&time_min=${startDate}&time_max=${endDate}`, { @@ -10,7 +9,6 @@ export async function fetchGoogleCalendarEvents(token, email, familyId, startDat ); const data = await response.json(); - console.log(data); const googleEvents = []; data.items?.forEach((item) => { let isAllDay = false; @@ -41,7 +39,7 @@ export async function fetchGoogleCalendarEvents(token, email, familyId, startDat const googleEvent = { id: item.id, - title: item.summary, + title: item.summary ?? "", startDate: startDateTime, endDate: endDateTime, allDay: isAllDay, From bb72c6c01146d43398c2de42d44b911239e3207d Mon Sep 17 00:00:00 2001 From: Dejan Date: Sun, 20 Oct 2024 18:34:48 +0200 Subject: [PATCH 2/8] - Implemented connecting multiple accounts for google --- .../pages/settings/CalendarSettingsPage.tsx | 118 +++++++++++------- firebase/functions/index.js | 14 ++- hooks/firebase/types/profileTypes.ts | 3 +- hooks/useFetchAndSaveGoogleEvents.ts | 6 +- 4 files changed, 90 insertions(+), 51 deletions(-) diff --git a/components/pages/settings/CalendarSettingsPage.tsx b/components/pages/settings/CalendarSettingsPage.tsx index beb416c..20ac573 100644 --- a/components/pages/settings/CalendarSettingsPage.tsx +++ b/components/pages/settings/CalendarSettingsPage.tsx @@ -90,8 +90,11 @@ const CalendarSettingsPage = (props: { const userInfo = await userInfoResponse.json(); const googleMail = userInfo.email; + let googleAccounts = profileData?.googleAccounts; + const updatedGoogleAccounts = googleAccounts ? {...googleAccounts, [googleMail]: accessToken} : {[googleMail]: accessToken}; + await updateUserData({ - newUserData: {googleToken: accessToken, googleMail: googleMail}, + newUserData: {googleAccounts: updatedGoogleAccounts}, }); await fetchAndSaveGoogleEvents({token: accessToken, email: googleMail}) @@ -263,11 +266,14 @@ const CalendarSettingsPage = (props: { debouncedUpdateUserData(color); }; - const clearToken = async (provider: "google" | "outlook" | "apple") => { + const clearToken = async (provider: "google" | "outlook" | "apple", email: string) => { const newUserData: Partial = {}; if (provider === "google") { - newUserData.googleToken = null; - newUserData.googleMail = null; + let googleAccounts = profileData?.googleAccounts; + if (googleAccounts) { + googleAccounts[email] = null; + newUserData.googleAccounts = googleAccounts; + } } else if (provider === "outlook") { newUserData.microsoftToken = null; newUserData.outlookMail = null; @@ -278,6 +284,16 @@ const CalendarSettingsPage = (props: { await updateUserData({newUserData}); }; + let isConnectedToGoogle = false; + if (profileData?.googleAccounts) { + Object.values(profileData?.googleAccounts).forEach((item) => { + if (item !== null) { + isConnectedToGoogle = true; + return; + } + }); + } + return ( @@ -378,8 +394,8 @@ const CalendarSettingsPage = (props: { - - - - ); + + + + + + ); }; export default AddChore; const styles = StyleSheet.create({ - divider: { height: 1, backgroundColor: "#e4e4e4", marginVertical: 15 }, - gradient: { - height: "25%", - position: "absolute", - bottom: 0, - width: "100%", - }, - buttonContainer: { - position: "absolute", - bottom: 25, - width: "100%", - }, - button: { - backgroundColor: "rgb(253, 23, 117)", - paddingVertical: 20, - }, - topBtn: { - backgroundColor: "white", - color: "#05a8b6", - }, - rotateSwitch: { - marginLeft: 35, - marginBottom: 10, - marginTop: 25, - }, -}); + gradient: { + height: 150, + position: "absolute", + bottom: 0, + width: "100%", + justifyContent: "center", + alignItems: "center", + }, + buttonContainer: { + width: "100%", + alignItems: "center", + }, + button: { + backgroundColor: "rgb(253, 23, 117)", + paddingVertical: 15, + paddingHorizontal: 30, + borderRadius: 30, + }, +}); \ No newline at end of file diff --git a/components/pages/todos/ToDosPage.tsx b/components/pages/todos/ToDosPage.tsx index 8c3aa46..8dddfc2 100644 --- a/components/pages/todos/ToDosPage.tsx +++ b/components/pages/todos/ToDosPage.tsx @@ -1,79 +1,83 @@ -import { View, Text, Button, ButtonSize } from "react-native-ui-lib"; -import React, { useState } from "react"; +import {Button, Text, View} from "react-native-ui-lib"; +import React, {useState} from "react"; import HeaderTemplate from "@/components/shared/HeaderTemplate"; import AddChore from "./AddChore"; import ProgressCard from "./ProgressCard"; import ToDosList from "./ToDosList"; -import { Dimensions, ScrollView } from "react-native"; -import { StyleSheet } from "react-native"; -import { TouchableOpacity } from "react-native-gesture-handler"; -import { ProfileType, useAuthContext } from "@/contexts/AuthContext"; +import {Dimensions, ScrollView, StyleSheet} from "react-native"; +import {TouchableOpacity} from "react-native-gesture-handler"; +import {ProfileType, useAuthContext} from "@/contexts/AuthContext"; import FamilyChoresProgress from "./family-chores/FamilyChoresProgress"; import UserChoresProgress from "./user-chores/UserChoresProgress"; const ToDosPage = () => { - const [pageIndex, setPageIndex] = useState(0); - const { profileData } = useAuthContext(); - const { width, height } = Dimensions.get("screen"); - const pageLink = ( - setPageIndex(1)}> - - View family progress - - - ); - return ( - - {pageIndex == 0 && ( - - - - - {profileData?.userType == ProfileType.CHILD && ( - - setPageIndex(2)} - > - (0); + const {profileData} = useAuthContext(); + const {width, height} = Dimensions.get("screen"); + const pageLink = ( + setPageIndex(1)}> + + View family progress + + + ); + return ( + <> + + {pageIndex == 0 && ( + + - View your full progress report here - - - } - /> - - )} - + + + {profileData?.userType == ProfileType.CHILD && ( + + setPageIndex(2)} + > + + View your full progress report here + + + } + /> + + )} + + + + + )} + {pageIndex == 1 && } + {pageIndex == 2 && } - - {profileData?.userType == ProfileType.PARENT && } - - )} - {pageIndex == 1 && } - {pageIndex == 2 && } - - ); + { + profileData?.userType == ProfileType.PARENT && + } + + ) + ; }; const styles = StyleSheet.create({ - linkBtn: { - backgroundColor: "transparent", - padding: 0, - }, + linkBtn: { + backgroundColor: "transparent", + padding: 0, + }, }); export default ToDosPage; diff --git a/ios/cally/Images.xcassets/SplashScreen.imageset/image.png b/ios/cally/Images.xcassets/SplashScreen.imageset/image.png index c52c2c68019b49c56da4faf7d8835a8392cfef7a..fbc2a87d46d75a58a115b3741bd15938d1ff82cf 100644 GIT binary patch literal 29567 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%0D=`G6k?ct-0N5j_ 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 literal 59836 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 diff --git a/ios/cally/Info.plist b/ios/cally/Info.plist index a202a32..504bab0 100644 --- a/ios/cally/Info.plist +++ b/ios/cally/Info.plist @@ -9,7 +9,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Cally. + Cally CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -112,6 +112,7 @@ $(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route $(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route $(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route + $(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route UILaunchStoryboardName SplashScreen diff --git a/yarn.lock b/yarn.lock index 6510025..ad2f2f1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8884,7 +8884,7 @@ react-native-linear-gradient@^2.8.3: react-native-onboarding-swiper@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/react-native-onboarding-swiper/-/react-native-onboarding-swiper-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/react-native-onboarding-swiper/-/react-native-onboarding-swiper-1.3.0.tgz#a97f945f03a036845242b3e1f319c6fdb262bc2b" integrity sha512-2ZPMrZrJFgR5dmVWIj60x/vTBWrm0BZPuc2w7Cz2Sq/8ChypCi3oL8F7GYMrzky1fmknCS6Z0WPphfZVpnLUnQ== dependencies: tinycolor2 "^1.4.1" From a8eb2ff48b0f8a51926425a57aadbf49b170b948 Mon Sep 17 00:00:00 2001 From: Milan Paunovic Date: Mon, 21 Oct 2024 04:19:19 +0200 Subject: [PATCH 8/8] Added pfp images --- .../settings/user_settings_views/MyGroup.tsx | 4 +- .../user_settings_views/MyProfile.tsx | 147 +++++++++++------- components/shared/AssigneesDisplay.tsx | 6 +- hooks/firebase/types/profileTypes.ts | 2 +- hooks/firebase/useChangeProfilePicture.ts | 57 +++++++ ios/Podfile.lock | 20 +++ ios/cally/Info.plist | 1 + package.json | 1 + yarn.lock | 5 + 9 files changed, 185 insertions(+), 58 deletions(-) create mode 100644 hooks/firebase/useChangeProfilePicture.ts diff --git a/components/pages/settings/user_settings_views/MyGroup.tsx b/components/pages/settings/user_settings_views/MyGroup.tsx index 7164082..0b69514 100644 --- a/components/pages/settings/user_settings_views/MyGroup.tsx +++ b/components/pages/settings/user_settings_views/MyGroup.tsx @@ -174,7 +174,7 @@ const MyGroup = () => { padding-10 > @@ -213,7 +213,7 @@ const MyGroup = () => { padding-10 > diff --git a/components/pages/settings/user_settings_views/MyProfile.tsx b/components/pages/settings/user_settings_views/MyProfile.tsx index fe91d08..1d90b0a 100644 --- a/components/pages/settings/user_settings_views/MyProfile.tsx +++ b/components/pages/settings/user_settings_views/MyProfile.tsx @@ -1,30 +1,34 @@ -import {Colors, Picker, Text, TextField, View} from "react-native-ui-lib"; import React, {useEffect, useRef, useState} from "react"; -import {ImageBackground, StyleSheet} from "react-native"; +import {StyleSheet, TouchableOpacity} from "react-native"; import {ScrollView} from "react-native-gesture-handler"; +import * as ImagePicker from "expo-image-picker"; +import {Colors, Image, Picker, Text, TextField, View} from "react-native-ui-lib"; +import Ionicons from "@expo/vector-icons/Ionicons"; +import * as tz from "tzdata"; +import * as Localization from "expo-localization"; +import debounce from "debounce"; import {useAuthContext} from "@/contexts/AuthContext"; import {useUpdateUserData} from "@/hooks/firebase/useUpdateUserData"; -import Ionicons from "@expo/vector-icons/Ionicons"; -import * as tz from 'tzdata'; -import * as Localization from 'expo-localization'; -import debounce from "debounce"; +import {useChangeProfilePicture} from "@/hooks/firebase/useChangeProfilePicture"; const MyProfile = () => { const {user, profileData} = useAuthContext(); - - const [timeZone, setTimeZone] = useState(profileData?.timeZone! ?? Localization.getCalendars()[0].timeZone); + const [timeZone, setTimeZone] = useState( + profileData?.timeZone! ?? Localization.getCalendars()[0].timeZone + ); const [lastName, setLastName] = useState(profileData?.lastName || ""); const [firstName, setFirstName] = useState( profileData?.firstName || "" ); + const [profileImage, setProfileImage] = useState(profileData?.pfp || null); const {mutateAsync: updateUserData} = useUpdateUserData(); + const {mutateAsync: changeProfilePicture} = useChangeProfilePicture(); const isFirstRender = useRef(true); - const handleUpdateUserData = async () => { await updateUserData({newUserData: {firstName, lastName, timeZone}}); - } + }; const debouncedUserDataUpdate = debounce(handleUpdateUserData, 500); @@ -34,22 +38,68 @@ const MyProfile = () => { return; } debouncedUserDataUpdate(); - }, [timeZone, lastName, firstName]); + }, [timeZone, lastName, firstName, profileImage]); + + useEffect(() => { + if (profileData) { + setFirstName(profileData.firstName || ""); + setLastName(profileData.lastName || ""); + // setProfileImage(profileData.pfp || null); + setTimeZone(profileData.timeZone || Localization.getCalendars()[0].timeZone!); + } + }, [profileData]); + + const pickImage = async () => { + const permissionResult = await ImagePicker.requestMediaLibraryPermissionsAsync(); + if (!permissionResult.granted) { + alert("Permission to access camera roll is required!"); + return; + } + + const result = await ImagePicker.launchImageLibraryAsync({ + mediaTypes: ImagePicker.MediaTypeOptions.Images, + allowsEditing: true, + aspect: [1, 1], + quality: 1, + }); + + if (!result.canceled) { + setProfileImage(result.assets[0].uri); + changeProfilePicture(result.assets[0]) + } + }; + + const handleClearImage = async () => { + await updateUserData({newUserData: {pfp: null}}); + setProfileImage(null) + } + + const pfpUri = profileImage && typeof profileImage === 'object' && 'uri' in profileImage ? profileImage.uri : profileImage; return ( Your Profile - + + + - - Change Photo - - Remove Photo + + + {profileData?.pfp ? "Change" : "Add"} Photo + + + + {profileData?.pfp && ( + + Remove Photo + + )} @@ -94,24 +144,27 @@ const MyProfile = () => { Time Zone { - setTimeZone(item as string) - }} + onChange={(item) => setTimeZone(item as string)} showSearch floatingPlaceholder style={styles.inViewPicker} trailingAccessory={ - - + + } > @@ -123,9 +176,11 @@ const MyProfile = () => { ); }; -const timeZoneItems = Object.keys(tz.zones).sort().map((zone) => ( - -)); +const timeZoneItems = Object.keys(tz.zones) + .sort() + .map((zone) => ( + + )); const styles = StyleSheet.create({ card: { @@ -139,7 +194,7 @@ const styles = StyleSheet.create({ pfp: { aspectRatio: 1, width: 65.54, - backgroundColor: "green", + backgroundColor: "gray", borderRadius: 20, }, txtBox: { @@ -150,7 +205,7 @@ const styles = StyleSheet.create({ padding: 15, height: 45, fontFamily: "PlusJakartaSans_500Medium", - fontSize: 13 + fontSize: 13, }, subTit: { fontFamily: "Manrope_500Medium", @@ -159,11 +214,11 @@ const styles = StyleSheet.create({ label: { fontFamily: "PlusJakartaSans_500Medium", fontSize: 12, - color: "#a1a1a1" + color: "#a1a1a1", }, photoSet: { fontFamily: "PlusJakartaSans_500Medium", - fontSize: 13.07 + fontSize: 13.07, }, jakarta12: { paddingVertical: 10, @@ -171,18 +226,6 @@ const styles = StyleSheet.create({ fontSize: 12, color: "#a1a1a1", }, - picker: { - borderRadius: 50, - paddingVertical: 12, - paddingHorizontal: 16, - backgroundColor: Colors.grey80, - marginBottom: 16, - borderColor: Colors.grey50, - borderWidth: 1, - marginTop: -20, - height: 40, - zIndex: 10, - }, viewPicker: { borderRadius: 50, backgroundColor: Colors.grey80, @@ -204,4 +247,4 @@ const styles = StyleSheet.create({ }, }); -export default MyProfile; +export default MyProfile; \ No newline at end of file diff --git a/components/shared/AssigneesDisplay.tsx b/components/shared/AssigneesDisplay.tsx index 92b6317..90343ab 100644 --- a/components/shared/AssigneesDisplay.tsx +++ b/components/shared/AssigneesDisplay.tsx @@ -1,6 +1,6 @@ import React from "react"; -import {ImageBackground, StyleSheet} from "react-native"; -import {Text, TouchableOpacity, View} from "react-native-ui-lib"; +import {StyleSheet} from "react-native"; +import {Image, Text, TouchableOpacity, View} from "react-native-ui-lib"; import RemoveAssigneeBtn from "./RemoveAssigneeBtn"; import {useGetFamilyMembers} from "@/hooks/firebase/useGetFamilyMembers"; @@ -26,7 +26,7 @@ const AssigneesDisplay = ({selectedAttendees, setSelectedAttendees}: { removeAttendee(member.uid!)}> {member?.pfp ? ( - } diff --git a/hooks/firebase/types/profileTypes.ts b/hooks/firebase/types/profileTypes.ts index 96ecac9..3179f65 100644 --- a/hooks/firebase/types/profileTypes.ts +++ b/hooks/firebase/types/profileTypes.ts @@ -17,7 +17,7 @@ export interface UserProfile { password: string; familyId?: string; uid?: string; - pfp?: string; + pfp?: string | null; eventColor?: string | null; timeZone?: string | null; firstDayOfWeek?: string | null; diff --git a/hooks/firebase/useChangeProfilePicture.ts b/hooks/firebase/useChangeProfilePicture.ts new file mode 100644 index 0000000..4f0b97e --- /dev/null +++ b/hooks/firebase/useChangeProfilePicture.ts @@ -0,0 +1,57 @@ +import { useMutation, useQueryClient } from "react-query"; +import firestore from "@react-native-firebase/firestore"; +import storage from "@react-native-firebase/storage"; +import { useAuthContext } from "@/contexts/AuthContext"; +import * as ImagePicker from "expo-image-picker"; +import { Platform } from "react-native"; + +export const useChangeProfilePicture = () => { + const queryClient = useQueryClient(); + const { user, refreshProfileData } = useAuthContext(); + + return useMutation({ + mutationKey: ["changeProfilePicture"], + mutationFn: async (profilePicture: ImagePicker.ImagePickerAsset) => { + if (!profilePicture?.uri) { + throw new Error("No image selected"); + } + + let imageUri = profilePicture.uri; + + console.log("Selected image URI:", imageUri); + + if (Platform.OS === 'ios' && !imageUri.startsWith('file://')) { + imageUri = `file://${imageUri}`; + console.log("Updated image URI for iOS:", imageUri); + } + + const fileName = `profilePictures/${new Date().getTime()}_profile.jpg`; + console.log("Firebase Storage file path:", fileName); + + try { + const reference = storage().ref(fileName); + + console.log('Uploading image to Firebase Storage...'); + await reference.putFile(imageUri); + console.log('Image uploaded successfully!'); + + const downloadURL = await reference.getDownloadURL(); + console.log("Download URL:", downloadURL); + + await firestore() + .collection("Profiles") + .doc(user?.uid) + .update({ pfp: downloadURL }); + + } catch (e) { + console.error("Error uploading profile picture:", e.message); + throw e; + } + }, + onSuccess: () => { + // Invalidate queries to refresh profile data + queryClient.invalidateQueries("Profiles"); + refreshProfileData(); + }, + }); +}; \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock index f8b463d..b467d5a 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1311,6 +1311,9 @@ PODS: - Firebase/Functions (10.29.0): - Firebase/CoreOnly - FirebaseFunctions (~> 10.29.0) + - Firebase/Storage (10.29.0): + - Firebase/CoreOnly + - FirebaseStorage (~> 10.29.0) - FirebaseAppCheckInterop (10.29.0) - FirebaseAuth (10.29.0): - FirebaseAppCheckInterop (~> 10.17) @@ -1382,6 +1385,13 @@ PODS: - nanopb (< 2.30911.0, >= 2.30908.0) - PromisesSwift (~> 2.1) - FirebaseSharedSwift (10.29.0) + - FirebaseStorage (10.29.0): + - FirebaseAppCheckInterop (~> 10.0) + - FirebaseAuthInterop (~> 10.25) + - FirebaseCore (~> 10.0) + - FirebaseCoreExtension (~> 10.0) + - GoogleUtilities/Environment (~> 7.12) + - GTMSessionFetcher/Core (< 4.0, >= 2.1) - fmt (9.1.0) - glog (0.3.5) - GoogleDataTransport (9.4.1): @@ -2719,6 +2729,10 @@ PODS: - Firebase/Functions (= 10.29.0) - React-Core - RNFBApp + - RNFBStorage (21.0.0): + - Firebase/Storage (= 10.29.0) + - React-Core + - RNFBApp - RNGestureHandler (2.16.2): - DoubleConversion - glog @@ -2897,6 +2911,7 @@ DEPENDENCIES: - "RNFBCrashlytics (from `../node_modules/@react-native-firebase/crashlytics`)" - "RNFBFirestore (from `../node_modules/@react-native-firebase/firestore`)" - "RNFBFunctions (from `../node_modules/@react-native-firebase/functions`)" + - "RNFBStorage (from `../node_modules/@react-native-firebase/storage`)" - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - RNReanimated (from `../node_modules/react-native-reanimated`) - RNScreens (from `../node_modules/react-native-screens`) @@ -2924,6 +2939,7 @@ SPEC REPOS: - FirebaseRemoteConfigInterop - FirebaseSessions - FirebaseSharedSwift + - FirebaseStorage - GoogleDataTransport - GoogleUtilities - "gRPC-C++" @@ -3138,6 +3154,8 @@ EXTERNAL SOURCES: :path: "../node_modules/@react-native-firebase/firestore" RNFBFunctions: :path: "../node_modules/@react-native-firebase/functions" + RNFBStorage: + :path: "../node_modules/@react-native-firebase/storage" RNGestureHandler: :path: "../node_modules/react-native-gesture-handler" RNReanimated: @@ -3210,6 +3228,7 @@ SPEC CHECKSUMS: FirebaseRemoteConfigInterop: 6efda51fb5e2f15b16585197e26eaa09574e8a4d FirebaseSessions: dbd14adac65ce996228652c1fc3a3f576bdf3ecc FirebaseSharedSwift: 20530f495084b8d840f78a100d8c5ee613375f6e + FirebaseStorage: 436c30aa46f2177ba152f268fe4452118b8a4856 fmt: 4c2741a687cc09f0634a2e2c72a838b99f1ff120 glog: fdfdfe5479092de0c4bdbebedd9056951f092c4f GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a @@ -3283,6 +3302,7 @@ SPEC CHECKSUMS: RNFBCrashlytics: f465771d96a2eaf9f6104b30abb002cfe78fc0be RNFBFirestore: e47cdde04ea3d9e73e58e037e1aa1d0b1141c316 RNFBFunctions: 738cc9e2177d060d29b5d143ef2f9ed0eda4bb1f + RNFBStorage: 2dab66f3fcc51de3acd838c72c0ff081e61a0960 RNGestureHandler: 20a4307fd21cbff339abfcfa68192f3f0a6a518b RNReanimated: d51431fd3597a8f8320319dce8e42cee82a5445f RNScreens: 30249f9331c3b00ae7cb7922e11f58b3ed369c07 diff --git a/ios/cally/Info.plist b/ios/cally/Info.plist index 504bab0..6bccf46 100644 --- a/ios/cally/Info.plist +++ b/ios/cally/Info.plist @@ -113,6 +113,7 @@ $(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route $(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route $(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route + $(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route UILaunchStoryboardName SplashScreen diff --git a/package.json b/package.json index 92e580b..bf18c9a 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "@react-native-firebase/crashlytics": "^20.3.0", "@react-native-firebase/firestore": "^20.4.0", "@react-native-firebase/functions": "^20.4.0", + "@react-native-firebase/storage": "^21.0.0", "@react-navigation/drawer": "^6.7.2", "@react-navigation/native": "^6.0.2", "date-fns": "^3.6.0", diff --git a/yarn.lock b/yarn.lock index ad2f2f1..a124c7e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2425,6 +2425,11 @@ resolved "https://registry.npmjs.org/@react-native-firebase/functions/-/functions-20.4.0.tgz" integrity sha512-g4kAWZboTE9cTdT7KT6k1haHDmEBA36bPCvrh2MJ2RACo2JxotB2MIOEPZ5U/cT94eIAlgI5YtxQQGQfC+VcBQ== +"@react-native-firebase/storage@^21.0.0": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@react-native-firebase/storage/-/storage-21.0.0.tgz#0905fd67c74629d947f176bfb988d7cc4d85e244" + integrity sha512-meft5Pu0nI7zxhpnP49ko9Uw8GaIy9hXGJfa/fCFrpf2vA9OXdTr3CvgloH/b9DpbkwQGcGTshRqltuttXI67w== + "@react-native/assets-registry@0.74.85": version "0.74.85" resolved "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.74.85.tgz"