import {AntDesign, Ionicons} from "@expo/vector-icons"; import React, {useCallback, useState} from "react"; import {Button, Checkbox, Text, View} from "react-native-ui-lib"; import {ActivityIndicator, ScrollView, StyleSheet} from "react-native"; import {TouchableOpacity} from "react-native-gesture-handler"; import {useAuthContext} from "@/contexts/AuthContext"; import {useUpdateUserData} from "@/hooks/firebase/useUpdateUserData"; import debounce from "debounce"; import AppleIcon from "@/assets/svgs/AppleIcon"; import GoogleIcon from "@/assets/svgs/GoogleIcon"; import OutlookIcon from "@/assets/svgs/OutlookIcon"; import ExpoLocalization from "expo-localization/src/ExpoLocalization"; import {colorMap} from "@/constants/colorMap"; import {useSetAtom} from "jotai"; import {settingsPageIndex} from "../calendar/atoms"; import CalendarSettingsDialog from "./calendar_components/CalendarSettingsDialog"; import {useClearTokens} from "@/hooks/firebase/useClearTokens"; import {useCalSync} from "@/hooks/useCalSync"; import Feather from "@expo/vector-icons/Feather"; const CalendarSettingsPage = () => { const {profileData} = useAuthContext(); const setPageIndex = useSetAtom(settingsPageIndex); const [firstDayOfWeek, setFirstDayOfWeek] = useState( profileData?.firstDayOfWeek ?? ExpoLocalization.getCalendars()[0].firstWeekday === 1 ? "Mondays" : "Sundays" ); const [isModalVisible, setModalVisible] = useState(false); const [selectedService, setSelectedService] = useState< "google" | "outlook" | "apple" >("google"); const [selectedEmail, setSelectedEmail] = useState(""); const showConfirmationDialog = ( serviceName: "google" | "outlook" | "apple", email: string ) => { setSelectedService(serviceName); setSelectedEmail(email); setModalVisible(true); }; const handleConfirm = async () => { await clearToken({email: selectedEmail, provider: selectedService}); setModalVisible(false); }; const handleCancel = () => { setModalVisible(false); }; const [selectedColor, setSelectedColor] = useState( profileData?.eventColor ?? colorMap.pink ); const [previousSelectedColor, setPreviousSelectedColor] = useState( profileData?.eventColor ?? colorMap.pink ); const {mutateAsync: updateUserData} = useUpdateUserData(); const {mutateAsync: clearToken} = useClearTokens(); const { isSyncingGoogle, isSyncingOutlook, isConnectedToGoogle, isConnectedToMicrosoft, isConnectedToApple, handleAppleSignIn, isSyncingApple, handleMicrosoftSignIn, fetchAndSaveOutlookEvents, fetchAndSaveGoogleEvents, handleStartGoogleSignIn, fetchAndSaveAppleEvents } = useCalSync() const debouncedUpdateUserData = useCallback( debounce(async (color: string) => { try { await updateUserData({ newUserData: { eventColor: color, }, }); } catch (error) { console.error("Failed to update color:", error); setSelectedColor(previousSelectedColor); } }, 500), [] ); const debouncedUpdateFirstDayOfWeek = useCallback( debounce(async (firstDayOfWeek: string) => { try { await updateUserData({ newUserData: { firstDayOfWeek, }, }); } catch (error) { console.error("Failed to update first day of week:", error); } }, 500), [] ); const handleChangeFirstDayOfWeek = (firstDayOfWeek: string) => { setFirstDayOfWeek(firstDayOfWeek); debouncedUpdateFirstDayOfWeek(firstDayOfWeek); }; const handleChangeColor = (color: string) => { setPreviousSelectedColor(selectedColor); setSelectedColor(color); debouncedUpdateUserData(color); }; return ( setPageIndex(0)}> Return to main settings Calendar settings Event Color Preference handleChangeColor(colorMap.pink)}> {selectedColor == colorMap.pink && ( )} handleChangeColor(colorMap.orange)} > {selectedColor == colorMap.orange && ( )} handleChangeColor(colorMap.green)}> {selectedColor == colorMap.green && ( )} handleChangeColor(colorMap.teal)}> {selectedColor == colorMap.teal && ( )} handleChangeColor(colorMap.purple)} > {selectedColor == colorMap.purple && ( )} Weekly Start Date handleChangeFirstDayOfWeek("Sundays")} /> Sundays {" "} (default) handleChangeFirstDayOfWeek("Mondays")} /> Mondays Add Calendar