import { zodResolver } from "@hookform/resolvers/zod" import { useMutation, useQueryClient } from "@tanstack/react-query" import { Pencil } from "lucide-react" import { useState } from "react" import { useForm } from "react-hook-form" import { z } from "zod" import { type ItemPublic, ItemsService } from "@/client" import { Button } from "@/components/ui/button" import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { DropdownMenuItem } from "@/components/ui/dropdown-menu" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form" import { Input } from "@/components/ui/input" import { LoadingButton } from "@/components/ui/loading-button" import useCustomToast from "@/hooks/useCustomToast" import { handleError } from "@/utils" const formSchema = z.object({ title: z.string().min(1, { message: "Title is required" }), description: z.string().optional(), }) type FormData = z.infer interface EditItemProps { item: ItemPublic onSuccess: () => void } const EditItem = ({ item, onSuccess }: EditItemProps) => { const [isOpen, setIsOpen] = useState(false) const queryClient = useQueryClient() const { showSuccessToast, showErrorToast } = useCustomToast() const form = useForm({ resolver: zodResolver(formSchema), mode: "onBlur", criteriaMode: "all", defaultValues: { title: item.title, description: item.description ?? undefined, }, }) const mutation = useMutation({ mutationFn: (data: FormData) => ItemsService.updateItem({ path: { id: item.id }, body: data }), onSuccess: () => { showSuccessToast("Item updated successfully") setIsOpen(false) onSuccess() }, onError: handleError.bind(showErrorToast), onSettled: () => { queryClient.invalidateQueries({ queryKey: ["items"] }) }, }) const onSubmit = (data: FormData) => { mutation.mutate(data) } return ( e.preventDefault()} onClick={() => setIsOpen(true)} > Edit Item
Edit Item Update the item details below.
( Title * )} /> ( Description )} />
Save
) } export default EditItem