import React, { useMemo } from 'react'; import { View, Text, Pressable, Dimensions } from 'react-native'; import Animated, { FadeIn } from 'react-native-reanimated'; import { ms } from '../utils'; import { getMonthGridDays } from '../utils'; import { CalendarEvent } from '../types'; const { width } = Dimensions.get('window'); interface MonthViewProps { currentDisplayDate: Date; selectedDate: Date; setSelectedDate: (date: Date) => void; events: CalendarEvent[]; theme: any; styles: any; renderEventMarkers?: (date: Date, events: CalendarEvent[]) => React.ReactNode; } export const MonthView = React.memo( ({ currentDisplayDate, selectedDate, setSelectedDate, events, theme, styles, renderEventMarkers, }: MonthViewProps) => { const weekHeaders = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']; const itemWidth = (width - ms(32)) / 7; const monthGridDays = useMemo( () => getMonthGridDays( currentDisplayDate.getFullYear(), currentDisplayDate.getMonth() ), [currentDisplayDate] ); return ( {weekHeaders.map((h) => ( {h} ))} {monthGridDays.map((d: any, i: number) => { // If not current month, render empty cell to maintain grid alignment if (!d.isCurrentMonth) { return ( ); } const isSameDate = d.fullDate.getDate() === selectedDate.getDate() && d.fullDate.getMonth() === selectedDate.getMonth() && d.fullDate.getFullYear() === selectedDate.getFullYear(); const isSelected = isSameDate; const dayEvents = events.filter( (e) => e.start.getDate() === d.fullDate.getDate() && e.start.getMonth() === d.fullDate.getMonth() && e.start.getFullYear() === d.fullDate.getFullYear() ); const hasEvent = dayEvents && dayEvents.length > 0; return ( { setSelectedDate(d.fullDate); }} > {d.day} {/* Event Markers */} {hasEvent && (renderEventMarkers ? ( renderEventMarkers(d.fullDate, dayEvents) ) : ( ))} ); })} ); } );