From 9513b6e806666e15a6065ce003999a66bf74e663 Mon Sep 17 00:00:00 2001 From: Sosokker Date: Wed, 6 Nov 2024 19:58:25 +0700 Subject: [PATCH] feat: add project edit page --- .../[projectId]/edit/EditProjectForm.tsx | 145 ++++++++++++++++++ src/app/project/[projectId]/edit/page.tsx | 39 +++++ src/lib/data/projectMutate.ts | 29 ++++ src/lib/data/projectQuery.ts | 3 + src/types/schemas/project.schema.ts | 12 ++ 5 files changed, 228 insertions(+) create mode 100644 src/app/project/[projectId]/edit/EditProjectForm.tsx create mode 100644 src/app/project/[projectId]/edit/page.tsx create mode 100644 src/lib/data/projectMutate.ts create mode 100644 src/types/schemas/project.schema.ts diff --git a/src/app/project/[projectId]/edit/EditProjectForm.tsx b/src/app/project/[projectId]/edit/EditProjectForm.tsx new file mode 100644 index 0000000..85686f9 --- /dev/null +++ b/src/app/project/[projectId]/edit/EditProjectForm.tsx @@ -0,0 +1,145 @@ +"use client"; + +import { SubmitHandler, useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { projectEditSchema, ProjectEditSchema } from "@/types/schemas/project.schema"; +import { Textarea } from "@/components/ui/textarea"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Form, FormField, FormItem, FormLabel, FormControl, FormMessage, FormDescription } from "@/components/ui/form"; +import { DateTimePicker } from "@/components/ui/datetime-picker"; +import { MdxEditor } from "@/components/MarkdownEditor"; +import { editProjectById } from "@/lib/data/projectMutate"; +import toast from "react-hot-toast"; +import { useRouter } from "next/navigation"; +import { createSupabaseClient } from "@/lib/supabase/clientComponentClient"; +import { useState } from "react"; + +export default function EditProjectForm({ + projectData, + projectId, +}: { + projectData: ProjectEditSchema; + projectId: number; +}) { + const router = useRouter(); + const client = createSupabaseClient(); + + const projectForm = useForm({ + resolver: zodResolver(projectEditSchema), + defaultValues: { + project_name: projectData.project_name || "", + project_short_description: projectData.project_short_description || "", + project_description: projectData.project_description || "", + deadline: projectData.deadline ? projectData.deadline : undefined, + }, + }); + + const [deadline, setDeadline] = useState(projectData.deadline); + const [descriptionContent, setDescriptionContent] = useState(projectData.project_description || ""); + + const onSubmit: SubmitHandler = async (updates) => { + try { + const updatedData = { + ...updates, + deadline: deadline ? new Date(deadline).toISOString() : undefined, + project_description: descriptionContent, + }; + + const result = await editProjectById(client, projectId, updatedData); + + if (result) { + toast.success("Project updated successfully!"); + router.push(`/deals/${projectId}`); + } else { + toast.error("No fields to update!"); + } + } catch (error) { + toast.error("Error updating project!"); + console.error("Error updating project:", error); + } + }; + + return ( +
+ + ( + + Project Name + + + + Provide the name of the project. + + {projectForm.formState.errors.project_name && ( + {projectForm.formState.errors.project_name.message} + )} + + + )} + /> + ( + + Short Description + +