import {
Button as AriaButton,
Calendar as AriaCalendar,
CalendarGridHeader as AriaCalendarGridHeader,
CalendarCell,
CalendarGrid,
CalendarGridBody,
CalendarHeaderCell,
Heading,
} from 'react-aria-components';
import { getLocalTimeZone, today } from '@internationalized/date';
import { tv } from 'tailwind-variants';
import { ChevronLeftIcon, ChevronRightIcon } from '@/components/icons';
import { calendarDateToDate, dateToCalendarDate } from './utils';
const cellStyles = tv({
base: 'flex h-[30px] w-[30px] cursor-default items-center justify-center rounded-full text-xs outline-none',
variants: {
isSelected: {
true: 'bg-primary font-bold text-white',
false: '',
},
isDisabled: {
true: 'cursor-default text-kc-gray-be',
},
isUnavailable: {
true: 'cursor-default text-kc-gray-be line-through',
},
isOutsideMonth: {
true: 'text-kc-gray-be',
},
isSunday: {
true: 'text-[#e48686]',
},
isSaturday: {
true: 'text-[#7b8cc8]',
},
isToday: {
true: 'font-bold text-primary',
},
isHovered: {
true: 'bg-primary-tertiary01',
},
isFocusVisible: {
true: 'ring-2 ring-offset-2 ring-primary',
},
},
compoundVariants: [
{
isSelected: true,
isSunday: true,
className: 'text-white',
},
{
isSelected: true,
isSaturday: true,
className: 'text-white',
},
{
isSelected: true,
isToday: true,
className: 'text-white',
},
{
isSelected: true,
isHovered: true,
className: 'bg-primary',
},
],
});
export interface CalendarProps {
value?: Date | null;
defaultValue?: Date | null;
onChange?: (date: Date | null) => void;
maxValue?: Date | null;
minValue?: Date | null;
isDisabled?: boolean;
className?: string;
}
export function Calendar({ value, defaultValue, onChange, maxValue, minValue, isDisabled, className }: CalendarProps) {
const todayDate = today(getLocalTimeZone());
return (
onChange?.(calendarDateToDate(val))}
maxValue={maxValue !== undefined ? dateToCalendarDate(maxValue) : undefined}
minValue={minValue !== undefined ? dateToCalendarDate(minValue) : undefined}
isDisabled={isDisabled}
firstDayOfWeek="sun"
className={className}
>
{(date) => {
const dayOfWeek = date.toDate('UTC').getDay();
const isSunday = dayOfWeek === 0;
const isSaturday = dayOfWeek === 6;
const isToday = date.compare(todayDate) === 0;
return (
cellStyles({
isSelected,
isDisabled: isCellDisabled,
isUnavailable,
isOutsideMonth,
isSunday: !isSelected && !isDisabled && !isOutsideMonth ? isSunday : false,
isSaturday: !isSelected && !isDisabled && !isOutsideMonth ? isSaturday : false,
isToday: !isSelected ? isToday : false,
isHovered: !isSelected ? isHovered : false,
isFocusVisible,
})
}
/>
);
}}
);
}
const navButton = tv({
base: 'flex h-7 w-7 items-center justify-center rounded-sm border-none bg-transparent outline-none',
variants: {
isDisabled: {
true: 'cursor-default text-kc-gray-be',
false: 'cursor-pointer text-kc-black-34 hover:bg-kc-gray-eb',
},
isFocusVisible: {
true: 'ring-2 ring-offset-2 ring-primary',
},
},
defaultVariants: {
isDisabled: false,
},
});
export function CalendarHeader() {
return (
navButton(renderProps)}>
navButton(renderProps)}>
);
}
export function CalendarGridHeader() {
return (
{(day) => (
{day}
)}
);
}