@@ -12,6 +12,7 @@ import { Input } from '@/components/ui/input'
1212import { useTranslation } from 'react-i18next'
1313import { Calendar as PersianCalendar } from '@/components/ui/persian-calendar'
1414import { formatDateByLocale , formatDateShort , isDateDisabled } from '@/utils/datePickerUtils'
15+ import { useIsMobile } from '@/hooks/use-mobile'
1516
1617export type DatePickerMode = 'single' | 'range'
1718
@@ -147,6 +148,7 @@ export function DatePicker({
147148} : DatePickerProps ) {
148149 const { t, i18n } = useTranslation ( )
149150 const isPersianLocale = i18n . language === 'fa'
151+ const isMobile = useIsMobile ( )
150152 const [ internalOpen , setInternalOpen ] = useState ( false )
151153 const [ internalDate , setInternalDate ] = useState < Date | undefined > ( date || undefined )
152154 const [ internalRange , setInternalRange ] = useState < DateRange | undefined > (
@@ -198,7 +200,11 @@ export function DatePicker({
198200 selectedDate = new Date ( now )
199201 }
200202
201- selectedDate . setHours ( now . getHours ( ) , now . getMinutes ( ) , now . getSeconds ( ) , now . getMilliseconds ( ) )
203+ if ( internalDate && ! showTime ) {
204+ selectedDate . setHours ( internalDate . getHours ( ) , internalDate . getMinutes ( ) , internalDate . getSeconds ( ) , internalDate . getMilliseconds ( ) )
205+ } else {
206+ selectedDate . setHours ( now . getHours ( ) , now . getMinutes ( ) , now . getSeconds ( ) , now . getMilliseconds ( ) )
207+ }
202208
203209 setInternalDate ( selectedDate )
204210 const value = useUtcTimestamp ? Math . floor ( selectedDate . getTime ( ) / 1000 ) : getLocalISOTime ( selectedDate )
@@ -208,7 +214,7 @@ export function DatePicker({
208214 setIsOpen ( false )
209215 } , 0 )
210216 } ,
211- [ onDateChange , onFieldChange , fieldName , useUtcTimestamp , minDate ] ,
217+ [ onDateChange , onFieldChange , fieldName , useUtcTimestamp , minDate , internalDate , showTime ] ,
212218 )
213219
214220 const handleDateSelectWrapper = useCallback (
@@ -285,7 +291,7 @@ export function DatePicker({
285291
286292 // Single date mode
287293 if ( mode === 'single' ) {
288- const displayDate = internalDate || ( date ? new Date ( date ) : null )
294+ const displayDate = internalDate || ( date ? new Date ( date ) : undefined )
289295 const timeValue = displayDate
290296 ? `${ String ( displayDate . getHours ( ) ) . padStart ( 2 , '0' ) } :${ String ( displayDate . getMinutes ( ) ) . padStart ( 2 , '0' ) } `
291297 : ''
@@ -330,7 +336,8 @@ export function DatePicker({
330336 </ PopoverTrigger >
331337 < PopoverContent
332338 className = "w-auto p-0"
333- align = "start"
339+ align = "end"
340+ side = { isMobile ? 'bottom' : 'left' }
334341 onInteractOutside = { ( ) => {
335342 setIsOpen ( false )
336343 } }
@@ -339,12 +346,12 @@ export function DatePicker({
339346 { isPersianLocale ? (
340347 < PersianCalendar
341348 mode = "single"
342- selected = { displayDate || undefined }
349+ selected = { displayDate }
343350 onSelect = { handleDateSelectWrapper }
344351 disabled = { dateDisabled }
345352 captionLayout = "dropdown"
346353 defaultMonth = { displayDate || now }
347- startMonth = { minDate || new Date ( now . getFullYear ( ) , now . getMonth ( ) , 1 ) }
354+ startMonth = { minDate || new Date ( now . getFullYear ( ) , 0 , 1 ) }
348355 endMonth = { maxDate || new Date ( now . getFullYear ( ) + 15 , 11 , 31 ) }
349356 formatters = { {
350357 formatMonthDropdown : date => date . toLocaleString ( 'fa-IR' , { month : 'short' } ) ,
@@ -353,12 +360,12 @@ export function DatePicker({
353360 ) : (
354361 < Calendar
355362 mode = "single"
356- selected = { displayDate || undefined }
363+ selected = { displayDate }
357364 onSelect = { handleDateSelectWrapper }
358365 disabled = { dateDisabled }
359366 captionLayout = "dropdown"
360367 defaultMonth = { displayDate || now }
361- startMonth = { minDate || new Date ( now . getFullYear ( ) , now . getMonth ( ) , 1 ) }
368+ startMonth = { minDate || new Date ( now . getFullYear ( ) , 0 , 1 ) }
362369 endMonth = { maxDate || new Date ( now . getFullYear ( ) + 15 , 11 , 31 ) }
363370 formatters = { {
364371 formatMonthDropdown : date => date . toLocaleString ( 'default' , { month : 'short' } ) ,
@@ -367,7 +374,7 @@ export function DatePicker({
367374 ) }
368375 { showTime && (
369376 < >
370- < div className = "hidden lg:flex items-center gap-1 flex-wrap border-t p-2" >
377+ < div dir = "ltr" className = "hidden lg:flex items-center gap-1 flex-wrap border-t p-2" >
371378 { [
372379 { label : '+7d' , days : 7 } ,
373380 { label : '+1m' , days : 30 } ,
@@ -457,7 +464,7 @@ export function DatePicker({
457464 ) }
458465 </ Button >
459466 </ PopoverTrigger >
460- < PopoverContent className = "w-auto p-0" align = "end" >
467+ < PopoverContent className = "w-auto p-0" align = "start" side = "bottom" sideOffset = { 4 } collisionPadding = { 8 } >
461468 { isPersianLocale ? (
462469 < PersianCalendar
463470 mode = "range"
0 commit comments