"use client"; import { useState } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "~/components/ui/dialog"; import { Button } from "~/components/ui/button"; import { Input } from "~/components/ui/input"; import { Label } from "~/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "~/components/ui/select"; import { Card, CardContent } from "~/components/ui/card"; import { Textarea } from "~/components/ui/textarea"; import { api } from "~/trpc/react"; const createStudySchema = z.object({ name: z.string().min(1, "Study name is required").max(100, "Name too long"), description: z .string() .min(10, "Description must be at least 10 characters") .max(1000, "Description too long"), irbProtocolNumber: z.string().optional(), institution: z .string() .min(1, "Institution is required") .max(100, "Institution name too long"), status: z.enum(["draft", "active", "completed", "archived"]), }); type CreateStudyFormData = z.infer; interface CreateStudyDialogProps { children: React.ReactNode; onSuccess?: () => void; } export function CreateStudyDialog({ children, onSuccess, }: CreateStudyDialogProps) { const [open, setOpen] = useState(false); const { register, handleSubmit, reset, setValue, watch, formState: { errors, isSubmitting }, } = useForm({ resolver: zodResolver(createStudySchema), defaultValues: { status: "draft" as const, }, }); const createStudyMutation = api.studies.create.useMutation({ onSuccess: () => { setOpen(false); reset(); onSuccess?.(); }, onError: (err) => { console.error("Failed to create study:", err); }, }); const onSubmit = async (data: CreateStudyFormData) => { try { await createStudyMutation.mutateAsync(data); } catch (error) { // Error handling is done in the mutation's onError callback } }; const watchedStatus = watch("status"); return ( {children} Create New Study Start a new Human-Robot Interaction research study. You'll be assigned as the study owner.
{/* Study Name */}
{errors.name && (

{errors.name.message}

)}
{/* Description */}