| import React, { createContext, use, useCallback, useState } from "react"; |
|
|
| import { DayPicker, type DropdownProps } from "react-day-picker"; |
|
|
| import { |
| Select, |
| SelectContent, |
| SelectGroup, |
| SelectItem, |
| SelectStyles, |
| SelectTrigger, |
| SelectValue, |
| } from "./Select"; |
|
|
| const ContainerContext = createContext<HTMLDivElement | null>(null); |
|
|
| export function CustomSelectDropdown(props: DropdownProps) { |
| const { options, value, onChange, "aria-label": ariaLabel } = props; |
| const container = use(ContainerContext); |
|
|
| const handleValueChange = (newValue: string) => { |
| if (onChange) { |
| const syntheticEvent = { |
| target: { |
| value: newValue, |
| }, |
| } as React.ChangeEvent<HTMLSelectElement>; |
|
|
| onChange(syntheticEvent); |
| } |
| }; |
|
|
| return ( |
| <Select value={value?.toString()} onValueChange={handleValueChange}> |
| <SelectTrigger aria-label={ariaLabel}> |
| <SelectValue /> |
| </SelectTrigger> |
| <SelectContent container={container}> |
| <SelectGroup> |
| {options?.map((option) => ( |
| <SelectItem |
| key={option.value} |
| value={option.value.toString()} |
| disabled={option.disabled} |
| > |
| {option.label} |
| </SelectItem> |
| ))} |
| </SelectGroup> |
| </SelectContent> |
| </Select> |
| ); |
| } |
|
|
| export function CustomDropdown() { |
| const [selected, setSelected] = useState<Date | undefined>(); |
|
|
| |
| const [container, setContainer] = useState<HTMLDivElement | null>(null); |
| const handleRef = useCallback((element: HTMLDivElement | null) => { |
| setContainer(element); |
| }, []); |
|
|
| return ( |
| <div ref={handleRef}> |
| <SelectStyles /> |
| <ContainerContext.Provider value={container}> |
| <DayPicker |
| captionLayout="dropdown" |
| components={{ Dropdown: CustomSelectDropdown }} |
| mode="single" |
| selected={selected} |
| onSelect={setSelected} |
| footer={ |
| selected |
| ? `Selected: ${selected.toLocaleDateString()}` |
| : "Pick a day." |
| } |
| /> |
| </ContainerContext.Provider> |
| </div> |
| ); |
| } |
|
|