@@ -3,12 +3,12 @@ import * as React from 'react';
3
3
import type { GenerateConfig } from '../../../generate' ;
4
4
import { formatValue , isSame , isSameTimestamp } from '../../../utils/dateUtil' ;
5
5
import useSyncState from '../../hooks/useSyncState' ;
6
- import type { FormatType , Locale } from '../../interface' ;
6
+ import type { BaseInfo , FormatType , Locale } from '../../interface' ;
7
7
import { fillIndex } from '../../util' ;
8
8
import type { RangePickerProps , RangeValueType } from '../RangePicker' ;
9
9
import useLockEffect from './useLockEffect' ;
10
10
11
- const EMPTY_VALUE : [ null , null ] = [ null , null ] ;
11
+ const EMPTY_VALUE : any [ ] = [ ] ;
12
12
13
13
// Submit Logic:
14
14
// * ✅ Value:
@@ -31,20 +31,20 @@ const EMPTY_VALUE: [null, null] = [null, null];
31
31
// * Update `needSubmit` mark to true
32
32
// * trigger onChange by `needSubmit` and update stateValue
33
33
34
- type TriggerCalendarChange < DateType > = ( [ start , end ] : RangeValueType < DateType > ) => void ;
34
+ type TriggerCalendarChange < ValueType extends object [ ] > = ( calendarValues : ValueType ) => void ;
35
35
36
- type RefillType < T > = {
36
+ type Replace2String < T > = {
37
37
[ P in keyof T ] : string ;
38
38
} ;
39
39
40
40
export function useUtil <
41
- DateType extends object = any ,
42
- MergedValueType extends DateType [ ] = RangeValueType < DateType > ,
41
+ MergedValueType extends object [ ] ,
42
+ DateType extends MergedValueType [ number ] = any ,
43
43
> ( generateConfig : GenerateConfig < DateType > , locale : Locale , formatList : FormatType [ ] ) {
44
44
const getDateTexts = ( dates : MergedValueType ) => {
45
45
return dates . map ( ( date ) =>
46
46
formatValue ( date , { generateConfig, locale, format : formatList [ 0 ] } ) ,
47
- ) as any as RefillType < Required < MergedValueType > > ;
47
+ ) as any as Replace2String < Required < MergedValueType > > ;
48
48
} ;
49
49
50
50
const isSameDates = ( source : MergedValueType , target : MergedValueType ) => {
@@ -71,10 +71,7 @@ export function useUtil<
71
71
* Used for internal value management.
72
72
* It should always use `mergedValue` in render logic
73
73
*/
74
- export function useCalendarValue <
75
- DateType extends object = any ,
76
- MergedValueType extends DateType [ ] = RangeValueType < DateType > ,
77
- > ( mergedValue : MergedValueType ) {
74
+ export function useCalendarValue < MergedValueType extends object [ ] > ( mergedValue : MergedValueType ) {
78
75
const [ calendarValue , setCalendarValue ] = useSyncState ( mergedValue ) ;
79
76
80
77
/** Sync calendarValue & submitValue back with value */
@@ -89,44 +86,50 @@ export function useCalendarValue<
89
86
return [ calendarValue , setCalendarValue ] as const ;
90
87
}
91
88
92
- export function useInnerValue < DateType extends object = any > (
89
+ export function useInnerValue < ValueType extends object [ ] , DateType extends ValueType [ number ] > (
93
90
generateConfig : GenerateConfig < DateType > ,
94
91
locale : Locale ,
95
92
formatList : FormatType [ ] ,
96
- defaultValue ?: RangeValueType < DateType > ,
97
- value ?: RangeValueType < DateType > ,
98
- onCalendarChange ?: RangePickerProps < DateType > [ 'onCalendarChange' ] ,
93
+ defaultValue ?: ValueType ,
94
+ value ?: ValueType ,
95
+ onCalendarChange ?: (
96
+ dates : ValueType ,
97
+ dateStrings : Replace2String < Required < ValueType > > ,
98
+ info : BaseInfo ,
99
+ ) => void ,
99
100
) {
100
101
// This is the root value which will sync with controlled or uncontrolled value
101
102
const [ innerValue , setInnerValue ] = useMergedState ( defaultValue , {
102
103
value,
103
104
} ) ;
104
- const mergedValue = innerValue || EMPTY_VALUE ;
105
+ const mergedValue = innerValue || ( EMPTY_VALUE as ValueType ) ;
105
106
106
107
// ========================= Inner Values =========================
107
108
const [ calendarValue , setCalendarValue ] = useCalendarValue ( mergedValue ) ;
108
109
109
110
// ============================ Change ============================
110
- const [ getDateTexts , isSameDates ] = useUtil ( generateConfig , locale , formatList ) ;
111
+ const [ getDateTexts , isSameDates ] = useUtil < ValueType > ( generateConfig , locale , formatList ) ;
111
112
112
- const triggerCalendarChange : TriggerCalendarChange < DateType > = useEvent ( ( [ start , end ] ) => {
113
- const clone : RangeValueType < DateType > = [ start , end ] ;
113
+ const triggerCalendarChange : TriggerCalendarChange < ValueType > = useEvent (
114
+ ( nextCalendarValues : ValueType ) => {
115
+ const clone = [ ...nextCalendarValues ] as ValueType ;
114
116
115
- // Update merged value
116
- const [ isSameMergedDates , isSameStart ] = isSameDates ( calendarValue ( ) , clone ) ;
117
+ // Update merged value
118
+ const [ isSameMergedDates , isSameStart ] = isSameDates ( calendarValue ( ) , clone ) ;
117
119
118
- if ( ! isSameMergedDates ) {
119
- setCalendarValue ( clone ) ;
120
+ if ( ! isSameMergedDates ) {
121
+ setCalendarValue ( clone ) ;
120
122
121
- // Trigger calendar change event
122
- if ( onCalendarChange ) {
123
- const cellTexts = getDateTexts ( clone ) ;
124
- onCalendarChange ( clone , cellTexts , {
125
- range : isSameStart ? 'end' : 'start' ,
126
- } ) ;
123
+ // Trigger calendar change event
124
+ if ( onCalendarChange ) {
125
+ const cellTexts = getDateTexts ( clone ) ;
126
+ onCalendarChange ( clone , cellTexts , {
127
+ range : isSameStart ? 'end' : 'start' ,
128
+ } ) ;
129
+ }
127
130
}
128
- }
129
- } ) ;
131
+ } ,
132
+ ) ;
130
133
131
134
return [ mergedValue , setInnerValue , calendarValue , triggerCalendarChange ] as const ;
132
135
}
@@ -145,7 +148,7 @@ export default function useRangeValue<DateType extends object = any>(
145
148
mergedValue : RangeValueType < DateType > ,
146
149
setInnerValue : ( nextValue : RangeValueType < DateType > ) => void ,
147
150
getCalendarValue : ( ) => RangeValueType < DateType > ,
148
- triggerCalendarChange : TriggerCalendarChange < DateType > ,
151
+ triggerCalendarChange : TriggerCalendarChange < RangeValueType < DateType > > ,
149
152
disabled : [ boolean , boolean ] ,
150
153
formatList : FormatType [ ] ,
151
154
focused : boolean ,
@@ -174,7 +177,11 @@ export default function useRangeValue<DateType extends object = any>(
174
177
const orderOnChange = disabled . some ( ( d ) => d ) ? false : order ;
175
178
176
179
// ============================= Util =============================
177
- const [ getDateTexts , isSameDates ] = useUtil ( generateConfig , locale , formatList ) ;
180
+ const [ getDateTexts , isSameDates ] = useUtil < RangeValueType < DateType > > (
181
+ generateConfig ,
182
+ locale ,
183
+ formatList ,
184
+ ) ;
178
185
179
186
// ============================ Values ============================
180
187
// Used for trigger `onChange` event.
@@ -194,7 +201,7 @@ export default function useRangeValue<DateType extends object = any>(
194
201
const triggerSubmit = useEvent ( ( nextValue ?: RangeValueType < DateType > ) => {
195
202
const isNullValue = nextValue === null ;
196
203
197
- const clone : RangeValueType < DateType > = [ ...( nextValue || submitValue ( ) ) ] ;
204
+ const clone = [ ...( nextValue || submitValue ( ) ) ] as RangeValueType < DateType > ;
198
205
199
206
// Fill null value
200
207
if ( isNullValue ) {
0 commit comments