import { useMemo } from 'react'; import { View, type TextStyle } from 'react-native'; import { Text } from '../Text'; import { format } from '../../utils'; import type { ModeType } from '../DatePickerInline'; import type { LocalState, LocalStateMultiple, LocalStateRange, LocalStateSingle } from './types'; import { IconButton } from '../IconButton'; import { datePickerModalContentHeaderStyles } from './utils'; export interface HeaderPickProps { moreLabel?: string; label?: string; emptyLabel?: string; saveLabel?: string; uppercase?: boolean; headerSeparator?: string; startLabel?: string; endLabel?: string; editIcon?: string; calendarIcon?: string; closeIcon?: string; } export interface HeaderContentProps extends HeaderPickProps { state: LocalState; mode: ModeType; collapsed: boolean; onToggle: () => any; // locale: string | undefined; textStyle?: TextStyle; separatorStyle?: TextStyle; } function getLabel(mode: ModeType, configuredLabel?: string) { if (configuredLabel) { return configuredLabel; } if (mode === 'range') { return 'Select period'; } if (mode === 'multiple') { return 'Select dates'; } if (mode === 'single') { return 'Select date'; } return '...'; } export default function DatePickerModalContentHeader(props: HeaderContentProps) { const { onToggle, collapsed, mode, moreLabel, uppercase, editIcon = 'pencil', calendarIcon = 'calendar', } = props; const label = getLabel(props.mode, props.label); const allowEditing = mode !== 'multiple'; const { fillContainerStyle, headerContentContainerStyle, headerStyle, labelStyle, headerTextStyle, separatorStyle, iconButtonStyle, } = useMemo(() => { const { fill, headerContentContainer, header, label: _labelStyle, headerText, headerSeparator, icon, } = datePickerModalContentHeaderStyles; return { fillContainerStyle: fill, headerContentContainerStyle: headerContentContainer, headerStyle: header, labelStyle: _labelStyle, headerTextStyle: headerText, separatorStyle: headerSeparator, iconButtonStyle: icon, }; }, []); return ( {uppercase ? label.toUpperCase() : label} <> {mode === 'range' ? ( ) : null} <> {mode === 'single' ? ( ) : null} <> {mode === 'multiple' ? ( ) : null} <> {allowEditing ? ( ) : null} ); } // TODO add translations export function HeaderContentSingle({ state, emptyLabel = ' ', // locale, textStyle, }: HeaderContentProps) { const singleState = state as LocalStateSingle; const label = useMemo( () => (singleState.date ? format(singleState.date, 'LLL dd') : emptyLabel), [emptyLabel, singleState.date], ); return {label}; } // TODO add translations export function HeaderContentMulti({ state, emptyLabel = ' ', moreLabel = 'more', textStyle, }: // locale = 'en', HeaderContentProps & { moreLabel: string | undefined }) { const multiState = state as LocalStateMultiple; const label = useMemo(() => { let _label = emptyLabel; const dateCount = multiState.dates?.length || 0; if (dateCount) { if (dateCount <= 2) { _label = multiState.dates!.map(date => format(date, 'LLL dd')).join(', '); } else { _label = format(multiState.dates![0], 'LLL dd') + ` (+ ${dateCount - 1} ${moreLabel})`; } } return _label; }, [emptyLabel, moreLabel, multiState.dates]); return {label}; } // TODO add translations export function HeaderContentRange({ // locale, state, headerSeparator = '-', startLabel = 'Start', endLabel = 'End', textStyle, separatorStyle, }: HeaderContentProps) { const rangeState = state as LocalStateRange; const startDateLabel = useMemo( () => (rangeState.startDate ? format(rangeState.startDate, 'LLL dd') : startLabel), [rangeState.startDate, startLabel], ); const endDateLabel = useMemo( () => (rangeState.endDate ? format(rangeState.endDate, 'LLL dd') : endLabel), [endLabel, rangeState.endDate], ); return ( <> {startDateLabel} {headerSeparator} {endDateLabel} ); }