import { Avatar, Button, ButtonSize, Colors, DateTimePicker, LoaderScreen, Modal, Picker, Switch, Text, TextField, TouchableOpacity, View, } from "react-native-ui-lib"; import { ScrollView } from "react-native-gesture-handler"; import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useState } from "react"; import { AntDesign, Feather, Ionicons, MaterialIcons, } from "@expo/vector-icons"; import { PickerMultiValue } from "react-native-ui-lib/src/components/picker/types"; import { useAuthContext } from "@/contexts/AuthContext"; import { useCreateEvent } from "@/hooks/firebase/useCreateEvent"; import { EventData } from "@/hooks/firebase/types/eventData"; import { addHours, setDate } from "date-fns"; import DropModalIcon from "@/assets/svgs/DropModalIcon"; import { CalendarEvent, useCalendarContext } from "@/contexts/CalendarContext"; import { repeatOptions } from "@/contexts/ToDosContext"; import { 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"; 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 = ({ show, close, initialDate, }: { show: boolean; close: () => void; initialDate?: Date; }) => { const { addEvent } = useCalendarContext(); const { user } = useAuthContext(); const insets = useSafeAreaInsets(); const [title, setTitle] = useState(""); const [isAllDay, setIsAllDay] = useState(false); const [isPrivate, setIsPrivate] = useState(false); const [startTime, setStartTime] = useState(() => { const date = initialDate ?? new Date(); date.setSeconds(0, 0); return date; }); const [endTime, setEndTime] = useState(() => { const date = initialDate ? addHours(initialDate, 1) : new Date(); date.setSeconds(0, 0); return date; }); const [startDate, setStartDate] = useState(initialDate ?? new Date()); const [endDate, setEndDate] = useState(initialDate ?? new Date()); const [repeatInterval, setRepeatInterval] = useState([]); const { mutateAsync: createEvent, isLoading, isError } = useCreateEvent(); const formatDateTime = (date: Date) => { return date.toLocaleDateString("en-US", { weekday: "long", month: "short", day: "numeric", }); }; 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 = () => { let finalStartDate: Date; let finalEndDate: Date; if (isAllDay) { finalStartDate = new Date(startDate); finalStartDate.setHours(0, 0, 0, 0); finalEndDate = new Date(startDate); finalEndDate.setHours(23, 59, 59, 999); } else { finalStartDate = combineDateAndTime(startDate, startTime); finalEndDate = combineDateAndTime(endDate, endTime); } const eventData: CalendarEvent = { title: title, start: finalStartDate, end: finalEndDate, allDay: isAllDay, private: isPrivate, }; addEvent(eventData); close(); }; 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 ( Cancel Save { setTitle(text); }} placeholderTextColor="#2d2d30" text60R marginT-15 marginL-30 /> All day setIsAllDay(value)} /> { setStartDate(date); }} /> {!isAllDay && { setEndDate(date); }} /> } Assignees