import React, { Fragment } from 'react' import { isArray, run, isString } from '@fexd/tools' import { Hook, dayjsTZ, Tooltip } from '@fexd/pro-utils' import { useProContext } from '@fexd/pro-provider' import useLocales from '../../locales' import { TZ_DatePicker_RangePicker, TZ_TimePicker_RangePicker } from '../type-date-time/fixAntdTimezone' import { formatDateValue, normalizeMomentValue } from '../type-date-time/time-utils' import { defineTypes } from '../types-define' import useDateTimeRangeBuiltInRule from './useDateTimeRangeBuiltInRule' import { normalizeTimeRangeFieldValue, normalizeTimeRangeValue, renderTimeRangeValue } from './time-range-utils' import useDayjsLocale from '../type-date-time/useDayjsLocale' const types = defineTypes({ // 日期区间 dateRange: { renderField: ({ fieldProps: props = {}, field } = {}) => ( {(props) => { const { t } = useLocales(({ t }) => [t]) const builtInProps = useDateTimeRangeBuiltInRule({ ...props, ...field, }) const mergeProps = { ...props, ...builtInProps, } const { dayFormat: ctxDayFormat } = useProContext() const format = mergeProps?.format ?? ctxDayFormat ?? 'YYYY-MM-DD' return ( ) }} ), normalizeValue: (value) => { if (isArray(value)) { const [start, end] = value return [normalizeMomentValue(start, '00:00:00:000'), normalizeMomentValue(end, '23:59:59:999')] } return value }, normalizeFieldValue: normalizeTimeRangeFieldValue, renderView: renderTimeRangeValue(), }, // 日期时间区间 dateTimeRange: { renderField: ({ fieldProps: props = {}, field } = {}) => ( {(props) => { const { t } = useLocales(({ t }) => [t]) const builtInProps = useDateTimeRangeBuiltInRule({ ...props, ...field, }) const mergeProps = { ...props, ...builtInProps, } const { dayFormat: ctxDayFormat } = useProContext() const format = mergeProps?.format ?? `${ctxDayFormat ?? 'YYYY-MM-DD'} HH:mm:ss` return ( ) }} ), normalizeValue: normalizeTimeRangeValue, normalizeFieldValue: normalizeTimeRangeFieldValue, renderView: renderTimeRangeValue('YYYY-MM-DD HH:mm:ss'), }, // 日期周区间 dateWeekRange: { renderField: ({ fieldProps: props = {}, field } = {}) => ( {(props) => { const { t } = useLocales(({ t }) => [t]) const builtInProps = useDateTimeRangeBuiltInRule({ ...props, ...field, }) return ( ) }} ), normalizeValue: normalizeTimeRangeValue, normalizeFieldValue: normalizeTimeRangeFieldValue, renderView: renderTimeRangeValue('YYYY-wo'), }, // 日期月区间 dateMonthRange: { renderField: ({ fieldProps: props = {}, field } = {}) => ( {(props) => { const { t } = useLocales(({ t }) => [t]) const builtInProps = useDateTimeRangeBuiltInRule({ ...props, ...field, }) return ( ) }} ), normalizeValue: normalizeTimeRangeValue, normalizeFieldValue: normalizeTimeRangeFieldValue, renderView: renderTimeRangeValue('YYYY-MM'), }, // 日期季度区间 dateQuarterRange: { renderField: ({ fieldProps: props = {}, field } = {}) => ( {(props) => { const { t } = useLocales(({ t }) => [t]) const builtInProps = useDateTimeRangeBuiltInRule({ ...props, ...field, }) return ( ) }} ), normalizeValue: normalizeTimeRangeValue, normalizeFieldValue: normalizeTimeRangeFieldValue, renderView: renderTimeRangeValue('YYYY-[Q]Q'), }, // 日期年份区间 dateYearRange: { renderField: ({ fieldProps: props = {}, field } = {}) => ( {(props) => { const { t } = useLocales(({ t }) => [t]) const builtInProps = useDateTimeRangeBuiltInRule({ ...props, ...field, }) return ( ) }} ), normalizeValue: normalizeTimeRangeValue, normalizeFieldValue: normalizeTimeRangeFieldValue, renderView: renderTimeRangeValue('YYYY'), }, // 时间区间 timeRange: { renderField: ({ fieldProps: props = {} } = {}) => ( {(props) => { const { t } = useLocales(({ t }) => [t]) return }} ), renderView: renderTimeRangeValue('HH:mm:ss'), normalizeValue: normalizeTimeRangeValue, normalizeFieldValue: normalizeTimeRangeFieldValue, }, // 相对当前时间区间 fromNowRange: { renderField: ({ fieldProps: props = {}, field } = {}) => ( {(props) => { const { t } = useLocales(({ t }) => [t]) const builtInProps = useDateTimeRangeBuiltInRule({ ...props, ...field, }) const mergeProps = { ...props, ...builtInProps, } const { dayFormat: ctxDayFormat } = useProContext() const format = mergeProps?.format ?? `${ctxDayFormat ?? 'YYYY-MM-DD'} HH:mm:ss` return ( ) }} ), normalizeValue: normalizeTimeRangeValue, normalizeFieldValue: normalizeTimeRangeFieldValue, renderView: (value, config = {}) => { const [start, end] = run(() => { if (isArray(value)) { return value } if (isString(value)) { return value.split('-') } return [] }) as any if ([start, end].filter(Boolean)?.length === 0) { return '--' } return ( <> {[start, end].filter(Boolean).map((value, idx) => ( {idx > 0 && ' ~ '} {value ? ( {() => { const localeKey = useDayjsLocale() const { dayFormat: ctxDayFormat } = useProContext() const format = config?.format ?? `${ctxDayFormat ?? 'YYYY-MM-DD'} HH:mm:ss` return ( {() => formatDateValue(value, format, localeKey)}}> {run(dayjsTZ(value).locale(localeKey), 'fromNow')} ) }} ) : ( '--' )} ))} ) }, }, }) export default types