11'use client' ;
22
33import { CalendarIcon } from '@radix-ui/react-icons' ;
4+ import { cx } from 'class-variance-authority' ;
45import dayjs from 'dayjs' ;
56import customParseFormat from 'dayjs/plugin/customParseFormat' ;
67import { useCallback , useEffect , useRef , useState } from 'react' ;
78import { PropsBase , PropsSingleRequired } from 'react-day-picker' ;
8-
99import { InputField } from '../input-field' ;
1010import { InputFieldProps } from '../input-field/input-field' ;
1111import { Popover } from '../popover' ;
12+ import { PopoverContentProps } from '../popover/popover' ;
1213import { Calendar } from './calendar' ;
1314import styles from './calendar.module.css' ;
1415
1516dayjs . extend ( customParseFormat ) ;
1617
1718interface DatePickerProps {
18- side ?: 'top' | 'right' | 'bottom' | 'left' ;
1919 dateFormat ?: string ;
2020 inputFieldProps ?: InputFieldProps ;
2121 calendarProps ?: PropsSingleRequired & PropsBase ;
@@ -26,18 +26,19 @@ interface DatePickerProps {
2626 | ( ( props : { selectedDate : string } ) => React . ReactNode ) ;
2727 showCalendarIcon ?: boolean ;
2828 timeZone ?: string ;
29+ popoverProps ?: PopoverContentProps ;
2930}
3031
3132export function DatePicker ( {
32- side = 'top' ,
3333 dateFormat = 'DD/MM/YYYY' ,
3434 inputFieldProps,
3535 calendarProps,
3636 value = new Date ( ) ,
3737 onSelect = ( ) => { } ,
3838 children,
3939 showCalendarIcon = true ,
40- timeZone
40+ timeZone,
41+ popoverProps
4142} : DatePickerProps ) {
4243 const [ showCalendar , setShowCalendar ] = useState ( false ) ;
4344 const [ selectedDate , setSelectedDate ] = useState ( value ) ;
@@ -55,19 +56,22 @@ export function DatePicker({
5556 selectedDateRef . current = selectedDate ;
5657 } , [ selectedDate ] ) ;
5758
58- function isElementOutside ( el : HTMLElement ) {
59+ const isElementOutside = useCallback ( ( el : HTMLElement ) => {
5960 return (
6061 ! isDropdownOpenRef . current && // Month and Year dropdown from Date picker
6162 ! inputFieldRef . current ?. contains ( el ) && // InputField
6263 ! contentRef . current ?. contains ( el )
6364 ) ;
64- }
65-
66- const handleMouseDown = useCallback ( ( event : MouseEvent ) => {
67- const el = event . target as HTMLElement | null ;
68- if ( el && isElementOutside ( el ) ) removeEventListeners ( ) ;
6965 } , [ ] ) ;
7066
67+ const handleMouseDown = useCallback (
68+ ( event : MouseEvent ) => {
69+ const el = event . target as HTMLElement | null ;
70+ if ( el && isElementOutside ( el ) ) removeEventListeners ( ) ;
71+ } ,
72+ [ isElementOutside ]
73+ ) ;
74+
7175 function registerEventListeners ( ) {
7276 isInputFieldFocused . current = true ;
7377 document . addEventListener ( 'mouseup' , handleMouseDown ) ;
@@ -184,17 +188,17 @@ export function DatePicker({
184188 ) : children ? (
185189 < div > { children } </ div >
186190 ) : (
187- defaultTrigger
191+ < div > { defaultTrigger } </ div >
188192 ) ;
189193
190194 return (
191195 < Popover open = { showCalendar } onOpenChange = { onOpenChange } >
192196 < Popover . Trigger asChild > { trigger } </ Popover . Trigger >
193-
194197 < Popover . Content
195- side = { side }
196- className = { styles . calendarPopover }
197198 ref = { contentRef }
199+ { ...popoverProps }
200+ className = { cx ( styles . calendarPopover , popoverProps ?. className ) }
201+ side = { popoverProps ?. side ?? 'top' }
198202 >
199203 < Calendar
200204 required = { true }
0 commit comments