"use client"; import * as React from "react"; import { ResponsiveDialog } from "@/components/ui/sheet"; import { Button } from "@/components/ui/button"; import { Input, Textarea } from "@/components/ui/input"; export interface PromptDialogProps { open: boolean; onOpenChange: (open: boolean) => void; title: React.ReactNode; description?: React.ReactNode; label?: string; placeholder?: string; defaultValue?: string; confirmLabel?: string; multiline?: boolean; maxLength?: number; onSubmit: (value: string) => Promise | void; } /** * Replacement for `window.prompt()`: bottom sheet on phones, small dialog on desktop. * Resolves with the trimmed value; empty submissions are ignored. */ export function PromptDialog({ open, onOpenChange, title, description, label, placeholder, defaultValue = "", confirmLabel = "Save", multiline, maxLength = 200, onSubmit }: PromptDialogProps) { const [value, setValue] = React.useState(defaultValue); const [busy, setBusy] = React.useState(false); const ref = React.useRef(null); React.useEffect(() => { if (open) { // eslint-disable-next-line react-hooks/set-state-in-effect setValue(defaultValue); setTimeout(() => { ref.current?.focus(); ref.current?.select(); }, 60); } }, [open, defaultValue]); const submit = async () => { const v = value.trim(); if (!v || busy) return; setBusy(true); try { await onSubmit(v); onOpenChange(false); } finally { setBusy(false); } }; return ( } >
{ e.preventDefault(); void submit(); }} > {label ? : null} {multiline ? (