import React, {
ReactElement,
useState,
useEffect,
useCallback,
ChangeEvent,
FocusEvent,
} from 'react';
import parseWithOptions from 'date-fns/fp/parseWithOptions';
import isValid from 'date-fns/fp/isValid';
import formatDateWithOptions from 'date-fns/fp/formatWithOptions';
import css from '../../utils/css';
import Input from '../Input';
import Dropdown from '../Dropdown';
import Calendar from './Calendar';
import { IconName } from '../Icon';
import { DatePickerContainer } from './StyledDatePicker';
import { CommonProps } from '../common';
export interface WeekPickerProps extends CommonProps {
/**
* Specify the [automated assistance](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete) in filling out form field values by the browser.
*/
autoComplete?: string;
/**
* Whether the picker is disabled.
*/
disabled?: boolean;
/**
* Week format. Following date-fns's format (https://date-fns.org/v2.16.1/docs/format).
*/
format?: string;
/**
* Whether the input is invalid.
*/
invalid?: boolean;
/**
* Name of element, is used to refer to the form data for submission.
*/
name?: string;
/**
* Blur event handler.
*/
onBlur?: (e: FocusEvent) => void;
/**
* onChange event handler.
*/
onChange?: (value: string) => void;
/**
* Placeholder text in the absence of any value.
*/
placeholder?: string;
/**
* Name of Icon or an Icon element to render on the left side of the input, before the user's cursor.
*/
prefix?: IconName | ReactElement;
/**
* Whether or not Input's value is read only.
*/
readonly?: boolean;
/**
* The size of the input box.
*/
size?: 'small' | 'medium' | 'large';
/**
* Current selected date which must be in correct format. If value is invalid, it will be skipped.
*/
value?: string;
}
const WeekPicker = ({
autoComplete,
value,
onChange,
onBlur,
size = 'medium',
invalid = false,
placeholder,
prefix,
disabled = false,
format = "'Week' ww', 'YYYY",
readonly,
name,
id,
className,
style,
sx = {},
'data-test-id': dataTestId,
}: WeekPickerProps): ReactElement => {
const [open, setOpen] = useState(false);
const [
selectedFirstDateOfWeek,
setSelectedFirstDateOfWeek,
] = useState();
const isValidDate = isValid(selectedFirstDateOfWeek);
const openCalendar = useCallback(() => setOpen(true), [setOpen]);
const closeCalendar = useCallback(() => setOpen(false), [setOpen]);
const onSelectFirstDateOfWeek = useCallback(
(newDate: Date): void => {
if (onChange !== undefined) {
const formattedDate = formatDateWithOptions(
{ useAdditionalWeekYearTokens: true },
format,
newDate
);
onChange(formattedDate);
}
closeCalendar();
},
[format, onChange, closeCalendar]
);
const onInputChange = useCallback(
(e: ChangeEvent): void => {
const target = e.target as HTMLInputElement;
if (target.value !== undefined && onChange !== undefined) {
onChange(target.value);
}
},
[onChange]
);
useEffect(() => {
setSelectedFirstDateOfWeek(
parseWithOptions(
{ useAdditionalWeekYearTokens: true },
new Date(),
format,
value !== undefined ? value : ''
)
);
}, [format, setSelectedFirstDateOfWeek, value]);
const dateInput = (
);
const calendar = (
);
return (
);
};
export default WeekPicker;