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