"use client"; import type { ChatStatus } from "ai"; import { ArrowUp, Building2, CalendarRange, ChevronDown, Hand, Mic, Plus, Square, Stethoscope, UserPlus, X, } from "lucide-react"; import { type ChangeEvent, type KeyboardEvent, type ReactNode, useCallback, useRef, useState, } from "react"; import { PatientFormDialog } from "@/components/chat/patient-form-dialog"; import { Menu, MenuPopup, MenuRadioGroup, MenuRadioItem, MenuTrigger, } from "@/components/ui/menu"; import { cn } from "@/lib/utils"; type ChatInputProps = { onSubmit: (text: string) => void; status: ChatStatus; onStop?: () => void; }; type Option = { value: string; label: string }; const ACCESS_OPTIONS: Option[] = [ { value: "standard", label: "Standard access" }, { value: "break-glass", label: "Break-glass (emergency)" }, { value: "read-only", label: "Read-only" }, ]; const RESPONSE_OPTIONS: Option[] = [ { value: "concise", label: "Concise" }, { value: "detailed", label: "Detailed" }, { value: "comprehensive", label: "Comprehensive" }, ]; const SPECIALTY_OPTIONS: Option[] = [ { value: "internal-medicine", label: "Internal Medicine" }, { value: "cardiology", label: "Cardiology" }, { value: "pediatrics", label: "Pediatrics" }, { value: "emergency", label: "Emergency" }, { value: "all", label: "All specialties" }, ]; const FACILITY_OPTIONS: Option[] = [ { value: "main-hospital", label: "Main Hospital" }, { value: "north-clinic", label: "North Clinic" }, { value: "telehealth", label: "Telehealth" }, ]; const TIME_OPTIONS: Option[] = [ { value: "30d", label: "Last 30 days" }, { value: "12m", label: "Last 12 months" }, { value: "5y", label: "Last 5 years" }, { value: "all", label: "All time" }, ]; const iconButton = "flex size-8 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent hover:text-foreground"; const pillButton = "flex h-8 items-center gap-1.5 rounded-lg px-2 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-foreground"; const contextPill = "flex h-7 items-center gap-1.5 rounded-md px-2 text-[13px] text-muted-foreground transition-colors hover:bg-foreground/5 hover:text-foreground"; function SelectPill({ ariaLabel, triggerClassName, chevronClassName, icon, prefix, value, onValueChange, options, align = "start", }: { ariaLabel: string; triggerClassName: string; chevronClassName: string; icon: ReactNode; prefix?: string; value: string; onValueChange: (value: string) => void; options: Option[]; align?: "start" | "center" | "end"; }) { const selected = options.find((option) => option.value === value); return (
); } export function ChatInput({ onSubmit, status, onStop }: ChatInputProps) { const [value, setValue] = useState(""); const [files, setFiles] = useState