'use client'; import { createCalendar, type ICalendarProps } from '@gluestack-ui/core/calendar/creator'; import React from 'react'; import { Pressable, Text, View } from 'react-native'; import { Menu, MenuItem, MenuItemLabel } from '../menu'; import { calendarBodyStyle, calendarDayIndicatorStyle, calendarDayStyle, calendarDayTextStyle, calendarFooterStyle, calendarGridStyle, calendarHeaderButtonStyle, calendarHeaderSelectStyle, calendarHeaderStyle, calendarHeaderTitleStyle, calendarStyle, calendarWeekDaysHeaderStyle, calendarWeekDayStyle, calendarWeekDayTextStyle, calendarWeekNumberStyle, calendarWeekNumberTextStyle, calendarWeekStyle, } from './styles'; // Styled Root Component const CalendarRoot = React.forwardRef< React.ElementRef, ICalendarProps & React.ComponentProps & { className?: string } >(({ className, ...props }, ref) => { return ( ); }); // Styled Header const CalendarHeaderRoot = React.forwardRef< React.ElementRef, React.ComponentProps & { className?: string } >(({ className, ...props }, ref) => { return ( ); }); const CalendarHeaderPrevButtonRoot = React.forwardRef< React.ElementRef, React.ComponentProps & { className?: string; disabled?: boolean; } >(({ className, disabled, ...props }, ref) => { return ( ); }); const CalendarHeaderNextButtonRoot = React.forwardRef< React.ElementRef, React.ComponentProps & { className?: string; disabled?: boolean; } >(({ className, disabled, ...props }, ref) => { return ( ); }); const CalendarHeaderTitleRoot = React.forwardRef< React.ElementRef, React.ComponentProps & { className?: string } >(({ className, ...props }, ref) => { return ( ); }); const MONTH_NAMES = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', ]; type SelectRootProps = React.ComponentProps & { className?: string; items?: Array<{ label: string; value: number }>; selectedValue?: number; onValueChange?: (value: number) => void; }; const CalendarHeaderMonthSelectRoot = React.forwardRef< React.ElementRef, SelectRootProps >(({ className, items = [], selectedValue, onValueChange, ...props }, ref) => { const label = selectedValue !== undefined ? MONTH_NAMES[selectedValue] : 'Month'; return ( ( {label} )} > {items.map((item) => ( onValueChange?.(item.value)} > {item.label} ))} ); }); const CalendarHeaderYearSelectRoot = React.forwardRef< React.ElementRef, SelectRootProps >(({ className, items = [], selectedValue, onValueChange, ...props }, ref) => { const label = selectedValue !== undefined ? String(selectedValue) : 'Year'; return ( ( {label} )} > {items.map((item) => ( onValueChange?.(item.value)} > {item.label} ))} ); }); // Styled Week Days Header const CalendarWeekDaysHeaderRoot = React.forwardRef< React.ElementRef, React.ComponentProps & { className?: string } >(({ className, ...props }, ref) => { return ( ); }); const CalendarWeekDayRoot = React.forwardRef< React.ElementRef, React.ComponentProps & { className?: string } >(({ className, children, ...props }, ref) => { return ( {typeof children === 'string' ? ( {children} ) : ( children )} ); }); // Styled Body & Grid const CalendarBodyRoot = React.forwardRef< React.ElementRef, React.ComponentProps & { className?: string } >(({ className, ...props }, ref) => { return ( ); }); const CalendarGridRoot = React.forwardRef< React.ElementRef, React.ComponentProps & { className?: string } >(({ className, ...props }, ref) => { return ( ); }); const CalendarWeekRoot = React.forwardRef< React.ElementRef, React.ComponentProps & { className?: string } >(({ className, ...props }, ref) => { return ( ); }); // Styled Day const CalendarDayRoot = React.forwardRef< React.ElementRef, React.ComponentProps & { 'className'?: string; 'data-state'?: string; } >(({ className, 'data-state': dataState, ...props }, ref) => { return ( ); }); const CalendarDayTextRoot = React.forwardRef< React.ElementRef, React.ComponentProps & { className?: string; state?: any } >(({ className, state, ...props }, ref) => { return ( ); }); const CalendarDayIndicatorRoot = React.forwardRef< React.ElementRef, React.ComponentProps & { 'className'?: string; 'data-type'?: string; } >(({ className, 'data-type': dataType, ...props }, ref) => { return ( ); }); // Styled Week Number const CalendarWeekNumberRoot = React.forwardRef< React.ElementRef, React.ComponentProps & { className?: string } >(({ className, children, ...props }, ref) => { return ( {typeof children === 'string' || typeof children === 'number' ? ( {children} ) : ( children )} ); }); // Styled Footer const CalendarFooterRoot = React.forwardRef< React.ElementRef, React.ComponentProps & { className?: string } >(({ className, ...props }, ref) => { return ( ); }); // Create Calendar using the factory const UICalendar = createCalendar({ Root: CalendarRoot, Header: CalendarHeaderRoot, HeaderPrevButton: CalendarHeaderPrevButtonRoot, HeaderNextButton: CalendarHeaderNextButtonRoot, HeaderTitle: CalendarHeaderTitleRoot, HeaderMonthSelect: CalendarHeaderMonthSelectRoot, HeaderYearSelect: CalendarHeaderYearSelectRoot, WeekDaysHeader: CalendarWeekDaysHeaderRoot, WeekDay: CalendarWeekDayRoot, Body: CalendarBodyRoot, Grid: CalendarGridRoot, Week: CalendarWeekRoot, Day: CalendarDayRoot, DayText: CalendarDayTextRoot, DayIndicator: CalendarDayIndicatorRoot, WeekNumber: CalendarWeekNumberRoot, Footer: CalendarFooterRoot, }); // Mode-specific discriminated union props so onValueChange is correctly // narrowed per mode (prevents TypeScript errors when passing setState). type OmittedCalendarKeys = 'mode' | 'value' | 'defaultValue' | 'onValueChange'; type SingleModeProps = { mode?: 'single'; value?: Date; defaultValue?: Date; onValueChange?: (value: Date) => void; }; type MultipleModeProps = { mode: 'multiple'; value?: Date[]; defaultValue?: Date[]; onValueChange?: (value: Date[]) => void; }; type RangeModeProps = { mode: 'range'; value?: { from: Date; to?: Date }; defaultValue?: { from: Date; to?: Date }; onValueChange?: (value: { from: Date; to?: Date }) => void; }; type CalendarProps = (SingleModeProps | MultipleModeProps | RangeModeProps) & Omit & Omit, OmittedCalendarKeys> & { className?: string; }; const CalendarComponent = React.forwardRef< React.ElementRef, CalendarProps >((props, ref) => { return ; }); CalendarComponent.displayName = 'Calendar'; // Export components export const Calendar = CalendarComponent; export const CalendarHeader = UICalendar.Header; export const CalendarHeaderPrevButton = UICalendar.HeaderPrevButton; export const CalendarHeaderNextButton = UICalendar.HeaderNextButton; export const CalendarHeaderTitle = UICalendar.HeaderTitle; export const CalendarHeaderMonthSelect = UICalendar.HeaderMonthSelect; export const CalendarHeaderYearSelect = UICalendar.HeaderYearSelect; export const CalendarWeekDaysHeader = UICalendar.WeekDaysHeader; export const CalendarWeekDay = UICalendar.WeekDay; export const CalendarBody = UICalendar.Body; export const CalendarGrid = UICalendar.Grid; export const CalendarWeek = UICalendar.Week; export const CalendarDay = UICalendar.Day; export const CalendarDayText = UICalendar.DayText; export const CalendarDayIndicator = UICalendar.DayIndicator; export const CalendarWeekNumber = UICalendar.WeekNumber; export const CalendarFooter = UICalendar.Footer; // Re-export types export type { CalendarMarker, CalendarMarkers, CalendarMode, DayState, ICalendarProps } from '@gluestack-ui/core/calendar/creator'; export type { CalendarProps };