From 5cfec1544a1274332395b71d5b5138bd2791cabe Mon Sep 17 00:00:00 2001 From: Milan Paunovic Date: Sun, 2 Feb 2025 22:28:40 +0100 Subject: [PATCH] Calendar improvements --- .idea/material_theme_project_new.xml | 12 + app/(auth)/_layout.tsx | 721 ++- app/_layout.tsx | 5 +- .../tablet_components/UsersList.tsx | 2 +- .../pages/calendar/CalendarController.tsx | 27 + components/pages/calendar/CalendarHeader.tsx | 212 +- components/pages/calendar/CalendarPage.tsx | 5 - .../pages/calendar/DetailedCalendar.tsx | 66 +- .../calendar/DetailedCalendarController.tsx | 38 + components/pages/calendar/EventCalendar.tsx | 43 +- components/pages/calendar/InnerCalendar.tsx | 14 +- .../pages/calendar/ManuallyAddEventModal.tsx | 53 +- components/pages/calendar/MonthCalendar.tsx | 126 +- .../pages/calendar/useFormattedEvents.ts | 2 +- components/pages/todos/AddChoreDialog.tsx | 2 +- components/shared/RefreshButton.tsx | 53 +- firebase/functions/index.js | 587 ++- ios/Podfile.lock | 4001 +++++++++++++++++ package.json | 1 - patches/@howljs+calendar-kit+2.2.1.patch | 148 + .../react-native-big-calendar+4.15.1.patch | 195 - yarn.lock | 15 +- 22 files changed, 5140 insertions(+), 1188 deletions(-) create mode 100644 .idea/material_theme_project_new.xml create mode 100644 components/pages/calendar/CalendarController.tsx create mode 100644 components/pages/calendar/DetailedCalendarController.tsx create mode 100644 ios/Podfile.lock create mode 100644 patches/@howljs+calendar-kit+2.2.1.patch delete mode 100644 patches/react-native-big-calendar+4.15.1.patch diff --git a/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml new file mode 100644 index 0000000..2a8895b --- /dev/null +++ b/.idea/material_theme_project_new.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/(auth)/_layout.tsx b/app/(auth)/_layout.tsx index 1a9610f..5994627 100644 --- a/app/(auth)/_layout.tsx +++ b/app/(auth)/_layout.tsx @@ -1,433 +1,356 @@ -import React from "react"; -import { Drawer } from "expo-router/drawer"; -import { useSignOut } from "@/hooks/firebase/useSignOut"; -import { - DrawerContentScrollView, - DrawerNavigationOptions, - DrawerNavigationProp, -} from "@react-navigation/drawer"; -import { - Button, - ButtonSize, - Text, - TouchableOpacity, - View, -} from "react-native-ui-lib"; -import { ImageBackground, Pressable, StyleSheet } from "react-native"; +import React, {useCallback} from "react"; +import {Drawer} from "expo-router/drawer"; +import {DrawerContentScrollView, DrawerContentComponentProps, DrawerNavigationOptions} from "@react-navigation/drawer"; +import {ImageBackground, Pressable, StyleSheet} from "react-native"; +import {Button, ButtonSize, Text, View} from "react-native-ui-lib"; +import * as Device from "expo-device"; +import {useSetAtom} from "jotai"; +import {Ionicons} from "@expo/vector-icons"; +import {DeviceType} from "expo-device"; +import {DrawerNavigationProp} from "@react-navigation/drawer"; +import {ParamListBase, Theme} from '@react-navigation/native'; +import {RouteProp} from "@react-navigation/native"; + +import {useSignOut} from "@/hooks/firebase/useSignOut"; +import {CalendarHeader} from "@/components/pages/calendar/CalendarHeader"; import DrawerButton from "@/components/shared/DrawerButton"; +import DrawerIcon from "@/assets/svgs/DrawerIcon"; import NavGroceryIcon from "@/assets/svgs/NavGroceryIcon"; import NavToDosIcon from "@/assets/svgs/NavToDosIcon"; import NavBrainDumpIcon from "@/assets/svgs/NavBrainDumpIcon"; import NavCalendarIcon from "@/assets/svgs/NavCalendarIcon"; import NavSettingsIcon from "@/assets/svgs/NavSettingsIcon"; -import ViewSwitch from "@/components/pages/(tablet_pages)/ViewSwitch"; -import { useSetAtom } from "jotai"; -import { - isFamilyViewAtom, - settingsPageIndex, - toDosPageIndex, - userSettingsView, -} from "@/components/pages/calendar/atoms"; -import Ionicons from "@expo/vector-icons/Ionicons"; -import * as Device from "expo-device"; -import { DeviceType } from "expo-device"; import FeedbackNavIcon from "@/assets/svgs/FeedbackNavIcon"; -import DrawerIcon from "@/assets/svgs/DrawerIcon"; -import { RouteProp } from "@react-navigation/core"; -import RefreshButton from "@/components/shared/RefreshButton"; -import { useCalSync } from "@/hooks/useCalSync"; -import {useIsFetching} from "@tanstack/react-query"; -import { CalendarHeader } from "@/components/pages/calendar/CalendarHeader"; +import { + isFamilyViewAtom, + settingsPageIndex, + toDosPageIndex, + userSettingsView, +} from "@/components/pages/calendar/atoms"; +import ViewSwitch from "@/components/pages/(tablet_pages)/ViewSwitch"; + +const isTablet = Device.deviceType === DeviceType.TABLET; type DrawerParamList = { - index: undefined; - calendar: undefined; - todos: undefined; + index: undefined; + calendar: undefined; + brain_dump: undefined; + settings: undefined; + grocery: undefined; + reminders: undefined; + todos: undefined; + notifications: undefined; + feedback: undefined; }; -type NavigationProp = DrawerNavigationProp; +type DrawerScreenNavigationProp = DrawerNavigationProp; -interface ViewSwitchProps { - navigation: NavigationProp; +interface DrawerButtonConfig { + id: string; + title: string; + color: string; + bgColor: string; + icon: React.FC; + route: keyof DrawerParamList; } +const DRAWER_BUTTONS: DrawerButtonConfig[] = [ + { + id: 'calendar', + title: 'Calendar', + color: 'rgb(7, 184, 199)', + bgColor: 'rgb(231, 248, 250)', + icon: NavCalendarIcon, + route: 'calendar' + }, + { + id: 'grocery', + title: 'Groceries', + color: '#50be0c', + bgColor: '#eef9e7', + icon: NavGroceryIcon, + route: 'grocery' + }, + { + id: 'feedback', + title: 'Feedback', + color: '#ea156d', + bgColor: '#fdedf4', + icon: FeedbackNavIcon, + route: 'feedback' + }, + { + id: 'todos', + title: 'To Dos', + color: '#8005eb', + bgColor: '#f3e6fd', + icon: NavToDosIcon, + route: 'todos' + }, + { + id: 'brain_dump', + title: 'Brain Dump', + color: '#e0ca03', + bgColor: '#fffacb', + icon: NavBrainDumpIcon, + route: 'brain_dump' + }, + { + id: 'notifications', + title: 'Notifications', + color: '#ffa200', + bgColor: '#ffdda1', + icon: () => , + route: 'notifications' + } +]; + +interface DrawerContentProps { + props: DrawerContentComponentProps; +} + +const DrawerContent: React.FC = ({props}) => { + const {mutateAsync: signOut} = useSignOut(); + const setIsFamilyView = useSetAtom(isFamilyViewAtom); + const setPageIndex = useSetAtom(settingsPageIndex); + const setUserView = useSetAtom(userSettingsView); + const setToDosIndex = useSetAtom(toDosPageIndex); + + const handleNavigation = useCallback((route: keyof DrawerParamList) => { + props.navigation.navigate(route); + setPageIndex(0); + setToDosIndex(0); + setUserView(true); + setIsFamilyView(false); + }, [props.navigation, setPageIndex, setToDosIndex, setUserView, setIsFamilyView]); + + const renderDrawerButtons = () => { + const midPoint = Math.ceil(DRAWER_BUTTONS.length / 2); + const leftButtons = DRAWER_BUTTONS.slice(0, midPoint); + const rightButtons = DRAWER_BUTTONS.slice(midPoint); + + return ( + + + {leftButtons.map(button => ( + handleNavigation(button.route)} + icon={} + /> + ))} + + + {rightButtons.map(button => ( + handleNavigation(button.route)} + icon={} + /> + ))} + + + ); + }; + + return ( + + + + Welcome to Cally + + + {renderDrawerButtons()} + + - + + + + ); }); const styles = StyleSheet.create({ - segmentslblStyle: { + container: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + paddingVertical: isTablet ? 8 : 0, + borderBottomLeftRadius: 0, + borderBottomRightRadius: 0, + paddingLeft: 10 + }, + yearText: { + fontFamily: "Manrope_500Medium", + fontSize: 17, + }, + monthPicker: { + fontFamily: "Manrope_500Medium", + fontSize: 17, + width: 85, + }, + segmentContainer: { + maxWidth: 120, + height: 40, + }, + segmentLabel: { fontSize: 12, fontFamily: "Manrope_600SemiBold", }, diff --git a/components/pages/calendar/CalendarPage.tsx b/components/pages/calendar/CalendarPage.tsx index 182454a..4acf9a3 100644 --- a/components/pages/calendar/CalendarPage.tsx +++ b/components/pages/calendar/CalendarPage.tsx @@ -9,11 +9,6 @@ export default function CalendarPage() { paddingH-0 paddingT-0 > - {/**/} ); diff --git a/components/pages/calendar/DetailedCalendar.tsx b/components/pages/calendar/DetailedCalendar.tsx index c2d2a3b..0f70837 100644 --- a/components/pages/calendar/DetailedCalendar.tsx +++ b/components/pages/calendar/DetailedCalendar.tsx @@ -1,21 +1,20 @@ -import React, {useCallback, useEffect, useMemo, useRef, useState} from "react"; -import {useAuthContext} from "@/contexts/AuthContext"; -import {useAtomValue} from "jotai"; -import {modeAtom, selectedDateAtom, selectedUserAtom} from "@/components/pages/calendar/atoms"; -import {useGetFamilyMembers} from "@/hooks/firebase/useGetFamilyMembers"; +import React, {useCallback, useMemo, useRef, useState} from "react"; +import {View} from "react-native-ui-lib"; +import {DeviceType} from "expo-device"; +import * as Device from "expo-device"; import {CalendarBody, CalendarContainer, CalendarHeader, CalendarKitHandle} from "@howljs/calendar-kit"; +import {useAtomValue} from "jotai"; +import {selectedUserAtom} from "@/components/pages/calendar/atoms"; + +import {useAuthContext} from "@/contexts/AuthContext"; +import {useGetFamilyMembers} from "@/hooks/firebase/useGetFamilyMembers"; import {useGetEvents} from "@/hooks/firebase/useGetEvents"; import {useFormattedEvents} from "@/components/pages/calendar/useFormattedEvents"; import {useCalendarControls} from "@/components/pages/calendar/useCalendarControls"; import {EventCell} from "@/components/pages/calendar/EventCell"; -import {isToday} from "date-fns"; -import {View} from "react-native-ui-lib"; -import {DeviceType} from "expo-device"; -import * as Device from "expo-device" -import {useAtomCallback} from 'jotai/utils' +import {DetailedCalendarController} from "@/components/pages/calendar/DetailedCalendarController"; interface EventCalendarProps { - calendarHeight: number; calendarWidth: number; mode: "week" | "month" | "day" | "3days"; onLoad?: () => void; @@ -36,14 +35,14 @@ const MODE_TO_DAYS = { '3days': 3, 'day': 1, 'month': 1 -}; +} as const; -const getContainerProps = (selectedDate: Date) => ({ +const getContainerProps = (date: Date, customKey: string) => ({ hourWidth: 70, allowPinchToZoom: true, useHaptic: true, scrollToNow: true, - initialDate: selectedDate.toISOString(), + initialDate: customKey !== "default" ? customKey : date.toISOString(), }); const MemoizedEventCell = React.memo(EventCell, (prev, next) => { @@ -51,37 +50,23 @@ const MemoizedEventCell = React.memo(EventCell, (prev, next) => { prev.event.lastModified === next.event.lastModified; }); -export const DetailedCalendar: React.FC = React.memo(( - { - calendarHeight, - calendarWidth, - mode, - onLoad - }) => { +export const DetailedCalendar: React.FC = React.memo(({ + calendarWidth, + mode, + onLoad + }) => { const {profileData} = useAuthContext(); - const selectedDate = useAtomValue(selectedDateAtom); const {data: familyMembers} = useGetFamilyMembers(); - const calendarRef = useRef(null); const {data: events} = useGetEvents(); const selectedUser = useAtomValue(selectedUserAtom); + const calendarRef = useRef(null); const [customKey, setCustomKey] = useState("defaultKey"); const memoizedFamilyMembers = useMemo(() => familyMembers || [], [familyMembers]); - const containerProps = useMemo(() => getContainerProps(selectedDate), [selectedDate]); + const currentDate = useMemo(() => new Date(), []); + const containerProps = useMemo(() => getContainerProps(currentDate, customKey), [currentDate, customKey]); - const checkModeAndGoToDate = useAtomCallback(useCallback((get) => { - const currentMode = get(modeAtom); - if ((selectedDate && isToday(selectedDate)) || currentMode === "month") { - calendarRef?.current?.goToDate({date: selectedDate}); - setCustomKey(selectedDate.toISOString()) - } - }, [selectedDate])); - - useEffect(() => { - checkModeAndGoToDate(); - }, [selectedDate, checkModeAndGoToDate]); - - const {data: formattedEvents} = useFormattedEvents(events ?? [], selectedDate, selectedUser); + const {data: formattedEvents} = useFormattedEvents(events ?? [], currentDate, selectedUser); const { handlePressEvent, handlePressCell, @@ -115,9 +100,12 @@ export const DetailedCalendar: React.FC = React.memo(( onPressEvent={handlePressEvent} onPressBackground={handlePressCell} onLoad={onLoad} - key={customKey} > - + + ; + setCustomKey: (key: string) => void; +} + +export const DetailedCalendarController: React.FC = ({ + calendarRef, + setCustomKey + }) => { + const selectedDate = useAtomValue(selectedDateAtom); + const lastSelectedDate = useRef(selectedDate); + + const checkModeAndGoToDate = useAtomCallback(useCallback((get) => { + const currentMode = get(modeAtom); + if ((selectedDate && isToday(selectedDate)) || currentMode === "month") { + if (currentMode === "month") { + setCustomKey(selectedDate.toISOString()); + } + calendarRef?.current?.goToDate({date: selectedDate}); + } + }, [selectedDate, calendarRef, setCustomKey])); + + useEffect(() => { + if (selectedDate !== lastSelectedDate.current) { + checkModeAndGoToDate(); + lastSelectedDate.current = selectedDate; + } + }, [selectedDate, checkModeAndGoToDate]); + + return null; +}; \ No newline at end of file diff --git a/components/pages/calendar/EventCalendar.tsx b/components/pages/calendar/EventCalendar.tsx index 556e2e0..97b8a1b 100644 --- a/components/pages/calendar/EventCalendar.tsx +++ b/components/pages/calendar/EventCalendar.tsx @@ -1,33 +1,31 @@ import React from 'react'; -import { StyleSheet, View, ActivityIndicator } from 'react-native'; -import { Text } from 'react-native-ui-lib'; +import {StyleSheet, View, ActivityIndicator} from 'react-native'; +import {Text} from 'react-native-ui-lib'; import Animated, { withTiming, useAnimatedStyle, FadeOut, useSharedValue, - runOnJS } from 'react-native-reanimated'; -import { useGetEvents } from '@/hooks/firebase/useGetEvents'; -import { useCalSync } from '@/hooks/useCalSync'; -import { useSyncEvents } from '@/hooks/useSyncOnScroll'; -import { useAtom } from 'jotai'; -import { modeAtom } from './atoms'; -import { MonthCalendar } from "@/components/pages/calendar/MonthCalendar"; +import {useGetEvents} from '@/hooks/firebase/useGetEvents'; +import {useCalSync} from '@/hooks/useCalSync'; +import {useSyncEvents} from '@/hooks/useSyncOnScroll'; +import {useAtom} from 'jotai'; +import {modeAtom} from './atoms'; +import {MonthCalendar} from "@/components/pages/calendar/MonthCalendar"; import DetailedCalendar from "@/components/pages/calendar/DetailedCalendar"; import * as Device from "expo-device"; export type CalendarMode = 'month' | 'day' | '3days' | 'week'; interface EventCalendarProps { - calendarHeight: number; calendarWidth: number; } export const EventCalendar: React.FC = React.memo((props) => { - const { isLoading } = useGetEvents(); + const {isLoading} = useGetEvents(); const [mode] = useAtom(modeAtom); - const { isSyncing } = useSyncEvents(); + const {isSyncing} = useSyncEvents(); const isTablet = Device.deviceType === Device.DeviceType.TABLET; const isCalendarReady = useSharedValue(false); useCalSync(); @@ -37,26 +35,26 @@ export const EventCalendar: React.FC = React.memo((props) => }, []); const containerStyle = useAnimatedStyle(() => ({ - opacity: withTiming(isCalendarReady.value ? 1 : 0, { duration: 500 }), + opacity: withTiming(isCalendarReady.value ? 1 : 0, {duration: 500}), flex: 1, })); const monthStyle = useAnimatedStyle(() => ({ - opacity: withTiming(mode === 'month' ? 1 : 0, { duration: 300 }), + opacity: withTiming(mode === 'month' ? 1 : 0, {duration: 300}), position: 'absolute', width: '100%', height: '100%', })); const detailedDayStyle = useAnimatedStyle(() => ({ - opacity: withTiming(mode === 'day' ? 1 : 0, { duration: 300 }), + opacity: withTiming(mode === 'day' ? 1 : 0, {duration: 300}), position: 'absolute', width: '100%', height: '100%', })); const detailedMultiStyle = useAnimatedStyle(() => ({ - opacity: withTiming(mode === (isTablet ? 'week' : '3days') ? 1 : 0, { duration: 300 }), + opacity: withTiming(mode === (isTablet ? 'week' : '3days') ? 1 : 0, {duration: 300}), position: 'absolute', width: '100%', height: '100%', @@ -64,7 +62,7 @@ export const EventCalendar: React.FC = React.memo((props) => return ( - {(isLoading || isSyncing) && mode !== 'month' && ( + {(isLoading || isSyncing) && mode !== 'month' && ( = React.memo((props) => )} - + - + {!isLoading && ( - + )} diff --git a/components/pages/calendar/InnerCalendar.tsx b/components/pages/calendar/InnerCalendar.tsx index d469d11..d76f2b4 100644 --- a/components/pages/calendar/InnerCalendar.tsx +++ b/components/pages/calendar/InnerCalendar.tsx @@ -4,19 +4,16 @@ import {LayoutChangeEvent} from "react-native"; import CalendarViewSwitch from "@/components/pages/calendar/CalendarViewSwitch"; import {AddEventDialog} from "@/components/pages/calendar/AddEventDialog"; import {ManuallyAddEventModal} from "@/components/pages/calendar/ManuallyAddEventModal"; -import {CalendarHeader} from "@/components/pages/calendar/CalendarHeader"; import {EventCalendar} from "@/components/pages/calendar/EventCalendar"; export const InnerCalendar = () => { - const [calendarHeight, setCalendarHeight] = useState(0); const [calendarWidth, setCalendarWidth] = useState(0); const calendarContainerRef = useRef(null); const hasSetInitialSize = useRef(false); const onLayout = useCallback((event: LayoutChangeEvent) => { if (!hasSetInitialSize.current) { - const {height, width} = event.nativeEvent.layout; - setCalendarHeight(height); + const width = event.nativeEvent.layout.width; setCalendarWidth(width); hasSetInitialSize.current = true; } @@ -30,12 +27,9 @@ export const InnerCalendar = () => { onLayout={onLayout} paddingB-0 > - {calendarHeight > 0 && ( - - )} + diff --git a/components/pages/calendar/ManuallyAddEventModal.tsx b/components/pages/calendar/ManuallyAddEventModal.tsx index c8a99c2..03bf12e 100644 --- a/components/pages/calendar/ManuallyAddEventModal.tsx +++ b/components/pages/calendar/ManuallyAddEventModal.tsx @@ -122,7 +122,7 @@ export const ManuallyAddEventModal = () => { const { mutateAsync: createEvent, - isLoading: isAdding, + isPending: isAdding, isError, } = useCreateEvent(); const {data: members} = useGetFamilyMembers(true); @@ -178,15 +178,6 @@ export const ManuallyAddEventModal = () => { if (!show) return null; - const formatDateTime = (date?: Date | string) => { - if (!date) return undefined; - return new Date(date).toLocaleDateString("en-US", { - weekday: "long", - month: "short", - day: "numeric", - }); - }; - const showDeleteEventModal = () => { setDeleteModalVisible(true); }; @@ -257,38 +248,6 @@ export const ManuallyAddEventModal = () => { return true; }; - const getRepeatLabel = () => { - const selectedDays = repeatInterval; - const allDays = [ - "sunday", - "monday", - "tuesday", - "wednesday", - "thursday", - "friday", - "saturday", - ]; - const workDays = ["monday", "tuesday", "wednesday", "thursday", "friday"]; - - const isEveryWorkDay = workDays.every((day) => selectedDays.includes(day)); - - const isEveryDay = allDays.every((day) => selectedDays.includes(day)); - - if (isEveryDay) { - return "Every day"; - } else if ( - isEveryWorkDay && - !selectedDays.includes("saturday") && - !selectedDays.includes("sunday") - ) { - return "Every work day"; - } else { - return selectedDays - .map((item) => daysOfWeek.find((day) => day.value === item)?.label) - .join(", "); - } - }; - if (isLoading && !isError) { return ( { setDate(newDate); if(isStart) { - if (startTime.getHours() > endTime.getHours() && + if (startTime.getHours() > endTime.getHours() && (isSameDay(newDate, endDate) || isAfter(newDate, endDate))) { const newEndDate = new Date(newDate); newEndDate.setDate(newEndDate.getDate() + 1); @@ -364,7 +323,7 @@ export const ManuallyAddEventModal = () => { setEndDate(newEndDate); } } else { - if (endTime.getHours() < startTime.getHours() && + if (endTime.getHours() < startTime.getHours() && (isSameDay(newDate, startDate) || isAfter(startDate, newDate))) { const newStartDate = new Date(newDate); newStartDate.setDate(newStartDate.getDate() - 1); @@ -432,7 +391,7 @@ export const ManuallyAddEventModal = () => { is24Hour={profileData?.userType === ProfileType.PARENT ? false : true} onChange={(time) => { if (endDate.getDate() === startDate.getDate() && - time.getHours() >= endTime.getHours() && time.getMinutes() >= endTime.getHours()) + time.getHours() >= endTime.getHours() && time.getMinutes() >= endTime.getHours()) { const newEndDate = new Date(endDate); @@ -801,9 +760,9 @@ export const ManuallyAddEventModal = () => { )} - /> + /> {editEvent && ( - void }) => ( @@ -78,7 +71,7 @@ const MultiDayEvent = React.memo(({ const style = { position: 'absolute' as const, height: 14, - backgroundColor: event.color || '#6200ee', + backgroundColor: event?.eventColor || '#6200ee', padding: 2, zIndex: 1, left: isStart ? 4 : -0.5, // Extend slightly into the border @@ -103,22 +96,21 @@ const MultiDayEvent = React.memo(({ ); }); -const Day = React.memo(({ - date, - selectedDate, - events, - multiDayEvents, - dayWidth, - onPress - }: { - date: Date; - selectedDate: Date; - events: CalendarEvent[]; - multiDayEvents: CalendarEvent[]; - dayWidth: number; - onPress: (date: Date) => void; -}) => { - const isCurrentMonth = isSameMonth(date, selectedDate); +const Day = React.memo(( + { + date, + events, + multiDayEvents, + dayWidth, + onPress + }: { + date: Date; + events: CalendarEvent[]; + multiDayEvents: CalendarEvent[]; + dayWidth: number; + onPress: (date: Date) => void; + }) => { + const isCurrentMonth = isSameMonth(date, new Date()); const isToday = isSameDay(date, new Date()); const remainingSlots = Math.max(0, MAX_VISIBLE_EVENTS - multiDayEvents.length); @@ -126,7 +118,6 @@ const Day = React.memo(({ const visibleSingleDayEvents = singleDayEvents.slice(0, remainingSlots); const totalHiddenEvents = singleDayEvents.length - remainingSlots; - // Calculate space needed for multi-day events const maxMultiDayPosition = multiDayEvents.length > 0 ? Math.max(...multiDayEvents.map(e => e.weekPosition || 0)) + 1 : 0; @@ -140,7 +131,7 @@ const Day = React.memo(({ > { - let position = 0; - while (usedPositions.includes(position)) { - position++; - } - return position; -}; - export const MonthCalendar: React.FC = () => { const {data: rawEvents} = useGetEvents(); - const [selectedDate, setSelectedDate] = useAtom(selectedDateAtom); + const setSelectedDate = useSetAtom(selectedDateAtom); const setMode = useSetAtom(modeAtom); const {profileData} = useAuthContext(); @@ -204,10 +186,8 @@ export const MonthCalendar: React.FC = () => { const isTablet = Device.deviceType === Device.DeviceType.TABLET; const screenWidth = isTablet ? Dimensions.get('window').width * 0.89 : Dimensions.get('window').width; const screenHeight = isTablet ? Dimensions.get('window').height * 0.89 : Dimensions.get('window').height; - const dayWidth = (screenWidth - 32) / 7; - const centerMonth = useRef(selectedDate); - const isScrolling = useRef(false); - const lastScrollUpdate = useRef(new Date()); + const dayWidth = screenWidth / 7; + const centerMonth = useRef(new Date()); const weekStartsOn = profileData?.firstDayOfWeek === "Sundays" ? 0 : 1; @@ -255,10 +235,10 @@ export const MonthCalendar: React.FC = () => { }); } return months; - }, [getMonthData]); + }, [getMonthData, rawEvents]); const processedEvents = useMemo(() => { - if (!rawEvents?.length || !selectedDate) return { + if (!rawEvents?.length) return { eventMap: new Map(), multiDayEvents: [] }; @@ -324,7 +304,6 @@ export const MonthCalendar: React.FC = () => { = () => { /> ), [getEventsForDay, getMultiDayEventsForDay, dayWidth, onDayPress, screenWidth, weekStartsOn]); - const debouncedSetSelectedDate = useMemo( - () => debounce(setSelectedDate, 500), - [setSelectedDate] - ); - - const onScroll = useCallback((event: NativeSyntheticEvent) => { - if (isScrolling.current) return; - - const currentMonthIndex = Math.round(event.nativeEvent.contentOffset.x / screenWidth); - const currentMonth = monthsToRender[currentMonthIndex]; - - if (currentMonth) { - setSelectedDate(currentMonth.date); - centerMonth.current = currentMonth.date; - } - }, [screenWidth, setSelectedDate, monthsToRender]); - - useEffect(() => { - return () => { - debouncedSetSelectedDate.clear(); - }; - }, [debouncedSetSelectedDate]); - return ( + = () => { pagingEnabled showsHorizontalScrollIndicator={false} initialScrollIndex={CENTER_MONTH_INDEX} - onScroll={onScroll} removeClippedSubviews={true} estimatedItemSize={screenWidth} estimatedListSize={{width: screenWidth, height: screenHeight * 0.9}} @@ -391,7 +350,6 @@ const keyExtractor = (item: MonthData, index: number) => `month-${index}`; const Month = React.memo(({ date, days, - selectedDate, getEventsForDay, getMultiDayEventsForDay, dayWidth, @@ -401,7 +359,6 @@ const Month = React.memo(({ }: { date: Date; days: Date[]; - selectedDate: Date; getEventsForDay: (date: Date) => CalendarEvent[]; getMultiDayEventsForDay: (date: Date) => CalendarEvent[]; dayWidth: number; @@ -481,7 +438,6 @@ const Month = React.memo(({ { // Precompute time constants const DAY_IN_MS = 24 * 60 * 60 * 1000; -const PERIOD_IN_MS = 5 * DAY_IN_MS; +const PERIOD_IN_MS = 180 * DAY_IN_MS; const TIME_ZONE = Intl.DateTimeFormat().resolvedOptions().timeZone; // Memoize date range calculations diff --git a/components/pages/todos/AddChoreDialog.tsx b/components/pages/todos/AddChoreDialog.tsx index 8bbb123..431c9a3 100644 --- a/components/pages/todos/AddChoreDialog.tsx +++ b/components/pages/todos/AddChoreDialog.tsx @@ -52,7 +52,7 @@ const AddChoreDialog = (addChoreDialogProps: IAddChoreDialog) => { addChoreDialogProps.selectedTodo ?? defaultTodo ); const [selectedAssignees, setSelectedAssignees] = useState( - addChoreDialogProps?.selectedTodo?.assignees ?? [user?.uid] + addChoreDialogProps?.selectedTodo?.assignees ?? [user?.uid!] ); const {width} = Dimensions.get("screen"); const [points, setPoints] = useState(todo.points); diff --git a/components/shared/RefreshButton.tsx b/components/shared/RefreshButton.tsx index 93f29c3..03cbaf2 100644 --- a/components/shared/RefreshButton.tsx +++ b/components/shared/RefreshButton.tsx @@ -1,6 +1,6 @@ import React, { useRef, useEffect } from 'react'; import { TouchableOpacity, Animated, Easing } from 'react-native'; -import { Feather } from '@expo/vector-icons'; +import { Feather } from '@expo/vector-icons'; interface RefreshButtonProps { onRefresh: () => Promise; @@ -9,12 +9,12 @@ interface RefreshButtonProps { color?: string; } -const RefreshButton = ({ - onRefresh, - isSyncing, - size = 24, - color = "#83807F" -}: RefreshButtonProps) => { +const RefreshButton = ({ + onRefresh, + isSyncing, + size = 24, + color = "#83807F" + }: RefreshButtonProps) => { const rotateAnim = useRef(new Animated.Value(0)).current; const rotationLoop = useRef(null); @@ -29,12 +29,12 @@ const RefreshButton = ({ const startContinuousRotation = () => { rotateAnim.setValue(0); rotationLoop.current = Animated.loop( - Animated.timing(rotateAnim, { - toValue: 1, - duration: 1000, - easing: Easing.linear, - useNativeDriver: true, - }) + Animated.timing(rotateAnim, { + toValue: 1, + duration: 1000, + easing: Easing.linear, + useNativeDriver: true, + }) ); rotationLoop.current.start(); }; @@ -56,11 +56,28 @@ const RefreshButton = ({ }; return ( - - - - - + + + + + ); }; diff --git a/firebase/functions/index.js b/firebase/functions/index.js index 86616a1..4defa60 100644 --- a/firebase/functions/index.js +++ b/firebase/functions/index.js @@ -1780,26 +1780,35 @@ async function syncEventToGoogle(event, accessToken, refreshToken, creatorId) { }); let token = accessToken; - - // Construct the Google Calendar event const googleEvent = { summary: event.title, start: { dateTime: event.allDay ? undefined : event.startDate.toISOString(), - date: event.allDay ? event.startDate.toISOString().split('T')[0] : undefined + date: event.allDay ? event.startDate.toISOString().split('T')[0] : undefined, + timeZone: 'UTC' }, end: { dateTime: event.allDay ? undefined : event.endDate.toISOString(), - date: event.allDay ? new Date(event.endDate.getTime() + 24*60*60*1000).toISOString().split('T')[0] : undefined + date: event.allDay ? new Date(event.endDate.getTime() + 24*60*60*1000).toISOString().split('T')[0] : undefined, + timeZone: 'UTC' }, visibility: event.private ? 'private' : 'default', - id: event.id + status: 'confirmed', + reminders: { + useDefault: true + }, + // Add extendedProperties to store our Firestore ID + extendedProperties: { + private: { + firestoreId: event.id + } + } }; - const url = `https://www.googleapis.com/calendar/v3/calendars/primary/events/${event.id}`; - + // For new events, use POST to create + const url = 'https://www.googleapis.com/calendar/v3/calendars/primary/events'; let response = await fetch(url, { - method: 'PUT', + method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' @@ -1820,7 +1829,7 @@ async function syncEventToGoogle(event, accessToken, refreshToken, creatorId) { // Retry with new token response = await fetch(url, { - method: 'PUT', + method: 'POST', headers: { 'Authorization': `Bearer ${refreshedGoogleToken}`, 'Content-Type': 'application/json' @@ -1834,9 +1843,16 @@ async function syncEventToGoogle(event, accessToken, refreshToken, creatorId) { throw new Error(`Failed to sync event: ${errorData.error?.message || response.statusText}`); } - console.log('[GOOGLE_SYNC] Successfully synced event to Google Calendar', { - eventId: event.id, - creatorId + const responseData = await response.json(); + + // Store the Google Calendar event ID in Firestore + await db.collection('Events').doc(event.id).update({ + googleEventId: responseData.id + }); + + console.log('[GOOGLE_SYNC] Successfully created event in Google Calendar', { + firestoreId: event.id, + googleEventId: responseData.id }); return true; @@ -1900,282 +1916,353 @@ async function deleteEventFromGoogle(eventId, accessToken, refreshToken, creator } } +const createEventHash = (event) => { + const str = `${event.startDate?.seconds || ''}-${event.endDate?.seconds || ''}-${ + event.title || '' + }-${event.location || ''}-${event.allDay ? 'true' : 'false'}`; + let hash = 0; + for (let i = 0; i < str.length; i++) { + const char = str.charCodeAt(i); + hash = ((hash << 5) - hash) + char; + hash = hash & hash; + } + return hash.toString(36); +}; -// Cloud Function to handle event updates - exports.syncEventToGoogleCalendar = functions.firestore - .document('Events/{eventId}') - .onWrite(async (change, context) => { - const eventId = context.params.eventId; - const afterData = change.after.exists ? change.after.data() : null; - const beforeData = change.before.exists ? change.before.data() : null; +async function fetchEventsFromFirestore(userId, profileData, isFamilyView) { + const db = admin.firestore(); + const eventsQuery = db.collection("Events"); + let constraints; + const familyId = profileData?.familyId; - // Skip if this is a Google-originated event - if (afterData?.externalOrigin === 'google' || beforeData?.externalOrigin === 'google') { - console.log('[GOOGLE_SYNC] Skipping sync for Google-originated event', { eventId }); - return null; + if (profileData?.userType === "FAMILY_DEVICE") { + constraints = [ + eventsQuery.where("familyId", "==", familyId) + ]; + } else { + if (isFamilyView) { + constraints = [ + eventsQuery.where("familyId", "==", familyId), + eventsQuery.where("creatorId", "==", userId), + eventsQuery.where("attendees", "array-contains", userId) + ]; + } else { + constraints = [ + eventsQuery.where("creatorId", "==", userId), + eventsQuery.where("attendees", "array-contains", userId) + ]; + } + } + + try { + const snapshots = await Promise.all(constraints.map(query => query.get())); + + const uniqueEvents = new Map(); + const processedHashes = new Set(); + const creatorIds = new Set(); + + snapshots.forEach(snapshot => { + snapshot.docs.forEach(doc => { + const event = doc.data(); + const hash = createEventHash(event); + + if (!processedHashes.has(hash)) { + processedHashes.add(hash); + creatorIds.add(event.creatorId); + uniqueEvents.set(doc.id, event); } - - try { - // Handle deletion - if (!afterData && beforeData) { - console.log('[GOOGLE_SYNC] Processing event deletion', { eventId }); - - // Only proceed if this was previously synced with Google - if (!beforeData.email) { - return null; - } - - const creatorDoc = await db.collection('Profiles').doc(beforeData.creatorId).get(); - const creatorData = creatorDoc.data(); - - if (!creatorData?.googleAccounts?.[beforeData.email]) { - return null; - } - - const accountData = creatorData.googleAccounts[beforeData.email]; - - await deleteEventFromGoogle( - eventId, - accountData.accessToken, - accountData.refreshToken, - beforeData.creatorId, - beforeData.email - ); - - return null; - } - - // Handle creation or update - if (afterData) { - // Skip if no creator or email is set - if (!afterData.creatorId || !afterData.email) { - return null; - } - - const creatorDoc = await db.collection('Profiles').doc(afterData.creatorId).get(); - const creatorData = creatorDoc.data(); - - if (!creatorData?.googleAccounts?.[afterData.email]) { - return null; - } - - const accountData = creatorData.googleAccounts[afterData.email]; - - await syncEventToGoogle( - afterData, - accountData.accessToken, - accountData.refreshToken, - afterData.creatorId - ); - } - - return null; - } catch (error) { - console.error('[GOOGLE_SYNC] Error in sync function:', error); - - // Store the error for later retry or monitoring - await db.collection('SyncErrors').add({ - eventId, - error: error.message, - timestamp: admin.firestore.FieldValue.serverTimestamp(), - type: 'google' - }); - - throw error; - } - });); - - let token = accessToken; - - // Construct the Google Calendar event - const googleEvent = { - summary: event.title, - start: { - dateTime: event.allDay ? undefined : event.startDate.toISOString(), - date: event.allDay ? event.startDate.toISOString().split('T')[0] : undefined - }, - end: { - dateTime: event.allDay ? undefined : event.endDate.toISOString(), - date: event.allDay ? new Date(event.endDate.getTime() + 24*60*60*1000).toISOString().split('T')[0] : undefined - }, - visibility: event.private ? 'private' : 'default', - id: event.id - }; - - const url = `https://www.googleapis.com/calendar/v3/calendars/primary/events/${event.id}`; - - let response = await fetch(url, { - method: 'PUT', - headers: { - 'Authorization': `Bearer ${token}`, - 'Content-Type': 'application/json' - }, - body: JSON.stringify(googleEvent) + }); }); - // Handle token refresh if needed - if (response.status === 401 && refreshToken) { - console.log('[GOOGLE_SYNC] Token expired, refreshing...'); - const { refreshedGoogleToken } = await refreshGoogleToken(refreshToken); - token = refreshedGoogleToken; + const creatorIdsArray = Array.from(creatorIds); + const creatorProfiles = new Map(); + const BATCH_SIZE = 10; - // Update the token in Firestore - await db.collection("Profiles").doc(creatorId).update({ - [`googleAccounts.${event.email}.accessToken`]: refreshedGoogleToken + for (let i = 0; i < creatorIdsArray.length; i += BATCH_SIZE) { + const chunk = creatorIdsArray.slice(i, i + BATCH_SIZE); + const profilesSnapshot = await db + .collection("Profiles") + .where(admin.firestore.FieldPath.documentId(), "in", chunk) + .get(); + + profilesSnapshot.docs.forEach(doc => { + creatorProfiles.set(doc.id, doc.data()?.eventColor || '#ff69b4'); }); + } - // Retry with new token - response = await fetch(url, { - method: 'PUT', + return Array.from(uniqueEvents.entries()).map(([id, event]) => ({ + ...event, + id, + start: event.allDay + ? new Date(new Date(event.startDate.seconds * 1000).setHours(0, 0, 0, 0)) + : new Date(event.startDate.seconds * 1000), + end: event.allDay + ? new Date(new Date(event.endDate.seconds * 1000).setHours(0, 0, 0, 0)) + : new Date(event.endDate.seconds * 1000), + hideHours: event.allDay, + eventColor: creatorProfiles.get(event.creatorId) || '#ff69b4', + notes: event.notes + })); + + } catch (error) { + console.error('Error fetching events:', error); + throw new functions.https.HttpsError('internal', 'Error fetching events'); + } +} + +exports.fetchEvents = functions.https.onCall(async (data, context) => { + if (!context.auth) { + throw new functions.https.HttpsError( + 'unauthenticated', + 'User must be authenticated' + ); + } + + try { + const { isFamilyView } = data; + const userId = context.auth.uid; + + const profileDoc = await admin.firestore() + .collection('Profiles') + .doc(userId) + .get(); + + if (!profileDoc.exists) { + throw new functions.https.HttpsError( + 'not-found', + 'User profile not found' + ); + } + + const profileData = profileDoc.data(); + const events = await fetchEventsFromFirestore(userId, profileData, isFamilyView); + + return { events }; + + } catch (error) { + console.error('Error in fetchEvents:', error); + throw new functions.https.HttpsError( + 'internal', + error.message || 'An unknown error occurred' + ); + } +}); + +exports.syncNewEventToGoogle = functions.firestore + .document('Events/{eventId}') + .onCreate(async (snapshot, context) => { + const newEvent = snapshot.data(); + const eventId = context.params.eventId; + + // Don't sync if this event came from Google + if (newEvent.externalOrigin === 'google') { + console.log('[GOOGLE_SYNC] Skipping sync for Google-originated event:', eventId); + return; + } + + try { + // Get the creator's Google account credentials + const creatorDoc = await db.collection('Profiles').doc(newEvent.creatorId).get(); + const creatorData = creatorDoc.data(); + + if (!creatorData?.googleAccounts) { + console.log('[GOOGLE_SYNC] Creator has no Google accounts:', newEvent.creatorId); + return; + } + + // Get the first Google account (assuming one account per user) + const [email, accountData] = Object.entries(creatorData.googleAccounts)[0]; + + if (!accountData?.accessToken) { + console.log('[GOOGLE_SYNC] No access token found for creator:', newEvent.creatorId); + return; + } + + await syncEventToGoogle( + { + ...newEvent, + email, + startDate: new Date(newEvent.startDate.seconds * 1000), + endDate: new Date(newEvent.endDate.seconds * 1000) + }, + accountData.accessToken, + accountData.refreshToken, + newEvent.creatorId + ); + + console.log('[GOOGLE_SYNC] Successfully synced new event to Google:', eventId); + } catch (error) { + console.error('[GOOGLE_SYNC] Error syncing new event to Google:', error); + } + }); + +exports.syncEventToGoogleOnUpdate = functions.firestore + .document('Events/{eventId}') + .onUpdate(async (change, context) => { + const eventBefore = change.before.data(); + const eventAfter = change.after.data(); + const eventId = context.params.eventId; + + if (eventAfter.externalOrigin === 'google') { + console.log('[GOOGLE_SYNC] Skipping sync for Google-originated event:', eventId); + return; + } + + if (JSON.stringify(eventBefore) === JSON.stringify(eventAfter)) { + console.log('[GOOGLE_SYNC] No changes detected for event:', eventId); + return; + } + + try { + const creatorDoc = await db.collection('Profiles').doc(eventAfter.creatorId).get(); + const creatorData = creatorDoc.data(); + + if (!creatorData?.googleAccounts) { + console.log('[GOOGLE_SYNC] Creator has no Google accounts:', eventAfter.creatorId); + return; + } + + const [email, accountData] = Object.entries(creatorData.googleAccounts)[0]; + + if (!accountData?.accessToken) { + console.log('[GOOGLE_SYNC] No access token found for creator:', eventAfter.creatorId); + return; + } + + const url = `https://www.googleapis.com/calendar/v3/calendars/primary/events/${eventId}`; + const googleEvent = { + summary: eventAfter.title, + start: { + dateTime: eventAfter.allDay ? undefined : new Date(eventAfter.startDate.seconds * 1000).toISOString(), + date: eventAfter.allDay ? new Date(eventAfter.startDate.seconds * 1000).toISOString().split('T')[0] : undefined, + timeZone: 'UTC' + }, + end: { + dateTime: eventAfter.allDay ? undefined : new Date(eventAfter.endDate.seconds * 1000).toISOString(), + date: eventAfter.allDay ? new Date(new Date(eventAfter.endDate.seconds * 1000).getTime() + 24*60*60*1000).toISOString().split('T')[0] : undefined, + timeZone: 'UTC' + }, + visibility: eventAfter.private ? 'private' : 'default', + status: 'confirmed', + reminders: { + useDefault: true + } + }; + + let response = await fetch(url, { + method: 'PATCH', headers: { - 'Authorization': `Bearer ${refreshedGoogleToken}`, + 'Authorization': `Bearer ${accountData.accessToken}`, 'Content-Type': 'application/json' }, body: JSON.stringify(googleEvent) }); - } - if (!response.ok) { - const errorData = await response.json(); - throw new Error(`Failed to sync event: ${errorData.error?.message || response.statusText}`); - } + if (response.status === 401 && accountData.refreshToken) { + console.log('[GOOGLE_SYNC] Token expired, refreshing...'); + const { refreshedGoogleToken } = await refreshGoogleToken(accountData.refreshToken); + await db.collection("Profiles").doc(eventAfter.creatorId).update({ + [`googleAccounts.${email}.accessToken`]: refreshedGoogleToken + }); - console.log('[GOOGLE_SYNC] Successfully synced event to Google Calendar', { - eventId: event.id, - creatorId - }); - - return true; - } catch (error) { - console.error('[GOOGLE_SYNC] Error syncing event to Google Calendar:', error); - throw error; - } -} - -async function deleteEventFromGoogle(eventId, accessToken, refreshToken, creatorId, email) { - try { - console.log('[GOOGLE_DELETE] Starting to delete event from Google Calendar', { - eventId, - creatorId - }); - - let token = accessToken; - const url = `https://www.googleapis.com/calendar/v3/calendars/primary/events/${eventId}`; - - let response = await fetch(url, { - method: 'DELETE', - headers: { - 'Authorization': `Bearer ${token}` + response = await fetch(url, { + method: 'PATCH', + headers: { + 'Authorization': `Bearer ${refreshedGoogleToken}`, + 'Content-Type': 'application/json' + }, + body: JSON.stringify(googleEvent) + }); } - }); - // Handle token refresh if needed - if (response.status === 401 && refreshToken) { - console.log('[GOOGLE_DELETE] Token expired, refreshing...'); - const { refreshedGoogleToken } = await refreshGoogleToken(refreshToken); - token = refreshedGoogleToken; + // If event doesn't exist in Google Calendar, create it using insert + if (response.status === 404) { + console.log('[GOOGLE_SYNC] Event not found in Google Calendar, creating new event'); + const insertUrl = 'https://www.googleapis.com/calendar/v3/calendars/primary/events'; + response = await fetch(insertUrl, { + method: 'POST', + headers: { + 'Authorization': `Bearer ${accountData.accessToken}`, + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + ...googleEvent, + id: eventId + }) + }); + } - // Update the token in Firestore - await db.collection("Profiles").doc(creatorId).update({ - [`googleAccounts.${email}.accessToken`]: refreshedGoogleToken - }); + if (!response.ok) { + const errorData = await response.json(); + throw new Error(errorData.error?.message || response.statusText); + } - // Retry with new token - response = await fetch(url, { - method: 'DELETE', - headers: { - 'Authorization': `Bearer ${refreshedGoogleToken}` - } - }); + console.log('[GOOGLE_SYNC] Successfully synced event update to Google:', eventId); + } catch (error) { + console.error('[GOOGLE_SYNC] Error syncing event update to Google:', error); } + }); - if (!response.ok && response.status !== 404) { - const errorData = await response.json(); - throw new Error(`Failed to delete event: ${errorData.error?.message || response.statusText}`); - } - - console.log('[GOOGLE_DELETE] Successfully deleted event from Google Calendar', { - eventId, - creatorId - }); - - return true; - } catch (error) { - console.error('[GOOGLE_DELETE] Error deleting event from Google Calendar:', error); - throw error; - } -} - -exports.handleEventDelete = functions.firestore +exports.syncEventToGoogleOnDelete = functions.firestore .document('Events/{eventId}') .onDelete(async (snapshot, context) => { const deletedEvent = snapshot.data(); const eventId = context.params.eventId; - // Skip if this was a Google-originated event to prevent sync loops - if (deletedEvent?.externalOrigin === 'google') { - console.log('[GOOGLE_DELETE] Skipping delete sync for Google-originated event', { eventId }); - return null; + if (deletedEvent.externalOrigin === 'google') { + console.log('[GOOGLE_SYNC] Skipping delete sync for Google-originated event:', eventId); + return; } try { - // Only proceed if this was synced with Google (has an email) - if (!deletedEvent?.email) { - console.log('[GOOGLE_DELETE] Event not synced with Google, skipping', { eventId }); - return null; - } - - const creatorDoc = await admin.firestore() - .collection('Profiles') - .doc(deletedEvent.creatorId) - .get(); - - if (!creatorDoc.exists) { - console.log('[GOOGLE_DELETE] Creator profile not found', { - eventId, - creatorId: deletedEvent.creatorId - }); - return null; - } - + const creatorDoc = await db.collection('Profiles').doc(deletedEvent.creatorId).get(); const creatorData = creatorDoc.data(); - const googleAccount = creatorData?.googleAccounts?.[deletedEvent.email]; - if (!googleAccount) { - console.log('[GOOGLE_DELETE] No Google account found for email', { - eventId, - email: deletedEvent.email - }); - return null; + if (!creatorData?.googleAccounts) { + console.log('[GOOGLE_SYNC] Creator has no Google accounts:', deletedEvent.creatorId); + return; } - await deleteEventFromGoogle( - eventId, - googleAccount.accessToken, - googleAccount.refreshToken, - deletedEvent.creatorId, - deletedEvent.email - ); + const [email, accountData] = Object.entries(creatorData.googleAccounts)[0]; - console.log('[GOOGLE_DELETE] Successfully deleted event from Google Calendar', { - eventId, - email: deletedEvent.email + if (!accountData?.accessToken) { + console.log('[GOOGLE_SYNC] No access token found for creator:', deletedEvent.creatorId); + return; + } + + const url = `https://www.googleapis.com/calendar/v3/calendars/primary/events/${eventId}`; + let response = await fetch(url, { + method: 'DELETE', + headers: { + 'Authorization': `Bearer ${accountData.accessToken}` + } }); - } catch (error) { - console.error('[GOOGLE_DELETE] Error deleting event from Google Calendar:', error); - - // Store the error for monitoring - await admin.firestore() - .collection('SyncErrors') - .add({ - eventId, - error: error.message, - timestamp: admin.firestore.FieldValue.serverTimestamp(), - type: 'google_delete' + if (response.status === 401 && accountData.refreshToken) { + console.log('[GOOGLE_SYNC] Token expired, refreshing...'); + const { refreshedGoogleToken } = await refreshGoogleToken(accountData.refreshToken); + await db.collection("Profiles").doc(deletedEvent.creatorId).update({ + [`googleAccounts.${email}.accessToken`]: refreshedGoogleToken }); - throw error; + response = await fetch(url, { + method: 'DELETE', + headers: { + 'Authorization': `Bearer ${refreshedGoogleToken}` + } + }); + } + + if (!response.ok && response.status !== 404) { + const errorData = await response.json(); + throw new Error(errorData.error?.message || response.statusText); + } + + console.log('[GOOGLE_SYNC] Successfully deleted event from Google:', eventId); + } catch (error) { + console.error('[GOOGLE_SYNC] Error deleting event from Google:', error); } }); + +exports.sendOverviews = functions.pubsub \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..7b64faa --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,4001 @@ +PODS: + - abseil/algorithm (1.20240116.2): + - abseil/algorithm/algorithm (= 1.20240116.2) + - abseil/algorithm/container (= 1.20240116.2) + - abseil/algorithm/algorithm (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/algorithm/container (1.20240116.2): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/base/nullability + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/base (1.20240116.2): + - abseil/base/atomic_hook (= 1.20240116.2) + - abseil/base/base (= 1.20240116.2) + - abseil/base/base_internal (= 1.20240116.2) + - abseil/base/config (= 1.20240116.2) + - abseil/base/core_headers (= 1.20240116.2) + - abseil/base/cycleclock_internal (= 1.20240116.2) + - abseil/base/dynamic_annotations (= 1.20240116.2) + - abseil/base/endian (= 1.20240116.2) + - abseil/base/errno_saver (= 1.20240116.2) + - abseil/base/fast_type_id (= 1.20240116.2) + - abseil/base/log_severity (= 1.20240116.2) + - abseil/base/malloc_internal (= 1.20240116.2) + - abseil/base/no_destructor (= 1.20240116.2) + - abseil/base/nullability (= 1.20240116.2) + - abseil/base/prefetch (= 1.20240116.2) + - abseil/base/pretty_function (= 1.20240116.2) + - abseil/base/raw_logging_internal (= 1.20240116.2) + - abseil/base/spinlock_wait (= 1.20240116.2) + - abseil/base/strerror (= 1.20240116.2) + - abseil/base/throw_delegate (= 1.20240116.2) + - abseil/base/atomic_hook (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/base/base (1.20240116.2): + - abseil/base/atomic_hook + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/cycleclock_internal + - abseil/base/dynamic_annotations + - abseil/base/log_severity + - abseil/base/nullability + - abseil/base/raw_logging_internal + - abseil/base/spinlock_wait + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/base/base_internal (1.20240116.2): + - abseil/base/config + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/base/config (1.20240116.2): + - abseil/xcprivacy + - abseil/base/core_headers (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/base/cycleclock_internal (1.20240116.2): + - abseil/base/base_internal + - abseil/base/config + - abseil/xcprivacy + - abseil/base/dynamic_annotations (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/base/endian (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/nullability + - abseil/xcprivacy + - abseil/base/errno_saver (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/base/fast_type_id (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/base/log_severity (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/base/malloc_internal (1.20240116.2): + - abseil/base/base + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/raw_logging_internal + - abseil/xcprivacy + - abseil/base/no_destructor (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/base/nullability (1.20240116.2): + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/base/prefetch (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/base/pretty_function (1.20240116.2): + - abseil/xcprivacy + - abseil/base/raw_logging_internal (1.20240116.2): + - abseil/base/atomic_hook + - abseil/base/config + - abseil/base/core_headers + - abseil/base/errno_saver + - abseil/base/log_severity + - abseil/xcprivacy + - abseil/base/spinlock_wait (1.20240116.2): + - abseil/base/base_internal + - abseil/base/core_headers + - abseil/base/errno_saver + - abseil/xcprivacy + - abseil/base/strerror (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/errno_saver + - abseil/xcprivacy + - abseil/base/throw_delegate (1.20240116.2): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/xcprivacy + - abseil/cleanup/cleanup (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/cleanup/cleanup_internal + - abseil/xcprivacy + - abseil/cleanup/cleanup_internal (1.20240116.2): + - abseil/base/base_internal + - abseil/base/core_headers + - abseil/utility/utility + - abseil/xcprivacy + - abseil/container/common (1.20240116.2): + - abseil/meta/type_traits + - abseil/types/optional + - abseil/xcprivacy + - abseil/container/common_policy_traits (1.20240116.2): + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/container/compressed_tuple (1.20240116.2): + - abseil/utility/utility + - abseil/xcprivacy + - abseil/container/container_memory (1.20240116.2): + - abseil/base/config + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/utility/utility + - abseil/xcprivacy + - abseil/container/fixed_array (1.20240116.2): + - abseil/algorithm/algorithm + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/throw_delegate + - abseil/container/compressed_tuple + - abseil/memory/memory + - abseil/xcprivacy + - abseil/container/flat_hash_map (1.20240116.2): + - abseil/algorithm/container + - abseil/base/core_headers + - abseil/container/container_memory + - abseil/container/hash_function_defaults + - abseil/container/raw_hash_map + - abseil/memory/memory + - abseil/xcprivacy + - abseil/container/flat_hash_set (1.20240116.2): + - abseil/algorithm/container + - abseil/base/core_headers + - abseil/container/container_memory + - abseil/container/hash_function_defaults + - abseil/container/raw_hash_set + - abseil/memory/memory + - abseil/xcprivacy + - abseil/container/hash_function_defaults (1.20240116.2): + - abseil/base/config + - abseil/hash/hash + - abseil/strings/cord + - abseil/strings/strings + - abseil/xcprivacy + - abseil/container/hash_policy_traits (1.20240116.2): + - abseil/container/common_policy_traits + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/container/hashtable_debug_hooks (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/container/hashtablez_sampler (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/debugging/stacktrace + - abseil/memory/memory + - abseil/profiling/exponential_biased + - abseil/profiling/sample_recorder + - abseil/synchronization/synchronization + - abseil/time/time + - abseil/utility/utility + - abseil/xcprivacy + - abseil/container/inlined_vector (1.20240116.2): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/base/throw_delegate + - abseil/container/inlined_vector_internal + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/container/inlined_vector_internal (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/container/compressed_tuple + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/types/span + - abseil/xcprivacy + - abseil/container/layout (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/debugging/demangle_internal + - abseil/meta/type_traits + - abseil/strings/strings + - abseil/types/span + - abseil/utility/utility + - abseil/xcprivacy + - abseil/container/raw_hash_map (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/throw_delegate + - abseil/container/container_memory + - abseil/container/raw_hash_set + - abseil/xcprivacy + - abseil/container/raw_hash_set (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/endian + - abseil/base/prefetch + - abseil/base/raw_logging_internal + - abseil/container/common + - abseil/container/compressed_tuple + - abseil/container/container_memory + - abseil/container/hash_policy_traits + - abseil/container/hashtable_debug_hooks + - abseil/container/hashtablez_sampler + - abseil/hash/hash + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/utility/utility + - abseil/xcprivacy + - abseil/crc/cpu_detect (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/xcprivacy + - abseil/crc/crc32c (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/prefetch + - abseil/crc/cpu_detect + - abseil/crc/crc_internal + - abseil/crc/non_temporal_memcpy + - abseil/strings/str_format + - abseil/strings/strings + - abseil/xcprivacy + - abseil/crc/crc_cord_state (1.20240116.2): + - abseil/base/config + - abseil/crc/crc32c + - abseil/numeric/bits + - abseil/strings/strings + - abseil/xcprivacy + - abseil/crc/crc_internal (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/prefetch + - abseil/base/raw_logging_internal + - abseil/crc/cpu_detect + - abseil/memory/memory + - abseil/numeric/bits + - abseil/xcprivacy + - abseil/crc/non_temporal_arm_intrinsics (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/crc/non_temporal_memcpy (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/crc/non_temporal_arm_intrinsics + - abseil/xcprivacy + - abseil/debugging/debugging_internal (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/errno_saver + - abseil/base/raw_logging_internal + - abseil/xcprivacy + - abseil/debugging/demangle_internal (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/debugging/examine_stack (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/debugging/stacktrace + - abseil/debugging/symbolize + - abseil/xcprivacy + - abseil/debugging/stacktrace (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/raw_logging_internal + - abseil/debugging/debugging_internal + - abseil/xcprivacy + - abseil/debugging/symbolize (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/malloc_internal + - abseil/base/raw_logging_internal + - abseil/debugging/debugging_internal + - abseil/debugging/demangle_internal + - abseil/strings/strings + - abseil/xcprivacy + - abseil/flags/commandlineflag (1.20240116.2): + - abseil/base/config + - abseil/base/fast_type_id + - abseil/flags/commandlineflag_internal + - abseil/strings/strings + - abseil/types/optional + - abseil/xcprivacy + - abseil/flags/commandlineflag_internal (1.20240116.2): + - abseil/base/config + - abseil/base/fast_type_id + - abseil/xcprivacy + - abseil/flags/config (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/flags/path_util + - abseil/flags/program_name + - abseil/strings/strings + - abseil/synchronization/synchronization + - abseil/xcprivacy + - abseil/flags/flag (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/flags/config + - abseil/flags/flag_internal + - abseil/flags/reflection + - abseil/strings/strings + - abseil/xcprivacy + - abseil/flags/flag_internal (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/flags/commandlineflag + - abseil/flags/commandlineflag_internal + - abseil/flags/config + - abseil/flags/marshalling + - abseil/flags/reflection + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/strings/strings + - abseil/synchronization/synchronization + - abseil/utility/utility + - abseil/xcprivacy + - abseil/flags/marshalling (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/numeric/int128 + - abseil/strings/str_format + - abseil/strings/strings + - abseil/types/optional + - abseil/xcprivacy + - abseil/flags/path_util (1.20240116.2): + - abseil/base/config + - abseil/strings/strings + - abseil/xcprivacy + - abseil/flags/private_handle_accessor (1.20240116.2): + - abseil/base/config + - abseil/flags/commandlineflag + - abseil/flags/commandlineflag_internal + - abseil/strings/strings + - abseil/xcprivacy + - abseil/flags/program_name (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/flags/path_util + - abseil/strings/strings + - abseil/synchronization/synchronization + - abseil/xcprivacy + - abseil/flags/reflection (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/no_destructor + - abseil/container/flat_hash_map + - abseil/flags/commandlineflag + - abseil/flags/commandlineflag_internal + - abseil/flags/config + - abseil/flags/private_handle_accessor + - abseil/strings/strings + - abseil/synchronization/synchronization + - abseil/xcprivacy + - abseil/functional/any_invocable (1.20240116.2): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/utility/utility + - abseil/xcprivacy + - abseil/functional/bind_front (1.20240116.2): + - abseil/base/base_internal + - abseil/container/compressed_tuple + - abseil/meta/type_traits + - abseil/utility/utility + - abseil/xcprivacy + - abseil/functional/function_ref (1.20240116.2): + - abseil/base/base_internal + - abseil/base/core_headers + - abseil/functional/any_invocable + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/hash/city (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/xcprivacy + - abseil/hash/hash (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/container/fixed_array + - abseil/functional/function_ref + - abseil/hash/city + - abseil/hash/low_level_hash + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/numeric/int128 + - abseil/strings/strings + - abseil/types/optional + - abseil/types/variant + - abseil/utility/utility + - abseil/xcprivacy + - abseil/hash/low_level_hash (1.20240116.2): + - abseil/base/config + - abseil/base/endian + - abseil/base/prefetch + - abseil/numeric/int128 + - abseil/xcprivacy + - abseil/log/absl_check (1.20240116.2): + - abseil/log/internal/check_impl + - abseil/xcprivacy + - abseil/log/absl_log (1.20240116.2): + - abseil/log/internal/log_impl + - abseil/xcprivacy + - abseil/log/absl_vlog_is_on (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/log/internal/vlog_config + - abseil/strings/strings + - abseil/xcprivacy + - abseil/log/check (1.20240116.2): + - abseil/log/internal/check_impl + - abseil/log/internal/check_op + - abseil/log/internal/conditions + - abseil/log/internal/log_message + - abseil/log/internal/strip + - abseil/xcprivacy + - abseil/log/globals (1.20240116.2): + - abseil/base/atomic_hook + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/base/raw_logging_internal + - abseil/hash/hash + - abseil/log/internal/vlog_config + - abseil/strings/strings + - abseil/xcprivacy + - abseil/log/internal/append_truncated (1.20240116.2): + - abseil/base/config + - abseil/strings/strings + - abseil/types/span + - abseil/xcprivacy + - abseil/log/internal/check_impl (1.20240116.2): + - abseil/base/core_headers + - abseil/log/internal/check_op + - abseil/log/internal/conditions + - abseil/log/internal/log_message + - abseil/log/internal/strip + - abseil/xcprivacy + - abseil/log/internal/check_op (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/log/internal/nullguard + - abseil/log/internal/nullstream + - abseil/log/internal/strip + - abseil/strings/strings + - abseil/xcprivacy + - abseil/log/internal/conditions (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/log/internal/voidify + - abseil/xcprivacy + - abseil/log/internal/config (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/log/internal/fnmatch (1.20240116.2): + - abseil/base/config + - abseil/strings/strings + - abseil/xcprivacy + - abseil/log/internal/format (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/log/internal/append_truncated + - abseil/log/internal/config + - abseil/log/internal/globals + - abseil/strings/str_format + - abseil/strings/strings + - abseil/time/time + - abseil/types/span + - abseil/xcprivacy + - abseil/log/internal/globals (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/base/raw_logging_internal + - abseil/strings/strings + - abseil/time/time + - abseil/xcprivacy + - abseil/log/internal/log_impl (1.20240116.2): + - abseil/log/absl_vlog_is_on + - abseil/log/internal/conditions + - abseil/log/internal/log_message + - abseil/log/internal/strip + - abseil/xcprivacy + - abseil/log/internal/log_message (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/errno_saver + - abseil/base/log_severity + - abseil/base/raw_logging_internal + - abseil/base/strerror + - abseil/container/inlined_vector + - abseil/debugging/examine_stack + - abseil/log/globals + - abseil/log/internal/append_truncated + - abseil/log/internal/format + - abseil/log/internal/globals + - abseil/log/internal/log_sink_set + - abseil/log/internal/nullguard + - abseil/log/internal/proto + - abseil/log/log_entry + - abseil/log/log_sink + - abseil/log/log_sink_registry + - abseil/memory/memory + - abseil/strings/strings + - abseil/time/time + - abseil/types/span + - abseil/xcprivacy + - abseil/log/internal/log_sink_set (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/base/no_destructor + - abseil/base/raw_logging_internal + - abseil/cleanup/cleanup + - abseil/log/globals + - abseil/log/internal/config + - abseil/log/internal/globals + - abseil/log/log_entry + - abseil/log/log_sink + - abseil/strings/strings + - abseil/synchronization/synchronization + - abseil/types/span + - abseil/xcprivacy + - abseil/log/internal/nullguard (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/log/internal/nullstream (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/strings/strings + - abseil/xcprivacy + - abseil/log/internal/proto (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/strings/strings + - abseil/types/span + - abseil/xcprivacy + - abseil/log/internal/strip (1.20240116.2): + - abseil/base/log_severity + - abseil/log/internal/log_message + - abseil/log/internal/nullstream + - abseil/xcprivacy + - abseil/log/internal/vlog_config (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/no_destructor + - abseil/log/internal/fnmatch + - abseil/memory/memory + - abseil/strings/strings + - abseil/synchronization/synchronization + - abseil/types/optional + - abseil/xcprivacy + - abseil/log/internal/voidify (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/log/log (1.20240116.2): + - abseil/log/internal/log_impl + - abseil/log/vlog_is_on + - abseil/xcprivacy + - abseil/log/log_entry (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/log/internal/config + - abseil/strings/strings + - abseil/time/time + - abseil/types/span + - abseil/xcprivacy + - abseil/log/log_sink (1.20240116.2): + - abseil/base/config + - abseil/log/log_entry + - abseil/xcprivacy + - abseil/log/log_sink_registry (1.20240116.2): + - abseil/base/config + - abseil/log/internal/log_sink_set + - abseil/log/log_sink + - abseil/xcprivacy + - abseil/log/vlog_is_on (1.20240116.2): + - abseil/log/absl_vlog_is_on + - abseil/xcprivacy + - abseil/memory (1.20240116.2): + - abseil/memory/memory (= 1.20240116.2) + - abseil/memory/memory (1.20240116.2): + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/meta (1.20240116.2): + - abseil/meta/type_traits (= 1.20240116.2) + - abseil/meta/type_traits (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/numeric/bits (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/numeric/int128 (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/numeric/bits + - abseil/xcprivacy + - abseil/numeric/representation (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/profiling/exponential_biased (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/xcprivacy + - abseil/profiling/sample_recorder (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/synchronization/synchronization + - abseil/time/time + - abseil/xcprivacy + - abseil/random/bit_gen_ref (1.20240116.2): + - abseil/base/core_headers + - abseil/base/fast_type_id + - abseil/meta/type_traits + - abseil/random/internal/distribution_caller + - abseil/random/internal/fast_uniform_bits + - abseil/random/random + - abseil/xcprivacy + - abseil/random/distributions (1.20240116.2): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/random/internal/distribution_caller + - abseil/random/internal/fast_uniform_bits + - abseil/random/internal/fastmath + - abseil/random/internal/generate_real + - abseil/random/internal/iostream_state_saver + - abseil/random/internal/traits + - abseil/random/internal/uniform_helper + - abseil/random/internal/wide_multiply + - abseil/strings/strings + - abseil/xcprivacy + - abseil/random/internal/distribution_caller (1.20240116.2): + - abseil/base/config + - abseil/base/fast_type_id + - abseil/utility/utility + - abseil/xcprivacy + - abseil/random/internal/fast_uniform_bits (1.20240116.2): + - abseil/base/config + - abseil/meta/type_traits + - abseil/random/internal/traits + - abseil/xcprivacy + - abseil/random/internal/fastmath (1.20240116.2): + - abseil/numeric/bits + - abseil/xcprivacy + - abseil/random/internal/generate_real (1.20240116.2): + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/random/internal/fastmath + - abseil/random/internal/traits + - abseil/xcprivacy + - abseil/random/internal/iostream_state_saver (1.20240116.2): + - abseil/meta/type_traits + - abseil/numeric/int128 + - abseil/xcprivacy + - abseil/random/internal/nonsecure_base (1.20240116.2): + - abseil/base/core_headers + - abseil/container/inlined_vector + - abseil/meta/type_traits + - abseil/random/internal/pool_urbg + - abseil/random/internal/salted_seed_seq + - abseil/random/internal/seed_material + - abseil/types/span + - abseil/xcprivacy + - abseil/random/internal/pcg_engine (1.20240116.2): + - abseil/base/config + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/numeric/int128 + - abseil/random/internal/fastmath + - abseil/random/internal/iostream_state_saver + - abseil/xcprivacy + - abseil/random/internal/platform (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/random/internal/pool_urbg (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/random/internal/randen + - abseil/random/internal/seed_material + - abseil/random/internal/traits + - abseil/random/seed_gen_exception + - abseil/types/span + - abseil/xcprivacy + - abseil/random/internal/randen (1.20240116.2): + - abseil/base/raw_logging_internal + - abseil/random/internal/platform + - abseil/random/internal/randen_hwaes + - abseil/random/internal/randen_slow + - abseil/xcprivacy + - abseil/random/internal/randen_engine (1.20240116.2): + - abseil/base/endian + - abseil/meta/type_traits + - abseil/random/internal/iostream_state_saver + - abseil/random/internal/randen + - abseil/xcprivacy + - abseil/random/internal/randen_hwaes (1.20240116.2): + - abseil/base/config + - abseil/random/internal/platform + - abseil/random/internal/randen_hwaes_impl + - abseil/xcprivacy + - abseil/random/internal/randen_hwaes_impl (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/numeric/int128 + - abseil/random/internal/platform + - abseil/xcprivacy + - abseil/random/internal/randen_slow (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/numeric/int128 + - abseil/random/internal/platform + - abseil/xcprivacy + - abseil/random/internal/salted_seed_seq (1.20240116.2): + - abseil/container/inlined_vector + - abseil/meta/type_traits + - abseil/random/internal/seed_material + - abseil/types/optional + - abseil/types/span + - abseil/xcprivacy + - abseil/random/internal/seed_material (1.20240116.2): + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/raw_logging_internal + - abseil/random/internal/fast_uniform_bits + - abseil/strings/strings + - abseil/types/optional + - abseil/types/span + - abseil/xcprivacy + - abseil/random/internal/traits (1.20240116.2): + - abseil/base/config + - abseil/numeric/bits + - abseil/numeric/int128 + - abseil/xcprivacy + - abseil/random/internal/uniform_helper (1.20240116.2): + - abseil/base/config + - abseil/meta/type_traits + - abseil/numeric/int128 + - abseil/random/internal/traits + - abseil/xcprivacy + - abseil/random/internal/wide_multiply (1.20240116.2): + - abseil/base/config + - abseil/numeric/bits + - abseil/numeric/int128 + - abseil/random/internal/traits + - abseil/xcprivacy + - abseil/random/random (1.20240116.2): + - abseil/random/distributions + - abseil/random/internal/nonsecure_base + - abseil/random/internal/pcg_engine + - abseil/random/internal/pool_urbg + - abseil/random/internal/randen_engine + - abseil/random/seed_sequences + - abseil/xcprivacy + - abseil/random/seed_gen_exception (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/random/seed_sequences (1.20240116.2): + - abseil/base/config + - abseil/random/internal/pool_urbg + - abseil/random/internal/salted_seed_seq + - abseil/random/internal/seed_material + - abseil/random/seed_gen_exception + - abseil/types/span + - abseil/xcprivacy + - abseil/status/status (1.20240116.2): + - abseil/base/atomic_hook + - abseil/base/config + - abseil/base/core_headers + - abseil/base/no_destructor + - abseil/base/nullability + - abseil/base/raw_logging_internal + - abseil/base/strerror + - abseil/container/inlined_vector + - abseil/debugging/stacktrace + - abseil/debugging/symbolize + - abseil/functional/function_ref + - abseil/memory/memory + - abseil/strings/cord + - abseil/strings/str_format + - abseil/strings/strings + - abseil/types/optional + - abseil/types/span + - abseil/xcprivacy + - abseil/status/statusor (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/nullability + - abseil/base/raw_logging_internal + - abseil/meta/type_traits + - abseil/status/status + - abseil/strings/has_ostream_operator + - abseil/strings/str_format + - abseil/strings/strings + - abseil/types/variant + - abseil/utility/utility + - abseil/xcprivacy + - abseil/strings/charset (1.20240116.2): + - abseil/base/core_headers + - abseil/strings/string_view + - abseil/xcprivacy + - abseil/strings/cord (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/nullability + - abseil/base/raw_logging_internal + - abseil/container/inlined_vector + - abseil/crc/crc32c + - abseil/crc/crc_cord_state + - abseil/functional/function_ref + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/strings/cord_internal + - abseil/strings/cordz_functions + - abseil/strings/cordz_info + - abseil/strings/cordz_statistics + - abseil/strings/cordz_update_scope + - abseil/strings/cordz_update_tracker + - abseil/strings/internal + - abseil/strings/strings + - abseil/types/optional + - abseil/types/span + - abseil/xcprivacy + - abseil/strings/cord_internal (1.20240116.2): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/base/throw_delegate + - abseil/container/compressed_tuple + - abseil/container/container_memory + - abseil/container/inlined_vector + - abseil/container/layout + - abseil/crc/crc_cord_state + - abseil/functional/function_ref + - abseil/meta/type_traits + - abseil/strings/strings + - abseil/types/span + - abseil/xcprivacy + - abseil/strings/cordz_functions (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/profiling/exponential_biased + - abseil/xcprivacy + - abseil/strings/cordz_handle (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/synchronization/synchronization + - abseil/xcprivacy + - abseil/strings/cordz_info (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/container/inlined_vector + - abseil/debugging/stacktrace + - abseil/strings/cord_internal + - abseil/strings/cordz_functions + - abseil/strings/cordz_handle + - abseil/strings/cordz_statistics + - abseil/strings/cordz_update_tracker + - abseil/synchronization/synchronization + - abseil/time/time + - abseil/types/span + - abseil/xcprivacy + - abseil/strings/cordz_statistics (1.20240116.2): + - abseil/base/config + - abseil/strings/cordz_update_tracker + - abseil/xcprivacy + - abseil/strings/cordz_update_scope (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/strings/cord_internal + - abseil/strings/cordz_info + - abseil/strings/cordz_update_tracker + - abseil/xcprivacy + - abseil/strings/cordz_update_tracker (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/strings/has_ostream_operator (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/strings/internal (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/strings/str_format (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/nullability + - abseil/strings/str_format_internal + - abseil/strings/string_view + - abseil/types/span + - abseil/xcprivacy + - abseil/strings/str_format_internal (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/container/fixed_array + - abseil/container/inlined_vector + - abseil/functional/function_ref + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/numeric/int128 + - abseil/numeric/representation + - abseil/strings/strings + - abseil/types/optional + - abseil/types/span + - abseil/utility/utility + - abseil/xcprivacy + - abseil/strings/string_view (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/nullability + - abseil/base/throw_delegate + - abseil/xcprivacy + - abseil/strings/strings (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/nullability + - abseil/base/raw_logging_internal + - abseil/base/throw_delegate + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/numeric/bits + - abseil/numeric/int128 + - abseil/strings/charset + - abseil/strings/internal + - abseil/strings/string_view + - abseil/xcprivacy + - abseil/synchronization/graphcycles_internal (1.20240116.2): + - abseil/base/base + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/malloc_internal + - abseil/base/raw_logging_internal + - abseil/xcprivacy + - abseil/synchronization/kernel_timeout_internal (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/time/time + - abseil/xcprivacy + - abseil/synchronization/synchronization (1.20240116.2): + - abseil/base/atomic_hook + - abseil/base/base + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/malloc_internal + - abseil/base/raw_logging_internal + - abseil/debugging/stacktrace + - abseil/debugging/symbolize + - abseil/synchronization/graphcycles_internal + - abseil/synchronization/kernel_timeout_internal + - abseil/time/time + - abseil/xcprivacy + - abseil/time (1.20240116.2): + - abseil/time/internal (= 1.20240116.2) + - abseil/time/time (= 1.20240116.2) + - abseil/time/internal (1.20240116.2): + - abseil/time/internal/cctz (= 1.20240116.2) + - abseil/time/internal/cctz (1.20240116.2): + - abseil/time/internal/cctz/civil_time (= 1.20240116.2) + - abseil/time/internal/cctz/time_zone (= 1.20240116.2) + - abseil/time/internal/cctz/civil_time (1.20240116.2): + - abseil/base/config + - abseil/xcprivacy + - abseil/time/internal/cctz/time_zone (1.20240116.2): + - abseil/base/config + - abseil/time/internal/cctz/civil_time + - abseil/xcprivacy + - abseil/time/time (1.20240116.2): + - abseil/base/base + - abseil/base/config + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/numeric/int128 + - abseil/strings/strings + - abseil/time/internal/cctz/civil_time + - abseil/time/internal/cctz/time_zone + - abseil/types/optional + - abseil/xcprivacy + - abseil/types (1.20240116.2): + - abseil/types/any (= 1.20240116.2) + - abseil/types/bad_any_cast (= 1.20240116.2) + - abseil/types/bad_any_cast_impl (= 1.20240116.2) + - abseil/types/bad_optional_access (= 1.20240116.2) + - abseil/types/bad_variant_access (= 1.20240116.2) + - abseil/types/compare (= 1.20240116.2) + - abseil/types/optional (= 1.20240116.2) + - abseil/types/span (= 1.20240116.2) + - abseil/types/variant (= 1.20240116.2) + - abseil/types/any (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/fast_type_id + - abseil/meta/type_traits + - abseil/types/bad_any_cast + - abseil/utility/utility + - abseil/xcprivacy + - abseil/types/bad_any_cast (1.20240116.2): + - abseil/base/config + - abseil/types/bad_any_cast_impl + - abseil/xcprivacy + - abseil/types/bad_any_cast_impl (1.20240116.2): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/xcprivacy + - abseil/types/bad_optional_access (1.20240116.2): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/xcprivacy + - abseil/types/bad_variant_access (1.20240116.2): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/xcprivacy + - abseil/types/compare (1.20240116.2): + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/types/optional (1.20240116.2): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/nullability + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/types/bad_optional_access + - abseil/utility/utility + - abseil/xcprivacy + - abseil/types/span (1.20240116.2): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/base/nullability + - abseil/base/throw_delegate + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/types/variant (1.20240116.2): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/types/bad_variant_access + - abseil/utility/utility + - abseil/xcprivacy + - abseil/utility/utility (1.20240116.2): + - abseil/base/base_internal + - abseil/base/config + - abseil/meta/type_traits + - abseil/xcprivacy + - abseil/xcprivacy (1.20240116.2) + - boost (1.84.0) + - BoringSSL-GRPC (0.0.36): + - BoringSSL-GRPC/Implementation (= 0.0.36) + - BoringSSL-GRPC/Interface (= 0.0.36) + - BoringSSL-GRPC/Implementation (0.0.36): + - BoringSSL-GRPC/Interface (= 0.0.36) + - BoringSSL-GRPC/Interface (0.0.36) + - BVLinearGradient (2.8.3): + - React-Core + - DoubleConversion (1.1.6) + - EASClient (0.13.1): + - ExpoModulesCore + - EXApplication (6.0.1): + - ExpoModulesCore + - EXConstants (17.0.3): + - ExpoModulesCore + - EXImageLoader (5.0.0): + - ExpoModulesCore + - React-Core + - EXJSONUtils (0.14.0) + - EXManifests (0.15.4): + - ExpoModulesCore + - EXNotifications (0.29.11): + - ExpoModulesCore + - Expo (52.0.18): + - ExpoModulesCore + - expo-dev-client (5.0.6): + - EXManifests + - expo-dev-launcher + - expo-dev-menu + - expo-dev-menu-interface + - EXUpdatesInterface + - expo-dev-launcher (5.0.19): + - DoubleConversion + - EXManifests + - expo-dev-launcher/Main (= 5.0.19) + - expo-dev-menu + - expo-dev-menu-interface + - ExpoModulesCore + - EXUpdatesInterface + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsinspector + - React-NativeModulesApple + - React-RCTAppDelegate + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - expo-dev-launcher/Main (5.0.19): + - DoubleConversion + - EXManifests + - expo-dev-launcher/Unsafe + - expo-dev-menu + - expo-dev-menu-interface + - ExpoModulesCore + - EXUpdatesInterface + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsinspector + - React-NativeModulesApple + - React-RCTAppDelegate + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - expo-dev-launcher/Unsafe (5.0.19): + - DoubleConversion + - EXManifests + - expo-dev-menu + - expo-dev-menu-interface + - ExpoModulesCore + - EXUpdatesInterface + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsinspector + - React-NativeModulesApple + - React-RCTAppDelegate + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - expo-dev-menu (6.0.14): + - DoubleConversion + - expo-dev-menu/Main (= 6.0.14) + - expo-dev-menu/ReactNativeCompatibles (= 6.0.14) + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - expo-dev-menu-interface (1.9.2) + - expo-dev-menu/Main (6.0.14): + - DoubleConversion + - EXManifests + - expo-dev-menu-interface + - expo-dev-menu/Vendored + - ExpoModulesCore + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsinspector + - React-NativeModulesApple + - React-RCTFabric + - React-rendererconsistency + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - expo-dev-menu/ReactNativeCompatibles (6.0.14): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - expo-dev-menu/SafeAreaView (6.0.14): + - DoubleConversion + - ExpoModulesCore + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - expo-dev-menu/Vendored (6.0.14): + - DoubleConversion + - expo-dev-menu/SafeAreaView + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - ExpoAppleAuthentication (7.1.2): + - ExpoModulesCore + - ExpoAsset (11.0.1): + - ExpoModulesCore + - ExpoCalendar (14.0.5): + - ExpoModulesCore + - ExpoCamera (16.0.9): + - ExpoModulesCore + - ZXingObjC/OneD + - ZXingObjC/PDF417 + - ExpoCrypto (14.0.1): + - ExpoModulesCore + - ExpoDevice (7.0.1): + - ExpoModulesCore + - ExpoFileSystem (18.0.5): + - ExpoModulesCore + - ExpoFont (13.0.1): + - ExpoModulesCore + - ExpoHaptics (14.0.0): + - ExpoModulesCore + - ExpoHead (4.0.11): + - ExpoModulesCore + - ExpoImagePicker (16.0.3): + - ExpoModulesCore + - ExpoKeepAwake (14.0.1): + - ExpoModulesCore + - ExpoLinking (7.0.3): + - ExpoModulesCore + - ExpoLocalization (16.0.0): + - ExpoModulesCore + - ExpoModulesCore (2.1.1): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsinspector + - React-NativeModulesApple + - React-RCTAppDelegate + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - ExpoScreenOrientation (8.0.1): + - DoubleConversion + - ExpoModulesCore + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - ExpoSplashScreen (0.29.18): + - ExpoModulesCore + - ExpoSystemUI (4.0.6): + - ExpoModulesCore + - ExpoWebBrowser (14.0.1): + - ExpoModulesCore + - EXStructuredHeaders (4.0.0) + - EXUpdates (0.26.10): + - DoubleConversion + - EASClient + - EXManifests + - ExpoModulesCore + - EXStructuredHeaders + - EXUpdatesInterface + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - ReachabilitySwift + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - EXUpdatesInterface (1.0.0): + - ExpoModulesCore + - FBLazyVector (0.76.5) + - Firebase/Auth (11.5.0): + - Firebase/CoreOnly + - FirebaseAuth (~> 11.5.0) + - Firebase/CoreOnly (11.5.0): + - FirebaseCore (= 11.5.0) + - Firebase/Crashlytics (11.5.0): + - Firebase/CoreOnly + - FirebaseCrashlytics (~> 11.5.0) + - Firebase/Firestore (11.5.0): + - Firebase/CoreOnly + - FirebaseFirestore (~> 11.5.0) + - Firebase/Functions (11.5.0): + - Firebase/CoreOnly + - FirebaseFunctions (~> 11.5.0) + - Firebase/Storage (11.5.0): + - Firebase/CoreOnly + - FirebaseStorage (~> 11.5.0) + - FirebaseAppCheckInterop (11.6.0) + - FirebaseAuth (11.5.0): + - FirebaseAppCheckInterop (~> 11.0) + - FirebaseAuthInterop (~> 11.0) + - FirebaseCore (= 11.5) + - FirebaseCoreExtension (= 11.5) + - GoogleUtilities/AppDelegateSwizzler (~> 8.0) + - GoogleUtilities/Environment (~> 8.0) + - GTMSessionFetcher/Core (< 5.0, >= 3.4) + - RecaptchaInterop (~> 100.0) + - FirebaseAuthInterop (11.6.0) + - FirebaseCore (11.5.0): + - FirebaseCoreInternal (= 11.5) + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/Logger (~> 8.0) + - FirebaseCoreExtension (11.5.0): + - FirebaseCore (= 11.5) + - FirebaseCoreInternal (11.5.0): + - "GoogleUtilities/NSData+zlib (~> 8.0)" + - FirebaseCrashlytics (11.5.0): + - FirebaseCore (= 11.5) + - FirebaseInstallations (~> 11.0) + - FirebaseRemoteConfigInterop (~> 11.0) + - FirebaseSessions (~> 11.0) + - GoogleDataTransport (~> 10.0) + - GoogleUtilities/Environment (~> 8.0) + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - FirebaseFirestore (11.5.0): + - FirebaseCore (= 11.5) + - FirebaseCoreExtension (= 11.5) + - FirebaseFirestoreInternal (= 11.5.0) + - FirebaseSharedSwift (~> 11.0) + - FirebaseFirestoreInternal (11.5.0): + - abseil/algorithm (~> 1.20240116.1) + - abseil/base (~> 1.20240116.1) + - abseil/container/flat_hash_map (~> 1.20240116.1) + - abseil/memory (~> 1.20240116.1) + - abseil/meta (~> 1.20240116.1) + - abseil/strings/strings (~> 1.20240116.1) + - abseil/time (~> 1.20240116.1) + - abseil/types (~> 1.20240116.1) + - FirebaseAppCheckInterop (~> 11.0) + - FirebaseCore (= 11.5) + - "gRPC-C++ (~> 1.65.0)" + - gRPC-Core (~> 1.65.0) + - leveldb-library (~> 1.22) + - nanopb (~> 3.30910.0) + - FirebaseFunctions (11.5.0): + - FirebaseAppCheckInterop (~> 11.0) + - FirebaseAuthInterop (~> 11.0) + - FirebaseCore (= 11.5) + - FirebaseCoreExtension (= 11.5) + - FirebaseMessagingInterop (~> 11.0) + - FirebaseSharedSwift (~> 11.0) + - GTMSessionFetcher/Core (< 5.0, >= 3.4) + - FirebaseInstallations (11.5.0): + - FirebaseCore (= 11.5) + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/UserDefaults (~> 8.0) + - PromisesObjC (~> 2.4) + - FirebaseMessagingInterop (11.6.0) + - FirebaseRemoteConfigInterop (11.6.0) + - FirebaseSessions (11.5.0): + - FirebaseCore (= 11.5) + - FirebaseCoreExtension (= 11.5) + - FirebaseInstallations (~> 11.0) + - GoogleDataTransport (~> 10.0) + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/UserDefaults (~> 8.0) + - nanopb (~> 3.30910.0) + - PromisesSwift (~> 2.1) + - FirebaseSharedSwift (11.6.0) + - FirebaseStorage (11.5.0): + - FirebaseAppCheckInterop (~> 11.0) + - FirebaseAuthInterop (~> 11.0) + - FirebaseCore (= 11.5) + - FirebaseCoreExtension (= 11.5) + - GoogleUtilities/Environment (~> 8.0) + - GTMSessionFetcher/Core (< 5.0, >= 3.4) + - fmt (9.1.0) + - glog (0.3.5) + - GoogleDataTransport (10.1.0): + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - GoogleUtilities/AppDelegateSwizzler (8.0.2): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (8.0.2): + - GoogleUtilities/Privacy + - GoogleUtilities/Logger (8.0.2): + - GoogleUtilities/Environment + - GoogleUtilities/Privacy + - GoogleUtilities/Network (8.0.2): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (8.0.2)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (8.0.2) + - GoogleUtilities/Reachability (8.0.2): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/UserDefaults (8.0.2): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - "gRPC-C++ (1.65.5)": + - "gRPC-C++/Implementation (= 1.65.5)" + - "gRPC-C++/Interface (= 1.65.5)" + - "gRPC-C++/Implementation (1.65.5)": + - abseil/algorithm/container (~> 1.20240116.2) + - abseil/base/base (~> 1.20240116.2) + - abseil/base/config (~> 1.20240116.2) + - abseil/base/core_headers (~> 1.20240116.2) + - abseil/base/log_severity (~> 1.20240116.2) + - abseil/base/no_destructor (~> 1.20240116.2) + - abseil/cleanup/cleanup (~> 1.20240116.2) + - abseil/container/flat_hash_map (~> 1.20240116.2) + - abseil/container/flat_hash_set (~> 1.20240116.2) + - abseil/container/inlined_vector (~> 1.20240116.2) + - abseil/flags/flag (~> 1.20240116.2) + - abseil/flags/marshalling (~> 1.20240116.2) + - abseil/functional/any_invocable (~> 1.20240116.2) + - abseil/functional/bind_front (~> 1.20240116.2) + - abseil/functional/function_ref (~> 1.20240116.2) + - abseil/hash/hash (~> 1.20240116.2) + - abseil/log/absl_check (~> 1.20240116.2) + - abseil/log/absl_log (~> 1.20240116.2) + - abseil/log/check (~> 1.20240116.2) + - abseil/log/globals (~> 1.20240116.2) + - abseil/log/log (~> 1.20240116.2) + - abseil/memory/memory (~> 1.20240116.2) + - abseil/meta/type_traits (~> 1.20240116.2) + - abseil/random/bit_gen_ref (~> 1.20240116.2) + - abseil/random/distributions (~> 1.20240116.2) + - abseil/random/random (~> 1.20240116.2) + - abseil/status/status (~> 1.20240116.2) + - abseil/status/statusor (~> 1.20240116.2) + - abseil/strings/cord (~> 1.20240116.2) + - abseil/strings/str_format (~> 1.20240116.2) + - abseil/strings/strings (~> 1.20240116.2) + - abseil/synchronization/synchronization (~> 1.20240116.2) + - abseil/time/time (~> 1.20240116.2) + - abseil/types/optional (~> 1.20240116.2) + - abseil/types/span (~> 1.20240116.2) + - abseil/types/variant (~> 1.20240116.2) + - abseil/utility/utility (~> 1.20240116.2) + - "gRPC-C++/Interface (= 1.65.5)" + - "gRPC-C++/Privacy (= 1.65.5)" + - gRPC-Core (= 1.65.5) + - "gRPC-C++/Interface (1.65.5)" + - "gRPC-C++/Privacy (1.65.5)" + - gRPC-Core (1.65.5): + - gRPC-Core/Implementation (= 1.65.5) + - gRPC-Core/Interface (= 1.65.5) + - gRPC-Core/Implementation (1.65.5): + - abseil/algorithm/container (~> 1.20240116.2) + - abseil/base/base (~> 1.20240116.2) + - abseil/base/config (~> 1.20240116.2) + - abseil/base/core_headers (~> 1.20240116.2) + - abseil/base/log_severity (~> 1.20240116.2) + - abseil/base/no_destructor (~> 1.20240116.2) + - abseil/cleanup/cleanup (~> 1.20240116.2) + - abseil/container/flat_hash_map (~> 1.20240116.2) + - abseil/container/flat_hash_set (~> 1.20240116.2) + - abseil/container/inlined_vector (~> 1.20240116.2) + - abseil/flags/flag (~> 1.20240116.2) + - abseil/flags/marshalling (~> 1.20240116.2) + - abseil/functional/any_invocable (~> 1.20240116.2) + - abseil/functional/bind_front (~> 1.20240116.2) + - abseil/functional/function_ref (~> 1.20240116.2) + - abseil/hash/hash (~> 1.20240116.2) + - abseil/log/check (~> 1.20240116.2) + - abseil/log/globals (~> 1.20240116.2) + - abseil/log/log (~> 1.20240116.2) + - abseil/memory/memory (~> 1.20240116.2) + - abseil/meta/type_traits (~> 1.20240116.2) + - abseil/random/bit_gen_ref (~> 1.20240116.2) + - abseil/random/distributions (~> 1.20240116.2) + - abseil/random/random (~> 1.20240116.2) + - abseil/status/status (~> 1.20240116.2) + - abseil/status/statusor (~> 1.20240116.2) + - abseil/strings/cord (~> 1.20240116.2) + - abseil/strings/str_format (~> 1.20240116.2) + - abseil/strings/strings (~> 1.20240116.2) + - abseil/synchronization/synchronization (~> 1.20240116.2) + - abseil/time/time (~> 1.20240116.2) + - abseil/types/optional (~> 1.20240116.2) + - abseil/types/span (~> 1.20240116.2) + - abseil/types/variant (~> 1.20240116.2) + - abseil/utility/utility (~> 1.20240116.2) + - BoringSSL-GRPC (= 0.0.36) + - gRPC-Core/Interface (= 1.65.5) + - gRPC-Core/Privacy (= 1.65.5) + - gRPC-Core/Interface (1.65.5) + - gRPC-Core/Privacy (1.65.5) + - GTMSessionFetcher/Core (4.1.0) + - hermes-engine (0.76.5): + - hermes-engine/Pre-built (= 0.76.5) + - hermes-engine/Pre-built (0.76.5) + - IQKeyboardManagerSwift (6.5.16) + - leveldb-library (1.22.6) + - nanopb (3.30910.0): + - nanopb/decode (= 3.30910.0) + - nanopb/encode (= 3.30910.0) + - nanopb/decode (3.30910.0) + - nanopb/encode (3.30910.0) + - PromisesObjC (2.4.0) + - PromisesSwift (2.4.0): + - PromisesObjC (= 2.4.0) + - RCT-Folly (2024.01.01.00): + - boost + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Default (= 2024.01.01.00) + - RCT-Folly/Default (2024.01.01.00): + - boost + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (2024.01.01.00): + - boost + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCTDeprecation (0.76.5) + - RCTRequired (0.76.5) + - RCTTypeSafety (0.76.5): + - FBLazyVector (= 0.76.5) + - RCTRequired (= 0.76.5) + - React-Core (= 0.76.5) + - ReachabilitySwift (5.2.4) + - React (0.76.5): + - React-Core (= 0.76.5) + - React-Core/DevSupport (= 0.76.5) + - React-Core/RCTWebSocket (= 0.76.5) + - React-RCTActionSheet (= 0.76.5) + - React-RCTAnimation (= 0.76.5) + - React-RCTBlob (= 0.76.5) + - React-RCTImage (= 0.76.5) + - React-RCTLinking (= 0.76.5) + - React-RCTNetwork (= 0.76.5) + - React-RCTSettings (= 0.76.5) + - React-RCTText (= 0.76.5) + - React-RCTVibration (= 0.76.5) + - React-callinvoker (0.76.5) + - React-Core (0.76.5): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default (= 0.76.5) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/CoreModulesHeaders (0.76.5): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/Default (0.76.5): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/DevSupport (0.76.5): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default (= 0.76.5) + - React-Core/RCTWebSocket (= 0.76.5) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTActionSheetHeaders (0.76.5): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTAnimationHeaders (0.76.5): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTBlobHeaders (0.76.5): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTImageHeaders (0.76.5): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTLinkingHeaders (0.76.5): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTNetworkHeaders (0.76.5): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTSettingsHeaders (0.76.5): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTTextHeaders (0.76.5): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTVibrationHeaders (0.76.5): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTWebSocket (0.76.5): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTDeprecation + - React-Core/Default (= 0.76.5) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-CoreModules (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - RCT-Folly (= 2024.01.01.00) + - RCTTypeSafety (= 0.76.5) + - React-Core/CoreModulesHeaders (= 0.76.5) + - React-jsi (= 0.76.5) + - React-jsinspector + - React-NativeModulesApple + - React-RCTBlob + - React-RCTImage (= 0.76.5) + - ReactCodegen + - ReactCommon + - SocketRocket (= 0.7.1) + - React-cxxreact (0.76.5): + - boost + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-callinvoker (= 0.76.5) + - React-debug (= 0.76.5) + - React-jsi (= 0.76.5) + - React-jsinspector + - React-logger (= 0.76.5) + - React-perflogger (= 0.76.5) + - React-runtimeexecutor (= 0.76.5) + - React-timing (= 0.76.5) + - React-debug (0.76.5) + - React-defaultsnativemodule (0.76.5): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-domnativemodule + - React-Fabric + - React-featureflags + - React-featureflagsnativemodule + - React-graphics + - React-idlecallbacksnativemodule + - React-ImageManager + - React-microtasksnativemodule + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-domnativemodule (0.76.5): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-FabricComponents + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-Fabric (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/animations (= 0.76.5) + - React-Fabric/attributedstring (= 0.76.5) + - React-Fabric/componentregistry (= 0.76.5) + - React-Fabric/componentregistrynative (= 0.76.5) + - React-Fabric/components (= 0.76.5) + - React-Fabric/core (= 0.76.5) + - React-Fabric/dom (= 0.76.5) + - React-Fabric/imagemanager (= 0.76.5) + - React-Fabric/leakchecker (= 0.76.5) + - React-Fabric/mounting (= 0.76.5) + - React-Fabric/observers (= 0.76.5) + - React-Fabric/scheduler (= 0.76.5) + - React-Fabric/telemetry (= 0.76.5) + - React-Fabric/templateprocessor (= 0.76.5) + - React-Fabric/uimanager (= 0.76.5) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/animations (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/attributedstring (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/componentregistry (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/componentregistrynative (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/components/legacyviewmanagerinterop (= 0.76.5) + - React-Fabric/components/root (= 0.76.5) + - React-Fabric/components/view (= 0.76.5) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/legacyviewmanagerinterop (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/root (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/view (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - Yoga + - React-Fabric/core (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/dom (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/imagemanager (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/leakchecker (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/mounting (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/observers (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events (= 0.76.5) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/observers/events (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/scheduler (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-performancetimeline + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/telemetry (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/templateprocessor (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/uimanager (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/uimanager/consistency (= 0.76.5) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/uimanager/consistency (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-FabricComponents (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components (= 0.76.5) + - React-FabricComponents/textlayoutmanager (= 0.76.5) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components/inputaccessory (= 0.76.5) + - React-FabricComponents/components/iostextinput (= 0.76.5) + - React-FabricComponents/components/modal (= 0.76.5) + - React-FabricComponents/components/rncore (= 0.76.5) + - React-FabricComponents/components/safeareaview (= 0.76.5) + - React-FabricComponents/components/scrollview (= 0.76.5) + - React-FabricComponents/components/text (= 0.76.5) + - React-FabricComponents/components/textinput (= 0.76.5) + - React-FabricComponents/components/unimplementedview (= 0.76.5) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/inputaccessory (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/iostextinput (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/modal (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/rncore (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/safeareaview (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/scrollview (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/text (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/textinput (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/unimplementedview (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/textlayoutmanager (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricImage (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - RCTRequired (= 0.76.5) + - RCTTypeSafety (= 0.76.5) + - React-Fabric + - React-graphics + - React-ImageManager + - React-jsi + - React-jsiexecutor (= 0.76.5) + - React-logger + - React-rendererdebug + - React-utils + - ReactCommon + - Yoga + - React-featureflags (0.76.5) + - React-featureflagsnativemodule (0.76.5): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-graphics (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-jsi + - React-jsiexecutor + - React-utils + - React-hermes (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-cxxreact (= 0.76.5) + - React-jsi + - React-jsiexecutor (= 0.76.5) + - React-jsinspector + - React-perflogger (= 0.76.5) + - React-runtimeexecutor + - React-idlecallbacksnativemodule (0.76.5): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-ImageManager (0.76.5): + - glog + - RCT-Folly/Fabric + - React-Core/Default + - React-debug + - React-Fabric + - React-graphics + - React-rendererdebug + - React-utils + - React-jserrorhandler (0.76.5): + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-cxxreact + - React-debug + - React-jsi + - React-jsi (0.76.5): + - boost + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-jsiexecutor (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-cxxreact (= 0.76.5) + - React-jsi (= 0.76.5) + - React-jsinspector + - React-perflogger (= 0.76.5) + - React-jsinspector (0.76.5): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-featureflags + - React-jsi + - React-perflogger (= 0.76.5) + - React-runtimeexecutor (= 0.76.5) + - React-jsitracing (0.76.5): + - React-jsi + - React-logger (0.76.5): + - glog + - React-Mapbuffer (0.76.5): + - glog + - React-debug + - React-microtasksnativemodule (0.76.5): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - react-native-blur (4.4.1): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - react-native-menu (1.1.6): + - React + - react-native-safe-area-context (4.12.0): + - React-Core + - React-nativeconfig (0.76.5) + - React-NativeModulesApple (0.76.5): + - glog + - hermes-engine + - React-callinvoker + - React-Core + - React-cxxreact + - React-jsi + - React-jsinspector + - React-runtimeexecutor + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - React-perflogger (0.76.5): + - DoubleConversion + - RCT-Folly (= 2024.01.01.00) + - React-performancetimeline (0.76.5): + - RCT-Folly (= 2024.01.01.00) + - React-cxxreact + - React-timing + - React-RCTActionSheet (0.76.5): + - React-Core/RCTActionSheetHeaders (= 0.76.5) + - React-RCTAnimation (0.76.5): + - RCT-Folly (= 2024.01.01.00) + - RCTTypeSafety + - React-Core/RCTAnimationHeaders + - React-jsi + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - React-RCTAppDelegate (0.76.5): + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-CoreModules + - React-debug + - React-defaultsnativemodule + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-nativeconfig + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-RCTNetwork + - React-rendererdebug + - React-RuntimeApple + - React-RuntimeCore + - React-RuntimeHermes + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon + - React-RCTBlob (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-Core/RCTBlobHeaders + - React-Core/RCTWebSocket + - React-jsi + - React-jsinspector + - React-NativeModulesApple + - React-RCTNetwork + - ReactCodegen + - ReactCommon + - React-RCTFabric (0.76.5): + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-Core + - React-debug + - React-Fabric + - React-FabricComponents + - React-FabricImage + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsinspector + - React-nativeconfig + - React-performancetimeline + - React-RCTImage + - React-RCTText + - React-rendererconsistency + - React-rendererdebug + - React-runtimescheduler + - React-utils + - Yoga + - React-RCTImage (0.76.5): + - RCT-Folly (= 2024.01.01.00) + - RCTTypeSafety + - React-Core/RCTImageHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTNetwork + - ReactCodegen + - ReactCommon + - React-RCTLinking (0.76.5): + - React-Core/RCTLinkingHeaders (= 0.76.5) + - React-jsi (= 0.76.5) + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - ReactCommon/turbomodule/core (= 0.76.5) + - React-RCTNetwork (0.76.5): + - RCT-Folly (= 2024.01.01.00) + - RCTTypeSafety + - React-Core/RCTNetworkHeaders + - React-jsi + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - React-RCTSettings (0.76.5): + - RCT-Folly (= 2024.01.01.00) + - RCTTypeSafety + - React-Core/RCTSettingsHeaders + - React-jsi + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - React-RCTText (0.76.5): + - React-Core/RCTTextHeaders (= 0.76.5) + - Yoga + - React-RCTVibration (0.76.5): + - RCT-Folly (= 2024.01.01.00) + - React-Core/RCTVibrationHeaders + - React-jsi + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - React-rendererconsistency (0.76.5) + - React-rendererdebug (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - RCT-Folly (= 2024.01.01.00) + - React-debug + - React-rncore (0.76.5) + - React-RuntimeApple (0.76.5): + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-callinvoker + - React-Core/Default + - React-CoreModules + - React-cxxreact + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-Mapbuffer + - React-NativeModulesApple + - React-RCTFabric + - React-RuntimeCore + - React-runtimeexecutor + - React-RuntimeHermes + - React-runtimescheduler + - React-utils + - React-RuntimeCore (0.76.5): + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-cxxreact + - React-featureflags + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-performancetimeline + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - React-runtimeexecutor (0.76.5): + - React-jsi (= 0.76.5) + - React-RuntimeHermes (0.76.5): + - hermes-engine + - RCT-Folly/Fabric (= 2024.01.01.00) + - React-featureflags + - React-hermes + - React-jsi + - React-jsinspector + - React-jsitracing + - React-nativeconfig + - React-RuntimeCore + - React-utils + - React-runtimescheduler (0.76.5): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-callinvoker + - React-cxxreact + - React-debug + - React-featureflags + - React-jsi + - React-performancetimeline + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-timing + - React-utils + - React-timing (0.76.5) + - React-utils (0.76.5): + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-debug + - React-jsi (= 0.76.5) + - ReactCodegen (0.76.5): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-FabricImage + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-NativeModulesApple + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - ReactCommon (0.76.5): + - ReactCommon/turbomodule (= 0.76.5) + - ReactCommon/turbomodule (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-callinvoker (= 0.76.5) + - React-cxxreact (= 0.76.5) + - React-jsi (= 0.76.5) + - React-logger (= 0.76.5) + - React-perflogger (= 0.76.5) + - ReactCommon/turbomodule/bridging (= 0.76.5) + - ReactCommon/turbomodule/core (= 0.76.5) + - ReactCommon/turbomodule/bridging (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-callinvoker (= 0.76.5) + - React-cxxreact (= 0.76.5) + - React-jsi (= 0.76.5) + - React-logger (= 0.76.5) + - React-perflogger (= 0.76.5) + - ReactCommon/turbomodule/core (0.76.5): + - DoubleConversion + - fmt (= 9.1.0) + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - React-callinvoker (= 0.76.5) + - React-cxxreact (= 0.76.5) + - React-debug (= 0.76.5) + - React-featureflags (= 0.76.5) + - React-jsi (= 0.76.5) + - React-logger (= 0.76.5) + - React-perflogger (= 0.76.5) + - React-utils (= 0.76.5) + - ReactNativeKeyboardManager (6.5.16-0): + - IQKeyboardManagerSwift (= 6.5.16) + - React-Core + - React-RCTText + - ReactNativeUiLib (4.3.2): + - React + - RecaptchaInterop (100.0.0) + - RNCAsyncStorage (1.23.1): + - React-Core + - RNDateTimePicker (8.2.0): + - React-Core + - RNFBApp (21.6.1): + - Firebase/CoreOnly (= 11.5.0) + - React-Core + - RNFBAuth (21.6.1): + - Firebase/Auth (= 11.5.0) + - React-Core + - RNFBApp + - RNFBCrashlytics (21.6.1): + - Firebase/Crashlytics (= 11.5.0) + - FirebaseCoreExtension + - React-Core + - RNFBApp + - RNFBFirestore (21.6.1): + - Firebase/Firestore (= 11.5.0) + - React-Core + - RNFBApp + - RNFBFunctions (21.6.1): + - Firebase/Functions (= 11.5.0) + - React-Core + - RNFBApp + - RNFBStorage (21.6.1): + - Firebase/Storage (= 11.5.0) + - React-Core + - RNFBApp + - RNFlashList (1.7.2): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - RNGestureHandler (2.20.2): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - RNReanimated (3.16.3): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/reanimated (= 3.16.3) + - RNReanimated/worklets (= 3.16.3) + - Yoga + - RNReanimated/reanimated (3.16.3): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/reanimated/apple (= 3.16.3) + - Yoga + - RNReanimated/reanimated/apple (3.16.3): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - RNReanimated/worklets (3.16.3): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - RNScreens (4.1.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - RNSVG (15.8.0): + - React-Core + - SocketRocket (0.7.1) + - Yoga (0.0.0) + - ZXingObjC/Core (3.6.9) + - ZXingObjC/OneD (3.6.9): + - ZXingObjC/Core + - ZXingObjC/PDF417 (3.6.9): + - ZXingObjC/Core + +DEPENDENCIES: + - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) + - BoringSSL-GRPC + - BVLinearGradient (from `../node_modules/react-native-linear-gradient`) + - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - EASClient (from `../node_modules/expo-eas-client/ios`) + - EXApplication (from `../node_modules/expo-application/ios`) + - EXConstants (from `../node_modules/expo-constants/ios`) + - EXImageLoader (from `../node_modules/expo-image-loader/ios`) + - EXJSONUtils (from `../node_modules/expo-json-utils/ios`) + - EXManifests (from `../node_modules/expo-manifests/ios`) + - EXNotifications (from `../node_modules/expo-notifications/ios`) + - Expo (from `../node_modules/expo`) + - expo-dev-client (from `../node_modules/expo-dev-client/ios`) + - expo-dev-launcher (from `../node_modules/expo-dev-launcher`) + - expo-dev-menu (from `../node_modules/expo-dev-menu`) + - expo-dev-menu-interface (from `../node_modules/expo-dev-menu-interface/ios`) + - ExpoAppleAuthentication (from `../node_modules/expo-apple-authentication/ios`) + - ExpoAsset (from `../node_modules/expo-asset/ios`) + - ExpoCalendar (from `../node_modules/expo-calendar/ios`) + - ExpoCamera (from `../node_modules/expo-camera/ios`) + - ExpoCrypto (from `../node_modules/expo-crypto/ios`) + - ExpoDevice (from `../node_modules/expo-device/ios`) + - ExpoFileSystem (from `../node_modules/expo-file-system/ios`) + - ExpoFont (from `../node_modules/expo-font/ios`) + - ExpoHaptics (from `../node_modules/expo-haptics/ios`) + - ExpoHead (from `../node_modules/expo-router/ios`) + - ExpoImagePicker (from `../node_modules/expo-image-picker/ios`) + - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) + - ExpoLinking (from `../node_modules/expo-linking/ios`) + - ExpoLocalization (from `../node_modules/expo-localization/ios`) + - ExpoModulesCore (from `../node_modules/expo-modules-core`) + - ExpoScreenOrientation (from `../node_modules/expo-screen-orientation/ios`) + - ExpoSplashScreen (from `../node_modules/expo-splash-screen/ios`) + - ExpoSystemUI (from `../node_modules/expo-system-ui/ios`) + - ExpoWebBrowser (from `../node_modules/expo-web-browser/ios`) + - EXStructuredHeaders (from `../node_modules/expo-structured-headers/ios`) + - EXUpdates (from `../node_modules/expo-updates/ios`) + - EXUpdatesInterface (from `../node_modules/expo-updates-interface/ios`) + - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`) + - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) + - IQKeyboardManagerSwift (from `https://github.com/douglasjunior/IQKeyboardManager.git`, branch `react-native-keyboard-manager`) + - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) + - RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) + - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) + - RCTRequired (from `../node_modules/react-native/Libraries/Required`) + - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../node_modules/react-native/`) + - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) + - React-Core (from `../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../node_modules/react-native/`) + - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) + - React-defaultsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/defaults`) + - React-domnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/dom`) + - React-Fabric (from `../node_modules/react-native/ReactCommon`) + - React-FabricComponents (from `../node_modules/react-native/ReactCommon`) + - React-FabricImage (from `../node_modules/react-native/ReactCommon`) + - React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`) + - React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) + - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) + - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) + - React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) + - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) + - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) + - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) + - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) + - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`) + - React-logger (from `../node_modules/react-native/ReactCommon/logger`) + - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) + - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) + - "react-native-blur (from `../node_modules/@react-native-community/blur`)" + - "react-native-menu (from `../node_modules/@react-native-menu/menu`)" + - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) + - React-nativeconfig (from `../node_modules/react-native/ReactCommon`) + - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) + - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) + - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`) + - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) + - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) + - React-RCTFabric (from `../node_modules/react-native/React`) + - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) + - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) + - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) + - React-RCTText (from `../node_modules/react-native/Libraries/Text`) + - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`) + - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) + - React-rncore (from `../node_modules/react-native/ReactCommon`) + - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) + - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) + - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) + - React-timing (from `../node_modules/react-native/ReactCommon/react/timing`) + - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) + - ReactCodegen (from `build/generated/ios`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - ReactNativeKeyboardManager (from `../node_modules/react-native-keyboard-manager`) + - ReactNativeUiLib (from `../node_modules/react-native-ui-lib`) + - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" + - "RNDateTimePicker (from `../node_modules/@react-native-community/datetimepicker`)" + - "RNFBApp (from `../node_modules/@react-native-firebase/app`)" + - "RNFBAuth (from `../node_modules/@react-native-firebase/auth`)" + - "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`)" + - "RNFlashList (from `../node_modules/@shopify/flash-list`)" + - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) + - RNReanimated (from `../node_modules/react-native-reanimated`) + - RNScreens (from `../node_modules/react-native-screens`) + - RNSVG (from `../node_modules/react-native-svg`) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + +SPEC REPOS: + trunk: + - abseil + - BoringSSL-GRPC + - Firebase + - FirebaseAppCheckInterop + - FirebaseAuth + - FirebaseAuthInterop + - FirebaseCore + - FirebaseCoreExtension + - FirebaseCoreInternal + - FirebaseCrashlytics + - FirebaseFirestore + - FirebaseFirestoreInternal + - FirebaseFunctions + - FirebaseInstallations + - FirebaseMessagingInterop + - FirebaseRemoteConfigInterop + - FirebaseSessions + - FirebaseSharedSwift + - FirebaseStorage + - GoogleDataTransport + - GoogleUtilities + - "gRPC-C++" + - gRPC-Core + - GTMSessionFetcher + - leveldb-library + - nanopb + - PromisesObjC + - PromisesSwift + - ReachabilitySwift + - RecaptchaInterop + - SocketRocket + - ZXingObjC + +EXTERNAL SOURCES: + boost: + :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" + BVLinearGradient: + :path: "../node_modules/react-native-linear-gradient" + DoubleConversion: + :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + EASClient: + :path: "../node_modules/expo-eas-client/ios" + EXApplication: + :path: "../node_modules/expo-application/ios" + EXConstants: + :path: "../node_modules/expo-constants/ios" + EXImageLoader: + :path: "../node_modules/expo-image-loader/ios" + EXJSONUtils: + :path: "../node_modules/expo-json-utils/ios" + EXManifests: + :path: "../node_modules/expo-manifests/ios" + EXNotifications: + :path: "../node_modules/expo-notifications/ios" + Expo: + :path: "../node_modules/expo" + expo-dev-client: + :path: "../node_modules/expo-dev-client/ios" + expo-dev-launcher: + :path: "../node_modules/expo-dev-launcher" + expo-dev-menu: + :path: "../node_modules/expo-dev-menu" + expo-dev-menu-interface: + :path: "../node_modules/expo-dev-menu-interface/ios" + ExpoAppleAuthentication: + :path: "../node_modules/expo-apple-authentication/ios" + ExpoAsset: + :path: "../node_modules/expo-asset/ios" + ExpoCalendar: + :path: "../node_modules/expo-calendar/ios" + ExpoCamera: + :path: "../node_modules/expo-camera/ios" + ExpoCrypto: + :path: "../node_modules/expo-crypto/ios" + ExpoDevice: + :path: "../node_modules/expo-device/ios" + ExpoFileSystem: + :path: "../node_modules/expo-file-system/ios" + ExpoFont: + :path: "../node_modules/expo-font/ios" + ExpoHaptics: + :path: "../node_modules/expo-haptics/ios" + ExpoHead: + :path: "../node_modules/expo-router/ios" + ExpoImagePicker: + :path: "../node_modules/expo-image-picker/ios" + ExpoKeepAwake: + :path: "../node_modules/expo-keep-awake/ios" + ExpoLinking: + :path: "../node_modules/expo-linking/ios" + ExpoLocalization: + :path: "../node_modules/expo-localization/ios" + ExpoModulesCore: + :path: "../node_modules/expo-modules-core" + ExpoScreenOrientation: + :path: "../node_modules/expo-screen-orientation/ios" + ExpoSplashScreen: + :path: "../node_modules/expo-splash-screen/ios" + ExpoSystemUI: + :path: "../node_modules/expo-system-ui/ios" + ExpoWebBrowser: + :path: "../node_modules/expo-web-browser/ios" + EXStructuredHeaders: + :path: "../node_modules/expo-structured-headers/ios" + EXUpdates: + :path: "../node_modules/expo-updates/ios" + EXUpdatesInterface: + :path: "../node_modules/expo-updates-interface/ios" + FBLazyVector: + :path: "../node_modules/react-native/Libraries/FBLazyVector" + fmt: + :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" + glog: + :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + hermes-engine: + :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + :tag: hermes-2024-11-12-RNv0.76.2-5b4aa20c719830dcf5684832b89a6edb95ac3d64 + IQKeyboardManagerSwift: + :branch: react-native-keyboard-manager + :git: https://github.com/douglasjunior/IQKeyboardManager.git + RCT-Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + RCTDeprecation: + :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" + RCTRequired: + :path: "../node_modules/react-native/Libraries/Required" + RCTTypeSafety: + :path: "../node_modules/react-native/Libraries/TypeSafety" + React: + :path: "../node_modules/react-native/" + React-callinvoker: + :path: "../node_modules/react-native/ReactCommon/callinvoker" + React-Core: + :path: "../node_modules/react-native/" + React-CoreModules: + :path: "../node_modules/react-native/React/CoreModules" + React-cxxreact: + :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-debug: + :path: "../node_modules/react-native/ReactCommon/react/debug" + React-defaultsnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults" + React-domnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom" + React-Fabric: + :path: "../node_modules/react-native/ReactCommon" + React-FabricComponents: + :path: "../node_modules/react-native/ReactCommon" + React-FabricImage: + :path: "../node_modules/react-native/ReactCommon" + React-featureflags: + :path: "../node_modules/react-native/ReactCommon/react/featureflags" + React-featureflagsnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" + React-graphics: + :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" + React-hermes: + :path: "../node_modules/react-native/ReactCommon/hermes" + React-idlecallbacksnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" + React-ImageManager: + :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + React-jserrorhandler: + :path: "../node_modules/react-native/ReactCommon/jserrorhandler" + React-jsi: + :path: "../node_modules/react-native/ReactCommon/jsi" + React-jsiexecutor: + :path: "../node_modules/react-native/ReactCommon/jsiexecutor" + React-jsinspector: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" + React-jsitracing: + :path: "../node_modules/react-native/ReactCommon/hermes/executor/" + React-logger: + :path: "../node_modules/react-native/ReactCommon/logger" + React-Mapbuffer: + :path: "../node_modules/react-native/ReactCommon" + React-microtasksnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" + react-native-blur: + :path: "../node_modules/@react-native-community/blur" + react-native-menu: + :path: "../node_modules/@react-native-menu/menu" + react-native-safe-area-context: + :path: "../node_modules/react-native-safe-area-context" + React-nativeconfig: + :path: "../node_modules/react-native/ReactCommon" + React-NativeModulesApple: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + React-perflogger: + :path: "../node_modules/react-native/ReactCommon/reactperflogger" + React-performancetimeline: + :path: "../node_modules/react-native/ReactCommon/react/performance/timeline" + React-RCTActionSheet: + :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + React-RCTAnimation: + :path: "../node_modules/react-native/Libraries/NativeAnimation" + React-RCTAppDelegate: + :path: "../node_modules/react-native/Libraries/AppDelegate" + React-RCTBlob: + :path: "../node_modules/react-native/Libraries/Blob" + React-RCTFabric: + :path: "../node_modules/react-native/React" + React-RCTImage: + :path: "../node_modules/react-native/Libraries/Image" + React-RCTLinking: + :path: "../node_modules/react-native/Libraries/LinkingIOS" + React-RCTNetwork: + :path: "../node_modules/react-native/Libraries/Network" + React-RCTSettings: + :path: "../node_modules/react-native/Libraries/Settings" + React-RCTText: + :path: "../node_modules/react-native/Libraries/Text" + React-RCTVibration: + :path: "../node_modules/react-native/Libraries/Vibration" + React-rendererconsistency: + :path: "../node_modules/react-native/ReactCommon/react/renderer/consistency" + React-rendererdebug: + :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" + React-rncore: + :path: "../node_modules/react-native/ReactCommon" + React-RuntimeApple: + :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" + React-RuntimeCore: + :path: "../node_modules/react-native/ReactCommon/react/runtime" + React-runtimeexecutor: + :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + React-RuntimeHermes: + :path: "../node_modules/react-native/ReactCommon/react/runtime" + React-runtimescheduler: + :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" + React-timing: + :path: "../node_modules/react-native/ReactCommon/react/timing" + React-utils: + :path: "../node_modules/react-native/ReactCommon/react/utils" + ReactCodegen: + :path: build/generated/ios + ReactCommon: + :path: "../node_modules/react-native/ReactCommon" + ReactNativeKeyboardManager: + :path: "../node_modules/react-native-keyboard-manager" + ReactNativeUiLib: + :path: "../node_modules/react-native-ui-lib" + RNCAsyncStorage: + :path: "../node_modules/@react-native-async-storage/async-storage" + RNDateTimePicker: + :path: "../node_modules/@react-native-community/datetimepicker" + RNFBApp: + :path: "../node_modules/@react-native-firebase/app" + RNFBAuth: + :path: "../node_modules/@react-native-firebase/auth" + RNFBCrashlytics: + :path: "../node_modules/@react-native-firebase/crashlytics" + RNFBFirestore: + :path: "../node_modules/@react-native-firebase/firestore" + RNFBFunctions: + :path: "../node_modules/@react-native-firebase/functions" + RNFBStorage: + :path: "../node_modules/@react-native-firebase/storage" + RNFlashList: + :path: "../node_modules/@shopify/flash-list" + RNGestureHandler: + :path: "../node_modules/react-native-gesture-handler" + RNReanimated: + :path: "../node_modules/react-native-reanimated" + RNScreens: + :path: "../node_modules/react-native-screens" + RNSVG: + :path: "../node_modules/react-native-svg" + Yoga: + :path: "../node_modules/react-native/ReactCommon/yoga" + +CHECKOUT OPTIONS: + IQKeyboardManagerSwift: + :commit: 718cbed77cdd5ecd8b779afe543ba5b2df45b40a + :git: https://github.com/douglasjunior/IQKeyboardManager.git + +SPEC CHECKSUMS: + abseil: d121da9ef7e2ff4cab7666e76c5a3e0915ae08c3 + boost: 1dca942403ed9342f98334bf4c3621f011aa7946 + BoringSSL-GRPC: ca6a8e5d04812fce8ffd6437810c2d46f925eaeb + BVLinearGradient: cb006ba232a1f3e4f341bb62c42d1098c284da70 + DoubleConversion: f16ae600a246532c4020132d54af21d0ddb2a385 + EASClient: d15d70e334b019ae5649609011cda761defe4b1a + EXApplication: 88ebf1a95f85faa5d2df160016d61f2d060e9438 + EXConstants: 277129d9a42ba2cf1fad375e7eaa9939005c60be + EXImageLoader: e5da974e25b13585c196b658a440720c075482d5 + EXJSONUtils: 01fc7492b66c234e395dcffdd5f53439c5c29c93 + EXManifests: 8de88191fe548cd5aeafa4228ed92283b483b923 + EXNotifications: 23f1620b7aab8a5c0566224cf555bcd3261c8bd5 + Expo: a68bbe94f5cbf55c2d30178942cfd215a59e914f + expo-dev-client: 6c1b998cb4ef67f528138c0e46df793848c9b1ee + expo-dev-launcher: f4762cf64dba8ef5a8673f267ed71d90180020bb + expo-dev-menu: 50c0a1a19990f16c605db6890087b974651f4713 + expo-dev-menu-interface: 4baf2f8b3b79ce37cf4b900e4b3ba6df3384f0a1 + ExpoAppleAuthentication: 97195d0bb6676f83160b6a9fad020e90116319b9 + ExpoAsset: 6f7a8887cbb9fb39fdb0808e7f6f74ba0e1ae9b6 + ExpoCalendar: ac4cd16664d204d747b62f9f867f60e7dceaf4d4 + ExpoCamera: bf2b44c5ab59e06431cf33f14f7e4015ce9ba4f0 + ExpoCrypto: 483fc758365923f89ddaab4327c21cae9534841d + ExpoDevice: 449822f2c45660c1ce83283dd51c67fe5404996c + ExpoFileSystem: 6774e1aa2d3c7edfde11855cf5c635a3565a4918 + ExpoFont: 12b0217e42ac97029d0f317f0486039a8508cf52 + ExpoHaptics: f8eacde90398b8be3648ed823b6e9e6bf87ece3f + ExpoHead: 0a8bb3bdc603d2249e7a590a969310230ed1b389 + ExpoImagePicker: 4eff722eec3f969b3978a8a3b64efbe52f800905 + ExpoKeepAwake: 22173f45d767c7d37403fdf48292726901d69ce7 + ExpoLinking: 40e30b571ffb77b280a38bed137d89b21f46f2a0 + ExpoLocalization: d81f70d53db94b31e4a0b1e11007424ea1011a1c + ExpoModulesCore: f14bb59adb6c74a096ad0f4d5c259584248994d4 + ExpoScreenOrientation: 4aec74c6d06be69bce64096978ddaf2313e5deaa + ExpoSplashScreen: b7d41a3769736c141e6f49780791e8757bc7ab09 + ExpoSystemUI: 778d700c6f38d3d7b8794460f50c1ca05c4f7462 + ExpoWebBrowser: b658ba8a9161f1b54afb279591cfce2cb73330fa + EXStructuredHeaders: 09c70347b282e3d2507e25fb4c747b1b885f87f6 + EXUpdates: da6f0dfa30391fa631d47b5f24e6a2c792dc85c8 + EXUpdatesInterface: 7c977640bdd8b85833c19e3959ba46145c5719db + FBLazyVector: 1bf99bb46c6af9a2712592e707347315f23947aa + Firebase: 7a56fe4f56b5ab81b86a6822f5b8f909ae6fc7e2 + FirebaseAppCheckInterop: 347aa09a805219a31249b58fc956888e9fcb314b + FirebaseAuth: d8ad770642af39d1be932094be5f5230efb0ea74 + FirebaseAuthInterop: a919d415797d23b7bfe195a04f322b86c65020ef + FirebaseCore: 93abc05437f8064cd2bc0a53b768fb0bc5a1d006 + FirebaseCoreExtension: ddb2eb987f736b714d30f6386795b52c4670439e + FirebaseCoreInternal: f47dd28ae7782e6a4738aad3106071a8fe0af604 + FirebaseCrashlytics: 94c11c3bf296fde8c18f2c9f8e76bd9349227038 + FirebaseFirestore: 3f59cb7b6f62b362886743d4c92e83a66b5e0a5d + FirebaseFirestoreInternal: d8d71a7f27834573404834172886183f1cd48c3d + FirebaseFunctions: 302356b97cd56d1d95dc9aca0ddcb0f1e0443b0c + FirebaseInstallations: d8063d302a426d114ac531cd82b1e335a0565745 + FirebaseMessagingInterop: d768073b71144b7bceadfec019d3dc49c743d53e + FirebaseRemoteConfigInterop: e75e348953352a000331eb77caf01e424248e176 + FirebaseSessions: b252b3f91a51186188882ea8e7e1730fc1eee391 + FirebaseSharedSwift: a4e5dfca3e210633bb3a3dfb94176c019211948b + FirebaseStorage: 4e521b5c833f0f3d488dcbde0c72044d02c59146 + fmt: 10c6e61f4be25dc963c36bd73fc7b1705fe975be + glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a + GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 + GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d + "gRPC-C++": 2fa52b3141e7789a28a737f251e0c45b4cb20a87 + gRPC-Core: a27c294d6149e1c39a7d173527119cfbc3375ce4 + GTMSessionFetcher: 923b710231ad3d6f3f0495ac1ced35421e07d9a6 + hermes-engine: 06a9c6900587420b90accc394199527c64259db4 + IQKeyboardManagerSwift: 90ba81812fbbd6694924a95a271fa3affdf04a14 + leveldb-library: cc8b8f8e013647a295ad3f8cd2ddf49a6f19be19 + nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 + RCT-Folly: 84578c8756030547307e4572ab1947de1685c599 + RCTDeprecation: fb7d408617e25d7f537940000d766d60149c5fea + RCTRequired: 9aaf0ffcc1f41f0c671af863970ef25c422a9920 + RCTTypeSafety: e9a6e7d48184646eb0610295b74c0dd02768cbb2 + ReachabilitySwift: 32793e867593cfc1177f5d16491e3a197d2fccda + React: fffb3cf1b0d7aee03c4eb4952b2d58783615e9fa + React-callinvoker: 3c6ecc0315d42924e01b3ddc25cf2e49d33da169 + React-Core: 1a5ddefb00dd72644171dd39bb4bbcd7849c70f0 + React-CoreModules: 8de64f712fe272ed08f37aaf64633ddf793e70d3 + React-cxxreact: e204185e1da1c843fec2bbb10bcc5b5800355dfa + React-debug: 02462c1bc08dae8a2994d1e710adba02c299724c + React-defaultsnativemodule: 57697530c24cf9c66ee6b8ccd836e16cd807b5ff + React-domnativemodule: a7765305675950ef69d1ec9f16d26692edc0136e + React-Fabric: dec910113e66ecc0bb01ca0450a670057913ea2b + React-FabricComponents: 39972a33b0aa0f497c8884904a9d34058c647e1d + React-FabricImage: 3bec45a3f523ae88bf94c67a483c1b0e055d0976 + React-featureflags: 7c440ac7e6bf5f691a39178a3dec335dcca19760 + React-featureflagsnativemodule: 4a1f4ac4e03c71d3c1f0bd369ce9bc6c409396bf + React-graphics: e36611400a08814f80b1496fa3e44cb2f4cb212d + React-hermes: a12bf33d9915dbe2dcde5b6b781faab6684883fb + React-idlecallbacksnativemodule: c0ecc1ae8ef566d3ea5da5fcaa24b120b0652ab8 + React-ImageManager: c90a16c0b5c9fdaa82d318bf3244f46cc6df4514 + React-jserrorhandler: 82a56fdcfb3a014915d75f0d14db8f82fcb87b16 + React-jsi: 217274301608d7fa529bd275c73020b55cf39361 + React-jsiexecutor: 1bcbc63a8c1d698b35c9fb521ee87aa48a3702d2 + React-jsinspector: a84b39d1cda7843770c36f11ab370ba33b3f83cc + React-jsitracing: 9a32b035bd6399ddc5230bfb8b288d4488c5076c + React-logger: ae95f0effa7e1791bd6f7283caddca323d4fbc1e + React-Mapbuffer: f0c766c9dfb313c91b07457beb4e4ec9b2e02435 + React-microtasksnativemodule: 2b269ab96f8d54e52c4534d1cf8012879663a28c + react-native-blur: aeda95624971b20d19c6c0fb291c411056e6d270 + react-native-menu: 6eb1bc1cffd6f3f29e0d33f0326552f805637b9c + react-native-safe-area-context: 8b8404e70b0cbf2a56428a17017c14c1dcc16448 + React-nativeconfig: 565ebf4340d9ede95b523f0e3640f48286985ef5 + React-NativeModulesApple: 6ec0cac27d99644895c1c22b2b7a33441854a539 + React-perflogger: 16e049953d21b37e9871ddf0b02f414e12ff14ba + React-performancetimeline: 1bd17418509e56758a1b4a363f75ffb17449eafa + React-RCTActionSheet: a4388035260b01ac38d3647da0433b0455da9bae + React-RCTAnimation: 9cc9e88ec5f94d573d3b5d5d9702f47774d8603c + React-RCTAppDelegate: 4a6d8313ccf569e49e0374ae85cc17698823e7d0 + React-RCTBlob: f879b05cf702dd4099054c3c3bf05bd4757de701 + React-RCTFabric: 480655dbfc22b45e6542e1e224fa19e2968f3962 + React-RCTImage: 8fc2b137d17fb8756cdba38d74f4d40fb9499dee + React-RCTLinking: e691e89d8658aaa772c59084a45a96e8c9ef8df1 + React-RCTNetwork: 749cb659702c3faf3efecfcb982150be0f2c834a + React-RCTSettings: 60c431627d37e6d996e0f61a9e84df8e41d898cb + React-RCTText: 74cc248bf8d2f6d07beb6196aa4c7055b3eb1a51 + React-RCTVibration: 81ff3704c7ed66a99e2670167252fd0e9a10980b + React-rendererconsistency: daabe06163f9fcef3a3d25883eddc7115098b3b0 + React-rendererdebug: 215df454a5d1cb3734c8438356302c8031de5d7a + React-rncore: 621a7b222dda9fe85a9922cb88d5e1ddcbd0e12b + React-RuntimeApple: 904dc291cd40fa9c616115e7f245b02e8b093145 + React-RuntimeCore: 68a937463999e07447269d106a4c6891c83ddd39 + React-runtimeexecutor: 10fae9492194097c99f6e34cedbb42a308922d32 + React-RuntimeHermes: 9820773d433a8b8f7e47c5b589cd1c64c1003ad2 + React-runtimescheduler: e20a7a00b1bf8cd15e564474e7fd175e19b1d383 + React-timing: 0287e530587639771ca7eb52e2ca897f5755be53 + React-utils: 89a30618bd38c591900879825de59104ded1e246 + ReactCodegen: 28abe92ea9a1e277edc25d02d7d53ab3acf5cc07 + ReactCommon: 7da12c0f59956995a153de45835b64c89e0a4a57 + ReactNativeKeyboardManager: 5abe57da962b386508945888c75abee4b93f382d + ReactNativeUiLib: 4990e6d7c99b57513540f317b5fb560eacb8fbb5 + RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21 + RNCAsyncStorage: aa75595c1aefa18f868452091fa0c411a516ce11 + RNDateTimePicker: 818460dc31b0dc5ec58289003e27dd8d022fb79c + RNFBApp: 72b96921c64702d51eca9f3ed579c1777efd0d7e + RNFBAuth: db39dbf0c9f10c50da349519551149a09dbb3656 + RNFBCrashlytics: 22223ee96beba1130c8906253f5b900f629c2926 + RNFBFirestore: d13b3429d574c8bb69867f08a8411b7c789bb492 + RNFBFunctions: f117db5e99cfb64a40211dfc36b257ee8facf337 + RNFBStorage: dcb4de202231f31ce5782732ccb725b302de54a3 + RNFlashList: a826a72577131c42a7d27e04f194f9b6bfb0c125 + RNGestureHandler: 987692c2cbd41ad765a9195675f96b65ab1c0c99 + RNReanimated: f858cf8b4a9a47c8b190347c1a8dacbeab4a3255 + RNScreens: 3ae60e6b62aabe98bba1f874fec15eaa453ad2d2 + RNSVG: 8542aa11770b27563714bbd8494a8436385fc85f + SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 + Yoga: 7548e4449365bf0ef60db4aefe58abff37fcabec + ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5 + +PODFILE CHECKSUM: 38667d7f148920d0676457550577e3307724328d + +COCOAPODS: 1.16.2 diff --git a/package.json b/package.json index ab7fdf1..0a07608 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,6 @@ "react": "18.3.1", "react-dom": "18.3.1", "react-native": "0.76.5", - "react-native-big-calendar": "^4.15.1", "react-native-calendars": "^1.1306.0", "react-native-element-dropdown": "^2.12.2", "react-native-gesture-handler": "~2.20.2", diff --git a/patches/@howljs+calendar-kit+2.2.1.patch b/patches/@howljs+calendar-kit+2.2.1.patch new file mode 100644 index 0000000..4cca47b --- /dev/null +++ b/patches/@howljs+calendar-kit+2.2.1.patch @@ -0,0 +1,148 @@ +diff --git a/node_modules/@howljs/calendar-kit/src/hooks/useSyncedList.tsx b/node_modules/@howljs/calendar-kit/src/hooks/useSyncedList.tsx +index 2c2d340..c27d395 100644 +--- a/node_modules/@howljs/calendar-kit/src/hooks/useSyncedList.tsx ++++ b/node_modules/@howljs/calendar-kit/src/hooks/useSyncedList.tsx +@@ -40,12 +40,12 @@ const useSyncedList = ({ id }: { id: ScrollType }) => { + + const _onMomentumEnd = () => { + if ( +- isTriggerMomentum.current && +- startDateUnix.current !== visibleDateUnix.current ++ isTriggerMomentum.current && ++ startDateUnix.current !== visibleDateUnix.current + ) { + triggerDateChanged.current = undefined; + onDateChanged?.( +- dateTimeToISOString(parseDateTime(visibleDateUnix.current)) ++ dateTimeToISOString(parseDateTime(visibleDateUnix.current)) + ); + notifyDateChanged(visibleDateUnix.current); + isTriggerMomentum.current = false; +@@ -83,71 +83,70 @@ const useSyncedList = ({ id }: { id: ScrollType }) => { + }); + + const onVisibleColumnChanged = useCallback( +- (props: { +- index: number; +- column: number; +- columns: number; +- offset: number; +- extraScrollData: Record; +- }) => { +- const { index: pageIndex, column, columns, extraScrollData } = props; +- const { visibleColumns, visibleDates } = extraScrollData; ++ (props: { ++ index: number; ++ column: number; ++ columns: number; ++ offset: number; ++ extraScrollData: Record; ++ }) => { ++ const { index: pageIndex, column, columns, extraScrollData } = props; ++ const { visibleColumns, visibleDates } = extraScrollData; + +- if (scrollType.current === id && visibleColumns && visibleDates) { +- const dayIndex = pageIndex * columns + column; +- const visibleStart = visibleDates[pageIndex * columns]; +- const visibleEnd = +- visibleDates[pageIndex * columns + column + visibleColumns]; ++ if (scrollType.current === id && visibleColumns && visibleDates) { ++ const dayIndex = pageIndex * columns + column; ++ const visibleStart = visibleDates[pageIndex * columns]; ++ const visibleEnd = ++ visibleDates[pageIndex * columns + column + visibleColumns]; + +- if (visibleStart && visibleEnd) { +- const diffDays = Math.floor( +- (visibleEnd - visibleStart) / MILLISECONDS_IN_DAY +- ); +- if (diffDays <= 7) { +- visibleWeeks.value = [visibleStart]; +- } else { +- const nextWeekStart = visibleDates[pageIndex * columns + 7]; +- if (nextWeekStart) { +- visibleWeeks.value = [visibleStart, nextWeekStart]; ++ if (visibleStart && visibleEnd) { ++ const diffDays = Math.floor( ++ (visibleEnd - visibleStart) / MILLISECONDS_IN_DAY ++ ); ++ if (diffDays <= 7) { ++ visibleWeeks.value = [visibleStart]; ++ } else { ++ const nextWeekStart = visibleDates[pageIndex * columns + 7]; ++ if (nextWeekStart) { ++ visibleWeeks.value = [visibleStart, nextWeekStart]; ++ } + } + } +- } +- +- const currentDate = visibleDates[dayIndex]; +- if (!currentDate) { +- triggerDateChanged.current = undefined; +- return; +- } + +- if (visibleDateUnix.current !== currentDate) { +- const dateIsoStr = dateTimeToISOString(parseDateTime(currentDate)); +- onChange?.(dateIsoStr); +- if ( +- triggerDateChanged.current && +- triggerDateChanged.current === currentDate +- ) { ++ const currentDate = visibleDates[dayIndex]; ++ if (!currentDate) { + triggerDateChanged.current = undefined; +- onDateChanged?.(dateIsoStr); +- notifyDateChanged(currentDate); ++ return; ++ } ++ ++ if (visibleDateUnix.current !== currentDate) { ++ const dateIsoStr = dateTimeToISOString(parseDateTime(currentDate)); ++ onChange?.(dateIsoStr); ++ if ( ++ triggerDateChanged?.current === currentDate ++ ) { ++ triggerDateChanged.current = undefined; ++ onDateChanged?.(dateIsoStr); ++ notifyDateChanged(currentDate); ++ } ++ visibleDateUnix.current = currentDate; ++ runOnUI(() => { ++ visibleDateUnixAnim.value = currentDate; ++ })(); + } +- visibleDateUnix.current = currentDate; +- runOnUI(() => { +- visibleDateUnixAnim.value = currentDate; +- })(); + } +- } +- }, +- [ +- scrollType, +- id, +- visibleDateUnix, +- visibleWeeks, +- triggerDateChanged, +- onChange, +- onDateChanged, +- notifyDateChanged, +- visibleDateUnixAnim, +- ] ++ }, ++ [ ++ scrollType, ++ id, ++ visibleDateUnix, ++ visibleWeeks, ++ triggerDateChanged, ++ onChange, ++ onDateChanged, ++ notifyDateChanged, ++ visibleDateUnixAnim, ++ ] + ); + + return { onScroll, onVisibleColumnChanged }; diff --git a/patches/react-native-big-calendar+4.15.1.patch b/patches/react-native-big-calendar+4.15.1.patch deleted file mode 100644 index 59c0912..0000000 --- a/patches/react-native-big-calendar+4.15.1.patch +++ /dev/null @@ -1,195 +0,0 @@ -diff --git a/node_modules/react-native-big-calendar/build/index.js b/node_modules/react-native-big-calendar/build/index.js -index 848ceba..f326b8e 100644 ---- a/node_modules/react-native-big-calendar/build/index.js -+++ b/node_modules/react-native-big-calendar/build/index.js -@@ -9,6 +9,17 @@ var isoWeek = require('dayjs/plugin/isoWeek'); - var React = require('react'); - var reactNative = require('react-native'); - var calendarize = require('calendarize'); -+var { -+ startOfDay, -+ endOfDay, -+ startOfWeek, -+ isAfter, -+ isBefore, -+ isSameDay, -+ differenceInDays, -+ add, -+ getTime -+} = require('date-fns'); - - function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } - -@@ -1000,87 +1011,91 @@ function _CalendarBodyForMonthView(_a) { - var start = _a.start, end = _a.end; - return day.isBetween(dayjs__default["default"](start).startOf('day'), dayjs__default["default"](end).endOf('day'), null, '[)'); - }); -- } -- else { -- /** -- * Better way to sort overlapping events that spans accross multiple days -- * For example, if you want following events -- * Event 1, start = 01/01 12:00, end = 02/01 12:00 -- * Event 2, start = 02/01 12:00, end = 03/01 12:00 -- * Event 3, start = 03/01 12:00, end = 04/01 12:00 -- * -- * When drawing calendar in month view, event 3 should be placed at 3rd index for 03/01, because Event 2 are placed at 2nd index for 02/01 and 03/01 -- * -- */ -- var min_1 = day.startOf('day'), max_1 = day.endOf('day'); -- //filter all events that starts from the current week until the current day, and sort them by reverse starting time -- var filteredEvents_1 = events -- .filter(function (_a) { -- var start = _a.start, end = _a.end; -- return dayjs__default["default"](end).isAfter(day.startOf('week')) && dayjs__default["default"](start).isBefore(max_1); -- }) -- .sort(function (a, b) { -- if (dayjs__default["default"](a.start).isSame(b.start, 'day')) { -- var aDuration = dayjs__default["default"].duration(dayjs__default["default"](a.end).diff(dayjs__default["default"](a.start))).days(); -- var bDuration = dayjs__default["default"].duration(dayjs__default["default"](b.end).diff(dayjs__default["default"](b.start))).days(); -- return aDuration - bDuration; -- } -- return b.start.getTime() - a.start.getTime(); -+ } else { -+ // Convert day once and cache all the commonly used dates/times -+ const jsDay = day?.toDate?.() || day; -+ const weekStart = startOfWeek(jsDay); -+ var min_1 = startOfDay(jsDay); -+ var max_1 = endOfDay(jsDay); -+ const max1Time = getTime(max_1); -+ const min1Time = getTime(min_1); -+ -+ // Pre-process events with dates and cache timestamps -+ const processedEvents = events.map(event => { -+ const startDay = event.start?.toDate?.() || new Date(event.start); -+ const endDay = event.end?.toDate?.() || new Date(event.end); -+ return { -+ ...event, -+ startDay, -+ endDay, -+ startTime: getTime(startDay), -+ endTime: getTime(endDay), -+ startDayStart: startOfDay(startDay) -+ }; - }); -- /** -- * find the most relevant min date to filter the events -- * in the example: -- * 1. when rendering for 01/01, min date will be 01/01 (start of day for event 1) -- * 2. when rendering for 02/01, min date will be 01/01 (start of day for event 1) -- * 3. when rendering for 03/01, min date will be 01/01 (start of day for event 1) -- * 4. when rendering for 04/01, min date will be 01/01 (start of day for event 1) -- * 5. when rendering for 05/01, min date will be 05/01 (no event overlaps with 05/01) -- */ -- filteredEvents_1.forEach(function (_a) { -- var start = _a.start, end = _a.end; -- if (dayjs__default["default"](end).isAfter(min_1) && dayjs__default["default"](start).isBefore(min_1)) { -- min_1 = dayjs__default["default"](start).startOf('day'); -+ -+ // Filter events within the weekly range and sort by reverse start time -+ let filteredEvents_1 = processedEvents -+ .filter(({ startTime, endTime }) => -+ endTime > getTime(weekStart) && startTime < max1Time -+ ) -+ .sort((a, b) => { -+ if (isSameDay(a.startDay, b.startDay)) { -+ // Pre-calculate durations since they're used in sorting -+ const aDuration = differenceInDays(a.endDay, a.startDay); -+ const bDuration = differenceInDays(b.endDay, b.startDay); -+ return bDuration - aDuration; -+ } -+ return b.startTime - a.startTime; -+ }); -+ -+ // Update min_1 to the earliest startDay for overlapping events -+ for (const event of filteredEvents_1) { -+ if (event.endTime > min1Time && event.startTime < min1Time) { -+ min_1 = event.startDayStart; -+ break; // We only need the first one due to the sort order - } -- }); -+ } -+ -+ // Filter to keep only events that overlap the min to max range, then reverse -+ const min1TimeUpdated = getTime(min_1); - filteredEvents_1 = filteredEvents_1 -- .filter(function (_a) { -- var start = _a.start, end = _a.end; -- return dayjs__default["default"](end).endOf('day').isAfter(min_1) && dayjs__default["default"](start).isBefore(max_1); -- }) -+ .filter(({ startTime, endDay }) => -+ getTime(endOfDay(endDay)) > min1TimeUpdated && startTime < max1Time -+ ) - .reverse(); -- /** -- * We move eligible event to the top -- * For example, when rendering for 03/01, Event 3 should be moved to the top, since there is a gap left by Event 1 -- */ -- var finalEvents_1 = []; -- var tmpDay_1 = day.startOf('week'); -- //re-sort events from the start of week until the calendar cell date -- //optimize sorting of event nodes and make sure that no empty gaps are left on top of calendar cell -- while (!tmpDay_1.isAfter(day)) { -- filteredEvents_1.forEach(function (event) { -- if (dayjs__default["default"](event.end).isBefore(tmpDay_1.startOf('day'))) { -- var eventToMoveUp = filteredEvents_1.find(function (e) { -- return dayjs__default["default"](e.start).startOf('day').isSame(tmpDay_1.startOf('day')); -- }); -- if (eventToMoveUp != undefined) { -- //remove eventToMoveUp from finalEvents first -- if (finalEvents_1.indexOf(eventToMoveUp) > -1) { -- finalEvents_1.splice(finalEvents_1.indexOf(eventToMoveUp), 1); -- } -- if (finalEvents_1.indexOf(event) > -1) { -- finalEvents_1.splice(finalEvents_1.indexOf(event), 1, eventToMoveUp); -- } -- else { -+ -+ // Move eligible events to the top, preventing duplicate entries -+ const finalEvents_1 = []; -+ const seenEvents = new Set(); // Use Set for faster lookups -+ let tmpDay_1 = weekStart; -+ -+ while (!isAfter(tmpDay_1, jsDay)) { -+ const tmpDayTime = getTime(tmpDay_1); -+ -+ for (const event of filteredEvents_1) { -+ const eventEndDayTime = getTime(startOfDay(event.endDay)); -+ -+ if (!seenEvents.has(event)) { -+ if (eventEndDayTime < tmpDayTime) { -+ // Find event starting on tmpDay -+ const eventToMoveUp = filteredEvents_1.find(e => -+ isSameDay(e.startDayStart, tmpDay_1) -+ ); -+ if (eventToMoveUp && !seenEvents.has(eventToMoveUp)) { - finalEvents_1.push(eventToMoveUp); -+ seenEvents.add(eventToMoveUp); - } -+ } else { -+ finalEvents_1.push(event); -+ seenEvents.add(event); - } - } -- else if (finalEvents_1.indexOf(event) == -1) { -- finalEvents_1.push(event); -- } -- }); -- tmpDay_1 = tmpDay_1.add(1, 'day'); -+ } -+ tmpDay_1 = add(tmpDay_1, { days: 1 }); - } -+ -+ console.log(finalEvents_1); - return finalEvents_1; - } - }, [events, sortedMonthView]); -@@ -1311,7 +1326,7 @@ function _CalendarHeader(_a) { - !stringHasContent(dayHeaderHighlightColor) && - u['mt-6'], - ] }, date.format('D')))), -- showAllDayEventCell ? (React__namespace.createElement(reactNative.View, { style: [ -+ showAllDayEventCell ? (React__namespace.createElement(reactNative.ScrollView, { style: [ - u['border-l'], - { borderColor: theme.palette.gray['200'] }, - { height: cellHeight }, diff --git a/yarn.lock b/yarn.lock index 22b15a4..6dfe9a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4394,11 +4394,6 @@ cacache@^18.0.2: tar "^6.1.11" unique-filename "^3.0.0" -calendarize@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/calendarize/-/calendarize-1.1.1.tgz#0fa8b8de6b5e6ff9f9fbb89cc3a8c01aace291c2" - integrity sha512-C2JyBAtNp2NG4DX4fA1EILggLt/5PlYzvQR0crHktoAPBc9TlIfdhzg7tWekCbe+pH6+9qoK+FhPbi+vYJJlqw== - call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -5005,7 +5000,7 @@ date-fns@^3.6.0: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== -dayjs@^1.11.13, dayjs@^1.8.15: +dayjs@^1.8.15: version "1.11.13" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== @@ -9618,14 +9613,6 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-native-big-calendar@^4.15.1: - version "4.15.1" - resolved "https://registry.yarnpkg.com/react-native-big-calendar/-/react-native-big-calendar-4.15.1.tgz#9cfef290e40a51cbc59b1be4d065804b21f2f74f" - integrity sha512-hNrzkM+9Kb2T0J/1fW9AMaeN+AuhakCfNtQPaQL29l3JXgOO14ikJ3iPqQkmNVbuiWYiMrpI25hrmXffiOVIgQ== - dependencies: - calendarize "^1.1.1" - dayjs "^1.11.13" - react-native-calendars@^1.1306.0: version "1.1307.0" resolved "https://registry.yarnpkg.com/react-native-calendars/-/react-native-calendars-1.1307.0.tgz#2cb8c5abd322037e9b3ef5605afa86f25347068f"