{"version":3,"file":"DateRangePicker.cjs","sources":["../../../../src/components/DatePicker/DateRangePicker.tsx"],"sourcesContent":["import {\n  ComponentProps,\n  Dispatch,\n  forwardRef,\n  KeyboardEvent,\n  MouseEvent,\n  ReactNode,\n  SetStateAction,\n  useCallback,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport { isSameDate, UseCalendarOptions } from '@h6s/calendar';\nimport { Dropdown } from '@/components/Dropdown';\nimport {\n  Body,\n  CalendarRenderer,\n  DateRangePickerInput,\n  DateTableCell,\n  StyledDropdownItem,\n} from './Common';\nimport { Container } from '@/components/Container';\nimport { Panel } from '@/components/Panel';\nimport { Icon } from '@/components/Icon';\nimport { cn, cva } from '@/lib/cva';\nimport styles from './DateRangePicker.module.css';\nimport {\n  DateRange,\n  Timezone,\n  areDatesWithinMaxRange,\n  formatDateHeader,\n  formatSelectedDate,\n  isDateNotInAllowList,\n  isDateRangeTheWholeMonth,\n  shiftFromTimezone,\n  shiftToTimezone,\n} from './utils';\n\ntype OpenDirection = 'left' | 'right';\n\nconst PredefinedCalendarContainer = ({\n  className,\n  children,\n  gap,\n  orientation,\n  padding,\n}: ComponentProps<typeof Panel>) => (\n  <Panel\n    gap={gap}\n    orientation={orientation}\n    padding={padding}\n    className={cn(styles['predefined-calendar-container'], className)}\n  >\n    {children}\n  </Panel>\n);\n\nconst PredefinedDatesContainer = ({\n  className,\n  children,\n  isResponsive,\n  orientation,\n  'data-testid': dataTestId,\n}: ComponentProps<typeof Container> & { 'data-testid'?: string }) => (\n  <Container\n    isResponsive={isResponsive}\n    orientation={orientation}\n    data-testid={dataTestId}\n    className={cn(styles['predefined-dates-container'], className)}\n  >\n    {children}\n  </Container>\n);\n\nconst calendarRendererContainerVariants = cva(styles['calendar-renderer-container'], {\n  variants: {\n    openDirection: {\n      left: styles['calendar-renderer-container_left'],\n      right: styles['calendar-renderer-container_right'],\n    },\n  },\n  defaultVariants: { openDirection: 'right' },\n});\n\nconst CalendarRendererContainer = forwardRef<\n  HTMLDivElement,\n  { openDirection?: OpenDirection; children: ReactNode }\n>(({ openDirection, children }, ref) => (\n  <div\n    ref={ref}\n    className={calendarRendererContainerVariants({ openDirection })}\n  >\n    {children}\n  </div>\n));\nCalendarRendererContainer.displayName = 'CalendarRendererContainer';\n\nconst StyledCalendarRenderer = ({\n  className,\n  children,\n  calendarOptions,\n  allowYearMonthSelection,\n  selectedDate,\n  timezone,\n}: ComponentProps<typeof CalendarRenderer>) => (\n  <CalendarRenderer\n    calendarOptions={calendarOptions}\n    allowYearMonthSelection={allowYearMonthSelection}\n    selectedDate={selectedDate}\n    timezone={timezone}\n    className={cn(styles['styled-calendar-renderer'], className)}\n  >\n    {children}\n  </CalendarRenderer>\n);\n\nconst ScrollableContainer = ({\n  className,\n  children,\n  orientation,\n}: ComponentProps<typeof Container>) => (\n  <Container\n    orientation={orientation}\n    className={cn(styles['scrollable-container'], className)}\n  >\n    {children}\n  </Container>\n);\n\nconst dateRangeTableCellVariants = cva(undefined, {\n  variants: {\n    showRangeIndicator: { true: styles['date-range-table-cell_indicator'] },\n  },\n});\n\nconst DateRangeTableCell = ({\n  shouldShowRangeIndicator,\n  className,\n  children,\n  isCurrentMonth,\n  isDisabled,\n  isSelected,\n  isPresent,\n  onClick,\n  onMouseEnter,\n  onMouseLeave,\n}: ComponentProps<typeof DateTableCell> & {\n  shouldShowRangeIndicator?: boolean;\n}) => (\n  <DateTableCell\n    isCurrentMonth={isCurrentMonth}\n    isDisabled={isDisabled}\n    isSelected={isSelected}\n    isPresent={isPresent}\n    onClick={onClick}\n    onMouseEnter={onMouseEnter}\n    onMouseLeave={onMouseLeave}\n    className={cn(\n      dateRangeTableCellVariants({ showRangeIndicator: shouldShowRangeIndicator }),\n      className\n    )}\n  >\n    {children}\n  </DateTableCell>\n);\n\ninterface CalendarProps {\n  allowOnlyDatesList?: Array<Date>;\n  calendarBody: Body;\n  closeDatepicker: () => void;\n  futureDatesDisabled: boolean;\n  futureStartDatesDisabled: boolean;\n  maxRangeLength: number;\n  setSelectedDate: (selectedDate: Date) => void;\n  startDate?: Date;\n  endDate?: Date;\n  timezone: Timezone;\n}\n\nconst Calendar = ({\n  allowOnlyDatesList,\n  calendarBody,\n  closeDatepicker,\n  futureDatesDisabled,\n  futureStartDatesDisabled,\n  maxRangeLength,\n  setSelectedDate,\n  startDate,\n  endDate,\n  timezone,\n}: CalendarProps) => {\n  const [hoveredDate, setHoveredDate] = useState<Date>();\n\n  const today = shiftToTimezone(new Date(), timezone);\n  const shiftedStart = startDate ? shiftToTimezone(startDate, timezone) : undefined;\n  const shiftedEnd = endDate ? shiftToTimezone(endDate, timezone) : undefined;\n\n  const shiftedAllowList = useMemo(() => {\n    return allowOnlyDatesList?.map(date => {\n      return shiftToTimezone(date, timezone);\n    });\n  }, [allowOnlyDatesList, timezone]);\n\n  const handleMouseOut = (): void => {\n    setHoveredDate(undefined);\n  };\n\n  return calendarBody.value.map(({ key: weekKey, value: week }) => {\n    return (\n      <tr key={weekKey}>\n        {week.map(({ date, isCurrentMonth, key: dayKey, value: fullDate }) => {\n          const isSelected =\n            (shiftedStart && isSameDate(shiftedStart, fullDate)) ||\n            (shiftedEnd && isSameDate(shiftedEnd, fullDate));\n          const isPresent = isSameDate(today, fullDate);\n\n          const isBetweenStartAndEndDates = Boolean(\n            shiftedStart && shiftedEnd && fullDate > shiftedStart && fullDate < shiftedEnd\n          );\n\n          let isDisabled = false;\n          if (futureDatesDisabled && fullDate > today) {\n            isDisabled = true;\n          }\n\n          if (futureStartDatesDisabled && !shiftedStart && fullDate > today) {\n            isDisabled = true;\n          }\n\n          if (\n            maxRangeLength > 1 &&\n            shiftedStart &&\n            !areDatesWithinMaxRange(shiftedStart, fullDate, maxRangeLength) &&\n            fullDate > shiftedStart\n          ) {\n            isDisabled = true;\n          }\n\n          if (isDateNotInAllowList(shiftedAllowList, fullDate)) {\n            isDisabled = true;\n          }\n\n          const shouldShowRangeIndicator =\n            !shiftedEnd &&\n            Boolean(\n              shiftedStart &&\n              hoveredDate &&\n              fullDate > shiftedStart &&\n              fullDate < hoveredDate\n            );\n\n          const handleMouseEnter = () => {\n            setHoveredDate(fullDate);\n          };\n\n          const handleClick = () => {\n            if (isDisabled) {\n              return false;\n            }\n            setSelectedDate(shiftFromTimezone(fullDate, timezone));\n\n            // User has a date range selected and clicked a new date.\n            // This will cause the selected date to be reset, thus do not close the datepicker.\n            if (shiftedStart && shiftedEnd) {\n              return;\n            }\n\n            // The user has selected a new start date, don't close\n            if (shiftedStart && fullDate < shiftedStart) {\n              return;\n            }\n\n            // Only close the datepicker if the user hasn't clicked the selected start date.\n            if (shiftedStart && !isSameDate(fullDate, shiftedStart)) {\n              closeDatepicker();\n              return;\n            }\n          };\n          return (\n            <DateRangeTableCell\n              shouldShowRangeIndicator={\n                !isSelected && (shouldShowRangeIndicator || isBetweenStartAndEndDates)\n              }\n              isCurrentMonth={isCurrentMonth}\n              isDisabled={isDisabled}\n              isSelected={Boolean(isSelected)}\n              isPresent={isPresent}\n              key={dayKey}\n              onClick={handleClick}\n              onMouseEnter={handleMouseEnter}\n              onMouseLeave={handleMouseOut}\n            >\n              {date}\n            </DateRangeTableCell>\n          );\n        })}\n      </tr>\n    );\n  });\n};\n\ninterface PredefinedDatesProps {\n  onSelectDateRange: (selectedStartDate: Date, selectedEndDate: Date) => void;\n  predefinedDatesList: DateRange[];\n  selectedEndDate: Date | undefined;\n  selectedStartDate: Date | undefined;\n  setEndDate: Dispatch<SetStateAction<Date | undefined>>;\n  setStartDate: Dispatch<SetStateAction<Date | undefined>>;\n  shouldShowCustomRange: boolean;\n  showCustomDateRange: Dispatch<SetStateAction<boolean>>;\n  timezone: Timezone;\n}\n\nconst PredefinedDates = ({\n  onSelectDateRange,\n  predefinedDatesList,\n  selectedEndDate,\n  selectedStartDate,\n  setEndDate,\n  setStartDate,\n  shouldShowCustomRange,\n  showCustomDateRange,\n  timezone,\n}: PredefinedDatesProps) => {\n  const handleCustomTimePeriodClick = (event: MouseEvent) => {\n    event.preventDefault();\n    showCustomDateRange(!shouldShowCustomRange);\n  };\n\n  return (\n    <PredefinedDatesContainer\n      data-testid=\"predefined-dates-list\"\n      isResponsive={false}\n      orientation=\"vertical\"\n    >\n      <ScrollableContainer orientation=\"vertical\">\n        {predefinedDatesList.map(({ startDate, endDate }) => {\n          const handleItemClick = () => {\n            setStartDate(startDate);\n            setEndDate(endDate);\n            onSelectDateRange(startDate, endDate);\n          };\n\n          const rangeIsSelected =\n            selectedEndDate &&\n            isSameDate(selectedEndDate, endDate) &&\n            selectedStartDate &&\n            isSameDate(selectedStartDate, startDate);\n\n          const isWholeMonth = isDateRangeTheWholeMonth({ startDate, endDate }, timezone);\n\n          const formattedText = isWholeMonth\n            ? formatDateHeader(timezone, startDate)\n            : `${formatSelectedDate(timezone, startDate)} – ${formatSelectedDate(timezone, endDate)}`.trim();\n\n          return (\n            <StyledDropdownItem\n              data-testid={`predefined-date-${startDate.getTime()}`}\n              key={startDate.toISOString()}\n              onClick={handleItemClick}\n            >\n              <Container\n                data-selected={rangeIsSelected}\n                data-testid={formattedText}\n                justifyContent=\"space-between\"\n                orientation=\"horizontal\"\n              >\n                {formattedText}\n                {rangeIsSelected && <Icon name=\"check\" />}\n              </Container>\n            </StyledDropdownItem>\n          );\n        })}\n      </ScrollableContainer>\n      <StyledDropdownItem onClick={handleCustomTimePeriodClick}>\n        <Container\n          justifyContent=\"space-between\"\n          orientation=\"horizontal\"\n        >\n          Custom time period <Icon name=\"chevron-right\" />\n        </Container>\n      </StyledDropdownItem>\n    </PredefinedDatesContainer>\n  );\n};\n\nexport interface DateRangePickerProps {\n  allowOnlyDatesList?: Array<Date>;\n  disabled?: boolean;\n  endDate?: Date;\n  futureDatesDisabled?: boolean;\n  futureStartDatesDisabled?: boolean;\n  maxRangeLength?: number;\n  onSelectDateRange: (selectedStartDate: Date, selectedEndDate: Date) => void;\n  openDirection?: OpenDirection;\n  placeholder?: string;\n  predefinedDatesList?: DateRange[];\n  responsivePositioning?: boolean;\n  startDate?: Date;\n  timezone?: Timezone;\n}\n\nexport const DateRangePicker = ({\n  allowOnlyDatesList,\n  disabled = false,\n  endDate,\n  futureDatesDisabled = false,\n  futureStartDatesDisabled = false,\n  maxRangeLength = -1,\n  onSelectDateRange,\n  openDirection = 'right',\n  placeholder = 'start date – end date',\n  predefinedDatesList,\n  responsivePositioning = true,\n  startDate,\n  timezone = 'system',\n}: DateRangePickerProps) => {\n  const [isOpen, setIsOpen] = useState<boolean>(false);\n  const [selectedStartDate, setSelectedStartDate] = useState<Date>();\n  const [selectedEndDate, setSelectedEndDate] = useState<Date>();\n  const [shouldShowCustomRange, setShouldShowCustomRange] = useState<boolean>(false);\n  const [calendarOpenDirection, setCalendarOpenDirection] =\n    useState<OpenDirection>(openDirection);\n  const calendarContainerRef = useRef<HTMLDivElement>(null);\n\n  const calendarOptions: UseCalendarOptions = {};\n\n  // If a start date is selected, open the calendar to that date\n  if (selectedStartDate) {\n    calendarOptions.defaultDate = selectedStartDate;\n  }\n\n  useEffect(() => {\n    if (startDate) {\n      setSelectedStartDate(startDate);\n    }\n  }, [startDate]);\n\n  useEffect(() => {\n    if (endDate) {\n      setSelectedEndDate(endDate);\n    }\n  }, [endDate]);\n\n  useLayoutEffect(() => {\n    if (shouldShowCustomRange && calendarContainerRef.current) {\n      if (\n        calendarContainerRef.current.getBoundingClientRect().right > window.innerWidth\n      ) {\n        setCalendarOpenDirection('left');\n      }\n    }\n  }, [shouldShowCustomRange]);\n\n  const closeDatePicker = useCallback((): void => {\n    setIsOpen(false);\n    setShouldShowCustomRange(false);\n    setCalendarOpenDirection(openDirection);\n  }, [openDirection]);\n\n  const handleOpenChange = (isOpen: boolean): void => {\n    setIsOpen(isOpen);\n\n    if (!isOpen) {\n      setShouldShowCustomRange(false);\n      setCalendarOpenDirection(openDirection);\n    }\n  };\n\n  const handleSelectDate = useCallback(\n    (selectedDate: Date): void => {\n      // Start date and end date are selected, user clicks any date.\n      // Set start date to the selected date, clear the end date.\n      if (selectedStartDate && selectedEndDate) {\n        // If futureStartDatesDisabled is true, only set the selected date to the date clicked if it's before today\n        if (futureStartDatesDisabled && selectedDate > new Date()) {\n          setSelectedEndDate(undefined);\n          return;\n        }\n        setSelectedStartDate(selectedDate);\n        setSelectedEndDate(undefined);\n        return;\n      }\n\n      if (selectedStartDate) {\n        if (isSameDate(selectedStartDate, selectedDate)) {\n          // Start date is selected, user clicks start date.\n          // Reset the start date.\n          setSelectedStartDate(undefined);\n          return;\n        }\n\n        // Start date is selected, user clicks an earlier date.\n        // Set the earlier date to the new start date.\n        if (selectedDate < selectedStartDate) {\n          setSelectedStartDate(selectedDate);\n          return;\n        }\n\n        // Otherwise, set the end date to the date the user clicked.\n        setSelectedEndDate(selectedDate);\n        onSelectDateRange(selectedStartDate, selectedDate);\n        setShouldShowCustomRange(false);\n        return;\n      }\n\n      setSelectedStartDate(selectedDate);\n    },\n    [futureStartDatesDisabled, onSelectDateRange, selectedEndDate, selectedStartDate]\n  );\n\n  const onTriggerKeyDown = useCallback((e: KeyboardEvent<HTMLDivElement>) => {\n    if (e.key === 'Enter' || e.key === ' ') {\n      e.preventDefault();\n      setIsOpen(true);\n    }\n  }, []);\n\n  const shouldShowPredefinedDates =\n    predefinedDatesList !== undefined && predefinedDatesList.length > 0;\n\n  return (\n    <Dropdown\n      onOpenChange={handleOpenChange}\n      open={isOpen}\n    >\n      <Dropdown.Trigger\n        disabled={disabled}\n        onKeyDown={onTriggerKeyDown}\n      >\n        <DateRangePickerInput\n          data-testid=\"datepicker-input-container\"\n          disabled={disabled}\n          isActive={isOpen}\n          placeholder={placeholder}\n          selectedEndDate={selectedEndDate}\n          selectedStartDate={selectedStartDate}\n          timezone={timezone}\n        />\n      </Dropdown.Trigger>\n      <Dropdown.Content\n        align=\"start\"\n        responsivePositioning={responsivePositioning}\n      >\n        {shouldShowPredefinedDates ? (\n          <PredefinedCalendarContainer\n            gap=\"none\"\n            orientation=\"horizontal\"\n            padding=\"none\"\n          >\n            <PredefinedDates\n              onSelectDateRange={onSelectDateRange}\n              predefinedDatesList={predefinedDatesList}\n              selectedEndDate={selectedEndDate}\n              selectedStartDate={selectedStartDate}\n              setEndDate={setSelectedEndDate}\n              setStartDate={setSelectedStartDate}\n              shouldShowCustomRange={shouldShowCustomRange}\n              showCustomDateRange={setShouldShowCustomRange}\n              timezone={timezone}\n            />\n\n            {shouldShowCustomRange && (\n              <CalendarRendererContainer\n                openDirection={calendarOpenDirection}\n                ref={calendarContainerRef}\n              >\n                <StyledCalendarRenderer\n                  calendarOptions={calendarOptions}\n                  allowYearMonthSelection={true}\n                  selectedDate={selectedStartDate}\n                  timezone={timezone}\n                >\n                  {(body: Body) => (\n                    <Calendar\n                      allowOnlyDatesList={allowOnlyDatesList}\n                      calendarBody={body}\n                      closeDatepicker={closeDatePicker}\n                      futureDatesDisabled={futureDatesDisabled}\n                      futureStartDatesDisabled={futureStartDatesDisabled}\n                      maxRangeLength={maxRangeLength}\n                      setSelectedDate={handleSelectDate}\n                      startDate={selectedStartDate}\n                      endDate={selectedEndDate}\n                      timezone={timezone}\n                    />\n                  )}\n                </StyledCalendarRenderer>\n              </CalendarRendererContainer>\n            )}\n          </PredefinedCalendarContainer>\n        ) : (\n          <CalendarRenderer\n            calendarOptions={calendarOptions}\n            allowYearMonthSelection={true}\n            selectedDate={selectedStartDate}\n            timezone={timezone}\n          >\n            {(body: Body) => (\n              <Calendar\n                allowOnlyDatesList={allowOnlyDatesList}\n                calendarBody={body}\n                closeDatepicker={closeDatePicker}\n                futureDatesDisabled={futureDatesDisabled}\n                futureStartDatesDisabled={futureStartDatesDisabled}\n                maxRangeLength={maxRangeLength}\n                setSelectedDate={handleSelectDate}\n                startDate={selectedStartDate}\n                endDate={selectedEndDate}\n                timezone={timezone}\n              />\n            )}\n          </CalendarRenderer>\n        )}\n      </Dropdown.Content>\n    </Dropdown>\n  );\n};\n"],"names":["jsx","Panel","cn","styles","Container","cva","forwardRef","CalendarRenderer","DateTableCell","useState","shiftToTimezone","useMemo","isSameDate","areDatesWithinMaxRange","isDateNotInAllowList","shiftFromTimezone","jsxs","isDateRangeTheWholeMonth","formatDateHeader","formatSelectedDate","StyledDropdownItem","Icon","useRef","useEffect","useLayoutEffect","useCallback","isOpen","Dropdown","DateRangePickerInput"],"mappings":"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"}