import * as React from 'react' import { View, StyleSheet } from 'react-native' import { IconButton, MD2Theme, Text, useTheme } from 'react-native-paper' import type { ModeType } from './Calendar' import type { LocalState } from './DatePickerModalContent' import { useHeaderTextColor } from '../utils' import Color from 'color' import { getTranslation } from '../translations/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 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.isV3 ? theme.colors.onSurfaceVariant : color const textFont = theme?.isV3 ? theme.fonts.labelMedium : (theme as any as MD2Theme).fonts.medium 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.isV3 ? theme.colors.onSurface : color : lighterColor const formatter = React.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.isV3 ? theme.colors.onSurface : color : lighterColor const formatter = React.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 formatter = React.useMemo(() => { return new Intl.DateTimeFormat(locale, { month: 'short', day: 'numeric', }) }, [locale]) const lighterColor = Color(color).fade(0.5).rgb().toString() const startColor = state.startDate ? theme.isV3 ? theme.colors.onSurface : color : lighterColor const endColor = state.endDate ? theme.isV3 ? theme.colors.onSurface : color : lighterColor return ( <> {state.startDate ? formatter.format(state.startDate) : startLabel} {headerSeparator} {state.endDate ? formatter.format(state.endDate) : endLabel} ) } const styles = StyleSheet.create({ fill: { flex: 1, }, animated: { paddingBottom: 0, elevation: 4, }, safeContent: { paddingBottom: 0, }, header: { height: 75, alignItems: 'center', flexDirection: 'row', paddingLeft: 24, paddingRight: 12, }, headerContentContainer: { marginTop: 5, flexDirection: 'row' }, label: { color: '#fff', letterSpacing: 1, fontSize: 13 }, singleHeaderText: { color: '#fff', fontSize: 25 }, rangeHeaderText: { color: '#fff', fontSize: 25 }, excludeInRangeHeaderText: { fontSize: 25 }, excludeInRangeHeaderTextSmall: { fontSize: 14, marginTop: -3, marginLeft: 3, }, headerSeparator: { color: 'rgba(255,255,255,1)', fontSize: 25, paddingLeft: 6, paddingRight: 6, }, appbarHeader: { elevation: 0, }, column: { flexDirection: 'column' }, row: { flexDirection: 'row' }, })