import React, { useRef, useState } from "react"; import { LayoutChangeEvent, StyleSheet } from "react-native"; import { Calendar } from "react-native-big-calendar"; import { Picker, PickerModes, SegmentedControl, View, } from "react-native-ui-lib"; import { MaterialIcons } from "@expo/vector-icons"; import { AddEventDialog } from "@/components/pages/calendar/AddEventDialog"; import HeaderTemplate from "@/components/shared/HeaderTemplate"; import CalendarViewSwitch from "@/components/pages/calendar/CalendarViewSwitch"; import { ManuallyAddEventModal } from "@/components/pages/calendar/ManuallyAddEventModal"; import { CalendarEvent } from "@/contexts/CalendarContext"; import { useSettingsContext } from "@/contexts/SettingsContext"; import EditEventDialog from "./EditEventDialog"; import { useGetEvents } from "@/hooks/firebase/useGetEvents"; import { Text } from "react-native-ui-lib"; const modeMap = new Map([ [0, "day"], [1, "week"], [2, "month"], ]); const months = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ]; export default function CalendarPage() { const { calendarColor } = useSettingsContext(); const [editVisible, setEditVisible] = useState(false); const [eventForEdit, setEventForEdit] = useState(); const styles = StyleSheet.create({ segmentslblStyle: { fontSize: 12, fontFamily: "Manrope_600SemiBold", }, calHeader: { borderWidth: 0, }, dayModeHeader: { alignSelf: "flex-start", justifyContent: "space-between", alignContent: "center", width: 38, right: 42, }, }); const [isFamilyView, setIsFamilyView] = useState(false); const [calendarHeight, setCalendarHeight] = useState(0); const [mode, setMode] = useState<"week" | "month" | "day">("week"); const [selectedDate, setSelectedDate] = useState(new Date()); const [selectedNewEventDate, setSelectedNewEndDate] = useState< Date | undefined >(undefined); const calendarContainerRef = useRef(null); const { data: events } = useGetEvents(isFamilyView); const onLayout = (event: LayoutChangeEvent) => { const { height } = event.nativeEvent.layout; setCalendarHeight(height); }; const handleSegmentChange = (index: number) => { const selectedMode = modeMap.get(index); if (selectedMode) { setMode(selectedMode as "day" | "week" | "month"); } }; const handleMonthChange = (month: string) => { const currentDay = selectedDate.getDate(); const currentYear = selectedDate.getFullYear(); const newMonthIndex = months.indexOf(month); const updatedDate = new Date(currentYear, newMonthIndex, currentDay); setSelectedDate(updatedDate); }; return ( {selectedDate.getFullYear()} handleMonthChange(itemValue as string)} trailingAccessory={} > {months.map((month) => ( ))} {calendarHeight > 0 && ( ({ backgroundColor: event.eventColor })} onPressEvent={(event) => { setEditVisible(true); setEventForEdit(event); }} height={calendarHeight} activeDate={selectedDate} date={selectedDate} onPressCell={setSelectedNewEndDate} headerContentStyle={mode === "day" ? styles.dayModeHeader : {}} onSwipeEnd={(date) => { setSelectedDate(date); }} /> )} {eventForEdit && ( { setEditVisible(!editVisible); }} event={eventForEdit} /> )} setSelectedNewEndDate(undefined)} /> ); }