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);