diff --git a/src/NewPicker/PickerInput/RangePicker.tsx b/src/NewPicker/PickerInput/RangePicker.tsx index fc1aa7227..a5e3a5947 100644 --- a/src/NewPicker/PickerInput/RangePicker.tsx +++ b/src/NewPicker/PickerInput/RangePicker.tsx @@ -238,6 +238,7 @@ function RangePicker( defaultValue, value, onCalendarChange, + 2, ); const calendarValue = getCalendarValue(); diff --git a/src/NewPicker/PickerInput/SinglePicker.tsx b/src/NewPicker/PickerInput/SinglePicker.tsx index 1104720e2..f83819116 100644 --- a/src/NewPicker/PickerInput/SinglePicker.tsx +++ b/src/NewPicker/PickerInput/SinglePicker.tsx @@ -21,7 +21,7 @@ import useCellRender from './hooks/useCellRender'; import useDisabledBoundary from './hooks/useDisabledBoundary'; import { useFieldFormat } from './hooks/useFieldFormat'; import useFilledProps from './hooks/useFilledProps'; -import useRangeValue, { useInnerValue } from './hooks/useFlexibleValue'; +import useRangeValue from './hooks/useFlexibleValue'; import useInputReadOnly from './hooks/useInputReadOnly'; import useInvalidate from './hooks/useInvalidate'; import useOpen from './hooks/useOpen'; @@ -29,6 +29,7 @@ import { usePickerRef } from './hooks/usePickerRef'; import usePresets from './hooks/usePresets'; import useRangeActive from './hooks/useRangeActive'; import useRangePickerValue from './hooks/useRangePickerValue'; +import { useInnerValue } from './hooks/useRangeValue'; import useShowNow from './hooks/useShowNow'; import Popup from './Popup'; import SingleSelector from './Selector/SingleSelector'; @@ -183,15 +184,21 @@ function Picker( // ======================== Format ======================== const [formatList, maskFormat] = useFieldFormat(internalPicker, locale, format); + // ======================= Calendar ======================= + const onInternalCalendarChange: any = ( + dates: DateType[], + dateStrings: string[], + info: BaseInfo, + ) => {}; + // ======================== Values ======================== const [mergedValue, setInnerValue, getCalendarValue, triggerCalendarChange] = useInnerValue( - multiple, generateConfig, locale, formatList, defaultValue, value, - onCalendarChange, + onInternalCalendarChange, ); const calendarValue = getCalendarValue(); diff --git a/src/NewPicker/PickerInput/hooks/useFilledProps.ts b/src/NewPicker/PickerInput/hooks/useFilledProps.ts index 7f06b11a3..158e704eb 100644 --- a/src/NewPicker/PickerInput/hooks/useFilledProps.ts +++ b/src/NewPicker/PickerInput/hooks/useFilledProps.ts @@ -1,4 +1,5 @@ import * as React from 'react'; +import { toArray } from '../../../utils/miscUtil'; import { fillLocale } from '../../hooks/useLocale'; import { getTimeConfig } from '../../hooks/useTimeConfig'; import type { InternalMode } from '../../interface'; @@ -20,10 +21,14 @@ type PickedProps = Pick< > & { // RangePicker showTime definition is different with Picker showTime?: any; + value?: any; + defaultValue?: any; }; type ExcludeBooleanType = T extends boolean ? never : T; +type ToArrayType = T extends any[] ? T : [T]; + /** * Align the outer props with unique typed and fill undefined props. * This is shared with both RangePicker and Picker. @@ -37,9 +42,11 @@ export default function useFilledProps< props: InProps, updater?: () => UpdaterProps, ): [ - filledProps: Omit & + filledProps: Omit & UpdaterProps & { showTime?: ExcludeBooleanType; + value?: ToArrayType; + defaultValue?: ToArrayType; }, internalPicker: InternalMode, complexPicker: boolean, @@ -55,8 +62,13 @@ export default function useFilledProps< allowClear, clearIcon, needConfirm, + value, + defaultValue, } = props; + const values = React.useMemo(() => (value ? toArray(value) : value), [value]); + const defaultValues = React.useMemo(() => toArray(defaultValue), [defaultValue]); + const filledProps = React.useMemo( () => ({ ...props, @@ -69,6 +81,8 @@ export default function useFilledProps< components, clearIcon: fillClearIcon(prefixCls, allowClear, clearIcon), showTime: getTimeConfig(props), + value: values, + defaultValue: defaultValues, ...updater?.(), }), [props], diff --git a/src/NewPicker/PickerInput/hooks/useFlexibleValue.ts b/src/NewPicker/PickerInput/hooks/useFlexibleValue.ts index c81f23934..b50de16dd 100644 --- a/src/NewPicker/PickerInput/hooks/useFlexibleValue.ts +++ b/src/NewPicker/PickerInput/hooks/useFlexibleValue.ts @@ -18,60 +18,60 @@ const EMPTY_VALUE: any[] = []; type TriggerCalendarChange = (dates: DateType[]) => void; -export function useInnerValue( - multiple: boolean, - generateConfig: GenerateConfig, - locale: Locale, - formatList: FormatType[], - - defaultValue?: DateType, - value?: DateType, - onCalendarChange?: PickerProps['onCalendarChange'], -) { - // This is the root value which will sync with controlled or uncontrolled value - const [innerValue, setInnerValue] = useMergedState(defaultValue, { - value, - }); - const mergedValue = React.useMemo(() => { - const filledValue = innerValue || EMPTY_VALUE; - - return Array.isArray(filledValue) ? filledValue : [filledValue]; - }, [innerValue]); - - // ========================= Inner Values ========================= - const [calendarValue, setCalendarValue] = useCalendarValue(mergedValue); - - // ============================ Change ============================ - const [getDateTexts, isSameDates] = useUtil( - generateConfig, - locale, - formatList, - ); - - function pickByMultiple(values: T[]): any { - return multiple ? values : values[0]; - } - - const triggerCalendarChange: TriggerCalendarChange = useEvent((dates) => { - const clone: DateType[] = [...dates]; - - // Update merged value - const [isSameMergedDates, isSameStart] = isSameDates(calendarValue(), clone); - - if (!isSameMergedDates) { - setCalendarValue(clone); - - // Trigger calendar change event - if (onCalendarChange) { - onCalendarChange(pickByMultiple(clone), pickByMultiple(getDateTexts(clone)), { - range: isSameStart ? 'end' : 'start', - }); - } - } - }); - - return [mergedValue, setInnerValue, calendarValue, triggerCalendarChange] as const; -} +// export function useInnerValue( +// multiple: boolean, +// generateConfig: GenerateConfig, +// locale: Locale, +// formatList: FormatType[], + +// defaultValue?: DateType, +// value?: DateType, +// onCalendarChange?: PickerProps['onCalendarChange'], +// ) { +// // This is the root value which will sync with controlled or uncontrolled value +// const [innerValue, setInnerValue] = useMergedState(defaultValue, { +// value, +// }); +// const mergedValue = React.useMemo(() => { +// const filledValue = innerValue || EMPTY_VALUE; + +// return Array.isArray(filledValue) ? filledValue : [filledValue]; +// }, [innerValue]); + +// // ========================= Inner Values ========================= +// const [calendarValue, setCalendarValue] = useCalendarValue(mergedValue); + +// // ============================ Change ============================ +// const [getDateTexts, isSameDates] = useUtil( +// generateConfig, +// locale, +// formatList, +// ); + +// function pickByMultiple(values: T[]): any { +// return multiple ? values : values[0]; +// } + +// const triggerCalendarChange: TriggerCalendarChange = useEvent((dates) => { +// const clone: DateType[] = [...dates]; + +// // Update merged value +// const [isSameMergedDates, isSameStart] = isSameDates(calendarValue(), clone); + +// if (!isSameMergedDates) { +// setCalendarValue(clone); + +// // Trigger calendar change event +// if (onCalendarChange) { +// onCalendarChange(pickByMultiple(clone), pickByMultiple(getDateTexts(clone)), { +// range: isSameStart ? 'end' : 'start', +// }); +// } +// } +// }); + +// return [mergedValue, setInnerValue, calendarValue, triggerCalendarChange] as const; +// } export default function useFlexibleValue( info: Pick< diff --git a/src/NewPicker/PickerInput/hooks/useRangeValue.ts b/src/NewPicker/PickerInput/hooks/useRangeValue.ts index 4086234de..4738c49e6 100644 --- a/src/NewPicker/PickerInput/hooks/useRangeValue.ts +++ b/src/NewPicker/PickerInput/hooks/useRangeValue.ts @@ -97,6 +97,8 @@ export function useInnerValue>, info: BaseInfo, ) => void, + /** Used for RangePicker */ + valueLen = 2, ) { // This is the root value which will sync with controlled or uncontrolled value const [innerValue, setInnerValue] = useMergedState(defaultValue, { @@ -114,6 +116,12 @@ export function useInnerValue { const clone = [...nextCalendarValues] as ValueType; + if (valueLen) { + for (let i = 0; i < valueLen; i += 1) { + clone[i] = clone[i] || null; + } + } + // Update merged value const [isSameMergedDates, isSameStart] = isSameDates(calendarValue(), clone);