{"version":3,"sources":["../../../../src/components/Calendar/CalendarMonth/useCalendarMonth.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport {\n  getIntrinsicElementProps,\n  mergeCallbacks,\n  slot,\n  useEventCallback,\n  useMergedRefs,\n} from '@fluentui/react-utilities';\nimport {\n  addYears,\n  compareDatePart,\n  getDateRange,\n  getMonthEnd,\n  getMonthStart,\n  getYearEnd,\n  getYearStart,\n  isRestrictedDate,\n  setMonth,\n} from '../utils';\nimport { useCalendarContext } from '../calendarContext';\nimport { mergeProps } from '../../../utils/mergeProps';\nimport { getAvailableDates } from '../utils/dateGrid/dateAvailability';\nimport {\n  getCalendarEventType,\n  onCalendarEnterKeyDown,\n  resolveCalendarNavigationButton,\n} from '../utils/calendarNavigation';\nimport { getCalendarPickerCellProps, getCalendarPickerRows, useCalendarPickerGrid } from '../hooks/useCalendarGrid';\nimport { CalendarYear } from '../CalendarYear/CalendarYear';\nimport type { CalendarYearHandle, CalendarYearProps, CalendarYearSelectData } from '../CalendarYear/CalendarYear.types';\nimport type { CalendarMonthProps, CalendarMonthState, CalendarMonthCellData } from './CalendarMonth.types';\n\ntype ButtonEvent = React.MouseEvent<HTMLButtonElement> | React.KeyboardEvent<HTMLButtonElement>;\n\n/**\n * Create the state required to render CalendarMonth.\n * Calendar owns selection, directional navigation and roving focus.\n * @param props - props from this instance of CalendarMonth\n * @param ref - reference to the root element of CalendarMonth\n */\nexport const useCalendarMonth = (props: CalendarMonthProps, ref: React.Ref<HTMLDivElement>): CalendarMonthState => {\n  const {\n    allFocusable,\n    calendarMonthColumns,\n    dateRangeType,\n    firstDayOfWeek,\n    formatters,\n    maxDate,\n    minDate,\n    restrictedDates,\n    workWeekDays,\n    today: contextToday,\n    value,\n  } = useCalendarContext();\n\n  const {\n    grid,\n    header,\n    navigation,\n    nextYearButton,\n    onHeaderSelect: onUserHeaderSelect,\n    onNavigateDate,\n    onSelectDate,\n    previousYearButton,\n    heading,\n    yearPicker,\n    yearPickerHidden = false,\n  } = props;\n\n  const today = React.useMemo(() => contextToday ?? new Date(), [contextToday]);\n  const navigatedDate = props.navigatedDate ?? today;\n  const selectedDate = props.selectedDate !== undefined ? props.selectedDate : value ?? null;\n  const restrictedDatesOptions = { minDate, maxDate, restrictedDates };\n\n  const yearPickerRef = React.useRef<CalendarYearHandle>(null);\n  const focusOnUpdate = React.useRef(false);\n\n  const [isYearPickerVisible, setIsYearPickerVisible] = React.useState(false);\n\n  const navigate = (ev: React.SyntheticEvent<HTMLElement>, date: Date, focusOnNavigatedDay: boolean) =>\n    onNavigateDate?.(ev, { event: ev, type: getCalendarEventType(ev), date, focusOnNavigatedDay });\n\n  const onSelectMonth = (ev: ButtonEvent, newMonth: number): void => {\n    const type = getCalendarEventType(ev);\n    let date = setMonth(navigatedDate, newMonth);\n    if (onSelectDate) {\n      const availableDates = getAvailableDates(getDateRange(date, 'month', firstDayOfWeek), restrictedDatesOptions);\n      if (!availableDates.length) {\n        return;\n      }\n      date = availableDates.find(rangeDate => compareDatePart(rangeDate, date) === 0) ?? availableDates[0];\n      const selectedDateRange = getAvailableDates(\n        getDateRange(date, dateRangeType, firstDayOfWeek, workWeekDays),\n        restrictedDatesOptions,\n      );\n      onSelectDate(ev, { event: ev, type, date, selectedDateRange });\n    }\n    // If header is clickable the calendars are overlaid, switch back to day picker when month is clicked\n    onUserHeaderSelect?.(ev, { event: ev, type });\n    navigate(ev, date, true);\n  };\n\n  const showYearPicker = (): void => {\n    if (isYearPickerVisible && yearPickerRef.current) {\n      // Showing the visible picker again does not render, so the update effect would not move focus.\n      yearPickerRef.current.focus();\n      return;\n    }\n    focusOnUpdate.current = true;\n    setIsYearPickerVisible(true);\n  };\n\n  const onHeaderSelect = useEventCallback((ev: ButtonEvent): void => {\n    if (!yearPickerHidden) {\n      showYearPicker();\n    } else {\n      onUserHeaderSelect?.(ev, { event: ev, type: getCalendarEventType(ev) });\n    }\n  });\n\n  const onSelectYear = useEventCallback((ev: React.SyntheticEvent | Event, data: CalendarYearSelectData) => {\n    const selectedYear = data.year;\n    focusOnUpdate.current = true;\n    const navYear = navigatedDate.getFullYear();\n    if (navYear !== selectedYear) {\n      let newNavigationDate = addYears(navigatedDate, selectedYear - navYear);\n      // for min and max dates, adjust the new navigation date\n      if (maxDate && compareDatePart(newNavigationDate, maxDate) > 0) {\n        newNavigationDate = setMonth(newNavigationDate, maxDate.getMonth());\n        if (compareDatePart(newNavigationDate, maxDate) > 0) {\n          newNavigationDate = maxDate;\n        }\n      } else if (minDate && compareDatePart(newNavigationDate, minDate) < 0) {\n        newNavigationDate = setMonth(newNavigationDate, minDate.getMonth());\n        if (compareDatePart(newNavigationDate, minDate) < 0) {\n          newNavigationDate = minDate;\n        }\n      }\n      onNavigateDate?.(ev, { ...data, date: newNavigationDate, focusOnNavigatedDay: true });\n    }\n    setIsYearPickerVisible(false);\n  });\n\n  const onYearPickerHeaderSelect = useEventCallback((): void => {\n    focusOnUpdate.current = true;\n    setIsYearPickerVisible(false);\n  });\n\n  const yearString = formatters.dateTime({ date: navigatedDate, format: 'year' });\n  const isPrevYearInBounds = minDate ? compareDatePart(minDate, getYearStart(navigatedDate)) < 0 : true;\n  const isNextYearInBounds = maxDate ? compareDatePart(getYearEnd(navigatedDate), maxDate) < 0 : true;\n  const headerIsClickable = !!onUserHeaderSelect || !yearPickerHidden;\n\n  const months: CalendarMonthCellData[] = Array.from({ length: 12 }, (_, monthIndex) => {\n    const indexedMonth = setMonth(navigatedDate, monthIndex);\n    const label = formatters.dateTime({ date: indexedMonth, format: 'shortMonth' });\n    return {\n      index: monthIndex,\n      label,\n      isNavigated: navigatedDate.getMonth() === monthIndex,\n      isCurrent: today.getFullYear() === navigatedDate.getFullYear() && today.getMonth() === monthIndex,\n      isSelected:\n        !!selectedDate &&\n        selectedDate.getMonth() === monthIndex &&\n        selectedDate.getFullYear() === navigatedDate.getFullYear(),\n      isInBounds:\n        (minDate ? compareDatePart(minDate, getMonthEnd(indexedMonth)) < 1 : true) &&\n        (maxDate ? compareDatePart(getMonthStart(indexedMonth), maxDate) < 1 : true) &&\n        (!onSelectDate ||\n          getDateRange(indexedMonth, 'month', firstDayOfWeek).some(\n            date => !isRestrictedDate(date, restrictedDatesOptions),\n          )),\n    };\n  });\n\n  const focusableMonth =\n    months.find(month => month.isNavigated && (month.isInBounds || allFocusable)) ??\n    months.find(month => month.isInBounds);\n  const [gridSlot, getCell, tabStop, activeCellIndex] = useCalendarPickerGrid(\n    grid,\n    yearString,\n    index => !!months[index]?.isInBounds,\n    onSelectMonth,\n    {\n      columns: calendarMonthColumns,\n      allFocusable,\n      defaultTabStop: focusableMonth?.index,\n      resetKey: `${navigatedDate.getFullYear()}:${calendarMonthColumns}`,\n    },\n  );\n\n  const focus = (options?: FocusOptions) => {\n    if (yearPickerRef.current) {\n      yearPickerRef.current.focus(options);\n    } else if (focusableMonth) {\n      getCell(focusableMonth.index)?.focus(options);\n    }\n  };\n\n  React.useImperativeHandle(props.imperativeRef, () => ({\n    focus,\n    showYearPicker: () => {\n      if (!yearPickerHidden) {\n        showYearPicker();\n      }\n    },\n  }));\n\n  React.useEffect(() => {\n    if (focusOnUpdate.current) {\n      focus();\n      focusOnUpdate.current = false;\n    }\n  });\n\n  for (const month of months) {\n    month.isNavigated = month === focusableMonth;\n  }\n  const monthRows = getCalendarPickerRows(months, calendarMonthColumns);\n  const getMonthCellProps: CalendarMonthState['getMonthCellProps'] = month => {\n    const cellProps = getCalendarPickerCellProps(\n      allFocusable,\n      !month.isInBounds,\n      month.isSelected,\n      month.isCurrent,\n      month.index === tabStop,\n      month.index === activeCellIndex,\n    );\n    const overrides = props.getCellProps?.(month);\n    return {\n      root: mergeProps(\n        {\n          ...cellProps.root,\n          'aria-label': formatters.dateTime({ date: setMonth(navigatedDate, month.index), format: 'month' }),\n        },\n        overrides?.root,\n      ),\n      button: mergeProps({ ...cellProps.button, children: month.label }, overrides?.button),\n    };\n  };\n  const getMonthRowProps: CalendarMonthState['getMonthRowProps'] = row => ({\n    root: mergeProps({ role: 'row' }, props.getRowProps?.(row).root),\n  });\n\n  let yearPickerProps: CalendarYearProps | undefined;\n  if (isYearPickerVisible) {\n    yearPickerProps = {\n      navigatedYear: navigatedDate.getFullYear(),\n      selectedYear: selectedDate === null ? null : selectedDate?.getFullYear(),\n      onHeaderSelect: onYearPickerHeaderSelect,\n      onSelectYear,\n    };\n  }\n\n  const previousYearDate = addYears(navigatedDate, -1);\n  const nextYearDate = addYears(navigatedDate, 1);\n  const onSelectPrevYear = (ev: ButtonEvent) => navigate(ev, previousYearDate, false);\n  const onSelectNextYear = (ev: ButtonEvent) => navigate(ev, nextYearDate, false);\n\n  const yearPickerSlot = slot.always(yearPicker, {\n    defaultProps: yearPickerProps,\n    elementType: CalendarYear,\n  });\n  yearPickerSlot.imperativeRef = useMergedRefs(yearPickerRef, yearPickerSlot.imperativeRef);\n  const headingSlot = slot.always(heading, {\n    defaultProps: {\n      'aria-label': headerIsClickable\n        ? formatters.monthPickerHeaderLabel({ date: navigatedDate, formattedDate: yearString })\n        : undefined,\n      children: (\n        <span aria-live=\"polite\" aria-atomic=\"true\">\n          {yearString}\n        </span>\n      ),\n      tabIndex: headerIsClickable ? 0 : undefined,\n      type: headerIsClickable ? 'button' : undefined,\n    },\n    elementType: headerIsClickable ? 'button' : 'div',\n  });\n  if (headerIsClickable) {\n    headingSlot.onClick = mergeCallbacks(\n      headingSlot.onClick as React.MouseEventHandler<HTMLElement> | undefined,\n      ev => {\n        if (!ev.isDefaultPrevented()) {\n          onHeaderSelect(ev as React.MouseEvent<HTMLButtonElement>);\n        }\n      },\n    );\n    headingSlot.onKeyDown = mergeCallbacks(\n      headingSlot.onKeyDown as React.KeyboardEventHandler<HTMLElement> | undefined,\n      ev => {\n        if (!ev.isDefaultPrevented()) {\n          onCalendarEnterKeyDown<HTMLElement>(event => onHeaderSelect(event as React.KeyboardEvent<HTMLButtonElement>))(\n            ev,\n          );\n        }\n      },\n    );\n  }\n\n  return {\n    isYearPickerVisible,\n    monthRows,\n    getMonthCellProps,\n    getMonthRowProps,\n    components: {\n      root: 'div',\n      header: 'div',\n      heading: headerIsClickable ? 'button' : 'div',\n      navigation: 'div',\n      previousYearButton: 'button',\n      nextYearButton: 'button',\n      grid: 'div',\n      yearPicker: CalendarYear,\n    },\n    root: slot.always(getIntrinsicElementProps('div', { ...props, ref, 'data-fui-calendar-picker': 'month' }), {\n      elementType: 'div',\n    }),\n    header: slot.always(header, { elementType: 'div' }),\n    heading: headingSlot,\n    navigation: slot.always(navigation, { elementType: 'div' }),\n    previousYearButton: resolveCalendarNavigationButton(\n      previousYearButton,\n      isPrevYearInBounds,\n      allFocusable,\n      formatters.previousYearLabel({\n        date: previousYearDate,\n        formattedDate: formatters.dateTime({ date: previousYearDate, format: 'year' }),\n      }),\n      onSelectPrevYear,\n    ),\n    nextYearButton: resolveCalendarNavigationButton(\n      nextYearButton,\n      isNextYearInBounds,\n      allFocusable,\n      formatters.nextYearLabel({\n        date: nextYearDate,\n        formattedDate: formatters.dateTime({ date: nextYearDate, format: 'year' }),\n      }),\n      onSelectNextYear,\n    ),\n    grid: gridSlot,\n    yearPicker: yearPickerSlot,\n  };\n};\n"],"names":["useCalendarMonth","props","ref","allFocusable","calendarMonthColumns","dateRangeType","firstDayOfWeek","formatters","maxDate","minDate","restrictedDates","workWeekDays","today","contextToday","value","useCalendarContext","grid","header","navigation","nextYearButton","onHeaderSelect","onUserHeaderSelect","onNavigateDate","onSelectDate","previousYearButton","heading","yearPicker","yearPickerHidden","React","useMemo","Date","navigatedDate","selectedDate","undefined","restrictedDatesOptions","yearPickerRef","useRef","focusOnUpdate","isYearPickerVisible","setIsYearPickerVisible","useState","navigate","ev","date","focusOnNavigatedDay","event","type","getCalendarEventType","onSelectMonth","newMonth","setMonth","availableDates","getAvailableDates","getDateRange","length","find","rangeDate","compareDatePart","selectedDateRange","showYearPicker","current","focus","useEventCallback","onSelectYear","data","selectedYear","year","navYear","getFullYear","newNavigationDate","addYears","getMonth","onYearPickerHeaderSelect","yearString","dateTime","format","isPrevYearInBounds","getYearStart","isNextYearInBounds","getYearEnd","headerIsClickable","months","Array","from","_","monthIndex","indexedMonth","label","index","isNavigated","isCurrent","isSelected","isInBounds","getMonthEnd","getMonthStart","some","isRestrictedDate","focusableMonth","month","gridSlot","getCell","tabStop","activeCellIndex","useCalendarPickerGrid","columns","defaultTabStop","resetKey","options","useImperativeHandle","imperativeRef","useEffect","monthRows","getCalendarPickerRows","getMonthCellProps","cellProps","getCalendarPickerCellProps","overrides","getCellProps","root","mergeProps","button","children","getMonthRowProps","row","role","getRowProps","yearPickerProps","navigatedYear","previousYearDate","nextYearDate","onSelectPrevYear","onSelectNextYear","yearPickerSlot","slot","always","defaultProps","elementType","CalendarYear","useMergedRefs","headingSlot","monthPickerHeaderLabel","formattedDate","span","aria-live","aria-atomic","tabIndex","onClick","mergeCallbacks","isDefaultPrevented","onKeyDown","onCalendarEnterKeyDown","components","getIntrinsicElementProps","resolveCalendarNavigationButton","previousYearLabel","nextYearLabel"],"mappings":"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"}