import { Button, ButtonSize, Colors, DateTimePicker, LoaderScreen, Modal, Picker, PickerModes, Switch, Text, TextField, TextFieldRef, TouchableOpacity, View, } from "react-native-ui-lib"; import { ScrollView } from "react-native-gesture-handler"; import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useEffect, useRef, useState } from "react"; import { AntDesign, Feather, Ionicons } from "@expo/vector-icons"; import { PickerMultiValue } from "react-native-ui-lib/src/components/picker/types"; import { useCreateEvent } from "@/hooks/firebase/useCreateEvent"; import { EventData } from "@/hooks/firebase/types/eventData"; import DropModalIcon from "@/assets/svgs/DropModalIcon"; import {Alert, StyleSheet} from "react-native"; import ClockIcon from "@/assets/svgs/ClockIcon"; import LockIcon from "@/assets/svgs/LockIcon"; import MenuIcon from "@/assets/svgs/MenuIcon"; import CameraIcon from "@/assets/svgs/CameraIcon"; import AssigneesDisplay from "@/components/shared/AssigneesDisplay"; import { useAtom } from "jotai"; import { eventForEditAtom, selectedNewEventDateAtom, isAllDayAtom, } from "@/components/pages/calendar/atoms"; import { useGetFamilyMembers } from "@/hooks/firebase/useGetFamilyMembers"; import BinIcon from "@/assets/svgs/BinIcon"; import DeleteEventDialog from "./DeleteEventDialog"; import { useDeleteEvent } from "@/hooks/firebase/useDeleteEvent"; import AddPersonIcon from "@/assets/svgs/AddPersonIcon"; const daysOfWeek = [ { label: "Monday", value: "monday" }, { label: "Tuesday", value: "tuesday" }, { label: "Wednesday", value: "wednesday" }, { label: "Thursday", value: "thursday" }, { label: "Friday", value: "friday" }, { label: "Saturday", value: "saturday" }, { label: "Sunday", value: "sunday" }, ]; export const ManuallyAddEventModal = () => { const insets = useSafeAreaInsets(); const [selectedNewEventDate, setSelectedNewEndDate] = useAtom( selectedNewEventDateAtom ); const [editEvent, setEditEvent] = useAtom(eventForEditAtom); const [allDayAtom, setAllDayAtom] = useAtom(isAllDayAtom); const [deleteModalVisible, setDeleteModalVisible] = useState(false); const { mutateAsync: deleteEvent, isLoading: isDeleting } = useDeleteEvent(); const { show, close, initialDate } = { show: !!selectedNewEventDate || !!editEvent, close: () => { setDeleteModalVisible(false); setSelectedNewEndDate(undefined); setEditEvent(undefined); }, initialDate: selectedNewEventDate || editEvent?.start, }; const detailsRef = useRef(null); const [title, setTitle] = useState(editEvent?.title || ""); const [details, setDetails] = useState(editEvent?.notes || ""); const [isAllDay, setIsAllDay] = useState(editEvent?.allDay || false); const [isPrivate, setIsPrivate] = useState( editEvent?.private || false ); const [location, setLocation] = useState(editEvent?.location ?? ""); useEffect(() => { if(allDayAtom === true) setIsAllDay(true); }, [allDayAtom]) const [startTime, setStartTime] = useState(() => { const date = initialDate ?? new Date(); if ( date.getMinutes() > 0 || date.getSeconds() > 0 || date.getMilliseconds() > 0 ) { date.setHours(date.getHours() + 1); } date.setMinutes(0); date.setSeconds(0); date.setMilliseconds(0); return date; }); const [endTime, setEndTime] = useState(() => { if (editEvent?.end) { const date = new Date(editEvent.end); date.setSeconds(0, 0); return date; } const baseDate = editEvent?.end ?? initialDate ?? new Date(); const date = new Date(baseDate); if ( date.getMinutes() > 0 || date.getSeconds() > 0 || date.getMilliseconds() > 0 ) { date.setHours(date.getHours() + 1); } date.setMinutes(0); date.setSeconds(0); date.setMilliseconds(0); date.setHours(date.getHours() + 1); return date; }); const [startDate, setStartDate] = useState(initialDate ?? new Date()); const [endDate, setEndDate] = useState( editEvent?.end ?? initialDate ?? new Date() ); const [selectedAttendees, setSelectedAttendees] = useState( editEvent?.attendees ?? [] ); const [repeatInterval, setRepeatInterval] = useState([]); const { mutateAsync: createEvent, isLoading: isAdding, isError, } = useCreateEvent(); const { data: members } = useGetFamilyMembers(true); const titleRef = useRef(null); const [creator, setCreator] = useState(''); useEffect(() => { if (editEvent) { let creatorMember = members?.find((member) => member?.uid === editEvent.creatorId); const fullName = `${creatorMember?.firstName ?? ""}`; setCreator(fullName); } }, []) const isLoading = isDeleting || isAdding; useEffect(() => { setTitle(editEvent?.title || ""); setDetails(editEvent?.notes || ""); setIsAllDay(editEvent?.allDay || false); setIsPrivate(editEvent?.private || false); setStartTime(() => { const date = new Date(initialDate ?? new Date()); const minutes = date.getMinutes(); date.setMinutes(0, 0, 0); if (minutes >= 30) { date.setHours(date.getHours() + 1); } return date; }); setEndTime(() => { if (editEvent?.end) { const date = new Date(editEvent.end); date.setSeconds(0, 0); return date; } const baseDate = editEvent?.end ?? initialDate ?? new Date(); const date = new Date(baseDate); if ( date.getMinutes() > 0 || date.getSeconds() > 0 || date.getMilliseconds() > 0 ) { date.setHours(date.getHours() + 1); } date.setMinutes(0); date.setSeconds(0); date.setMilliseconds(0); date.setHours(date.getHours() + 1); return date; }); setStartDate(initialDate ?? new Date()); setEndDate(editEvent?.end ?? initialDate ?? new Date()); setSelectedAttendees(editEvent?.attendees ?? []); setLocation(editEvent?.location ?? ""); setRepeatInterval([]); }, [editEvent, selectedNewEventDate]); useEffect(() => { if (show && !editEvent) { setTimeout(() => { titleRef?.current?.focus(); }, 500); } }, [selectedNewEventDate]); 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); }; const handleDeleteEvent = async () => { await deleteEvent({ eventId: `${editEvent?.id}` }); close(); }; const hideDeleteEventModal = () => { setDeleteModalVisible(false); }; const combineDateAndTime = (date: Date, time: Date): Date => { const combined = new Date(date); combined.setHours(time.getHours()); combined.setMinutes(time.getMinutes()); combined.setSeconds(0); combined.setMilliseconds(0); return combined; }; const handleSave = async () => { let finalStartDate: Date; let finalEndDate: Date; if (isAllDay) { finalStartDate = new Date(startDate.setHours(0, 0, 0, 0)); finalEndDate = new Date(startDate.setHours(0, 0, 0, 0)); } else { finalStartDate = combineDateAndTime(startDate, startTime); finalEndDate = combineDateAndTime(endDate, endTime); } const eventData: Partial = { title: title, startDate: finalStartDate, endDate: finalEndDate, allDay: isAllDay, attendees: selectedAttendees, notes: details, location: location }; if (editEvent?.id) eventData.id = editEvent?.id; if (validateEvent()) { await createEvent(eventData); setEditEvent(undefined); close(); } else { return; } }; const validateEvent = () => { if (!title) { Alert.alert('Alert', 'Title field cannot be empty'); return false; } if (!selectedAttendees || selectedAttendees?.length === 0) { Alert.alert('Alert', 'Cannot have an event without any attendees'); return false; } 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 ( ); } return ( {/*{editEvent ? (*/} {/* <>*/} {/* */} {/* */} {/* */} {/* */} {/* */} {/* */} {/* }*/} {/* onPress={close}*/} {/* />*/} {/* */} {/* }*/} {/* onPress={handleSave}*/} {/* />*/} {/* }*/} {/* onPress={() => {*/} {/* showDeleteEventModal();*/} {/* }}*/} {/* />*/} {/* */} {/* */} {/* */} {/*) : (*/} Cancel Save {editEvent && (