"use client"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Loader2 } from "lucide-react"; import { useState } from "react"; import { Sandbox } from "@/lib/types"; import { Button } from "@/components/ui/button"; import { deleteSandbox, updateSandbox } from "@/lib/actions"; import { useRouter } from "next/navigation"; import { toast } from "sonner"; const formSchema = z.object({ name: z.string().min(1).max(16), visibility: z.enum(["public", "private"]), }); export default function EditSandboxModal({ open, setOpen, data, }: { open: boolean; setOpen: (open: boolean) => void; data: Sandbox; }) { const [loading, setLoading] = useState(false); const [loadingDelete, setLoadingDelete] = useState(false); const router = useRouter(); const form = useForm<z.infer<typeof formSchema>>({ resolver: zodResolver(formSchema), defaultValues: { name: data.name, visibility: data.visibility, }, }); async function onSubmit(values: z.infer<typeof formSchema>) { setLoading(true); await updateSandbox({ id: data.id, ...values }); toast.success("Sandbox updated successfully"); setLoading(false); } async function onDelete() { setLoadingDelete(true); await deleteSandbox(data.id); router.push("/dashboard"); } return ( <Dialog open={open} onOpenChange={setOpen}> <DialogContent> <DialogHeader> <DialogTitle>Edit Sandbox Info</DialogTitle> </DialogHeader> <Form {...form}> <form onSubmit={form.handleSubmit(onSubmit)}> <FormField control={form.control} name="name" render={({ field }) => ( <FormItem className="mb-4"> <FormLabel>Name</FormLabel> <FormControl> <Input placeholder="My Project" {...field} /> </FormControl> <FormMessage /> </FormItem> )} /> <FormField control={form.control} name="visibility" render={({ field }) => ( <FormItem className="mb-8"> <FormLabel>Visibility</FormLabel> <Select onValueChange={field.onChange} defaultValue={field.value} > <FormControl> <SelectTrigger> <SelectValue /> </SelectTrigger> </FormControl> <SelectContent> <SelectItem value="public">Public</SelectItem> <SelectItem value="private">Private</SelectItem> </SelectContent> </Select> <FormMessage /> </FormItem> )} /> <Button disabled={loading} type="submit" className="w-full"> {loading ? ( <> <Loader2 className="animate-spin mr-2 h-4 w-4" /> Loading... </> ) : ( "Update Sandbox" )} </Button> </form> </Form> <Button disabled={loadingDelete} onClick={onDelete} className="w-full" variant="destructive" > {loadingDelete ? ( <> <Loader2 className="animate-spin mr-2 h-4 w-4" /> Loading... </> ) : ( "Delete Sandbox" )} </Button> </DialogContent> </Dialog> ); }