@transferwise/components 0.0.0-experimental-2371aee → 0.0.0-experimental-d6d5b6e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,6 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var React = require('react');
6
6
  var reactIntl = require('react-intl');
7
+ var formatting = require('@transferwise/formatting');
7
8
  require('../common/theme.js');
8
9
  require('../common/direction.js');
9
10
  require('@transferwise/neptune-tokens');
@@ -23,7 +24,6 @@ require('../common/PropsValues/variant.js');
23
24
  require('../common/PropsValues/scroll.js');
24
25
  require('../common/PropsValues/markdownNodeType.js');
25
26
  require('../common/fileType.js');
26
- require('@transferwise/formatting');
27
27
  require('@transferwise/icons');
28
28
  require('clsx');
29
29
  require('../common/CloseButton/CloseButton.messages.js');
@@ -64,11 +64,11 @@ const Calendar = ({
64
64
  // eslint-disable-next-line react-hooks/set-state-in-effect
65
65
  setFocusedDate(selectedDate);
66
66
  }, [selectedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps
67
- const focusedDateDisabled = focusedDate ? !isWithinRange.isWithinRange(focusedDate, min, max) || isDateDisabled.isDateDisabled(focusedDate, disabledRules) : false;
68
67
  const checkIsEnabled = date => {
69
68
  if (!date) return true;
70
69
  return isWithinRange.isWithinRange(date, min, max) && !isDateDisabled.isDateDisabled(date, disabledRulesRef.current);
71
70
  };
71
+ const focusedDateDisabled = focusedDate ? !isWithinRange.isWithinRange(focusedDate, min, max) || isDateDisabled.isDateDisabled(focusedDate, disabledRules) : false;
72
72
  React.useEffect(() => {
73
73
  if (selectedDate && !isWithinRange.isWithinRange(selectedDate, min, max)) {
74
74
  const clamped = moveToWithinRange.moveToWithinRange(selectedDate, min, max);
@@ -154,24 +154,18 @@ const Calendar = ({
154
154
  case 'Enter':
155
155
  case ' ':
156
156
  if (mode === 'day' && focusedDate && event.target.hasAttribute('data-calendar-cell')) {
157
- const isEnabled = checkIsEnabled(focusedDate);
158
- onDateFocus?.(focusedDate, {
159
- isEnabled
160
- });
161
- if (isEnabled && onChange) {
162
- onChange(focusedDate);
163
- }
157
+ handleSelectedDateUpdate(focusedDate);
164
158
  event.preventDefault();
165
159
  }
166
160
  break;
167
161
  }
168
- }, [adjustDate, focusedDate, mode, onDateFocus, onChange]);
162
+ }, [adjustDate, focusedDate, mode, handleSelectedDateUpdate]);
169
163
  const focusedDateOutOfRange = focusedDate ? !isWithinRange.isWithinRange(focusedDate, min, max) : false;
170
- const formatDateForPrompt = date => new Intl.DateTimeFormat(intl.locale, {
164
+ const formatDateForPrompt = date => formatting.formatDate(date, intl.locale, {
171
165
  day: 'numeric',
172
166
  month: 'long',
173
167
  year: 'numeric'
174
- }).format(date);
168
+ });
175
169
  const outOfRangePromptText = min && max ? intl.formatMessage(Calendar_messages.default.outOfRangeBetween, {
176
170
  min: formatDateForPrompt(min),
177
171
  max: formatDateForPrompt(max)
@@ -1 +1 @@
1
- {"version":3,"file":"Calendar.js","sources":["../../src/Calendar/Calendar.tsx"],"sourcesContent":["import { useState, useCallback, useEffect, useId, useRef, KeyboardEvent } from 'react';\nimport { useIntl } from 'react-intl';\n\nimport { MonthFormat } from '../common';\nimport {\n isWithinRange,\n moveToWithinRange,\n returnDateView,\n isDateDisabled,\n hasDisabledDatesInMonth,\n} from '../common/DateUtils';\nimport { InlinePrompt } from '../Prompt/InlinePrompt';\nimport type { DateChangeMeta, DisabledRules } from './Calendar.types';\nimport DayCalendar from './DayCalendar';\nimport { getStartOfDay } from './GetStartOfDay';\nimport messages from './Calendar.messages';\nimport MonthCalendar from './MonthCalendar';\nimport YearCalendar from './YearCalendar';\n\nexport interface CalendarProps {\n /** The currently selected date, or `null` for no selection. */\n value: Date | null;\n /** Earliest selectable date (inclusive). Dates before this are interactive but not selectable, and show a boundary prompt. */\n min?: Date | null;\n /** Latest selectable date (inclusive). Dates after this are interactive but not selectable, and show a boundary prompt. */\n max?: Date | null;\n /** Month name format in the header. Defaults to `'long'` (e.g. \"January\"). */\n monthFormat?: `${MonthFormat}`;\n /** Placeholder text shown in the month/year cells when no date is selected. */\n placeholder?: string;\n /** Rules for disabling specific weekdays, individual dates, or date ranges. The required `reason` is shown in an inline prompt and linked to disabled cells via `aria-describedby` for screen reader accessibility. */\n disabledRules?: DisabledRules;\n /** Called whenever the focused date changes — including disabled and out-of-range dates. `meta.isEnabled` is `false` when the date is not selectable. */\n onDateFocus?: (date: Date | null, meta: DateChangeMeta) => void;\n /** Called when a date is confirmed (click or Enter). Only fires for enabled dates. */\n onChange?: (date: Date) => void;\n}\n\n\n/**\n * Inline calendar for selecting a single date. Powers [DateLookup](?path=/docs/forms-datelookup--docs).\n */\nconst Calendar = ({\n value,\n min: minProp = null,\n max: maxProp = null,\n monthFormat = MonthFormat.LONG,\n placeholder,\n disabledRules,\n onDateFocus,\n onChange,\n}: CalendarProps) => {\n const intl = useIntl();\n const selectedDate = getStartOfDay(value);\n const min = getStartOfDay(minProp);\n const max = getStartOfDay(maxProp);\n const disabledReasonId = useId();\n const disabledRulesRef = useRef(disabledRules);\n useEffect(() => {\n disabledRulesRef.current = disabledRules;\n });\n\n const [focusedDate, setFocusedDate] = useState<Date | null>(selectedDate);\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setFocusedDate(selectedDate);\n }, [selectedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const focusedDateDisabled = focusedDate\n ? !isWithinRange(focusedDate, min, max) || isDateDisabled(focusedDate, disabledRules)\n : false;\n\n const checkIsEnabled = (date: Date | null) => {\n if (!date) return true;\n return isWithinRange(date, min, max) && !isDateDisabled(date, disabledRulesRef.current);\n };\n\n useEffect(() => {\n if (selectedDate && !isWithinRange(selectedDate, min, max)) {\n const clamped = moveToWithinRange(selectedDate, min, max);\n setFocusedDate(clamped); // eslint-disable-line react-hooks/set-state-in-effect\n onDateFocus?.(clamped, { isEnabled: checkIsEnabled(clamped) });\n }\n }, [selectedDate?.getTime(), min?.getTime(), max?.getTime(), onDateFocus]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const dateView = returnDateView(selectedDate, min, max);\n const [viewMonth, setViewMonth] = useState(dateView.getMonth());\n const [viewYear, setViewYear] = useState(dateView.getFullYear());\n const [mode, setMode] = useState<'day' | 'month' | 'year'>('day');\n\n useEffect(() => {\n const view = returnDateView(selectedDate, min, max);\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setViewMonth(view.getMonth());\n\n setViewYear(view.getFullYear());\n }, [selectedDate?.getTime(), min?.getTime(), max?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (focusedDate) {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setViewMonth(focusedDate.getMonth());\n setViewYear(focusedDate.getFullYear());\n }\n }, [focusedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleViewDateUpdate = useCallback(\n // eslint-disable-next-line react-hooks/preserve-manual-memoization\n ({ month, year }: { month?: number; year?: number }) => {\n if (month !== undefined) setViewMonth(month);\n if (year !== undefined) setViewYear(year);\n },\n [],\n );\n\n const switchToDays = useCallback(() => setMode('day'), []);\n const switchToMonths = useCallback(() => setMode('month'), []);\n const switchToYears = useCallback(() => setMode('year'), []);\n\n const handleSelectedDateUpdate = useCallback(\n (date: Date) => {\n const isEnabled = checkIsEnabled(date);\n setFocusedDate(date);\n onDateFocus?.(date, { isEnabled });\n if (isEnabled && onChange) {\n onChange(date);\n }\n },\n [onDateFocus, onChange], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const adjustDate = useCallback(\n (daysToAdd: number, monthsToAdd: number, yearsToAdd: number) => {\n const base = focusedDate ?? selectedDate;\n let date: Date | null;\n if (base) {\n date = new Date(\n mode === 'year' ? base.getFullYear() + yearsToAdd : base.getFullYear(),\n mode === 'month' ? base.getMonth() + monthsToAdd : base.getMonth(),\n mode === 'day' ? base.getDate() + daysToAdd : base.getDate(),\n );\n } else {\n date = getStartOfDay(new Date());\n }\n date &&= moveToWithinRange(date, min, max);\n if (date?.getTime() !== focusedDate?.getTime()) {\n setFocusedDate(date);\n onDateFocus?.(date, { isEnabled: checkIsEnabled(date) });\n }\n },\n [focusedDate, selectedDate, min, max, mode, onDateFocus], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowLeft':\n adjustDate(-1, -1, -1);\n event.preventDefault();\n break;\n case 'ArrowUp':\n adjustDate(-7, -4, -4);\n event.preventDefault();\n break;\n case 'ArrowRight':\n adjustDate(1, 1, 1);\n event.preventDefault();\n break;\n case 'ArrowDown':\n adjustDate(7, 4, 4);\n event.preventDefault();\n break;\n case 'Enter':\n case ' ':\n if (\n mode === 'day' &&\n focusedDate &&\n (event.target as HTMLElement).hasAttribute('data-calendar-cell')\n ) {\n const isEnabled = checkIsEnabled(focusedDate);\n onDateFocus?.(focusedDate, { isEnabled });\n if (isEnabled && onChange) {\n onChange(focusedDate);\n }\n event.preventDefault();\n }\n break;\n default:\n break;\n }\n },\n [adjustDate, focusedDate, mode, onDateFocus, onChange], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const focusedDateOutOfRange = focusedDate ? !isWithinRange(focusedDate, min, max) : false;\n\n const formatDateForPrompt = (date: Date) =>\n new Intl.DateTimeFormat(intl.locale, { day: 'numeric', month: 'long', year: 'numeric' }).format(\n date,\n );\n\n const outOfRangePromptText =\n min && max\n ? intl.formatMessage(messages.outOfRangeBetween, {\n min: formatDateForPrompt(min),\n max: formatDateForPrompt(max),\n })\n : min\n ? intl.formatMessage(messages.outOfRangeAfter, { min: formatDateForPrompt(min) })\n : max\n ? intl.formatMessage(messages.outOfRangeBefore, { max: formatDateForPrompt(max) })\n : '';\n\n const hasOutOfRangeDates = mode === 'day' && !!(min || max);\n const showRulesPrompt =\n mode === 'day' &&\n !!disabledRules &&\n hasDisabledDatesInMonth(viewMonth, viewYear, disabledRules, min, max);\n const showOutOfRangePrompt = mode === 'day' && focusedDateOutOfRange;\n const showPrompt = hasOutOfRangeDates || showRulesPrompt;\n\n const promptText = showOutOfRangePrompt\n ? outOfRangePromptText\n : (disabledRules?.reason ?? outOfRangePromptText);\n const promptSentiment = showOutOfRangePrompt || focusedDateDisabled ? 'negative' : 'neutral';\n const promptClassName =\n showOutOfRangePrompt || (showRulesPrompt && !showOutOfRangePrompt) ? 'm-t-1' : 'sr-only';\n\n return (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div onKeyDown={handleKeyDown}>\n {mode === 'day' && (\n <DayCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewMonth={viewMonth}\n viewYear={viewYear}\n monthFormat={monthFormat}\n disabledRules={disabledRules}\n disabledReasonId={showPrompt ? disabledReasonId : undefined}\n onSelect={handleSelectedDateUpdate}\n onLabelClick={switchToYears}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {mode === 'month' && (\n <MonthCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewYear={viewYear}\n {...(placeholder != null && { placeholder })}\n onSelect={switchToDays}\n onLabelClick={switchToYears}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {mode === 'year' && (\n <YearCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewYear={viewYear}\n {...(placeholder != null && { placeholder })}\n onSelect={switchToMonths}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {showPrompt && (\n <InlinePrompt\n sentiment={promptSentiment}\n width=\"full\"\n id={disabledReasonId}\n className={promptClassName}\n >\n {promptText}\n </InlinePrompt>\n )}\n </div>\n );\n};\n\nexport default Calendar;\n"],"names":["Calendar","value","min","minProp","max","maxProp","monthFormat","MonthFormat","LONG","placeholder","disabledRules","onDateFocus","onChange","intl","useIntl","selectedDate","getStartOfDay","disabledReasonId","useId","disabledRulesRef","useRef","useEffect","current","focusedDate","setFocusedDate","useState","getTime","focusedDateDisabled","isWithinRange","isDateDisabled","checkIsEnabled","date","clamped","moveToWithinRange","isEnabled","dateView","returnDateView","viewMonth","setViewMonth","getMonth","viewYear","setViewYear","getFullYear","mode","setMode","view","handleViewDateUpdate","useCallback","month","year","undefined","switchToDays","switchToMonths","switchToYears","handleSelectedDateUpdate","adjustDate","daysToAdd","monthsToAdd","yearsToAdd","base","Date","getDate","handleKeyDown","event","key","preventDefault","target","hasAttribute","focusedDateOutOfRange","formatDateForPrompt","Intl","DateTimeFormat","locale","day","format","outOfRangePromptText","formatMessage","messages","outOfRangeBetween","outOfRangeAfter","outOfRangeBefore","hasOutOfRangeDates","showRulesPrompt","hasDisabledDatesInMonth","showOutOfRangePrompt","showPrompt","promptText","reason","promptSentiment","promptClassName","_jsxs","onKeyDown","children","_jsx","DayCalendar","onSelect","onLabelClick","onViewDateUpdate","MonthCalendar","YearCalendar","InlinePrompt","sentiment","width","id","className"],"mappings":"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"}
1
+ {"version":3,"file":"Calendar.js","sources":["../../src/Calendar/Calendar.tsx"],"sourcesContent":["import { useState, useCallback, useEffect, useId, useRef, KeyboardEvent } from 'react';\nimport { useIntl } from 'react-intl';\nimport { formatDate } from '@transferwise/formatting';\n\nimport { MonthFormat } from '../common';\nimport {\n isWithinRange,\n moveToWithinRange,\n returnDateView,\n isDateDisabled,\n hasDisabledDatesInMonth,\n} from '../common/DateUtils';\nimport { InlinePrompt } from '../Prompt/InlinePrompt';\nimport type { DateChangeMeta, DisabledRules } from './Calendar.types';\nimport DayCalendar from './DayCalendar';\nimport { getStartOfDay } from './GetStartOfDay';\nimport messages from './Calendar.messages';\nimport MonthCalendar from './MonthCalendar';\nimport YearCalendar from './YearCalendar';\n\nexport interface CalendarProps {\n /** The currently selected date, or `null` for no selection. */\n value: Date | null;\n /** Earliest selectable date (inclusive). Dates before this are interactive but not selectable, and show a boundary prompt. */\n min?: Date | null;\n /** Latest selectable date (inclusive). Dates after this are interactive but not selectable, and show a boundary prompt. */\n max?: Date | null;\n /** Month name format in the header. Defaults to `'long'` (e.g. \"January\"). */\n monthFormat?: `${MonthFormat}`;\n /** Placeholder text shown in the month/year cells when no date is selected. */\n placeholder?: string;\n /** Rules for disabling specific weekdays, individual dates, or date ranges. The required `reason` is shown in an inline prompt and linked to disabled cells via `aria-describedby` for screen reader accessibility. */\n disabledRules?: DisabledRules;\n /** Called whenever the focused date changes — including disabled and out-of-range dates. `meta.isEnabled` is `false` when the date is not selectable. */\n onDateFocus?: (date: Date | null, meta: DateChangeMeta) => void;\n /** Called when a date is confirmed (click or Enter). Only fires for enabled dates. */\n onChange?: (date: Date) => void;\n}\n\n/**\n * Inline calendar for selecting a single date. Powers [DateLookup](?path=/docs/forms-datelookup--docs).\n */\nconst Calendar = ({\n value,\n min: minProp = null,\n max: maxProp = null,\n monthFormat = MonthFormat.LONG,\n placeholder,\n disabledRules,\n onDateFocus,\n onChange,\n}: CalendarProps) => {\n const intl = useIntl();\n const selectedDate = getStartOfDay(value);\n const min = getStartOfDay(minProp);\n const max = getStartOfDay(maxProp);\n const disabledReasonId = useId();\n const disabledRulesRef = useRef(disabledRules);\n useEffect(() => {\n disabledRulesRef.current = disabledRules;\n });\n\n const [focusedDate, setFocusedDate] = useState<Date | null>(selectedDate);\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setFocusedDate(selectedDate);\n }, [selectedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const checkIsEnabled = (date: Date | null) => {\n if (!date) return true;\n return isWithinRange(date, min, max) && !isDateDisabled(date, disabledRulesRef.current);\n };\n\n const focusedDateDisabled = focusedDate\n ? !isWithinRange(focusedDate, min, max) || isDateDisabled(focusedDate, disabledRules)\n : false;\n\n useEffect(() => {\n if (selectedDate && !isWithinRange(selectedDate, min, max)) {\n const clamped = moveToWithinRange(selectedDate, min, max);\n setFocusedDate(clamped); // eslint-disable-line react-hooks/set-state-in-effect\n onDateFocus?.(clamped, { isEnabled: checkIsEnabled(clamped) });\n }\n }, [selectedDate?.getTime(), min?.getTime(), max?.getTime(), onDateFocus]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const dateView = returnDateView(selectedDate, min, max);\n const [viewMonth, setViewMonth] = useState(dateView.getMonth());\n const [viewYear, setViewYear] = useState(dateView.getFullYear());\n const [mode, setMode] = useState<'day' | 'month' | 'year'>('day');\n\n useEffect(() => {\n const view = returnDateView(selectedDate, min, max);\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setViewMonth(view.getMonth());\n\n setViewYear(view.getFullYear());\n }, [selectedDate?.getTime(), min?.getTime(), max?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (focusedDate) {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setViewMonth(focusedDate.getMonth());\n setViewYear(focusedDate.getFullYear());\n }\n }, [focusedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleViewDateUpdate = useCallback(\n // eslint-disable-next-line react-hooks/preserve-manual-memoization\n ({ month, year }: { month?: number; year?: number }) => {\n if (month !== undefined) setViewMonth(month);\n if (year !== undefined) setViewYear(year);\n },\n [],\n );\n\n const switchToDays = useCallback(() => setMode('day'), []);\n const switchToMonths = useCallback(() => setMode('month'), []);\n const switchToYears = useCallback(() => setMode('year'), []);\n\n const handleSelectedDateUpdate = useCallback(\n (date: Date) => {\n const isEnabled = checkIsEnabled(date);\n setFocusedDate(date);\n onDateFocus?.(date, { isEnabled });\n if (isEnabled && onChange) {\n onChange(date);\n }\n },\n [onDateFocus, onChange], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const adjustDate = useCallback(\n (daysToAdd: number, monthsToAdd: number, yearsToAdd: number) => {\n const base = focusedDate ?? selectedDate;\n let date: Date | null;\n if (base) {\n date = new Date(\n mode === 'year' ? base.getFullYear() + yearsToAdd : base.getFullYear(),\n mode === 'month' ? base.getMonth() + monthsToAdd : base.getMonth(),\n mode === 'day' ? base.getDate() + daysToAdd : base.getDate(),\n );\n } else {\n date = getStartOfDay(new Date());\n }\n date &&= moveToWithinRange(date, min, max);\n if (date?.getTime() !== focusedDate?.getTime()) {\n setFocusedDate(date);\n onDateFocus?.(date, { isEnabled: checkIsEnabled(date) });\n }\n },\n [focusedDate, selectedDate, min, max, mode, onDateFocus], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowLeft':\n adjustDate(-1, -1, -1);\n event.preventDefault();\n break;\n case 'ArrowUp':\n adjustDate(-7, -4, -4);\n event.preventDefault();\n break;\n case 'ArrowRight':\n adjustDate(1, 1, 1);\n event.preventDefault();\n break;\n case 'ArrowDown':\n adjustDate(7, 4, 4);\n event.preventDefault();\n break;\n case 'Enter':\n case ' ':\n if (\n mode === 'day' &&\n focusedDate &&\n (event.target as HTMLElement).hasAttribute('data-calendar-cell')\n ) {\n handleSelectedDateUpdate(focusedDate);\n event.preventDefault();\n }\n break;\n default:\n break;\n }\n },\n [adjustDate, focusedDate, mode, handleSelectedDateUpdate], \n );\n\n const focusedDateOutOfRange = focusedDate ? !isWithinRange(focusedDate, min, max) : false;\n\n const formatDateForPrompt = (date: Date) =>\n formatDate(date, intl.locale, { day: 'numeric', month: 'long', year: 'numeric' });\n\n const outOfRangePromptText =\n min && max\n ? intl.formatMessage(messages.outOfRangeBetween, {\n min: formatDateForPrompt(min),\n max: formatDateForPrompt(max),\n })\n : min\n ? intl.formatMessage(messages.outOfRangeAfter, { min: formatDateForPrompt(min) })\n : max\n ? intl.formatMessage(messages.outOfRangeBefore, { max: formatDateForPrompt(max) })\n : '';\n\n const hasOutOfRangeDates = mode === 'day' && !!(min || max);\n const showRulesPrompt =\n mode === 'day' &&\n !!disabledRules &&\n hasDisabledDatesInMonth(viewMonth, viewYear, disabledRules, min, max);\n const showOutOfRangePrompt = mode === 'day' && focusedDateOutOfRange;\n const showPrompt = hasOutOfRangeDates || showRulesPrompt;\n\n const promptText = showOutOfRangePrompt\n ? outOfRangePromptText\n : (disabledRules?.reason ?? outOfRangePromptText);\n const promptSentiment = showOutOfRangePrompt || focusedDateDisabled ? 'negative' : 'neutral';\n const promptClassName =\n showOutOfRangePrompt || (showRulesPrompt && !showOutOfRangePrompt) ? 'm-t-1' : 'sr-only';\n\n return (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div onKeyDown={handleKeyDown}>\n {mode === 'day' && (\n <DayCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewMonth={viewMonth}\n viewYear={viewYear}\n monthFormat={monthFormat}\n disabledRules={disabledRules}\n disabledReasonId={showPrompt ? disabledReasonId : undefined}\n onSelect={handleSelectedDateUpdate}\n onLabelClick={switchToYears}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {mode === 'month' && (\n <MonthCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewYear={viewYear}\n {...(placeholder != null && { placeholder })}\n onSelect={switchToDays}\n onLabelClick={switchToYears}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {mode === 'year' && (\n <YearCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewYear={viewYear}\n {...(placeholder != null && { placeholder })}\n onSelect={switchToMonths}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {showPrompt && (\n <InlinePrompt\n sentiment={promptSentiment}\n width=\"full\"\n id={disabledReasonId}\n className={promptClassName}\n >\n {promptText}\n </InlinePrompt>\n )}\n </div>\n );\n};\n\nexport default Calendar;\n"],"names":["Calendar","value","min","minProp","max","maxProp","monthFormat","MonthFormat","LONG","placeholder","disabledRules","onDateFocus","onChange","intl","useIntl","selectedDate","getStartOfDay","disabledReasonId","useId","disabledRulesRef","useRef","useEffect","current","focusedDate","setFocusedDate","useState","getTime","checkIsEnabled","date","isWithinRange","isDateDisabled","focusedDateDisabled","clamped","moveToWithinRange","isEnabled","dateView","returnDateView","viewMonth","setViewMonth","getMonth","viewYear","setViewYear","getFullYear","mode","setMode","view","handleViewDateUpdate","useCallback","month","year","undefined","switchToDays","switchToMonths","switchToYears","handleSelectedDateUpdate","adjustDate","daysToAdd","monthsToAdd","yearsToAdd","base","Date","getDate","handleKeyDown","event","key","preventDefault","target","hasAttribute","focusedDateOutOfRange","formatDateForPrompt","formatDate","locale","day","outOfRangePromptText","formatMessage","messages","outOfRangeBetween","outOfRangeAfter","outOfRangeBefore","hasOutOfRangeDates","showRulesPrompt","hasDisabledDatesInMonth","showOutOfRangePrompt","showPrompt","promptText","reason","promptSentiment","promptClassName","_jsxs","onKeyDown","children","_jsx","DayCalendar","onSelect","onLabelClick","onViewDateUpdate","MonthCalendar","YearCalendar","InlinePrompt","sentiment","width","id","className"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { useId, useRef, useEffect, useState, useCallback } from 'react';
2
2
  import { useIntl } from 'react-intl';
3
+ import { formatDate } from '@transferwise/formatting';
3
4
  import '../common/theme.mjs';
4
5
  import '../common/direction.mjs';
5
6
  import '@transferwise/neptune-tokens';
@@ -19,7 +20,6 @@ import '../common/PropsValues/variant.mjs';
19
20
  import '../common/PropsValues/scroll.mjs';
20
21
  import '../common/PropsValues/markdownNodeType.mjs';
21
22
  import '../common/fileType.mjs';
22
- import '@transferwise/formatting';
23
23
  import '@transferwise/icons';
24
24
  import 'clsx';
25
25
  import '../common/CloseButton/CloseButton.messages.mjs';
@@ -60,11 +60,11 @@ const Calendar = ({
60
60
  // eslint-disable-next-line react-hooks/set-state-in-effect
61
61
  setFocusedDate(selectedDate);
62
62
  }, [selectedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps
63
- const focusedDateDisabled = focusedDate ? !isWithinRange(focusedDate, min, max) || isDateDisabled(focusedDate, disabledRules) : false;
64
63
  const checkIsEnabled = date => {
65
64
  if (!date) return true;
66
65
  return isWithinRange(date, min, max) && !isDateDisabled(date, disabledRulesRef.current);
67
66
  };
67
+ const focusedDateDisabled = focusedDate ? !isWithinRange(focusedDate, min, max) || isDateDisabled(focusedDate, disabledRules) : false;
68
68
  useEffect(() => {
69
69
  if (selectedDate && !isWithinRange(selectedDate, min, max)) {
70
70
  const clamped = moveToWithinRange(selectedDate, min, max);
@@ -150,24 +150,18 @@ const Calendar = ({
150
150
  case 'Enter':
151
151
  case ' ':
152
152
  if (mode === 'day' && focusedDate && event.target.hasAttribute('data-calendar-cell')) {
153
- const isEnabled = checkIsEnabled(focusedDate);
154
- onDateFocus?.(focusedDate, {
155
- isEnabled
156
- });
157
- if (isEnabled && onChange) {
158
- onChange(focusedDate);
159
- }
153
+ handleSelectedDateUpdate(focusedDate);
160
154
  event.preventDefault();
161
155
  }
162
156
  break;
163
157
  }
164
- }, [adjustDate, focusedDate, mode, onDateFocus, onChange]);
158
+ }, [adjustDate, focusedDate, mode, handleSelectedDateUpdate]);
165
159
  const focusedDateOutOfRange = focusedDate ? !isWithinRange(focusedDate, min, max) : false;
166
- const formatDateForPrompt = date => new Intl.DateTimeFormat(intl.locale, {
160
+ const formatDateForPrompt = date => formatDate(date, intl.locale, {
167
161
  day: 'numeric',
168
162
  month: 'long',
169
163
  year: 'numeric'
170
- }).format(date);
164
+ });
171
165
  const outOfRangePromptText = min && max ? intl.formatMessage(messages.outOfRangeBetween, {
172
166
  min: formatDateForPrompt(min),
173
167
  max: formatDateForPrompt(max)
@@ -1 +1 @@
1
- {"version":3,"file":"Calendar.mjs","sources":["../../src/Calendar/Calendar.tsx"],"sourcesContent":["import { useState, useCallback, useEffect, useId, useRef, KeyboardEvent } from 'react';\nimport { useIntl } from 'react-intl';\n\nimport { MonthFormat } from '../common';\nimport {\n isWithinRange,\n moveToWithinRange,\n returnDateView,\n isDateDisabled,\n hasDisabledDatesInMonth,\n} from '../common/DateUtils';\nimport { InlinePrompt } from '../Prompt/InlinePrompt';\nimport type { DateChangeMeta, DisabledRules } from './Calendar.types';\nimport DayCalendar from './DayCalendar';\nimport { getStartOfDay } from './GetStartOfDay';\nimport messages from './Calendar.messages';\nimport MonthCalendar from './MonthCalendar';\nimport YearCalendar from './YearCalendar';\n\nexport interface CalendarProps {\n /** The currently selected date, or `null` for no selection. */\n value: Date | null;\n /** Earliest selectable date (inclusive). Dates before this are interactive but not selectable, and show a boundary prompt. */\n min?: Date | null;\n /** Latest selectable date (inclusive). Dates after this are interactive but not selectable, and show a boundary prompt. */\n max?: Date | null;\n /** Month name format in the header. Defaults to `'long'` (e.g. \"January\"). */\n monthFormat?: `${MonthFormat}`;\n /** Placeholder text shown in the month/year cells when no date is selected. */\n placeholder?: string;\n /** Rules for disabling specific weekdays, individual dates, or date ranges. The required `reason` is shown in an inline prompt and linked to disabled cells via `aria-describedby` for screen reader accessibility. */\n disabledRules?: DisabledRules;\n /** Called whenever the focused date changes — including disabled and out-of-range dates. `meta.isEnabled` is `false` when the date is not selectable. */\n onDateFocus?: (date: Date | null, meta: DateChangeMeta) => void;\n /** Called when a date is confirmed (click or Enter). Only fires for enabled dates. */\n onChange?: (date: Date) => void;\n}\n\n\n/**\n * Inline calendar for selecting a single date. Powers [DateLookup](?path=/docs/forms-datelookup--docs).\n */\nconst Calendar = ({\n value,\n min: minProp = null,\n max: maxProp = null,\n monthFormat = MonthFormat.LONG,\n placeholder,\n disabledRules,\n onDateFocus,\n onChange,\n}: CalendarProps) => {\n const intl = useIntl();\n const selectedDate = getStartOfDay(value);\n const min = getStartOfDay(minProp);\n const max = getStartOfDay(maxProp);\n const disabledReasonId = useId();\n const disabledRulesRef = useRef(disabledRules);\n useEffect(() => {\n disabledRulesRef.current = disabledRules;\n });\n\n const [focusedDate, setFocusedDate] = useState<Date | null>(selectedDate);\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setFocusedDate(selectedDate);\n }, [selectedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const focusedDateDisabled = focusedDate\n ? !isWithinRange(focusedDate, min, max) || isDateDisabled(focusedDate, disabledRules)\n : false;\n\n const checkIsEnabled = (date: Date | null) => {\n if (!date) return true;\n return isWithinRange(date, min, max) && !isDateDisabled(date, disabledRulesRef.current);\n };\n\n useEffect(() => {\n if (selectedDate && !isWithinRange(selectedDate, min, max)) {\n const clamped = moveToWithinRange(selectedDate, min, max);\n setFocusedDate(clamped); // eslint-disable-line react-hooks/set-state-in-effect\n onDateFocus?.(clamped, { isEnabled: checkIsEnabled(clamped) });\n }\n }, [selectedDate?.getTime(), min?.getTime(), max?.getTime(), onDateFocus]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const dateView = returnDateView(selectedDate, min, max);\n const [viewMonth, setViewMonth] = useState(dateView.getMonth());\n const [viewYear, setViewYear] = useState(dateView.getFullYear());\n const [mode, setMode] = useState<'day' | 'month' | 'year'>('day');\n\n useEffect(() => {\n const view = returnDateView(selectedDate, min, max);\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setViewMonth(view.getMonth());\n\n setViewYear(view.getFullYear());\n }, [selectedDate?.getTime(), min?.getTime(), max?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (focusedDate) {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setViewMonth(focusedDate.getMonth());\n setViewYear(focusedDate.getFullYear());\n }\n }, [focusedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleViewDateUpdate = useCallback(\n // eslint-disable-next-line react-hooks/preserve-manual-memoization\n ({ month, year }: { month?: number; year?: number }) => {\n if (month !== undefined) setViewMonth(month);\n if (year !== undefined) setViewYear(year);\n },\n [],\n );\n\n const switchToDays = useCallback(() => setMode('day'), []);\n const switchToMonths = useCallback(() => setMode('month'), []);\n const switchToYears = useCallback(() => setMode('year'), []);\n\n const handleSelectedDateUpdate = useCallback(\n (date: Date) => {\n const isEnabled = checkIsEnabled(date);\n setFocusedDate(date);\n onDateFocus?.(date, { isEnabled });\n if (isEnabled && onChange) {\n onChange(date);\n }\n },\n [onDateFocus, onChange], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const adjustDate = useCallback(\n (daysToAdd: number, monthsToAdd: number, yearsToAdd: number) => {\n const base = focusedDate ?? selectedDate;\n let date: Date | null;\n if (base) {\n date = new Date(\n mode === 'year' ? base.getFullYear() + yearsToAdd : base.getFullYear(),\n mode === 'month' ? base.getMonth() + monthsToAdd : base.getMonth(),\n mode === 'day' ? base.getDate() + daysToAdd : base.getDate(),\n );\n } else {\n date = getStartOfDay(new Date());\n }\n date &&= moveToWithinRange(date, min, max);\n if (date?.getTime() !== focusedDate?.getTime()) {\n setFocusedDate(date);\n onDateFocus?.(date, { isEnabled: checkIsEnabled(date) });\n }\n },\n [focusedDate, selectedDate, min, max, mode, onDateFocus], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowLeft':\n adjustDate(-1, -1, -1);\n event.preventDefault();\n break;\n case 'ArrowUp':\n adjustDate(-7, -4, -4);\n event.preventDefault();\n break;\n case 'ArrowRight':\n adjustDate(1, 1, 1);\n event.preventDefault();\n break;\n case 'ArrowDown':\n adjustDate(7, 4, 4);\n event.preventDefault();\n break;\n case 'Enter':\n case ' ':\n if (\n mode === 'day' &&\n focusedDate &&\n (event.target as HTMLElement).hasAttribute('data-calendar-cell')\n ) {\n const isEnabled = checkIsEnabled(focusedDate);\n onDateFocus?.(focusedDate, { isEnabled });\n if (isEnabled && onChange) {\n onChange(focusedDate);\n }\n event.preventDefault();\n }\n break;\n default:\n break;\n }\n },\n [adjustDate, focusedDate, mode, onDateFocus, onChange], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const focusedDateOutOfRange = focusedDate ? !isWithinRange(focusedDate, min, max) : false;\n\n const formatDateForPrompt = (date: Date) =>\n new Intl.DateTimeFormat(intl.locale, { day: 'numeric', month: 'long', year: 'numeric' }).format(\n date,\n );\n\n const outOfRangePromptText =\n min && max\n ? intl.formatMessage(messages.outOfRangeBetween, {\n min: formatDateForPrompt(min),\n max: formatDateForPrompt(max),\n })\n : min\n ? intl.formatMessage(messages.outOfRangeAfter, { min: formatDateForPrompt(min) })\n : max\n ? intl.formatMessage(messages.outOfRangeBefore, { max: formatDateForPrompt(max) })\n : '';\n\n const hasOutOfRangeDates = mode === 'day' && !!(min || max);\n const showRulesPrompt =\n mode === 'day' &&\n !!disabledRules &&\n hasDisabledDatesInMonth(viewMonth, viewYear, disabledRules, min, max);\n const showOutOfRangePrompt = mode === 'day' && focusedDateOutOfRange;\n const showPrompt = hasOutOfRangeDates || showRulesPrompt;\n\n const promptText = showOutOfRangePrompt\n ? outOfRangePromptText\n : (disabledRules?.reason ?? outOfRangePromptText);\n const promptSentiment = showOutOfRangePrompt || focusedDateDisabled ? 'negative' : 'neutral';\n const promptClassName =\n showOutOfRangePrompt || (showRulesPrompt && !showOutOfRangePrompt) ? 'm-t-1' : 'sr-only';\n\n return (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div onKeyDown={handleKeyDown}>\n {mode === 'day' && (\n <DayCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewMonth={viewMonth}\n viewYear={viewYear}\n monthFormat={monthFormat}\n disabledRules={disabledRules}\n disabledReasonId={showPrompt ? disabledReasonId : undefined}\n onSelect={handleSelectedDateUpdate}\n onLabelClick={switchToYears}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {mode === 'month' && (\n <MonthCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewYear={viewYear}\n {...(placeholder != null && { placeholder })}\n onSelect={switchToDays}\n onLabelClick={switchToYears}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {mode === 'year' && (\n <YearCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewYear={viewYear}\n {...(placeholder != null && { placeholder })}\n onSelect={switchToMonths}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {showPrompt && (\n <InlinePrompt\n sentiment={promptSentiment}\n width=\"full\"\n id={disabledReasonId}\n className={promptClassName}\n >\n {promptText}\n </InlinePrompt>\n )}\n </div>\n );\n};\n\nexport default Calendar;\n"],"names":["Calendar","value","min","minProp","max","maxProp","monthFormat","MonthFormat","LONG","placeholder","disabledRules","onDateFocus","onChange","intl","useIntl","selectedDate","getStartOfDay","disabledReasonId","useId","disabledRulesRef","useRef","useEffect","current","focusedDate","setFocusedDate","useState","getTime","focusedDateDisabled","isWithinRange","isDateDisabled","checkIsEnabled","date","clamped","moveToWithinRange","isEnabled","dateView","returnDateView","viewMonth","setViewMonth","getMonth","viewYear","setViewYear","getFullYear","mode","setMode","view","handleViewDateUpdate","useCallback","month","year","undefined","switchToDays","switchToMonths","switchToYears","handleSelectedDateUpdate","adjustDate","daysToAdd","monthsToAdd","yearsToAdd","base","Date","getDate","handleKeyDown","event","key","preventDefault","target","hasAttribute","focusedDateOutOfRange","formatDateForPrompt","Intl","DateTimeFormat","locale","day","format","outOfRangePromptText","formatMessage","messages","outOfRangeBetween","outOfRangeAfter","outOfRangeBefore","hasOutOfRangeDates","showRulesPrompt","hasDisabledDatesInMonth","showOutOfRangePrompt","showPrompt","promptText","reason","promptSentiment","promptClassName","_jsxs","onKeyDown","children","_jsx","DayCalendar","onSelect","onLabelClick","onViewDateUpdate","MonthCalendar","YearCalendar","InlinePrompt","sentiment","width","id","className"],"mappings":"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"}
1
+ {"version":3,"file":"Calendar.mjs","sources":["../../src/Calendar/Calendar.tsx"],"sourcesContent":["import { useState, useCallback, useEffect, useId, useRef, KeyboardEvent } from 'react';\nimport { useIntl } from 'react-intl';\nimport { formatDate } from '@transferwise/formatting';\n\nimport { MonthFormat } from '../common';\nimport {\n isWithinRange,\n moveToWithinRange,\n returnDateView,\n isDateDisabled,\n hasDisabledDatesInMonth,\n} from '../common/DateUtils';\nimport { InlinePrompt } from '../Prompt/InlinePrompt';\nimport type { DateChangeMeta, DisabledRules } from './Calendar.types';\nimport DayCalendar from './DayCalendar';\nimport { getStartOfDay } from './GetStartOfDay';\nimport messages from './Calendar.messages';\nimport MonthCalendar from './MonthCalendar';\nimport YearCalendar from './YearCalendar';\n\nexport interface CalendarProps {\n /** The currently selected date, or `null` for no selection. */\n value: Date | null;\n /** Earliest selectable date (inclusive). Dates before this are interactive but not selectable, and show a boundary prompt. */\n min?: Date | null;\n /** Latest selectable date (inclusive). Dates after this are interactive but not selectable, and show a boundary prompt. */\n max?: Date | null;\n /** Month name format in the header. Defaults to `'long'` (e.g. \"January\"). */\n monthFormat?: `${MonthFormat}`;\n /** Placeholder text shown in the month/year cells when no date is selected. */\n placeholder?: string;\n /** Rules for disabling specific weekdays, individual dates, or date ranges. The required `reason` is shown in an inline prompt and linked to disabled cells via `aria-describedby` for screen reader accessibility. */\n disabledRules?: DisabledRules;\n /** Called whenever the focused date changes — including disabled and out-of-range dates. `meta.isEnabled` is `false` when the date is not selectable. */\n onDateFocus?: (date: Date | null, meta: DateChangeMeta) => void;\n /** Called when a date is confirmed (click or Enter). Only fires for enabled dates. */\n onChange?: (date: Date) => void;\n}\n\n/**\n * Inline calendar for selecting a single date. Powers [DateLookup](?path=/docs/forms-datelookup--docs).\n */\nconst Calendar = ({\n value,\n min: minProp = null,\n max: maxProp = null,\n monthFormat = MonthFormat.LONG,\n placeholder,\n disabledRules,\n onDateFocus,\n onChange,\n}: CalendarProps) => {\n const intl = useIntl();\n const selectedDate = getStartOfDay(value);\n const min = getStartOfDay(minProp);\n const max = getStartOfDay(maxProp);\n const disabledReasonId = useId();\n const disabledRulesRef = useRef(disabledRules);\n useEffect(() => {\n disabledRulesRef.current = disabledRules;\n });\n\n const [focusedDate, setFocusedDate] = useState<Date | null>(selectedDate);\n\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setFocusedDate(selectedDate);\n }, [selectedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const checkIsEnabled = (date: Date | null) => {\n if (!date) return true;\n return isWithinRange(date, min, max) && !isDateDisabled(date, disabledRulesRef.current);\n };\n\n const focusedDateDisabled = focusedDate\n ? !isWithinRange(focusedDate, min, max) || isDateDisabled(focusedDate, disabledRules)\n : false;\n\n useEffect(() => {\n if (selectedDate && !isWithinRange(selectedDate, min, max)) {\n const clamped = moveToWithinRange(selectedDate, min, max);\n setFocusedDate(clamped); // eslint-disable-line react-hooks/set-state-in-effect\n onDateFocus?.(clamped, { isEnabled: checkIsEnabled(clamped) });\n }\n }, [selectedDate?.getTime(), min?.getTime(), max?.getTime(), onDateFocus]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const dateView = returnDateView(selectedDate, min, max);\n const [viewMonth, setViewMonth] = useState(dateView.getMonth());\n const [viewYear, setViewYear] = useState(dateView.getFullYear());\n const [mode, setMode] = useState<'day' | 'month' | 'year'>('day');\n\n useEffect(() => {\n const view = returnDateView(selectedDate, min, max);\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setViewMonth(view.getMonth());\n\n setViewYear(view.getFullYear());\n }, [selectedDate?.getTime(), min?.getTime(), max?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (focusedDate) {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setViewMonth(focusedDate.getMonth());\n setViewYear(focusedDate.getFullYear());\n }\n }, [focusedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleViewDateUpdate = useCallback(\n // eslint-disable-next-line react-hooks/preserve-manual-memoization\n ({ month, year }: { month?: number; year?: number }) => {\n if (month !== undefined) setViewMonth(month);\n if (year !== undefined) setViewYear(year);\n },\n [],\n );\n\n const switchToDays = useCallback(() => setMode('day'), []);\n const switchToMonths = useCallback(() => setMode('month'), []);\n const switchToYears = useCallback(() => setMode('year'), []);\n\n const handleSelectedDateUpdate = useCallback(\n (date: Date) => {\n const isEnabled = checkIsEnabled(date);\n setFocusedDate(date);\n onDateFocus?.(date, { isEnabled });\n if (isEnabled && onChange) {\n onChange(date);\n }\n },\n [onDateFocus, onChange], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const adjustDate = useCallback(\n (daysToAdd: number, monthsToAdd: number, yearsToAdd: number) => {\n const base = focusedDate ?? selectedDate;\n let date: Date | null;\n if (base) {\n date = new Date(\n mode === 'year' ? base.getFullYear() + yearsToAdd : base.getFullYear(),\n mode === 'month' ? base.getMonth() + monthsToAdd : base.getMonth(),\n mode === 'day' ? base.getDate() + daysToAdd : base.getDate(),\n );\n } else {\n date = getStartOfDay(new Date());\n }\n date &&= moveToWithinRange(date, min, max);\n if (date?.getTime() !== focusedDate?.getTime()) {\n setFocusedDate(date);\n onDateFocus?.(date, { isEnabled: checkIsEnabled(date) });\n }\n },\n [focusedDate, selectedDate, min, max, mode, onDateFocus], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowLeft':\n adjustDate(-1, -1, -1);\n event.preventDefault();\n break;\n case 'ArrowUp':\n adjustDate(-7, -4, -4);\n event.preventDefault();\n break;\n case 'ArrowRight':\n adjustDate(1, 1, 1);\n event.preventDefault();\n break;\n case 'ArrowDown':\n adjustDate(7, 4, 4);\n event.preventDefault();\n break;\n case 'Enter':\n case ' ':\n if (\n mode === 'day' &&\n focusedDate &&\n (event.target as HTMLElement).hasAttribute('data-calendar-cell')\n ) {\n handleSelectedDateUpdate(focusedDate);\n event.preventDefault();\n }\n break;\n default:\n break;\n }\n },\n [adjustDate, focusedDate, mode, handleSelectedDateUpdate], \n );\n\n const focusedDateOutOfRange = focusedDate ? !isWithinRange(focusedDate, min, max) : false;\n\n const formatDateForPrompt = (date: Date) =>\n formatDate(date, intl.locale, { day: 'numeric', month: 'long', year: 'numeric' });\n\n const outOfRangePromptText =\n min && max\n ? intl.formatMessage(messages.outOfRangeBetween, {\n min: formatDateForPrompt(min),\n max: formatDateForPrompt(max),\n })\n : min\n ? intl.formatMessage(messages.outOfRangeAfter, { min: formatDateForPrompt(min) })\n : max\n ? intl.formatMessage(messages.outOfRangeBefore, { max: formatDateForPrompt(max) })\n : '';\n\n const hasOutOfRangeDates = mode === 'day' && !!(min || max);\n const showRulesPrompt =\n mode === 'day' &&\n !!disabledRules &&\n hasDisabledDatesInMonth(viewMonth, viewYear, disabledRules, min, max);\n const showOutOfRangePrompt = mode === 'day' && focusedDateOutOfRange;\n const showPrompt = hasOutOfRangeDates || showRulesPrompt;\n\n const promptText = showOutOfRangePrompt\n ? outOfRangePromptText\n : (disabledRules?.reason ?? outOfRangePromptText);\n const promptSentiment = showOutOfRangePrompt || focusedDateDisabled ? 'negative' : 'neutral';\n const promptClassName =\n showOutOfRangePrompt || (showRulesPrompt && !showOutOfRangePrompt) ? 'm-t-1' : 'sr-only';\n\n return (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div onKeyDown={handleKeyDown}>\n {mode === 'day' && (\n <DayCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewMonth={viewMonth}\n viewYear={viewYear}\n monthFormat={monthFormat}\n disabledRules={disabledRules}\n disabledReasonId={showPrompt ? disabledReasonId : undefined}\n onSelect={handleSelectedDateUpdate}\n onLabelClick={switchToYears}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {mode === 'month' && (\n <MonthCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewYear={viewYear}\n {...(placeholder != null && { placeholder })}\n onSelect={switchToDays}\n onLabelClick={switchToYears}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {mode === 'year' && (\n <YearCalendar\n selectedDate={selectedDate}\n focusedDate={focusedDate}\n min={min}\n max={max}\n viewYear={viewYear}\n {...(placeholder != null && { placeholder })}\n onSelect={switchToMonths}\n onViewDateUpdate={handleViewDateUpdate}\n />\n )}\n {showPrompt && (\n <InlinePrompt\n sentiment={promptSentiment}\n width=\"full\"\n id={disabledReasonId}\n className={promptClassName}\n >\n {promptText}\n </InlinePrompt>\n )}\n </div>\n );\n};\n\nexport default Calendar;\n"],"names":["Calendar","value","min","minProp","max","maxProp","monthFormat","MonthFormat","LONG","placeholder","disabledRules","onDateFocus","onChange","intl","useIntl","selectedDate","getStartOfDay","disabledReasonId","useId","disabledRulesRef","useRef","useEffect","current","focusedDate","setFocusedDate","useState","getTime","checkIsEnabled","date","isWithinRange","isDateDisabled","focusedDateDisabled","clamped","moveToWithinRange","isEnabled","dateView","returnDateView","viewMonth","setViewMonth","getMonth","viewYear","setViewYear","getFullYear","mode","setMode","view","handleViewDateUpdate","useCallback","month","year","undefined","switchToDays","switchToMonths","switchToYears","handleSelectedDateUpdate","adjustDate","daysToAdd","monthsToAdd","yearsToAdd","base","Date","getDate","handleKeyDown","event","key","preventDefault","target","hasAttribute","focusedDateOutOfRange","formatDateForPrompt","formatDate","locale","day","outOfRangePromptText","formatMessage","messages","outOfRangeBetween","outOfRangeAfter","outOfRangeBefore","hasOutOfRangeDates","showRulesPrompt","hasDisabledDatesInMonth","showOutOfRangePrompt","showPrompt","promptText","reason","promptSentiment","promptClassName","_jsxs","onKeyDown","children","_jsx","DayCalendar","onSelect","onLabelClick","onViewDateUpdate","MonthCalendar","YearCalendar","InlinePrompt","sentiment","width","id","className"],"mappings":"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"}
@@ -24,7 +24,7 @@ function isDateDisabled(date, disabledRules) {
24
24
  }
25
25
  }
26
26
  if (disabledRules.ranges?.length) {
27
- const dateStart = new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();
27
+ const dateStart = date.getTime();
28
28
  if (disabledRules.ranges.some(range => {
29
29
  const rangeStart = new Date(range.start.getFullYear(), range.start.getMonth(), range.start.getDate()).getTime();
30
30
  const rangeEnd = new Date(range.end.getFullYear(), range.end.getMonth(), range.end.getDate()).getTime();
@@ -1 +1 @@
1
- {"version":3,"file":"isDateDisabled.js","sources":["../../../../src/common/DateUtils/isDateDisabled/isDateDisabled.ts"],"sourcesContent":["import type { DisabledRules, WeekDayType } from '../../../Calendar/Calendar.types';\n\nconst DAY_INDEX_TO_WEEKDAY: Record<number, WeekDayType> = {\n 0: 'sun',\n 1: 'mon',\n 2: 'tue',\n 3: 'wed',\n 4: 'thu',\n 5: 'fri',\n 6: 'sat',\n};\n\nexport function isDateDisabled(date: Date, disabledRules?: DisabledRules): boolean {\n if (!disabledRules) return false;\n\n if (disabledRules.weekdays?.length) {\n const weekday = DAY_INDEX_TO_WEEKDAY[date.getDay()];\n if (disabledRules.weekdays.includes(weekday)) return true;\n }\n\n if (disabledRules.dates?.length) {\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n if (\n disabledRules.dates.some(\n (disabledDate) =>\n disabledDate.getFullYear() === year &&\n disabledDate.getMonth() === month &&\n disabledDate.getDate() === day,\n )\n ) {\n return true;\n }\n }\n\n if (disabledRules.ranges?.length) {\n const dateStart = new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();\n if (\n disabledRules.ranges.some((range) => {\n const rangeStart = new Date(\n range.start.getFullYear(),\n range.start.getMonth(),\n range.start.getDate(),\n ).getTime();\n const rangeEnd = new Date(\n range.end.getFullYear(),\n range.end.getMonth(),\n range.end.getDate(),\n ).getTime();\n return dateStart >= rangeStart && dateStart <= rangeEnd;\n })\n ) {\n return true;\n }\n }\n\n return false;\n}\n"],"names":["DAY_INDEX_TO_WEEKDAY","isDateDisabled","date","disabledRules","weekdays","length","weekday","getDay","includes","dates","year","getFullYear","month","getMonth","day","getDate","some","disabledDate","ranges","dateStart","Date","getTime","range","rangeStart","start","rangeEnd","end"],"mappings":";;AAEA,MAAMA,oBAAoB,GAAgC;AACxD,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE;CACJ;AAEK,SAAUC,cAAcA,CAACC,IAAU,EAAEC,aAA6B,EAAA;AACtE,EAAA,IAAI,CAACA,aAAa,EAAE,OAAO,KAAK;AAEhC,EAAA,IAAIA,aAAa,CAACC,QAAQ,EAAEC,MAAM,EAAE;IAClC,MAAMC,OAAO,GAAGN,oBAAoB,CAACE,IAAI,CAACK,MAAM,EAAE,CAAC;IACnD,IAAIJ,aAAa,CAACC,QAAQ,CAACI,QAAQ,CAACF,OAAO,CAAC,EAAE,OAAO,IAAI;AAC3D,EAAA;AAEA,EAAA,IAAIH,aAAa,CAACM,KAAK,EAAEJ,MAAM,EAAE;AAC/B,IAAA,MAAMK,IAAI,GAAGR,IAAI,CAACS,WAAW,EAAE;AAC/B,IAAA,MAAMC,KAAK,GAAGV,IAAI,CAACW,QAAQ,EAAE;AAC7B,IAAA,MAAMC,GAAG,GAAGZ,IAAI,CAACa,OAAO,EAAE;AAC1B,IAAA,IACEZ,aAAa,CAACM,KAAK,CAACO,IAAI,CACrBC,YAAY,IACXA,YAAY,CAACN,WAAW,EAAE,KAAKD,IAAI,IACnCO,YAAY,CAACJ,QAAQ,EAAE,KAAKD,KAAK,IACjCK,YAAY,CAACF,OAAO,EAAE,KAAKD,GAAG,CACjC,EACD;AACA,MAAA,OAAO,IAAI;AACb,IAAA;AACF,EAAA;AAEA,EAAA,IAAIX,aAAa,CAACe,MAAM,EAAEb,MAAM,EAAE;IAChC,MAAMc,SAAS,GAAG,IAAIC,IAAI,CAAClB,IAAI,CAACS,WAAW,EAAE,EAAET,IAAI,CAACW,QAAQ,EAAE,EAAEX,IAAI,CAACa,OAAO,EAAE,CAAC,CAACM,OAAO,EAAE;AACzF,IAAA,IACElB,aAAa,CAACe,MAAM,CAACF,IAAI,CAAEM,KAAK,IAAI;AAClC,MAAA,MAAMC,UAAU,GAAG,IAAIH,IAAI,CACzBE,KAAK,CAACE,KAAK,CAACb,WAAW,EAAE,EACzBW,KAAK,CAACE,KAAK,CAACX,QAAQ,EAAE,EACtBS,KAAK,CAACE,KAAK,CAACT,OAAO,EAAE,CACtB,CAACM,OAAO,EAAE;AACX,MAAA,MAAMI,QAAQ,GAAG,IAAIL,IAAI,CACvBE,KAAK,CAACI,GAAG,CAACf,WAAW,EAAE,EACvBW,KAAK,CAACI,GAAG,CAACb,QAAQ,EAAE,EACpBS,KAAK,CAACI,GAAG,CAACX,OAAO,EAAE,CACpB,CAACM,OAAO,EAAE;AACX,MAAA,OAAOF,SAAS,IAAII,UAAU,IAAIJ,SAAS,IAAIM,QAAQ;AACzD,IAAA,CAAC,CAAC,EACF;AACA,MAAA,OAAO,IAAI;AACb,IAAA;AACF,EAAA;AAEA,EAAA,OAAO,KAAK;AACd;;;;"}
1
+ {"version":3,"file":"isDateDisabled.js","sources":["../../../../src/common/DateUtils/isDateDisabled/isDateDisabled.ts"],"sourcesContent":["import type { DisabledRules, WeekDayType } from '../../../Calendar/Calendar.types';\n\nconst DAY_INDEX_TO_WEEKDAY: Record<number, WeekDayType> = {\n 0: 'sun',\n 1: 'mon',\n 2: 'tue',\n 3: 'wed',\n 4: 'thu',\n 5: 'fri',\n 6: 'sat',\n};\n\nexport function isDateDisabled(date: Date, disabledRules?: DisabledRules): boolean {\n if (!disabledRules) return false;\n\n if (disabledRules.weekdays?.length) {\n const weekday = DAY_INDEX_TO_WEEKDAY[date.getDay()];\n if (disabledRules.weekdays.includes(weekday)) return true;\n }\n\n if (disabledRules.dates?.length) {\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n if (\n disabledRules.dates.some(\n (disabledDate) =>\n disabledDate.getFullYear() === year &&\n disabledDate.getMonth() === month &&\n disabledDate.getDate() === day,\n )\n ) {\n return true;\n }\n }\n\n if (disabledRules.ranges?.length) {\n const dateStart = date.getTime();\n if (\n disabledRules.ranges.some((range) => {\n const rangeStart = new Date(\n range.start.getFullYear(),\n range.start.getMonth(),\n range.start.getDate(),\n ).getTime();\n const rangeEnd = new Date(\n range.end.getFullYear(),\n range.end.getMonth(),\n range.end.getDate(),\n ).getTime();\n return dateStart >= rangeStart && dateStart <= rangeEnd;\n })\n ) {\n return true;\n }\n }\n\n return false;\n}\n"],"names":["DAY_INDEX_TO_WEEKDAY","isDateDisabled","date","disabledRules","weekdays","length","weekday","getDay","includes","dates","year","getFullYear","month","getMonth","day","getDate","some","disabledDate","ranges","dateStart","getTime","range","rangeStart","Date","start","rangeEnd","end"],"mappings":";;AAEA,MAAMA,oBAAoB,GAAgC;AACxD,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE;CACJ;AAEK,SAAUC,cAAcA,CAACC,IAAU,EAAEC,aAA6B,EAAA;AACtE,EAAA,IAAI,CAACA,aAAa,EAAE,OAAO,KAAK;AAEhC,EAAA,IAAIA,aAAa,CAACC,QAAQ,EAAEC,MAAM,EAAE;IAClC,MAAMC,OAAO,GAAGN,oBAAoB,CAACE,IAAI,CAACK,MAAM,EAAE,CAAC;IACnD,IAAIJ,aAAa,CAACC,QAAQ,CAACI,QAAQ,CAACF,OAAO,CAAC,EAAE,OAAO,IAAI;AAC3D,EAAA;AAEA,EAAA,IAAIH,aAAa,CAACM,KAAK,EAAEJ,MAAM,EAAE;AAC/B,IAAA,MAAMK,IAAI,GAAGR,IAAI,CAACS,WAAW,EAAE;AAC/B,IAAA,MAAMC,KAAK,GAAGV,IAAI,CAACW,QAAQ,EAAE;AAC7B,IAAA,MAAMC,GAAG,GAAGZ,IAAI,CAACa,OAAO,EAAE;AAC1B,IAAA,IACEZ,aAAa,CAACM,KAAK,CAACO,IAAI,CACrBC,YAAY,IACXA,YAAY,CAACN,WAAW,EAAE,KAAKD,IAAI,IACnCO,YAAY,CAACJ,QAAQ,EAAE,KAAKD,KAAK,IACjCK,YAAY,CAACF,OAAO,EAAE,KAAKD,GAAG,CACjC,EACD;AACA,MAAA,OAAO,IAAI;AACb,IAAA;AACF,EAAA;AAEA,EAAA,IAAIX,aAAa,CAACe,MAAM,EAAEb,MAAM,EAAE;AAChC,IAAA,MAAMc,SAAS,GAAGjB,IAAI,CAACkB,OAAO,EAAE;AAChC,IAAA,IACEjB,aAAa,CAACe,MAAM,CAACF,IAAI,CAAEK,KAAK,IAAI;AAClC,MAAA,MAAMC,UAAU,GAAG,IAAIC,IAAI,CACzBF,KAAK,CAACG,KAAK,CAACb,WAAW,EAAE,EACzBU,KAAK,CAACG,KAAK,CAACX,QAAQ,EAAE,EACtBQ,KAAK,CAACG,KAAK,CAACT,OAAO,EAAE,CACtB,CAACK,OAAO,EAAE;AACX,MAAA,MAAMK,QAAQ,GAAG,IAAIF,IAAI,CACvBF,KAAK,CAACK,GAAG,CAACf,WAAW,EAAE,EACvBU,KAAK,CAACK,GAAG,CAACb,QAAQ,EAAE,EACpBQ,KAAK,CAACK,GAAG,CAACX,OAAO,EAAE,CACpB,CAACK,OAAO,EAAE;AACX,MAAA,OAAOD,SAAS,IAAIG,UAAU,IAAIH,SAAS,IAAIM,QAAQ;AACzD,IAAA,CAAC,CAAC,EACF;AACA,MAAA,OAAO,IAAI;AACb,IAAA;AACF,EAAA;AAEA,EAAA,OAAO,KAAK;AACd;;;;"}
@@ -22,7 +22,7 @@ function isDateDisabled(date, disabledRules) {
22
22
  }
23
23
  }
24
24
  if (disabledRules.ranges?.length) {
25
- const dateStart = new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();
25
+ const dateStart = date.getTime();
26
26
  if (disabledRules.ranges.some(range => {
27
27
  const rangeStart = new Date(range.start.getFullYear(), range.start.getMonth(), range.start.getDate()).getTime();
28
28
  const rangeEnd = new Date(range.end.getFullYear(), range.end.getMonth(), range.end.getDate()).getTime();
@@ -1 +1 @@
1
- {"version":3,"file":"isDateDisabled.mjs","sources":["../../../../src/common/DateUtils/isDateDisabled/isDateDisabled.ts"],"sourcesContent":["import type { DisabledRules, WeekDayType } from '../../../Calendar/Calendar.types';\n\nconst DAY_INDEX_TO_WEEKDAY: Record<number, WeekDayType> = {\n 0: 'sun',\n 1: 'mon',\n 2: 'tue',\n 3: 'wed',\n 4: 'thu',\n 5: 'fri',\n 6: 'sat',\n};\n\nexport function isDateDisabled(date: Date, disabledRules?: DisabledRules): boolean {\n if (!disabledRules) return false;\n\n if (disabledRules.weekdays?.length) {\n const weekday = DAY_INDEX_TO_WEEKDAY[date.getDay()];\n if (disabledRules.weekdays.includes(weekday)) return true;\n }\n\n if (disabledRules.dates?.length) {\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n if (\n disabledRules.dates.some(\n (disabledDate) =>\n disabledDate.getFullYear() === year &&\n disabledDate.getMonth() === month &&\n disabledDate.getDate() === day,\n )\n ) {\n return true;\n }\n }\n\n if (disabledRules.ranges?.length) {\n const dateStart = new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();\n if (\n disabledRules.ranges.some((range) => {\n const rangeStart = new Date(\n range.start.getFullYear(),\n range.start.getMonth(),\n range.start.getDate(),\n ).getTime();\n const rangeEnd = new Date(\n range.end.getFullYear(),\n range.end.getMonth(),\n range.end.getDate(),\n ).getTime();\n return dateStart >= rangeStart && dateStart <= rangeEnd;\n })\n ) {\n return true;\n }\n }\n\n return false;\n}\n"],"names":["DAY_INDEX_TO_WEEKDAY","isDateDisabled","date","disabledRules","weekdays","length","weekday","getDay","includes","dates","year","getFullYear","month","getMonth","day","getDate","some","disabledDate","ranges","dateStart","Date","getTime","range","rangeStart","start","rangeEnd","end"],"mappings":"AAEA,MAAMA,oBAAoB,GAAgC;AACxD,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE;CACJ;AAEK,SAAUC,cAAcA,CAACC,IAAU,EAAEC,aAA6B,EAAA;AACtE,EAAA,IAAI,CAACA,aAAa,EAAE,OAAO,KAAK;AAEhC,EAAA,IAAIA,aAAa,CAACC,QAAQ,EAAEC,MAAM,EAAE;IAClC,MAAMC,OAAO,GAAGN,oBAAoB,CAACE,IAAI,CAACK,MAAM,EAAE,CAAC;IACnD,IAAIJ,aAAa,CAACC,QAAQ,CAACI,QAAQ,CAACF,OAAO,CAAC,EAAE,OAAO,IAAI;AAC3D,EAAA;AAEA,EAAA,IAAIH,aAAa,CAACM,KAAK,EAAEJ,MAAM,EAAE;AAC/B,IAAA,MAAMK,IAAI,GAAGR,IAAI,CAACS,WAAW,EAAE;AAC/B,IAAA,MAAMC,KAAK,GAAGV,IAAI,CAACW,QAAQ,EAAE;AAC7B,IAAA,MAAMC,GAAG,GAAGZ,IAAI,CAACa,OAAO,EAAE;AAC1B,IAAA,IACEZ,aAAa,CAACM,KAAK,CAACO,IAAI,CACrBC,YAAY,IACXA,YAAY,CAACN,WAAW,EAAE,KAAKD,IAAI,IACnCO,YAAY,CAACJ,QAAQ,EAAE,KAAKD,KAAK,IACjCK,YAAY,CAACF,OAAO,EAAE,KAAKD,GAAG,CACjC,EACD;AACA,MAAA,OAAO,IAAI;AACb,IAAA;AACF,EAAA;AAEA,EAAA,IAAIX,aAAa,CAACe,MAAM,EAAEb,MAAM,EAAE;IAChC,MAAMc,SAAS,GAAG,IAAIC,IAAI,CAAClB,IAAI,CAACS,WAAW,EAAE,EAAET,IAAI,CAACW,QAAQ,EAAE,EAAEX,IAAI,CAACa,OAAO,EAAE,CAAC,CAACM,OAAO,EAAE;AACzF,IAAA,IACElB,aAAa,CAACe,MAAM,CAACF,IAAI,CAAEM,KAAK,IAAI;AAClC,MAAA,MAAMC,UAAU,GAAG,IAAIH,IAAI,CACzBE,KAAK,CAACE,KAAK,CAACb,WAAW,EAAE,EACzBW,KAAK,CAACE,KAAK,CAACX,QAAQ,EAAE,EACtBS,KAAK,CAACE,KAAK,CAACT,OAAO,EAAE,CACtB,CAACM,OAAO,EAAE;AACX,MAAA,MAAMI,QAAQ,GAAG,IAAIL,IAAI,CACvBE,KAAK,CAACI,GAAG,CAACf,WAAW,EAAE,EACvBW,KAAK,CAACI,GAAG,CAACb,QAAQ,EAAE,EACpBS,KAAK,CAACI,GAAG,CAACX,OAAO,EAAE,CACpB,CAACM,OAAO,EAAE;AACX,MAAA,OAAOF,SAAS,IAAII,UAAU,IAAIJ,SAAS,IAAIM,QAAQ;AACzD,IAAA,CAAC,CAAC,EACF;AACA,MAAA,OAAO,IAAI;AACb,IAAA;AACF,EAAA;AAEA,EAAA,OAAO,KAAK;AACd;;;;"}
1
+ {"version":3,"file":"isDateDisabled.mjs","sources":["../../../../src/common/DateUtils/isDateDisabled/isDateDisabled.ts"],"sourcesContent":["import type { DisabledRules, WeekDayType } from '../../../Calendar/Calendar.types';\n\nconst DAY_INDEX_TO_WEEKDAY: Record<number, WeekDayType> = {\n 0: 'sun',\n 1: 'mon',\n 2: 'tue',\n 3: 'wed',\n 4: 'thu',\n 5: 'fri',\n 6: 'sat',\n};\n\nexport function isDateDisabled(date: Date, disabledRules?: DisabledRules): boolean {\n if (!disabledRules) return false;\n\n if (disabledRules.weekdays?.length) {\n const weekday = DAY_INDEX_TO_WEEKDAY[date.getDay()];\n if (disabledRules.weekdays.includes(weekday)) return true;\n }\n\n if (disabledRules.dates?.length) {\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n if (\n disabledRules.dates.some(\n (disabledDate) =>\n disabledDate.getFullYear() === year &&\n disabledDate.getMonth() === month &&\n disabledDate.getDate() === day,\n )\n ) {\n return true;\n }\n }\n\n if (disabledRules.ranges?.length) {\n const dateStart = date.getTime();\n if (\n disabledRules.ranges.some((range) => {\n const rangeStart = new Date(\n range.start.getFullYear(),\n range.start.getMonth(),\n range.start.getDate(),\n ).getTime();\n const rangeEnd = new Date(\n range.end.getFullYear(),\n range.end.getMonth(),\n range.end.getDate(),\n ).getTime();\n return dateStart >= rangeStart && dateStart <= rangeEnd;\n })\n ) {\n return true;\n }\n }\n\n return false;\n}\n"],"names":["DAY_INDEX_TO_WEEKDAY","isDateDisabled","date","disabledRules","weekdays","length","weekday","getDay","includes","dates","year","getFullYear","month","getMonth","day","getDate","some","disabledDate","ranges","dateStart","getTime","range","rangeStart","Date","start","rangeEnd","end"],"mappings":"AAEA,MAAMA,oBAAoB,GAAgC;AACxD,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE,KAAK;AACR,EAAA,CAAC,EAAE;CACJ;AAEK,SAAUC,cAAcA,CAACC,IAAU,EAAEC,aAA6B,EAAA;AACtE,EAAA,IAAI,CAACA,aAAa,EAAE,OAAO,KAAK;AAEhC,EAAA,IAAIA,aAAa,CAACC,QAAQ,EAAEC,MAAM,EAAE;IAClC,MAAMC,OAAO,GAAGN,oBAAoB,CAACE,IAAI,CAACK,MAAM,EAAE,CAAC;IACnD,IAAIJ,aAAa,CAACC,QAAQ,CAACI,QAAQ,CAACF,OAAO,CAAC,EAAE,OAAO,IAAI;AAC3D,EAAA;AAEA,EAAA,IAAIH,aAAa,CAACM,KAAK,EAAEJ,MAAM,EAAE;AAC/B,IAAA,MAAMK,IAAI,GAAGR,IAAI,CAACS,WAAW,EAAE;AAC/B,IAAA,MAAMC,KAAK,GAAGV,IAAI,CAACW,QAAQ,EAAE;AAC7B,IAAA,MAAMC,GAAG,GAAGZ,IAAI,CAACa,OAAO,EAAE;AAC1B,IAAA,IACEZ,aAAa,CAACM,KAAK,CAACO,IAAI,CACrBC,YAAY,IACXA,YAAY,CAACN,WAAW,EAAE,KAAKD,IAAI,IACnCO,YAAY,CAACJ,QAAQ,EAAE,KAAKD,KAAK,IACjCK,YAAY,CAACF,OAAO,EAAE,KAAKD,GAAG,CACjC,EACD;AACA,MAAA,OAAO,IAAI;AACb,IAAA;AACF,EAAA;AAEA,EAAA,IAAIX,aAAa,CAACe,MAAM,EAAEb,MAAM,EAAE;AAChC,IAAA,MAAMc,SAAS,GAAGjB,IAAI,CAACkB,OAAO,EAAE;AAChC,IAAA,IACEjB,aAAa,CAACe,MAAM,CAACF,IAAI,CAAEK,KAAK,IAAI;AAClC,MAAA,MAAMC,UAAU,GAAG,IAAIC,IAAI,CACzBF,KAAK,CAACG,KAAK,CAACb,WAAW,EAAE,EACzBU,KAAK,CAACG,KAAK,CAACX,QAAQ,EAAE,EACtBQ,KAAK,CAACG,KAAK,CAACT,OAAO,EAAE,CACtB,CAACK,OAAO,EAAE;AACX,MAAA,MAAMK,QAAQ,GAAG,IAAIF,IAAI,CACvBF,KAAK,CAACK,GAAG,CAACf,WAAW,EAAE,EACvBU,KAAK,CAACK,GAAG,CAACb,QAAQ,EAAE,EACpBQ,KAAK,CAACK,GAAG,CAACX,OAAO,EAAE,CACpB,CAACK,OAAO,EAAE;AACX,MAAA,OAAOD,SAAS,IAAIG,UAAU,IAAIH,SAAS,IAAIM,QAAQ;AACzD,IAAA,CAAC,CAAC,EACF;AACA,MAAA,OAAO,IAAI;AACb,IAAA;AACF,EAAA;AAEA,EAAA,OAAO,KAAK;AACd;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../../src/Calendar/Calendar.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AASxC,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOtE,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,8HAA8H;IAC9H,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,2HAA2H;IAC3H,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,GAAG,WAAW,EAAE,CAAC;IAC/B,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uNAAuN;IACvN,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,yJAAyJ;IACzJ,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAChE,sFAAsF;IACtF,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CACjC;AAGD;;GAEG;AACH,QAAA,MAAM,QAAQ,GAAI,wGASf,aAAa,gCA0Of,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../../src/Calendar/Calendar.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AASxC,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOtE,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,8HAA8H;IAC9H,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,2HAA2H;IAC3H,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,GAAG,WAAW,EAAE,CAAC;IAC/B,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uNAAuN;IACvN,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,yJAAyJ;IACzJ,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAChE,sFAAsF;IACtF,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CACjC;AAED;;GAEG;AACH,QAAA,MAAM,QAAQ,GAAI,wGASf,aAAa,gCAoOf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transferwise/components",
3
- "version": "0.0.0-experimental-2371aee",
3
+ "version": "0.0.0-experimental-d6d5b6e",
4
4
  "description": "Neptune React components",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -1,5 +1,6 @@
1
1
  import { useState, useCallback, useEffect, useId, useRef, KeyboardEvent } from 'react';
2
2
  import { useIntl } from 'react-intl';
3
+ import { formatDate } from '@transferwise/formatting';
3
4
 
4
5
  import { MonthFormat } from '../common';
5
6
  import {
@@ -36,7 +37,6 @@ export interface CalendarProps {
36
37
  onChange?: (date: Date) => void;
37
38
  }
38
39
 
39
-
40
40
  /**
41
41
  * Inline calendar for selecting a single date. Powers [DateLookup](?path=/docs/forms-datelookup--docs).
42
42
  */
@@ -67,15 +67,15 @@ const Calendar = ({
67
67
  setFocusedDate(selectedDate);
68
68
  }, [selectedDate?.getTime()]); // eslint-disable-line react-hooks/exhaustive-deps
69
69
 
70
- const focusedDateDisabled = focusedDate
71
- ? !isWithinRange(focusedDate, min, max) || isDateDisabled(focusedDate, disabledRules)
72
- : false;
73
-
74
70
  const checkIsEnabled = (date: Date | null) => {
75
71
  if (!date) return true;
76
72
  return isWithinRange(date, min, max) && !isDateDisabled(date, disabledRulesRef.current);
77
73
  };
78
74
 
75
+ const focusedDateDisabled = focusedDate
76
+ ? !isWithinRange(focusedDate, min, max) || isDateDisabled(focusedDate, disabledRules)
77
+ : false;
78
+
79
79
  useEffect(() => {
80
80
  if (selectedDate && !isWithinRange(selectedDate, min, max)) {
81
81
  const clamped = moveToWithinRange(selectedDate, min, max);
@@ -178,11 +178,7 @@ const Calendar = ({
178
178
  focusedDate &&
179
179
  (event.target as HTMLElement).hasAttribute('data-calendar-cell')
180
180
  ) {
181
- const isEnabled = checkIsEnabled(focusedDate);
182
- onDateFocus?.(focusedDate, { isEnabled });
183
- if (isEnabled && onChange) {
184
- onChange(focusedDate);
185
- }
181
+ handleSelectedDateUpdate(focusedDate);
186
182
  event.preventDefault();
187
183
  }
188
184
  break;
@@ -190,15 +186,13 @@ const Calendar = ({
190
186
  break;
191
187
  }
192
188
  },
193
- [adjustDate, focusedDate, mode, onDateFocus, onChange], // eslint-disable-line react-hooks/exhaustive-deps
189
+ [adjustDate, focusedDate, mode, handleSelectedDateUpdate],
194
190
  );
195
191
 
196
192
  const focusedDateOutOfRange = focusedDate ? !isWithinRange(focusedDate, min, max) : false;
197
193
 
198
194
  const formatDateForPrompt = (date: Date) =>
199
- new Intl.DateTimeFormat(intl.locale, { day: 'numeric', month: 'long', year: 'numeric' }).format(
200
- date,
201
- );
195
+ formatDate(date, intl.locale, { day: 'numeric', month: 'long', year: 'numeric' });
202
196
 
203
197
  const outOfRangePromptText =
204
198
  min && max
@@ -35,7 +35,7 @@ export function isDateDisabled(date: Date, disabledRules?: DisabledRules): boole
35
35
  }
36
36
 
37
37
  if (disabledRules.ranges?.length) {
38
- const dateStart = new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();
38
+ const dateStart = date.getTime();
39
39
  if (
40
40
  disabledRules.ranges.some((range) => {
41
41
  const rangeStart = new Date(