import { Combobox } from "@headlessui/react"; import clsx from "clsx"; import { addMinutes, format, isSameDay, setHours, setMinutes } from "date-fns"; import * as React from "react"; import ReactDOM from "react-dom"; import { usePopper } from "react-popper"; import ChevronDown from "../../../icons/chevron-down.svg"; import { styleMenuItem } from "../../../menu-styles"; export interface TimePickerProps { value: Date; startFrom?: Date; className?: string; onChange?: (value: Date) => void; } const TimePicker: React.VoidFunctionComponent = ({ value, onChange, className, startFrom = setMinutes(setHours(value, 0), 0), }) => { const [referenceElement, setReferenceElement] = React.useState(null); const [popperElement, setPopperElement] = React.useState(null); const { styles, attributes } = usePopper(referenceElement, popperElement, { modifiers: [ { name: "offset", options: { offset: [0, 5], }, }, ], }); const [query, setQuery] = React.useState(""); const options: React.ReactNode[] = []; for (let i = 0; i < 96; i++) { const optionValue = addMinutes(startFrom, i * 15); if (!isSameDay(value, optionValue)) { // we only support event that start and end on the same day for now // because react-big-calendar does not support events that span days break; } if (query && !format(optionValue, "hhmma").includes(query)) { continue; } options.push( {format(optionValue, "p")} , ); } const portal = document.getElementById("portal"); return ( { setQuery(""); onChange?.(new Date(newValue)); }} >
{/* Remove generic params once Combobox.Input can infer the types */} className="input w-28 pr-8" displayValue={() => ""} onChange={(e) => { setQuery(e.target.value.toUpperCase().replace(/[\:\s]/g, "")); }} /> {!query ? format(value, "p") : null} {portal && ReactDOM.createPortal( {options} , portal, )}
); }; export default TimePicker;