import React, { forwardRef, type HTMLAttributes, type PropsWithChildren, useCallback, useContext } from 'react';
import {
Button,
CalendarStateContext,
Group,
Input,
NumberField,
RangeCalendarStateContext,
} from 'react-aria-components';
import { getLocalTimeZone } from '@internationalized/date';
import { formatDate } from '@openmrs/esm-utils';
import { useIntlLocale } from './hooks';
import { CaretDownIcon, CaretUpIcon } from '../icons';
function getYearAsNumber(date: Date, intlLocale: Intl.Locale) {
return Number.parseInt(
formatDate(date, {
calendar: intlLocale.calendar,
locale: intlLocale.baseName,
day: false,
month: false,
noToday: true,
numberingSystem: 'latn',
}),
);
}
/**
* Custom component to render the month and year on the DatePicker and provide the standard Carbon
* UI to change them.
*
* Should work with any calendar system supported by the @internationalized/date package.
*/
export const MonthYear = /*#__PURE__*/ forwardRef>>(
function MonthYear(props, ref) {
const { className } = props;
const calendarState = useContext(CalendarStateContext);
const rangeCalendarState = useContext(RangeCalendarStateContext);
const state = (calendarState ?? rangeCalendarState)!;
const intlLocale = useIntlLocale();
const tz = getLocalTimeZone();
const month = formatDate(state.visibleRange.start.toDate(tz), {
calendar: intlLocale.calendar,
locale: intlLocale.baseName,
day: false,
year: false,
noToday: true,
});
const year = getYearAsNumber(state.visibleRange.start.toDate(tz), intlLocale);
const maxYear = state.maxValue ? getYearAsNumber(state.maxValue.toDate(tz), intlLocale) : undefined;
const minYear = state.minValue ? getYearAsNumber(state.minValue.toDate(tz), intlLocale) : undefined;
const changeHandler = useCallback((value: number) => {
state.setFocusedDate(state.focusedDate.cycle('year', value - state.focusedDate.year));
}, []);
return (
state && (
{month}
)
);
},
);