import React, { useEffect, useRef, useState } from "react"; import { StyleSheet, TouchableOpacity } from "react-native"; import { ScrollView } from "react-native-gesture-handler"; import * as ImagePicker from "expo-image-picker"; import { Button, Colors, Image, Picker, Text, TextField, View, } from "react-native-ui-lib"; import Ionicons from "@expo/vector-icons/Ionicons"; import * as tz from "tzdata"; import * as Localization from "expo-localization"; import debounce from "debounce"; import { useAuthContext } from "@/contexts/AuthContext"; import { useUpdateUserData } from "@/hooks/firebase/useUpdateUserData"; import { useChangeProfilePicture } from "@/hooks/firebase/useChangeProfilePicture"; import { colorMap } from "@/constants/colorMap"; import DeleteProfileDialogs from "../user_components/DeleteProfileDialogs"; const MyProfile = () => { const { user, profileData } = useAuthContext(); const [timeZone, setTimeZone] = useState( profileData?.timeZone! ?? Localization.getCalendars()[0].timeZone ); const [lastName, setLastName] = useState(profileData?.lastName || ""); const [firstName, setFirstName] = useState( profileData?.firstName || "" ); const [profileImage, setProfileImage] = useState< string | ImagePicker.ImagePickerAsset | null >(profileData?.pfp || null); const [showDeleteDialog, setShowDeleteDialog] = useState(false); const handleHideDeleteDialog = () => { setShowDeleteDialog(false); }; const handleShowDeleteDialog = () => { setShowDeleteDialog(true); }; const { mutateAsync: updateUserData } = useUpdateUserData(); const { mutateAsync: changeProfilePicture } = useChangeProfilePicture(); const isFirstRender = useRef(true); const handleUpdateUserData = async () => { await updateUserData({ newUserData: { firstName, lastName, timeZone } }); }; const debouncedUserDataUpdate = debounce(handleUpdateUserData, 500); useEffect(() => { if (isFirstRender.current) { isFirstRender.current = false; return; } debouncedUserDataUpdate(); }, [timeZone, lastName, firstName]); useEffect(() => { if (profileData) { setFirstName(profileData.firstName || ""); setLastName(profileData.lastName || ""); setTimeZone( profileData.timeZone || Localization.getCalendars()[0].timeZone! ); } }, [profileData]); const pickImage = async () => { const permissionResult = await ImagePicker.requestMediaLibraryPermissionsAsync(); if (!permissionResult.granted) { alert("Permission to access camera roll is required!"); return; } const result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, allowsEditing: true, aspect: [1, 1], quality: 1, }); if (!result.canceled) { setProfileImage(result.assets[0].uri); await changeProfilePicture(result.assets[0]); } }; const handleClearImage = async () => { await updateUserData({ newUserData: { pfp: null } }); setProfileImage(null); }; const pfpUri = profileImage && typeof profileImage === "object" && "uri" in profileImage ? profileImage.uri : profileImage; return ( Your Profile {pfpUri ? ( ) : ( {profileData?.firstName?.at(0)} {profileData?.lastName?.at(0)} )} {profileData?.pfp ? "Change" : "Add"} Photo {profileData?.pfp && ( Remove Photo )} First name { setFirstName(value); }} /> Last name { setLastName(value); }} /> Email address Settings Time Zone setTimeZone(item as string)} showSearch floatingPlaceholder style={styles.inViewPicker} trailingAccessory={ } > {timeZoneItems}