All files / apps/timeOff/src/screens/ChooseDate/hooks useChooseDateSelectionState.ts

100% Statements 17/17
50% Branches 6/12
100% Functions 3/3
100% Lines 17/17

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71                            1x       17x 17x 6x   17x       17x 17x       17x   17x 6x           6x 6x 6x     6x     6x     6x     17x                                
import { useCallback, useState } from 'react';
 
import {
  DATE_PICKER_TIME_SLOT,
  type DateRangeValue,
} from '@repo/ui/components/DatePicker';
import type { QuickSelectValue } from '@repo/ui/components/QuickSelect';
 
import { getDraftSlotState, toDatePickerRange } from './helpers';
 
interface UseChooseDateSelectionStateParams {
  initialSelectedValue: QuickSelectValue;
}
 
export const useChooseDateSelectionState = ({
  initialSelectedValue,
}: UseChooseDateSelectionStateParams) => {
  const [selectedValue, setSelectedValue] =
    useState<QuickSelectValue>(initialSelectedValue);
  const [datePickerValue, setDatePickerValue] = useState<DateRangeValue>(() =>
    toDatePickerRange(initialSelectedValue),
  );
  const [datePickerTimeSlot, setDatePickerTimeSlot] = useState(
    initialSelectedValue.timeSlot || DATE_PICKER_TIME_SLOT.ALL_DAY,
  );
  const [datePickerRangeStartTimeSlot, setDatePickerRangeStartTimeSlot] =
    useState(initialSelectedValue.timeSlot || DATE_PICKER_TIME_SLOT.ALL_DAY);
  const [datePickerRangeEndTimeSlot, setDatePickerRangeEndTimeSlot] = useState(
    initialSelectedValue.timeSlot || DATE_PICKER_TIME_SLOT.ALL_DAY,
  );
  const [datePickerActiveRangeSelection, setDatePickerActiveRangeSelection] =
    useState<'start' | 'end'>('start');
 
  const syncSelectionState = useCallback((value: QuickSelectValue) => {
    const draftSlotState = getDraftSlotState(
      value.startDate,
      value.endDate,
      value.timeSlot,
    );
 
    setSelectedValue(value);
    setDatePickerValue(toDatePickerRange(value));
    setDatePickerTimeSlot(
      draftSlotState.timeSlot || DATE_PICKER_TIME_SLOT.ALL_DAY,
    );
    setDatePickerRangeStartTimeSlot(
      draftSlotState.rangeStartTimeSlot || DATE_PICKER_TIME_SLOT.ALL_DAY,
    );
    setDatePickerRangeEndTimeSlot(
      draftSlotState.rangeEndTimeSlot || DATE_PICKER_TIME_SLOT.ALL_DAY,
    );
    setDatePickerActiveRangeSelection(draftSlotState.activeRangeSelection);
  }, []);
 
  return {
    selectedValue,
    datePickerValue,
    datePickerTimeSlot,
    datePickerRangeStartTimeSlot,
    datePickerRangeEndTimeSlot,
    datePickerActiveRangeSelection,
    setSelectedValue,
    setDatePickerValue,
    setDatePickerTimeSlot,
    setDatePickerRangeStartTimeSlot,
    setDatePickerRangeEndTimeSlot,
    setDatePickerActiveRangeSelection,
    syncSelectionState,
  };
};