{"version":3,"sources":["../../../src/components/Calendar/useCalendar.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Escape, PageDown, PageUp } from '@fluentui/keyboard-keys';\nimport {\n  getIntrinsicElementProps,\n  mergeCallbacks,\n  slot,\n  useAnimationFrame,\n  useControllableState,\n  useEventCallback,\n  useMergedRefs,\n} from '@fluentui/react-utilities';\nimport { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts';\n\nimport {\n  addMonths,\n  addYears,\n  compareDatePart,\n  calendarFormatters as defaultCalendarFormatters,\n  isRestrictedDate,\n} from './utils';\nimport { CalendarDay } from './CalendarDay/CalendarDay';\nimport { CalendarMonth } from './CalendarMonth/CalendarMonth';\nimport { getCalendarNavigationDate } from './utils/calendarNavigation';\nimport { isCalendarKeyboardEditable, isCalendarKeyboardEventFromNestedWidget } from './hooks/useCalendarGrid';\nimport type { DayOfWeek } from './utils';\nimport type {\n  CalendarDayHandle,\n  CalendarDayNavigateData,\n  CalendarDaySelectData,\n} from './CalendarDay/CalendarDay.types';\nimport type { CalendarMonthHandle, CalendarMonthNavigateData } from './CalendarMonth/CalendarMonth.types';\nimport type { CalendarProps, CalendarState } from './Calendar.types';\n\nconst defaultWorkWeekDays: DayOfWeek[] = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday'];\n\nfunction useDateState({\n  defaultDisplayedDate,\n  defaultValue,\n  displayedDate,\n  maxDate,\n  minDate,\n  onDisplayedDateChange,\n  onSelectDate,\n  restrictedDates,\n  today,\n  value,\n}: Pick<\n  CalendarProps,\n  | 'defaultDisplayedDate'\n  | 'defaultValue'\n  | 'displayedDate'\n  | 'maxDate'\n  | 'minDate'\n  | 'onDisplayedDateChange'\n  | 'onSelectDate'\n  | 'restrictedDates'\n  | 'value'\n> & {\n  today: Date;\n}) {\n  const resolveDate = (date: Date): Date => {\n    let resolvedDate = date;\n\n    if (minDate && compareDatePart(resolvedDate, minDate) < 0) {\n      resolvedDate = minDate;\n    } else if (maxDate && compareDatePart(resolvedDate, maxDate) > 0) {\n      resolvedDate = maxDate;\n    }\n\n    return resolvedDate;\n  };\n\n  const [selectedDateState, setSelectedDate] = useControllableState({\n    state: value,\n    defaultState: defaultValue && resolveDate(defaultValue),\n    initialState: null,\n  });\n  const selectedDate =\n    selectedDateState && compareDatePart(selectedDateState, resolveDate(selectedDateState)) !== 0\n      ? null\n      : selectedDateState;\n  const warnedOutOfRange = React.useRef(false);\n  const isControlledValueOutOfRange = !!value && compareDatePart(value, resolveDate(value)) !== 0;\n  React.useEffect(() => {\n    if (process.env.NODE_ENV !== 'production' && isControlledValueOutOfRange && !warnedOutOfRange.current) {\n      warnedOutOfRange.current = true;\n      // eslint-disable-next-line no-console\n      console.warn('Calendar: value is outside minDate/maxDate and is rendered as an empty selection.');\n    }\n  }, [isControlledValueOutOfRange]);\n\n  const initialDisplayedDate = resolveDate(defaultDisplayedDate ?? selectedDate ?? today);\n  const [navigatedDateState = initialDisplayedDate, setNavigatedDate] = useControllableState({\n    state: displayedDate,\n    initialState: initialDisplayedDate,\n  });\n  const navigatedDate = resolveDate(navigatedDateState);\n\n  const valueTimestamp = value?.getTime();\n  const [previousValueTimestamp, setPreviousValueTimestamp] = React.useState(valueTimestamp);\n  if (!Object.is(previousValueTimestamp, valueTimestamp)) {\n    setPreviousValueTimestamp(valueTimestamp);\n    if (value && displayedDate === undefined) {\n      setNavigatedDate(resolveDate(value));\n    }\n  }\n\n  const navigate = useEventCallback((date: Date, ev: React.SyntheticEvent | Event) => {\n    const resolvedDate = resolveDate(date);\n    setNavigatedDate(resolvedDate);\n    onDisplayedDateChange?.(ev, {\n      event: ev as React.SyntheticEvent<HTMLElement>,\n      type: ev.type === 'keydown' ? 'keydown' : 'click',\n      displayedDate: resolvedDate,\n    });\n  });\n\n  // Stable identity: this is published on the calendar context, which would otherwise change every render.\n  const onDateSelected = useEventCallback((ev: React.SyntheticEvent | Event, data: CalendarDaySelectData) => {\n    const { date } = data;\n    if (isRestrictedDate(date, { minDate, maxDate, restrictedDates })) {\n      return;\n    }\n\n    const selectedDateRange = data.selectedDateRange.filter(\n      rangeDate => !isRestrictedDate(rangeDate, { minDate, maxDate, restrictedDates }),\n    );\n\n    setSelectedDate(date);\n    onSelectDate?.(ev, { ...data, date, selectedDateRange });\n  });\n\n  return [selectedDate, navigatedDate, onDateSelected, navigate, resolveDate] as const;\n}\n\nfunction useVisibilityState({\n  dayPicker,\n  defaultView,\n  layout = 'sideBySide',\n  monthPicker,\n  onViewChange,\n  view: viewProp,\n}: Pick<CalendarProps, 'dayPicker' | 'defaultView' | 'layout' | 'monthPicker' | 'onViewChange' | 'view'>) {\n  const [view = 'day', setView] = useControllableState({\n    state: viewProp,\n    defaultState: viewProp === undefined ? defaultView : undefined,\n    initialState: 'day' as const,\n  });\n  const hasDayPicker = dayPicker !== null;\n  const hasMonthPicker = monthPicker !== null;\n  const isOverlay = hasDayPicker && hasMonthPicker && layout === 'overlay';\n  const isDayPickerVisible = hasDayPicker && (!isOverlay || view === 'day');\n  const isMonthPickerVisible = hasMonthPicker && (!isOverlay || view === 'month');\n\n  const toggleDayMonthPickerVisibility = (ev: React.SyntheticEvent | Event) => {\n    const nextView = view === 'day' ? 'month' : 'day';\n    setView(nextView);\n    onViewChange?.(ev, {\n      event: ev as React.SyntheticEvent<HTMLElement>,\n      type: ev.type === 'keydown' ? 'keydown' : 'click',\n      view: nextView,\n    });\n  };\n\n  return [isMonthPickerVisible, isDayPickerVisible, isOverlay, toggleDayMonthPickerVisibility] as const;\n}\n\n/**\n * Creates Calendar state and resolves its headless picker slots.\n * @param props - Props from this instance of Calendar.\n * @param ref - Reference to Calendar's root element.\n */\nexport const useCalendar = (props: CalendarProps, ref: React.Ref<HTMLDivElement>): CalendarState => {\n  const {\n    allFocusable = false,\n    calendarMonthColumns = 4,\n    calendarYearColumns = 4,\n    dateRangeType = 'day',\n    defaultDisplayedDate,\n    defaultValue,\n    defaultView,\n    divider,\n    displayedDate,\n    firstDayOfWeek = 'sunday',\n    firstWeekOfYear = 'firstDay',\n    formatters: formatterOverrides,\n    goToTodayButton,\n    liveRegion,\n    layout,\n    maxDate,\n    minDate,\n    monthPickerWrapper,\n    onDismiss,\n    onDisplayedDateChange,\n    onSelectDate,\n    onViewChange,\n    restrictedDates,\n    showWeekNumbers = false,\n    today: todayProp,\n    value,\n    view,\n    workWeekDays = defaultWorkWeekDays,\n  } = props;\n\n  const formatters = React.useMemo(\n    () => (formatterOverrides ? { ...defaultCalendarFormatters, ...formatterOverrides } : defaultCalendarFormatters),\n    [formatterOverrides],\n  );\n\n  const today = React.useMemo(() => todayProp ?? new Date(), [todayProp]);\n\n  const [selectedDate, navigatedDate, onDateSelected, navigate, resolveDate] = useDateState({\n    defaultDisplayedDate,\n    defaultValue,\n    displayedDate,\n    maxDate,\n    minDate,\n    onDisplayedDateChange,\n    onSelectDate,\n    restrictedDates,\n    value,\n    today,\n  });\n\n  const [isMonthPickerVisible, isDayPickerVisible, isOverlay, toggleDayMonthPickerVisibility] = useVisibilityState({\n    dayPicker: props.dayPicker,\n    defaultView,\n    layout,\n    monthPicker: props.monthPicker,\n    onViewChange,\n    view,\n  });\n\n  const dayPickerRef = React.useRef<CalendarDayHandle>(null);\n  const monthPickerRef = React.useRef<CalendarMonthHandle>(null);\n  const rootRef = React.useRef<HTMLDivElement>(null);\n  const mergedRootRef = useMergedRefs(ref, rootRef);\n  const focusedPicker = React.useRef<'day' | 'month' | undefined>(undefined);\n  const isFocusWithin = React.useRef(false);\n  const focusOnUpdate = React.useRef(false);\n  const [requestAnimationFrame, cancelAnimationFrame] = useAnimationFrame();\n  const { targetDocument } = useFluent();\n\n  const cancelFocus = () => {\n    focusedPicker.current = undefined;\n    isFocusWithin.current = false;\n    focusOnUpdate.current = false;\n    cancelAnimationFrame();\n  };\n\n  const onDocumentFocus = useEventCallback((ev: FocusEvent) => {\n    const root = rootRef.current;\n    if (root && !ev.composedPath().includes(root)) {\n      cancelFocus();\n    }\n  });\n\n  // Removing a focused cell may not emit blur, so also observe the next focus target.\n  React.useEffect(() => {\n    targetDocument?.addEventListener('focusin', onDocumentFocus, true);\n    return () => targetDocument?.removeEventListener('focusin', onDocumentFocus, true);\n  }, [onDocumentFocus, targetDocument]);\n\n  const focus = useEventCallback(() => {\n    requestAnimationFrame(() => {\n      if (targetDocument?.activeElement !== targetDocument?.body && !isFocusWithin.current) {\n        return;\n      }\n\n      if (isDayPickerVisible && dayPickerRef.current) {\n        dayPickerRef.current.focus();\n      } else if (isMonthPickerVisible && monthPickerRef.current) {\n        monthPickerRef.current.focus();\n      }\n    });\n  });\n\n  React.useEffect(() => {\n    if (focusOnUpdate.current) {\n      focus();\n      focusOnUpdate.current = false;\n    }\n  });\n\n  React.useEffect(() => {\n    if (\n      (focusedPicker.current === 'day' && !isDayPickerVisible) ||\n      (focusedPicker.current === 'month' && !isMonthPickerVisible)\n    ) {\n      focus();\n    }\n  }, [focus, isDayPickerVisible, isMonthPickerVisible]);\n\n  const focusOnNextUpdate = () => {\n    focusOnUpdate.current = true;\n  };\n\n  const onNavigateDate = useEventCallback(\n    (ev: React.SyntheticEvent | Event, data: CalendarDayNavigateData | CalendarMonthNavigateData): void => {\n      if (data.focusOnNavigatedDay) {\n        focusOnNextUpdate();\n      }\n      navigate(data.date, ev);\n    },\n  );\n\n  const onHeaderSelect = useEventCallback((ev: React.SyntheticEvent | Event, _data): void => {\n    toggleDayMonthPickerVisibility(ev);\n    focusOnNextUpdate();\n  });\n\n  const onRootKeyDown = useEventCallback((ev: React.KeyboardEvent<HTMLDivElement>): void => {\n    props.onKeyDown?.(ev);\n\n    if (ev.isDefaultPrevented()) {\n      return;\n    }\n\n    switch (ev.key) {\n      case Escape:\n        if (onDismiss) {\n          ev.stopPropagation();\n          onDismiss(ev, { event: ev, type: 'keydown' });\n        }\n        break;\n\n      case PageUp:\n      case PageDown: {\n        if (\n          isCalendarKeyboardEditable(ev.target) ||\n          isCalendarKeyboardEventFromNestedWidget(ev.target, ev.currentTarget)\n        ) {\n          break;\n        }\n        const date = getCalendarNavigationDate(ev.nativeEvent) ?? navigatedDate;\n        const direction = ev.key === PageUp ? -1 : 1;\n        navigate(ev.shiftKey ? addYears(date, direction) : addMonths(date, direction), ev);\n        focusOnNextUpdate();\n        ev.preventDefault();\n        break;\n      }\n\n      default:\n        break;\n    }\n  });\n\n  const onRootFocusCapture = useEventCallback((ev: React.FocusEvent<HTMLDivElement>): void => {\n    isFocusWithin.current = true;\n    props.onFocusCapture?.(ev);\n\n    const picker = ev.target.closest('[data-fui-calendar-picker]');\n    const pickerType =\n      picker && ev.currentTarget.contains(picker) ? picker.getAttribute('data-fui-calendar-picker') : undefined;\n    focusedPicker.current = pickerType === 'day' || pickerType === 'month' ? pickerType : undefined;\n  });\n\n  const onRootBlurCapture = useEventCallback((ev: React.FocusEvent<HTMLDivElement>): void => {\n    props.onBlurCapture?.(ev);\n    if (!ev.currentTarget.contains(ev.relatedTarget)) {\n      cancelFocus();\n    }\n  });\n\n  const formattedToday = formatters.dateTime({ date: today, format: 'monthDayYear' });\n  const todayDateString = formatters.todayDateLabel({ date: today, formattedDate: formattedToday });\n  const selectedDateString = selectedDate\n    ? formatters.selectedDateLabel({\n        date: selectedDate,\n        formattedDate: formatters.dateTime({ date: selectedDate, format: 'monthDayYear' }),\n      })\n    : '';\n  const isMonthOnly = props.dayPicker === null;\n\n  const dayPicker = slot.optional(props.dayPicker, {\n    renderByDefault: true,\n    defaultProps: {\n      grid: {\n        'aria-label': `${formatters.dateTime({\n          date: navigatedDate,\n          format: 'monthYear',\n        })}, ${selectedDateString}, ${todayDateString}`,\n      },\n      navigatedDate,\n      onDismiss,\n      onHeaderSelect: isOverlay ? onHeaderSelect : undefined,\n      onNavigateDate,\n    },\n    elementType: CalendarDay,\n  });\n  const monthPicker = slot.optional(props.monthPicker, {\n    renderByDefault: true,\n    defaultProps: {\n      navigatedDate,\n      selectedDate: isMonthOnly ? selectedDate : navigatedDate,\n      onSelectDate: isMonthOnly ? onDateSelected : undefined,\n      onHeaderSelect: isOverlay ? onHeaderSelect : undefined,\n      onNavigateDate,\n    },\n    elementType: CalendarMonth,\n  });\n  const mergedDayPickerRef = useMergedRefs(dayPickerRef, dayPicker?.imperativeRef);\n  const mergedMonthPickerRef = useMergedRefs(monthPickerRef, monthPicker?.imperativeRef);\n  if (dayPicker) {\n    dayPicker.imperativeRef = mergedDayPickerRef;\n  }\n  if (monthPicker) {\n    monthPicker.imperativeRef = mergedMonthPickerRef;\n  }\n  const resolvedToday = resolveDate(today);\n  const goToTodayEnabled =\n    navigatedDate.getFullYear() !== resolvedToday.getFullYear() ||\n    navigatedDate.getMonth() !== resolvedToday.getMonth() ||\n    (dayPicker?.weeksToShow !== undefined &&\n      dayPicker.weeksToShow <= 5 &&\n      compareDatePart(dayPicker.navigatedDate ?? navigatedDate, resolvedToday) !== 0);\n  const onGotoToday = useEventCallback((ev: React.MouseEvent<HTMLButtonElement>): void => {\n    if (ev.isDefaultPrevented() || !goToTodayEnabled) {\n      return;\n    }\n\n    navigate(resolvedToday, ev);\n    if (isOverlay && isMonthPickerVisible) {\n      toggleDayMonthPickerVisibility(ev);\n    }\n    focusOnNextUpdate();\n  });\n  const goToTodaySlot = slot.optional(goToTodayButton, {\n    renderByDefault: true,\n    defaultProps: {\n      children: formatters.goToTodayLabel(),\n      'aria-disabled': !goToTodayEnabled,\n      disabled: !goToTodayEnabled && !allFocusable,\n      type: 'button',\n    },\n    elementType: 'button',\n  });\n  if (goToTodaySlot) {\n    goToTodaySlot.onClick = mergeCallbacks(goToTodaySlot.onClick, onGotoToday);\n  }\n\n  return {\n    allFocusable,\n    calendarMonthColumns,\n    calendarYearColumns,\n    dateRangeType,\n    firstDayOfWeek,\n    firstWeekOfYear,\n    formatters,\n    maxDate,\n    minDate,\n    restrictedDates,\n    setValue: onDateSelected,\n    showWeekNumbers,\n    today,\n    value: selectedDate,\n    workWeekDays,\n    isDayPickerVisible,\n    isMonthPickerVisible,\n    components: {\n      root: 'div',\n      liveRegion: 'div',\n      divider: 'div',\n      monthPickerWrapper: 'div',\n      goToTodayButton: 'button',\n      dayPicker: CalendarDay,\n      monthPicker: CalendarMonth,\n    },\n    root: slot.always(\n      getIntrinsicElementProps(\n        'div',\n        {\n          ref: mergedRootRef,\n          ...props,\n          'data-fui-calendar-root': '',\n          onBlurCapture: onRootBlurCapture,\n          onFocusCapture: onRootFocusCapture,\n          onKeyDown: onRootKeyDown,\n        },\n        ['defaultValue'],\n      ),\n      {\n        elementType: 'div',\n      },\n    ),\n    liveRegion: slot.always(liveRegion, {\n      defaultProps: {\n        'aria-atomic': true,\n        'aria-live': 'polite',\n        children: selectedDateString,\n      },\n      elementType: 'div',\n    }),\n    divider: slot.always(divider, {\n      elementType: 'div',\n    }),\n    monthPickerWrapper: slot.always(monthPickerWrapper, {\n      elementType: 'div',\n    }),\n    goToTodayButton: goToTodaySlot,\n    dayPicker,\n    monthPicker,\n  };\n};\n"],"names":["useCalendar","defaultWorkWeekDays","useDateState","defaultDisplayedDate","defaultValue","displayedDate","maxDate","minDate","onDisplayedDateChange","onSelectDate","restrictedDates","today","value","resolveDate","date","resolvedDate","compareDatePart","selectedDateState","setSelectedDate","useControllableState","state","defaultState","initialState","selectedDate","warnedOutOfRange","React","useRef","isControlledValueOutOfRange","useEffect","process","env","NODE_ENV","current","console","warn","initialDisplayedDate","navigatedDateState","setNavigatedDate","navigatedDate","valueTimestamp","getTime","previousValueTimestamp","setPreviousValueTimestamp","useState","Object","is","undefined","navigate","useEventCallback","ev","event","type","onDateSelected","data","isRestrictedDate","selectedDateRange","filter","rangeDate","useVisibilityState","dayPicker","defaultView","layout","monthPicker","onViewChange","view","viewProp","setView","hasDayPicker","hasMonthPicker","isOverlay","isDayPickerVisible","isMonthPickerVisible","toggleDayMonthPickerVisibility","nextView","props","ref","allFocusable","calendarMonthColumns","calendarYearColumns","dateRangeType","divider","firstDayOfWeek","firstWeekOfYear","formatters","formatterOverrides","goToTodayButton","liveRegion","monthPickerWrapper","onDismiss","showWeekNumbers","todayProp","workWeekDays","useMemo","defaultCalendarFormatters","Date","dayPickerRef","monthPickerRef","rootRef","mergedRootRef","useMergedRefs","focusedPicker","isFocusWithin","focusOnUpdate","requestAnimationFrame","cancelAnimationFrame","useAnimationFrame","targetDocument","useFluent","cancelFocus","onDocumentFocus","root","composedPath","includes","addEventListener","removeEventListener","focus","activeElement","body","focusOnNextUpdate","onNavigateDate","focusOnNavigatedDay","onHeaderSelect","_data","onRootKeyDown","onKeyDown","isDefaultPrevented","key","Escape","stopPropagation","PageUp","PageDown","isCalendarKeyboardEditable","target","isCalendarKeyboardEventFromNestedWidget","currentTarget","getCalendarNavigationDate","nativeEvent","direction","shiftKey","addYears","addMonths","preventDefault","onRootFocusCapture","onFocusCapture","picker","closest","pickerType","contains","getAttribute","onRootBlurCapture","onBlurCapture","relatedTarget","formattedToday","dateTime","format","todayDateString","todayDateLabel","formattedDate","selectedDateString","selectedDateLabel","isMonthOnly","slot","optional","renderByDefault","defaultProps","grid","elementType","CalendarDay","CalendarMonth","mergedDayPickerRef","imperativeRef","mergedMonthPickerRef","resolvedToday","goToTodayEnabled","getFullYear","getMonth","weeksToShow","onGotoToday","goToTodaySlot","children","goToTodayLabel","disabled","onClick","mergeCallbacks","setValue","components","always","getIntrinsicElementProps"],"mappings":"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"}