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"; 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: 14, }, 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 ( 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 : {}} /> )} {eventForEdit && ( { setEditVisible(!editVisible); }} event={eventForEdit} /> )} setSelectedNewEndDate(undefined)} /> ); }