diff --git a/app/(customer)/dashboard/projects/[projectId]/page.tsx b/app/(customer)/dashboard/projects/[projectId]/page.tsx
index 5c40708e..d7a24ec5 100644
--- a/app/(customer)/dashboard/projects/[projectId]/page.tsx
+++ b/app/(customer)/dashboard/projects/[projectId]/page.tsx
@@ -39,6 +39,7 @@ export default async function RoutePage(props: PageParams<{ projectId: string }>
diff --git a/prisma/migrations/20241217183424_2024_12_17/migration.sql b/prisma/migrations/20241217183424_2024_12_17/migration.sql
new file mode 100644
index 00000000..a2dd6863
--- /dev/null
+++ b/prisma/migrations/20241217183424_2024_12_17/migration.sql
@@ -0,0 +1,8 @@
+/*
+ Warnings:
+
+ - Added the required column `isArchived` to the `projects` table without a default value. This is not possible if the table is not empty.
+
+*/
+-- AlterTable
+ALTER TABLE "projects" ADD COLUMN "isArchived" BOOLEAN NOT NULL;
diff --git a/prisma/migrations/20241217183746_2024_12_17/migration.sql b/prisma/migrations/20241217183746_2024_12_17/migration.sql
new file mode 100644
index 00000000..87dae96b
--- /dev/null
+++ b/prisma/migrations/20241217183746_2024_12_17/migration.sql
@@ -0,0 +1,2 @@
+-- AlterTable
+ALTER TABLE "projects" ALTER COLUMN "isArchived" SET DEFAULT false;
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index 3eb37225..4553f48b 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -102,11 +102,11 @@ model UserOrganization {
}
model Project {
- id String @id @default(cuid())
- slug String @unique
- name String
- createdAt DateTime @default(now()) @map("created_at")
-
+ id String @id @default(cuid())
+ slug String @unique
+ name String
+ createdAt DateTime @default(now()) @map("created_at")
+ isArchived Boolean @default(false)
organizationId String @map("organization_id")
organization Organization @relation(fields: [organizationId], references: [id])
diff --git a/src/components/wrappers/dashboard/projects/ButtonDeleteProject/ButtonDeleteProject.tsx b/src/components/wrappers/dashboard/projects/ButtonDeleteProject/ButtonDeleteProject.tsx
index 0a82d593..8b7b24c2 100644
--- a/src/components/wrappers/dashboard/projects/ButtonDeleteProject/ButtonDeleteProject.tsx
+++ b/src/components/wrappers/dashboard/projects/ButtonDeleteProject/ButtonDeleteProject.tsx
@@ -2,29 +2,36 @@
import {Trash2} from "lucide-react";
import {ButtonWithConfirm} from "@/components/wrappers/common/button/button-with-confirm";
+import {useMutation} from "@tanstack/react-query";
+import {deleteProjectAction} from "@/components/wrappers/dashboard/projects/ButtonDeleteProject/delete-project.action";
+import {useRouter} from "next/navigation";
+import {toast} from "sonner";
export type ButtonDeleteProjectProps = {
text? : string
+ projectId: string
}
export const ButtonDeleteProject = (props: ButtonDeleteProjectProps) => {
-
- // const mutation = useMutation({
- // mutationFn: () => deleteUserAction(""),
- // onSuccess: async () => {
- // await signOutAction();
- // },
- // })
+ const router = useRouter()
+ const mutation = useMutation({
+ mutationFn: () => deleteProjectAction(props.projectId),
+ onSuccess: async (result) => {
+ router.push("/dashboard/projects")
+ if(result.data.success) {
+ toast.success(result.data.actionSuccess.message);
+ }
+ },
+ })
return (
{
- // mutation.mutate()
- console.log("ok")
+ mutation.mutate()
}}
variant={"destructive"}
- // isPending={mutation.isPending}
+ isPending={mutation.isPending}
className="gap-2"
icon={}
/>
diff --git a/src/components/wrappers/dashboard/projects/ButtonDeleteProject/delete-project.action.ts b/src/components/wrappers/dashboard/projects/ButtonDeleteProject/delete-project.action.ts
new file mode 100644
index 00000000..ed1e5734
--- /dev/null
+++ b/src/components/wrappers/dashboard/projects/ButtonDeleteProject/delete-project.action.ts
@@ -0,0 +1,47 @@
+"use server"
+import {userAction} from "@/safe-actions";
+import {z} from "zod";
+import {v4 as uuidv4} from "uuid";
+import {prisma} from "@/prisma";
+import {ServerActionResult} from "@/types/action-type";
+import {Projects} from "@prisma/client";
+
+
+export const deleteProjectAction = userAction
+ .schema(z.string())
+ .action(async ({parsedInput, ctx}): Promise> => {
+
+ try {
+ const uuid = uuidv4()
+
+ const project = await prisma.project.update({
+ where: {
+ id: parsedInput
+ },
+ data:{
+ isArchived: true,
+ slug: uuid
+ }
+ })
+
+ return {
+ success: true,
+ value: project,
+ actionSuccess: {
+ message: "Projects has been successfully archived.",
+ messageParams: {projectName: parsedInput.data.name},
+ },
+ };
+ } catch (error) {
+ return {
+ success: false,
+ actionError: {
+ message: "Failed to archived Projects.",
+ status: 500, // Optional: Use a meaningful status code
+ cause: error instanceof Error ? error.message : "Unknown error",
+ messageParams: {projectName: parsedInput.data.name},
+ },
+ };
+ }
+
+ });
diff --git a/src/components/wrappers/dashboard/projects/ProjectsForm/project-form.action.ts b/src/components/wrappers/dashboard/projects/ProjectsForm/project-form.action.ts
index 82af9795..d6c9ccb8 100644
--- a/src/components/wrappers/dashboard/projects/ProjectsForm/project-form.action.ts
+++ b/src/components/wrappers/dashboard/projects/ProjectsForm/project-form.action.ts
@@ -42,7 +42,7 @@ export const createProjectAction = userAction
success: true,
value: project,
actionSuccess: {
- message: "ProjectsForm has been successfully created.",
+ message: "Projects has been successfully created.",
messageParams: {projectName: parsedInput.data.name},
},
};
@@ -50,7 +50,7 @@ export const createProjectAction = userAction
return {
success: false,
actionError: {
- message: "Failed to create ProjectsForm.",
+ message: "Failed to create Projects.",
status: 500, // Optional: Use a meaningful status code
cause: error instanceof Error ? error.message : "Unknown error",
messageParams: {projectName: parsedInput.data.name},