diff --git a/app/(auth)/calendar/index.tsx b/app/(auth)/calendar/index.tsx index 1b239ac..53fa094 100644 --- a/app/(auth)/calendar/index.tsx +++ b/app/(auth)/calendar/index.tsx @@ -1,8 +1,40 @@ -import React from "react"; +import React, { useState } from "react"; +import { ScrollView, RefreshControl } from "react-native"; +import { useSetAtom } from "jotai"; import CalendarPage from "@/components/pages/calendar/CalendarPage"; +import { refreshTriggerAtom } from "@/components/pages/calendar/atoms"; export default function Screen() { - return ( - - ); + const [refreshing, setRefreshing] = useState(false); + const setRefreshTrigger = useSetAtom(refreshTriggerAtom); + + const onRefresh = React.useCallback(async () => { + setRefreshing(true); + + const minimumDelay = new Promise((resolve) => setTimeout(resolve, 1000)); + + try { + setRefreshTrigger((prev) => !prev); + + await Promise.all([minimumDelay]); + } catch (error) { + console.error("Refresh failed:", error); + } finally { + setRefreshing(false); + } + }, [setRefreshTrigger]); + + return ( + + } + bounces={true} + showsVerticalScrollIndicator={false} + > + + + ); } diff --git a/components/pages/calendar/CalendarPage.tsx b/components/pages/calendar/CalendarPage.tsx index 0118f6c..d6d2d7e 100644 --- a/components/pages/calendar/CalendarPage.tsx +++ b/components/pages/calendar/CalendarPage.tsx @@ -1,21 +1,21 @@ import React from "react"; -import {View,} from "react-native-ui-lib"; +import { View } from "react-native-ui-lib"; import HeaderTemplate from "@/components/shared/HeaderTemplate"; -import {InnerCalendar} from "@/components/pages/calendar/InnerCalendar"; +import { InnerCalendar } from "@/components/pages/calendar/InnerCalendar"; export default function CalendarPage() { - return ( - - - - - ); + return ( + + + + + ); } diff --git a/components/pages/calendar/EventCalendar.tsx b/components/pages/calendar/EventCalendar.tsx index efd3ede..30379cc 100644 --- a/components/pages/calendar/EventCalendar.tsx +++ b/components/pages/calendar/EventCalendar.tsx @@ -2,12 +2,13 @@ import React, { useCallback, useEffect, useMemo, useState } from "react"; import { Calendar } from "react-native-big-calendar"; import { ActivityIndicator, ScrollView, StyleSheet, View, ViewStyle } from "react-native"; import { useGetEvents } from "@/hooks/firebase/useGetEvents"; -import { useAtom, useSetAtom } from "jotai"; +import { useAtom, useAtomValue, useSetAtom } from "jotai"; import { editVisibleAtom, eventForEditAtom, isAllDayAtom, modeAtom, + refreshTriggerAtom, selectedDateAtom, selectedNewEventDateAtom, } from "@/components/pages/calendar/atoms"; @@ -31,7 +32,7 @@ const getTotalMinutes = () => { export const EventCalendar: React.FC = React.memo( ({ calendarHeight }) => { - const { data: events, isLoading } = useGetEvents(); + const { data: events, isLoading, refetch } = useGetEvents(); const { profileData } = useAuthContext(); const [selectedDate, setSelectedDate] = useAtom(selectedDateAtom); const [mode, setMode] = useAtom(modeAtom); @@ -39,6 +40,7 @@ export const EventCalendar: React.FC = React.memo( const setEditVisible = useSetAtom(editVisibleAtom); const [isAllDay, setIsAllDay] = useAtom(isAllDayAtom); const setEventForEdit = useSetAtom(eventForEditAtom); + const shouldRefresh = useAtomValue(refreshTriggerAtom); const setSelectedNewEndDate = useSetAtom(selectedNewEventDateAtom); const {isSyncing} = useSyncEvents() @@ -233,6 +235,17 @@ export const EventCalendar: React.FC = React.memo( setOffsetMinutes(getTotalMinutes()); }, [events, mode]); + useEffect(() => { + refetch() + .then(() => { + console.log('✅ Events refreshed successfully'); + }) + .catch((error) => { + console.error('❌ Events refresh failed:', error); + }); + }, [shouldRefresh, refetch]) + + if (isLoading) { return ( diff --git a/components/pages/calendar/InnerCalendar.tsx b/components/pages/calendar/InnerCalendar.tsx index 6dc83f8..5744bdc 100644 --- a/components/pages/calendar/InnerCalendar.tsx +++ b/components/pages/calendar/InnerCalendar.tsx @@ -1,5 +1,5 @@ import {View} from "react-native-ui-lib"; -import React, {useRef, useState} from "react"; +import React, {useCallback, useRef, useState} from "react"; import {LayoutChangeEvent} from "react-native"; import CalendarViewSwitch from "@/components/pages/calendar/CalendarViewSwitch"; import {AddEventDialog} from "@/components/pages/calendar/AddEventDialog"; @@ -11,12 +11,16 @@ export const InnerCalendar = () => { const [calendarHeight, setCalendarHeight] = useState(0); const [calendarWidth, setCalendarWidth] = useState(0); const calendarContainerRef = useRef(null); + const hasSetInitialSize = useRef(false); - const onLayout = (event: LayoutChangeEvent) => { - const {height, width} = event.nativeEvent.layout; - setCalendarHeight(height); - setCalendarWidth(width); - }; + const onLayout = useCallback((event: LayoutChangeEvent) => { + if (!hasSetInitialSize.current) { + const {height, width} = event.nativeEvent.layout; + setCalendarHeight(height); + setCalendarWidth(width); + hasSetInitialSize.current = true; + } + }, []); return ( <> diff --git a/components/pages/calendar/atoms.ts b/components/pages/calendar/atoms.ts index 62bc25e..3f24905 100644 --- a/components/pages/calendar/atoms.ts +++ b/components/pages/calendar/atoms.ts @@ -11,3 +11,4 @@ export const selectedNewEventDateAtom = atom(undefined); export const settingsPageIndex = atom(0); export const userSettingsView = atom(true); export const toDosPageIndex = atom(0); +export const refreshTriggerAtom = atom(false);