All files / apps/reallocation/src/screens/ChooseDate utils.ts

100% Statements 13/13
100% Branches 14/14
100% Functions 4/4
100% Lines 13/13

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 72 73 74 75 76 77 78 79 80 81                                  3x     56x         3x 5x 5x     3x                     4x                                       21x 5x         16x 8x         8x 8x            
import {
  DATE_PICKER_TIME_SLOT,
  type DatePickerTimeSlot,
} from '@repo/ui/components/DatePicker';
import type { QuickSelectOption } from '@repo/ui/components/QuickSelect';
 
import {
  generateDynamicQuickSelectOptions as sharedGenerateOptions,
  normalizeDateValue,
  type QuickSelectLabelParams,
  toQuickSelectValue as sharedToQuickSelectValue,
} from '@repo/utils';
 
import { type ReallocationShift } from '../Reallocation/types';
 
export { normalizeDateValue };
 
export const toDatePickerSlot = (
  shift: ReallocationShift | undefined,
): DatePickerTimeSlot => {
  return shift === 'Afternoon'
    ? DATE_PICKER_TIME_SLOT.AFTERNOON
    : DATE_PICKER_TIME_SLOT.MORNING;
};
 
export const toQuickSelectValue = (date: Date, shift: ReallocationShift) => {
  const timeSlot = toDatePickerSlot(shift);
  return sharedToQuickSelectValue(date, timeSlot);
};
 
export const generateDynamicQuickSelectOptions = ({
  holidays,
  makeUpWorkdays,
  now = new Date(),
  maxBusinessDays = 4,
}: {
  holidays: string[];
  makeUpWorkdays: string[];
  now?: Date;
  maxBusinessDays?: number;
}): QuickSelectOption[] => {
  return sharedGenerateOptions({
    holidays,
    makeUpWorkdays,
    now,
    maxBusinessDays,
    limit: 100, // No specific limit other than business days for reallocation
    slotSequence: [
      DATE_PICKER_TIME_SLOT.MORNING,
      DATE_PICKER_TIME_SLOT.AFTERNOON,
    ],
    fallbackSlotSequence: [
      DATE_PICKER_TIME_SLOT.MORNING,
      DATE_PICKER_TIME_SLOT.AFTERNOON,
    ],
    labelFormatter: ({
      day,
      isToday,
      isCalendarTomorrow,
      timeSlot,
    }: QuickSelectLabelParams) => {
      if (isToday) {
        return timeSlot === DATE_PICKER_TIME_SLOT.MORNING
          ? 'This morning'
          : 'This afternoon';
      }
 
      if (isCalendarTomorrow) {
        return timeSlot === DATE_PICKER_TIME_SLOT.MORNING
          ? 'Tomorrow morning'
          : 'Tomorrow afternoon';
      }
 
      const weekday = day.toLocaleDateString('en-US', { weekday: 'short' });
      return `${weekday} - ${
        timeSlot === DATE_PICKER_TIME_SLOT.MORNING ? 'Morning' : 'Afternoon'
      }`;
    },
  });
};