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}
>
);
}