import { StyleSheet, View } from 'react-native' import { IconButton, Text, useTheme } from 'react-native-paper' import type { ModeType } from './Calendar' import type { LocalState } from './DatePickerModalContent' import { useHeaderTextColor } from '../shared/utils' import Color from 'color' import { getTranslation } from '../translations/utils' import { useMemo } from 'react' import { sharedStyles } from '../shared/styles' export interface HeaderPickProps { moreLabel?: string label?: string emptyLabel?: string withDateFormatInLabel?: boolean placeholder?: string saveLabel?: string uppercase?: boolean headerSeparator?: string startLabel?: string endLabel?: string editIcon?: string calendarIcon?: string closeIcon?: string allowEditing?: boolean } export interface HeaderContentProps extends HeaderPickProps { state: LocalState mode: ModeType collapsed: boolean onToggle: () => any locale: string | undefined } function getLabel( locale: string | undefined, mode: ModeType, configuredLabel?: string ) { if (configuredLabel) { return configuredLabel } if (mode === 'range') { return getTranslation(locale, 'selectRange') } if (mode === 'multiple') { return getTranslation(locale, 'selectMultiple') } if (mode === 'single') { return getTranslation(locale, 'selectSingle') } return '...?' } export default function DatePickerModalContentHeader( props: HeaderContentProps ) { const { onToggle, collapsed, mode, moreLabel, uppercase, editIcon, calendarIcon, allowEditing, } = props const theme = useTheme() const label = getLabel(props.locale, props.mode, props.label) const color = useHeaderTextColor() const isEditingEnabled = allowEditing && mode !== 'multiple' const supportingTextColor = theme.colors.onSurfaceVariant const textFont = theme.fonts.labelMedium const finalCollapsedIcon = editIcon ?? 'pencil-outline' const finalExpandedIcon = calendarIcon ?? 'calendar-blank' return ( {uppercase ? label.toUpperCase() : label} {mode === 'range' ? ( ) : null} {mode === 'single' ? ( ) : null} {mode === 'multiple' ? ( ) : null} {isEditingEnabled ? ( ) : null} ) } export function HeaderContentSingle({ state, emptyLabel = ' ', color, locale, }: HeaderContentProps & { color: string }) { const theme = useTheme() const lighterColor = Color(color).fade(0.5).rgb().toString() const dateColor = state.date ? theme.colors.onSurface : lighterColor const formatter = useMemo(() => { return new Intl.DateTimeFormat(locale, { month: 'short', day: 'numeric', }) }, [locale]) return ( {state.date ? formatter.format(state.date) : emptyLabel} ) } export function HeaderContentMulti({ state, emptyLabel = ' ', moreLabel = 'more', color, locale, }: HeaderContentProps & { color: string; moreLabel: string | undefined }) { const theme = useTheme() const dateCount = state.dates?.length || 0 const lighterColor = Color(color).fade(0.5).rgb().toString() const dateColor = dateCount ? theme.colors.onSurface : lighterColor const formatter = useMemo(() => { return new Intl.DateTimeFormat(locale, { month: 'short', day: 'numeric', }) }, [locale]) let label = emptyLabel if (dateCount) { if (dateCount <= 2) { label = state.dates!.map((date) => formatter.format(date)).join(', ') } else { label = formatter.format(state.dates![0]) + ` (+ ${dateCount - 1} ${moreLabel})` } } return ( {label} ) } export function HeaderContentRange({ locale, state, headerSeparator = '-', startLabel = 'Start', endLabel = 'End', color, }: HeaderContentProps & { color: string }) { const theme = useTheme() const lighterColor = Color(color).fade(0.5).rgb().toString() const startColorFilled = theme.colors.onSurface const endColorFilled = theme.colors.onSurface const startColor = state.startDate ? startColorFilled : lighterColor const endColor = state.endDate ? endColorFilled : lighterColor const formatter = useMemo(() => { return new Intl.DateTimeFormat(locale, { month: 'short', day: 'numeric', }) }, [locale]) return ( <> {state.startDate ? formatter.format(state.startDate) : startLabel} {headerSeparator} {state.endDate ? formatter.format(state.endDate) : endLabel} ) } const styles = StyleSheet.create({ header: { height: 75, alignItems: 'center', flexDirection: 'row', paddingLeft: 24, paddingRight: 12, }, headerContentContainer: { flexDirection: 'row', marginTop: 5, }, headerSeparator: { color: 'rgba(255,255,255,1)', fontSize: 25, paddingLeft: 6, paddingRight: 6, }, label: { color: '#fff', fontSize: 13, letterSpacing: 1, }, text: { color: '#fff', fontSize: 25, }, })