import type { FormValidator } from '../../shared/utils/validator'; import type { DATETIME_PICKER_LOCALE, DATETIME_PICKER_MODE, NAVIGATION_ACTION } from './datetime-picker-constants'; import type { INPUT_TIME_TYPE } from './time-picker/time-picker-constants'; /** * Modos válidos de operação do datetime picker. * * Derivado de `DATETIME_PICKER_MODE` para manter o tipo e os valores em sincronização. */ export type DatetimePickerMode = (typeof DATETIME_PICKER_MODE)[keyof typeof DATETIME_PICKER_MODE]; /** * Locais suportados pelo componente. * * Aceita `string` livre para manter compatibilidade com consumidores que ainda * não utilizam `DATETIME_PICKER_LOCALE`. */ export type DatetimePickerLocale = string | (typeof DATETIME_PICKER_LOCALE)[keyof typeof DATETIME_PICKER_LOCALE]; /** * Valor inicial aceito pelo componente. * * - `'now'`: usa o instante atual ao carregar ou atualizar a prop. * - `Date` ou `string`: usa uma data informada pelo consumidor. * - `null`: inicia sem seleção. */ export type DatetimePickerInitialMoment = 'now' | Date | string | null; /** * Valor de data aceito para regras de desabilitação. */ export type DatetimePickerDisabledDate = Date | string; /** * Datas indisponíveis para seleção no calendário. * * Aceita um array de datas, uma string com datas separadas por espaço ou `null`. */ export type DatetimePickerDisabledDates = DatetimePickerDisabledDate[] | string | null; /** * Modo de seleção do calendário. * * `range` é suportado em `date`, `time` e `datetime`. */ export type DatetimePickerSelectionMode = 'single' | 'range'; /** * Índice do dia inicial da semana no calendário. * * Dom = 0, Seg = 1, Ter = 2, Qua = 3, Qui = 4, Sex = 5, Sab = 6. */ export type DatetimePickerWeekDayIndex = 0 | 1 | 2 | 3 | 4 | 5 | 6; /** * Intervalo de datas selecionado no calendário. */ export type DatetimePickerDateRange = { start: Date | null; end: Date | null; }; /** * Validador de dados usado pelo componente para validar seleção e intervalos. */ export type DatetimePickerValidator = FormValidator; /** * Representa um dia dentro do intervalo selecionado com seu estado de bloqueio. */ export type DatetimePickerRangeDateState = { date: Date; disabled: boolean; }; /** * Ações de navegação emitidas pelos controles de calendário e horário. * * Derivado de `NAVIGATION_ACTION` para manter o tipo alinhado às ações públicas. */ export type NavigationAction = (typeof NAVIGATION_ACTION)[keyof typeof NAVIGATION_ACTION]; /** * Estado compartilhado entre os subcomponentes de data e horário. * * `referenceDate` controla a navegação visual e `value` representa a seleção * efetiva do usuário. */ export type DatetimePickerDateState = { referenceDate: Date; value: Date | null; range?: DatetimePickerDateRange; rangeDates?: DatetimePickerRangeDateState[]; origin?: string; }; /** * Detalhe emitido pelo datetime picker em resposta a uma seleção. * * `value` representa a seleção completa do modo ativo. Em intervalos, inclui * tanto o início quanto o fim. */ export type DatetimePickerChangeDetail = { mode: 'date'; selectionMode: 'single'; value: Date | null; serializedValue: string; } | { mode: 'date'; selectionMode: 'range'; value: { start: string | null; end: string | null; }; serializedValue: string; complete: boolean; } | { mode: 'time'; selectionMode: 'range'; value: { start: string | null; end: string | null; }; serializedValue: string; complete: boolean; } | { mode: 'time'; selectionMode: 'single'; value: { hours: number; minutes: number; } | null; serializedValue: string; } | { mode: 'datetime'; selectionMode: 'single'; value: Date | null; serializedValue: string; } | { mode: 'datetime'; selectionMode: 'range'; value: { start: string | null; end: string | null; }; serializedValue: string; complete: boolean; }; /** * Índice do dia da semana. * * Dom = 0, Seg = 1, Ter = 2, Qua = 3, Qui = 4, Sex = 5, Sab = 6. */ export type WeekDayIndex = 0 | 1 | 2 | 3 | 4 | 5 | 6; /** * Tipos de campo suportados pelo time picker. * * Derivado de `INPUT_TIME_TYPE` para manter o tipo alinhado aos valores públicos. */ export type InputTimeType = (typeof INPUT_TIME_TYPE)[keyof typeof INPUT_TIME_TYPE]; export type DatetimePickerFormContext = { mode: DatetimePickerMode; selectionMode: DatetimePickerSelectionMode; rangeStart: Date | null; rangeEnd: Date | null; referenceDate: Date; }; export type DatetimePickerMissingValueContext = DatetimePickerFormContext & { required: boolean; disabled: boolean; value: Date | null; };