From 1784e9ceb8c3bf859c1d8b10bc83bb7b4cad2198 Mon Sep 17 00:00:00 2001 From: Bob Burningham Date: Sun, 15 Oct 2023 18:12:54 -0700 Subject: [PATCH] added delete and leave functionality --- app/api/servers/[serverId]/leave/route.ts | 57 ++++++++++++++++ app/api/servers/[serverId]/route.ts | 28 ++++++++ components/modals/delete-server-modal.tsx | 81 +++++++++++++++++++++++ components/modals/leave-server-modal.tsx | 81 +++++++++++++++++++++++ components/providors/modal-providor.tsx | 4 ++ components/server/server-header.tsx | 2 + hooks/use-modal-store.ts | 2 +- 7 files changed, 254 insertions(+), 1 deletion(-) create mode 100644 app/api/servers/[serverId]/leave/route.ts create mode 100644 components/modals/delete-server-modal.tsx create mode 100644 components/modals/leave-server-modal.tsx diff --git a/app/api/servers/[serverId]/leave/route.ts b/app/api/servers/[serverId]/leave/route.ts new file mode 100644 index 0000000..be4af30 --- /dev/null +++ b/app/api/servers/[serverId]/leave/route.ts @@ -0,0 +1,57 @@ +import { currentProfile } from "@/lib/current-profile"; +import { db } from "@/lib/db"; +import { NextResponse } from "next/server"; + +export async function PATCH(req: Request, {params}: {params: {serverId: string}}) +{ + try + { + const profile = await currentProfile(); + + if (!profile) + { + return new NextResponse("Unauthorized", { status: 401 }); + } + + if (!params.serverId) + { + return new NextResponse("Server ID Missing", { status: 400 }); + } + + const server = await db.server.update + ({ + where: + { + id: params.serverId, + profileId: + { + not: profile.id + }, + members: + { + some: + { + profileId: profile.id, + } + }, + }, + data: + { + members: + { + deleteMany: + { + profileId: profile.id + } + } + } + }) + + return NextResponse.json(server); + } + catch (error) + { + console.log("[SERVER_ID_LEAVE]", error); + return new NextResponse("Internal Error", { status: 500}); + } +} \ No newline at end of file diff --git a/app/api/servers/[serverId]/route.ts b/app/api/servers/[serverId]/route.ts index d443870..4d806fb 100644 --- a/app/api/servers/[serverId]/route.ts +++ b/app/api/servers/[serverId]/route.ts @@ -2,6 +2,34 @@ import { currentProfile } from "@/lib/current-profile"; import { NextResponse } from "next/server"; import { db } from "@/lib/db"; +export async function DELETE(req: Request, { params }: { params: { serverId: string }}) +{ + try + { + const profile = await currentProfile(); + + if (!profile) + { + return new NextResponse("Unauthorized", { status: 401 }); + } + + const server = await db.server.delete + ({ + where: + { + id: params.serverId, + profileId: profile.id, + }, + }); + return NextResponse.json(server); + } + catch (error) + { + console.log("[SERVER_ID_DELETE]", error); + return new NextResponse("Internal Error", { status: 500}); + } +} + export async function PATCH(req: Request, { params }: { params: { serverId: string }}) { try diff --git a/components/modals/delete-server-modal.tsx b/components/modals/delete-server-modal.tsx new file mode 100644 index 0000000..dbf197f --- /dev/null +++ b/components/modals/delete-server-modal.tsx @@ -0,0 +1,81 @@ +"use client"; + +import axios from "axios"; +import { useState } from "react"; +import { useRouter } from "next/navigation"; + +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { useModal } from "@/hooks/use-modal-store"; +import { Button } from "@/components/ui/button"; + + +export const DeleteServerModal = () => { + const { isOpen, onClose, type, data } = useModal(); + const router = useRouter(); + + const isModalOpen = isOpen && type === "deleteServer"; + const { server } = data; + + const [isLoading, setIsLoading] = useState(false); + + const onClick = async () => + { + try + { + setIsLoading(true); + + await axios.delete(`/api/servers/${server?.id}`); + + onClose(); + router.refresh(); + router.push("/"); + + + } + catch (error) + { + console.log(error); + } + finally + { + setIsLoading(false); + onClose(); + } + } + + return ( + + + + + Delete Server + + + Are you sure you want to do this?
+ + {server?.name} + will be permenantly deleted. +
+
+ +
+ + +
+ +
+
+
+ ) +} \ No newline at end of file diff --git a/components/modals/leave-server-modal.tsx b/components/modals/leave-server-modal.tsx new file mode 100644 index 0000000..ad3ecc2 --- /dev/null +++ b/components/modals/leave-server-modal.tsx @@ -0,0 +1,81 @@ +"use client"; + +import axios from "axios"; +import { useState } from "react"; +import { useRouter } from "next/navigation"; + +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { useModal } from "@/hooks/use-modal-store"; +import { Button } from "@/components/ui/button"; + + +export const LeaveServerModal = () => { + const { isOpen, onClose, type, data } = useModal(); + const router = useRouter(); + + const isModalOpen = isOpen && type === "leaveServer"; + const { server } = data; + + const [isLoading, setIsLoading] = useState(false); + + const onClick = async () => + { + try + { + setIsLoading(true); + + await axios.patch(`/api/servers/${server?.id}/leave`); + + onClose(); + router.refresh(); + router.push("/"); + + + } + catch (error) + { + console.log(error); + } + finally + { + setIsLoading(false); + onClose(); + } + } + + return ( + + + + + Leave Server + + + Are you sure you wan to leave + + {server?.name} + + + + +
+ + +
+ +
+
+
+ ) +} \ No newline at end of file diff --git a/components/providors/modal-providor.tsx b/components/providors/modal-providor.tsx index 46ee213..54e164c 100644 --- a/components/providors/modal-providor.tsx +++ b/components/providors/modal-providor.tsx @@ -7,6 +7,8 @@ import { CreateServerModal } from "@/components/modals/create-server-modal"; import { InviteModal } from "@/components/modals/invite-modal"; import { MembersModal } from "@/components/modals/members-modal"; import { CreateChannelModal } from "@/components/modals/create-channel-modal"; +import { LeaveServerModal } from "@/components/modals/leave-server-modal"; +import { DeleteServerModal } from "@/components/modals/delete-server-modal"; export const ModalProvidor = () => { const [isMounted, setIsMounted] = useState(false); @@ -26,6 +28,8 @@ export const ModalProvidor = () => { + + ) } \ No newline at end of file diff --git a/components/server/server-header.tsx b/components/server/server-header.tsx index 4288908..04c9663 100644 --- a/components/server/server-header.tsx +++ b/components/server/server-header.tsx @@ -71,6 +71,7 @@ export const SeverHeader = ({server, role}: ServerHeaderProps) => { )} {isAdmin && ( onOpen("deleteServer", {server})} className="text-rose-500 px-3 py-2 text-sm cursor-pointer" > Delete Server @@ -79,6 +80,7 @@ export const SeverHeader = ({server, role}: ServerHeaderProps) => { )} {!isAdmin && ( onOpen("leaveServer", {server})} className="text-rose-500 px-3 py-2 text-sm cursor-pointer" > Leave Server diff --git a/hooks/use-modal-store.ts b/hooks/use-modal-store.ts index 2f42f6b..ffd7eb4 100644 --- a/hooks/use-modal-store.ts +++ b/hooks/use-modal-store.ts @@ -2,7 +2,7 @@ import { Server } from "@prisma/client"; import { create } from "zustand"; -export type ModalType = "createServer" | "invite" | "editServer" | "members" | "createChannel"; +export type ModalType = "createServer" | "invite" | "editServer" | "members" | "createChannel" | "leaveServer" | "deleteServer"; interface ModalData { server?: Server