import * as React from "react"; import * as SelectPrimitive from "@radix-ui/react-select"; import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react"; import { cn } from "~/client/lib/utils"; const SelectSsrValueContext = React.createContext<{ items: Map; value: string | undefined; } | null>(null); function getSelectItemText(children: React.ReactNode): string { return React.Children.toArray(children) .map((child) => { if (typeof child === "string" || typeof child === "number") { return String(child); } if (!React.isValidElement<{ children?: React.ReactNode }>(child)) { return ""; } return getSelectItemText(child.props.children); }) .join("") .trim(); } function collectSelectItems(children: React.ReactNode, items = new Map()) { for (const child of React.Children.toArray(children)) { if (!React.isValidElement<{ children?: React.ReactNode; value?: string }>(child)) { continue; } if ((child.type === SelectItem || child.type === SelectPrimitive.Item) && typeof child.props.value === "string") { items.set(child.props.value, getSelectItemText(child.props.children)); } if (child.props.children) { collectSelectItems(child.props.children, items); } } return items; } function Select({ children, value, ...props }: React.ComponentProps) { const items = collectSelectItems(children); return ( {children} ); } function SelectGroup({ ...props }: React.ComponentProps) { return ; } function SelectValue({ children, ...props }: React.ComponentProps) { const context = React.useContext(SelectSsrValueContext); const resolvedChildren = children ?? (context?.value ? context.items.get(context.value) : undefined); return ( {resolvedChildren} ); } function SelectTrigger({ className, size = "default", children, ...props }: React.ComponentProps & { size?: "sm" | "default"; }) { return ( {children} ); } function SelectContent({ className, children, position = "popper", ...props }: React.ComponentProps) { return ( {children} ); } function SelectLabel({ className, ...props }: React.ComponentProps) { return ( ); } function SelectItem({ className, children, ...props }: React.ComponentProps) { return ( {children} ); } function SelectSeparator({ className, ...props }: React.ComponentProps) { return ( ); } function SelectScrollUpButton({ className, ...props }: React.ComponentProps) { return ( ); } function SelectScrollDownButton({ className, ...props }: React.ComponentProps) { return ( ); } export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, };