"use client"; import { zodResolver } from "@hookform/resolvers/zod"; import { BlueskyIcon, GitHubIcon, LinkedInIcon, XIcon, YouTubeIcon, } from "@openstatus/icons"; import { Badge } from "@openstatus/ui/components/ui/badge"; import { Button } from "@openstatus/ui/components/ui/button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@openstatus/ui/components/ui/form"; import { Input } from "@openstatus/ui/components/ui/input"; import { RadioGroup, RadioGroupItem, } from "@openstatus/ui/components/ui/radio-group"; import { cn } from "@openstatus/ui/lib/utils"; import { Check, MoreHorizontal, Newspaper, Search, Sparkles, Users, } from "lucide-react"; import { useTransition } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; import { Note } from "@/components/common/note"; const sources = [ { id: "search-engine", title: "Search Engine", icon: Search }, { id: "github", title: "GitHub", icon: GitHubIcon }, { id: "linkedin", title: "LinkedIn", icon: LinkedInIcon }, { id: "bluesky", title: "Bluesky", icon: BlueskyIcon }, { id: "twitter", title: "X / Twitter", icon: XIcon }, { id: "ai-chat", title: "AI Chat", icon: Sparkles }, { id: "recommendation", title: "Friend / Colleague", icon: Users }, { id: "youtube", title: "YouTube", icon: YouTubeIcon }, { id: "blog", title: "Blog / Article", icon: Newspaper }, { id: "other", title: "Other", icon: MoreHorizontal }, ] as const; const schema = z.object({ source: z.string().min(1, "Please select an option"), other: z.string().optional(), }); export type FormValues = z.infer; export function QuestionForm({ onSubmit, defaultValues, className, ...props }: Omit, "onSubmit"> & { defaultValues?: FormValues; onSubmit: (values: FormValues) => Promise; }) { const [isPending, startTransition] = useTransition(); const form = useForm({ resolver: zodResolver(schema), defaultValues: defaultValues ?? { source: "", other: "", }, }); const watchSource = form.watch("source"); function handleSubmit(values: FormValues) { if (isPending) return; startTransition(async () => { try { const promise = onSubmit(values); toast.promise(promise, { loading: "Submitting...", success: () => "Submitted", error: "Failed to submit", }); await promise; } catch (error) { console.error(error); } }); } if (!isPending && form.formState.isSubmitSuccessful) { return ( Thank you for your feedback! ); } return (
( {sources.map((item) => { const selected = field.value === item.id; return ( {item.title} ); })} )} />
{watchSource === "other" && ( ( )} /> )}
); }