All files / packages/sds-components/src/sds/calendar/utils calendarUtils.js

92.3% Statements 12/13
84.37% Branches 27/32
100% Functions 1/1
92.3% Lines 12/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 82 83 84 85 86 87 88 89 90 91    112x                                                       4x 4x 4x         4x     4x   112x                 16x 16x 16x             112x                                   4x                        
// utils/calendarUtils.js
export function createDay(date = new Date(), options = {}) {
  return {
    id: `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`, // Unique ID for each day
    date,
    weekOrder: options.weekOrder || 0,
    central: options.central || false,
    startOfWeek: options.startOfWeek || false,
    selected: options.selected || false,
    previousMonth: options.previousMonth || false,
    currentMonth: options.currentMonth || false,
    nextMonth: options.nextMonth || false,
    past: options.past || false,
    today: options.today || false,
    future: options.future || false,
    disabled: options.disabled || false,
    tabindex: options.tabindex || '-1',
    ariaCurrent: options.ariaCurrent || undefined,
    classnames: options.classnames || '',
  };
}
 
// createSingleMonth() is a function that creates a calendar for a given
// central date and returns an object with an array of months, each containing
// an array of weeks, each containing an array of days.
export function createSingleMonth(centralDate, { firstDayOfWeek = 0 } = {}) {
  const months = [];
  const startDate = new Date(centralDate.getFullYear(), centralDate.getMonth(), 1);
  const endDate = new Date(centralDate.getFullYear(), centralDate.getMonth() + 1, 0);
 
  const weeks = [];
  let currentWeek = {
    days: [],
    id: `${centralDate.getFullYear()}-${centralDate.getMonth() + 1}-week-1`,
  };
  let weekCounter = 1;
 
  // Reuse the same date object to avoid creating new Date instances
  const date = new Date(startDate);
 
  while (date <= endDate) {
    const day = createDay(new Date(date), {
      weekOrder: date.getDay(),
      currentMonth: true,
      id: `${centralDate.getFullYear()}-${centralDate.getMonth() + 1}-${date.getDate()}`,
    });
    currentWeek.days.push(day);
 
    // If the day is Saturday, end the current week and start a new one
    if (date.getDay() === 6) {
      weeks.push(currentWeek);
      weekCounter++;
      currentWeek = {
        days: [],
        id: `${centralDate.getFullYear()}-${centralDate.getMonth() + 1}-week-${weekCounter}`,
      };
    }
 
    // Move to the next day
    date.setDate(date.getDate() + 1);
  }
 
  // Add the last week if it has any days
  if (currentWeek.days.length > 0) {
    weeks.push(currentWeek);
  }
 
  // Add the month to the months array
  months.push({
    id: `${centralDate.getFullYear()}-${centralDate.getMonth() + 1}`, // Unique ID for each month
    month: centralDate.toLocaleString('default', { month: 'long' }),
    year: centralDate.getFullYear(),
    weeks,
  });
 
  return { months };
}
 
/**
 * isSameDay() is a function that checks if two dates are the same day.
 * Dates are normalized to UTC to avoid issues with time zones.
 * @param {Date} date1
 * @param {Date} date2
 * @returns {boolean}
 */
export const isSameDay = (date1, date2) => {
  const utcDate1 = new Date(Date.UTC(date1.getUTCFullYear(), date1.getUTCMonth(), date1.getUTCDate()));
  const utcDate2 = new Date(Date.UTC(date2.getUTCFullYear(), date2.getUTCMonth(), date2.getUTCDate()));
  return utcDate1.getTime() === utcDate2.getTime();
};