11import React , { forwardRef , useCallback , useEffect } from 'react' ;
2+
23import classNames from 'classnames' ;
34import dayjs from 'dayjs' ;
45import { isDate } from 'lodash-es' ;
6+
57import { formatDate , formatTime , getDefaultFormat , parseToDayjs } from '@tdesign/common-js/date-picker/format' ;
68import { addMonth , covertToDate , extractTimeObj , isSame , subtractMonth } from '@tdesign/common-js/date-picker/utils' ;
7- import type { StyledProps } from '../common' ;
9+
810import useConfig from '../hooks/useConfig' ;
911import useDefaultProps from '../hooks/useDefaultProps' ;
1012import useLatest from '../hooks/useLatest' ;
1113import useUpdateEffect from '../hooks/useUpdateEffect' ;
1214import { useLocaleReceiver } from '../locale/LocalReceiver' ;
1315import SelectInput from '../select-input' ;
14- import type { TagInputRemoveContext } from '../tag-input' ;
1516import { datePickerDefaultProps } from './defaultProps' ;
1617import useSingle from './hooks/useSingle' ;
1718import SinglePanel from './panel/SinglePanel' ;
19+
20+ import type { StyledProps } from '../common' ;
21+ import type { TagInputRemoveContext } from '../tag-input' ;
1822import type { DateMultipleValue , DateValue , PresetDate , TdDatePickerProps } from './type' ;
1923
2024export interface DatePickerProps extends TdDatePickerProps , StyledProps { }
@@ -149,11 +153,11 @@ const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>((originalProps, r
149153 if ( enableTimePicker ) {
150154 setCacheValue ( formatDate ( date , { format } ) ) ;
151155 if ( props . needConfirm ) return ;
156+ handlePopupInvisible ( ) ;
152157 onChange ( formatDate ( date , { format, targetFormat : valueType } ) , {
153158 dayjsValue : parseToDayjs ( date , format ) ,
154159 trigger : 'pick' ,
155160 } ) ;
156- handlePopupInvisible ( ) ;
157161 } else {
158162 if ( multiple ) {
159163 const newDate = processDate ( date ) ;
@@ -163,11 +167,11 @@ const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>((originalProps, r
163167 } ) ;
164168 return ;
165169 }
170+ handlePopupInvisible ( ) ;
166171 onChange ( formatDate ( date , { format, targetFormat : valueType } ) , {
167172 dayjsValue : parseToDayjs ( date , format ) ,
168173 trigger : 'pick' ,
169174 } ) ;
170- handlePopupInvisible ( ) ;
171175 }
172176 }
173177 // 头部快速切换
@@ -218,7 +222,7 @@ const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>((originalProps, r
218222 function onConfirmClick ( { e } ) {
219223 const nextValue = formatDate ( inputValue , { format } ) ;
220224 props ?. onConfirm ?.( { e, date : nextValue } ) ;
221-
225+ handlePopupInvisible ( ) ;
222226 if ( nextValue ) {
223227 onChange ( formatDate ( inputValue , { format, targetFormat : valueType } ) , {
224228 dayjsValue : parseToDayjs ( inputValue , format ) ,
@@ -227,7 +231,6 @@ const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>((originalProps, r
227231 } else {
228232 setInputValue ( formatDate ( value , { format } ) ) ;
229233 }
230- handlePopupInvisible ( ) ;
231234 }
232235
233236 // 预设
@@ -236,19 +239,24 @@ const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>((originalProps, r
236239 if ( typeof preset === 'function' ) {
237240 presetValue = preset ( ) ;
238241 }
239- const formattedPresetValue = formatDate ( presetValue , { format, targetFormat : valueType } ) ;
240- const formattedInputValue = formatDate ( presetValue , { format } ) ;
242+ const formattedPreset = formatDate ( presetValue , { format, targetFormat : valueType } ) ;
243+ const formattedInput = formatDate ( presetValue , { format } ) ;
244+
245+ setInputValue ( formattedInput ) ;
246+ setCacheValue ( formattedInput ) ;
241247
242- // preset 不需要 confirm 就同步
243- setInputValue ( formattedInputValue ) ;
244- setCacheValue ( formattedInputValue ) ;
248+ setTime ( formatTime ( presetValue , format , timeFormat , props . defaultTime ) ) ;
249+ setYear ( parseToDayjs ( presetValue , format ) . year ( ) ) ;
250+ setMonth ( parseToDayjs ( presetValue , format ) . month ( ) ) ;
245251
246- onChange ( formattedPresetValue , {
252+ // 先回调 onVisibleChange
253+ handlePopupInvisible ( ) ;
254+ // 再回调 onChange(方便用户覆盖弹窗开闭状态)
255+ onChange ( formattedPreset , {
247256 dayjsValue : parseToDayjs ( presetValue , format ) ,
248257 trigger : 'preset' ,
249258 } ) ;
250259 props . onPresetClick ?.( context ) ;
251- handlePopupInvisible ( ) ;
252260 }
253261
254262 const onYearChange = useCallback ( ( year : number ) => {
0 commit comments