Skip to content

Commit d1f7651

Browse files
committed
refactor: generic of SinglePicker
1 parent 3cb73c9 commit d1f7651

File tree

3 files changed

+34
-39
lines changed

3 files changed

+34
-39
lines changed

src/NewPicker/PickerInput/SinglePicker.tsx

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,25 +23,19 @@ import PickerContext from './context';
2323
import useCellRender from './hooks/useCellRender';
2424
import useDisabledBoundary from './hooks/useDisabledBoundary';
2525
import { useFieldFormat } from './hooks/useFieldFormat';
26+
import useRangeValue, { useInnerValue } from './hooks/useFlexibleValue';
2627
import useInputReadOnly from './hooks/useInputReadOnly';
2728
import useInvalidate from './hooks/useInvalidate';
2829
import useOpen from './hooks/useOpen';
2930
import usePresets from './hooks/usePresets';
3031
import useRangeActive from './hooks/useRangeActive';
3132
import useRangePickerValue from './hooks/useRangePickerValue';
3233
import useShowNow from './hooks/useShowNow';
33-
import useRangeValue, { useInnerValue } from './hooks/useFlexibleValue';
3434
import Popup from './Popup';
3535
import { useClearIcon } from './Selector/hooks/useClearIcon';
3636
import SingleSelector from './Selector/SingleSelector';
3737

38-
export interface PickerProps<DateType extends object> extends SharedPickerProps<DateType> {
39-
// Value
40-
value?: DateType;
41-
defaultValue?: DateType;
42-
onChange?: (date: DateType, dateString: string) => void;
43-
onCalendarChange?: (date: DateType, dateString: string, info: BaseInfo) => void;
44-
38+
export interface BasePickerProps<DateType extends object> extends SharedPickerProps<DateType> {
4539
// Placeholder
4640
placeholder?: string;
4741

@@ -81,6 +75,28 @@ export interface PickerProps<DateType extends object> extends SharedPickerProps<
8175
onPanelChange?: (values: DateType, modes: PanelMode) => void;
8276
}
8377

78+
export interface SinglePickerProps<DateType extends object> extends SharedPickerProps<DateType> {
79+
// Value
80+
value?: DateType;
81+
defaultValue?: DateType;
82+
onChange?: (date: DateType, dateString: string) => void;
83+
onCalendarChange?: (date: DateType, dateString: string, info: BaseInfo) => void;
84+
}
85+
86+
export interface MultiplePickerProps<DateType extends object> extends SharedPickerProps<DateType> {
87+
multiple: true;
88+
89+
// Value
90+
value?: DateType[];
91+
defaultValue?: DateType[];
92+
onChange?: (date: DateType[], dateString: string[]) => void;
93+
onCalendarChange?: (date: DateType[], dateString: string[], info: BaseInfo) => void;
94+
}
95+
96+
export type PickerProps<DateType extends object> =
97+
| SinglePickerProps<DateType>
98+
| MultiplePickerProps<DateType>;
99+
84100
function Picker<DateType extends object = any>(
85101
props: PickerProps<DateType>,
86102
ref: React.Ref<PickerRef>,

src/NewPicker/PickerInput/hooks/useFlexibleValue.ts

Lines changed: 9 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,40 +7,15 @@ import type { FormatType, Locale } from '../../interface';
77
import { fillIndex } from '../../util';
88
import type { RangePickerProps } from '../RangePicker';
99
import useLockEffect from './useLockEffect';
10-
import { useCalendarValue } from './useRangeValue';
10+
import { useCalendarValue, useUtil } from './useRangeValue';
1111

1212
const EMPTY_VALUE: any[] = [];
1313

1414
// Single Value is similar to Range Value, but it's more simple.
1515
// This is design to support single value or multiple value,
1616
// Thus this hook reuse part of the util from `useRangeValue`.
1717

18-
type TriggerCalendarChange<DateType> = ([start, end]: DateType) => void;
19-
20-
function useUtil<DateType extends object = any>(
21-
generateConfig: GenerateConfig<DateType>,
22-
locale: Locale,
23-
formatList: FormatType[],
24-
) {
25-
const getDateTexts = ([start, end]: DateType) => {
26-
return [start, end].map((date) =>
27-
formatValue(date, { generateConfig, locale, format: formatList[0] }),
28-
) as [string, string];
29-
};
30-
31-
const isSameDates = (source: DateType, target: DateType) => {
32-
const [prevStart = null, prevEnd = null] = source;
33-
const [nextStart = null, nextEnd = null] = target;
34-
35-
const isSameStart =
36-
prevStart === nextStart || isSameTimestamp(generateConfig, prevStart, nextStart);
37-
const isSameEnd = prevEnd === nextEnd || isSameTimestamp(generateConfig, prevEnd, nextEnd);
38-
39-
return [isSameStart && isSameEnd, isSameStart, isSameEnd];
40-
};
41-
42-
return [getDateTexts, isSameDates] as const;
43-
}
18+
type TriggerCalendarChange<DateType> = (dates: DateType[]) => void;
4419

4520
export function useInnerValue<DateType extends object = any>(
4621
generateConfig: GenerateConfig<DateType>,
@@ -64,10 +39,14 @@ export function useInnerValue<DateType extends object = any>(
6439
const [calendarValue, setCalendarValue] = useCalendarValue(mergedValue);
6540

6641
// ============================ Change ============================
67-
const [getDateTexts, isSameDates] = useUtil(generateConfig, locale, formatList);
42+
const [getDateTexts, isSameDates] = useUtil<DateType, DateType[]>(
43+
generateConfig,
44+
locale,
45+
formatList,
46+
);
6847

69-
const triggerCalendarChange: TriggerCalendarChange<DateType> = useEvent(([start, end]) => {
70-
const clone: DateType = [start, end];
48+
const triggerCalendarChange: TriggerCalendarChange<DateType> = useEvent((dates) => {
49+
const clone: DateType[] = [...dates];
7150

7251
// Update merged value
7352
const [isSameMergedDates, isSameStart] = isSameDates(calendarValue(), clone);

src/NewPicker/PickerInput/hooks/useRangeValue.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ const EMPTY_VALUE: [null, null] = [null, null];
3333

3434
type TriggerCalendarChange<DateType> = ([start, end]: RangeValueType<DateType>) => void;
3535

36-
function useUtil<
36+
export function useUtil<
3737
DateType extends object = any,
3838
MergedValueType extends DateType[] = RangeValueType<DateType>,
3939
>(generateConfig: GenerateConfig<DateType>, locale: Locale, formatList: FormatType[]) {

0 commit comments

Comments
 (0)