"use client" import { useForm } from "react-hook-form" import { zodResolver } from "@hookform/resolvers/zod" import { z } from "zod" import { Button } from "@/components/ui/button" import { Card, CardContent } from "@/components/ui/card" import { Form, FormField, FormItem, FormControl, FormMessage, } from "@/components/ui/form" import { Textarea } from "@/components/ui/textarea" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { CreateThoughtSchema } from "@/lib/api" import { useAuth } from "@/hooks/use-auth" import { toast } from "sonner" import { Globe, Lock, Users } from "lucide-react" import { useState } from "react" import { Confetti } from "./confetti" import { createThought } from "@/app/actions/thoughts" interface ThoughtFormProps { /** Set to the parent thought ID when composing a reply. */ replyToId?: string /** Called after successful submit (e.g. close the reply panel). */ onSuccess?: () => void /** Whether to wrap in a Card. Defaults to true when no replyToId. */ card?: boolean } export function ThoughtForm({ replyToId, onSuccess, card = !replyToId }: ThoughtFormProps) { const { token } = useAuth() const [showConfetti, setShowConfetti] = useState(false) const form = useForm>({ resolver: zodResolver(CreateThoughtSchema), defaultValues: { content: "", visibility: "public", ...(replyToId ? { inReplyToId: replyToId } : {}), }, }) async function onSubmit(values: z.infer) { if (!token) { toast.error("You must be logged in.") return } try { await createThought(values) toast.success(replyToId ? "Reply posted!" : "Thought posted!") setShowConfetti(true) form.reset() onSuccess?.() } catch { toast.error(replyToId ? "Failed to post reply." : "Failed to post thought.") } } const inner = (
(