From 7d48962a9659c6ca71018afe4aac76f2a76ee96d Mon Sep 17 00:00:00 2001 From: Bob Burningham Date: Sat, 21 Oct 2023 00:21:44 -0700 Subject: [PATCH] added member chatheader and conversation page --- .../conversations/[memberId]/page.tsx | 57 ++++++++++++++- components/chat/chat-header.tsx | 7 ++ lib/conversation.ts | 72 +++++++++++++++++++ 3 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 lib/conversation.ts diff --git a/app/(main)/(routes)/servers/[serverId]/conversations/[memberId]/page.tsx b/app/(main)/(routes)/servers/[serverId]/conversations/[memberId]/page.tsx index 981fca2..daaf8aa 100644 --- a/app/(main)/(routes)/servers/[serverId]/conversations/[memberId]/page.tsx +++ b/app/(main)/(routes)/servers/[serverId]/conversations/[memberId]/page.tsx @@ -1,7 +1,58 @@ -const MemberIdPage = () => { +import { ChatHeader } from "@/components/chat/chat-header"; +import { getOrCreateConversation } from "@/lib/conversation"; +import { currentProfile } from "@/lib/current-profile"; +import { db } from "@/lib/db"; +import { redirectToSignIn } from "@clerk/nextjs"; +import { redirect } from "next/navigation"; + +interface MemberIdPageProps{ + params: { + serverId: string; + memberId: string; + } +} + +const MemberIdPage = async ({ + params +}: MemberIdPageProps) => { + const profile = await currentProfile(); + + if (!profile) { + return redirectToSignIn(); + } + + const currentMember = await db.member.findFirst({ + where: { + serverId: params.serverId, + profileId: profile.id, + }, + include: { + profile: true, + } + }); + + if (!currentMember) { + return redirect(`/`); + } + + const conversation = await getOrCreateConversation(currentMember.id, params.memberId); + + if (!conversation) { + return redirect(`/servers/${params.serverId}`); + } + + const { MemberOne, MemberTwo } = conversation; + + const otherMember = MemberOne.profileId === profile.id ? MemberTwo : MemberOne; + return ( -
- Member ID Page +
+
) } diff --git a/components/chat/chat-header.tsx b/components/chat/chat-header.tsx index abd9944..cb1408b 100644 --- a/components/chat/chat-header.tsx +++ b/components/chat/chat-header.tsx @@ -1,5 +1,6 @@ import { Hash, Menu } from "lucide-react" import { MobileToggle } from "@/components/mobile-toggle"; +import { UserAvatar } from "../user-avatar"; interface ChatHeaderProps { serverId: string; @@ -21,6 +22,12 @@ export const ChatHeader = ({ {type === "channel" && ( )} + {type === "conversation" && ( + + )}

{name}

diff --git a/lib/conversation.ts b/lib/conversation.ts new file mode 100644 index 0000000..14be3ce --- /dev/null +++ b/lib/conversation.ts @@ -0,0 +1,72 @@ +import { db } from "@/lib/db"; + +export const getOrCreateConversation = async (memberOneId: string, memberTwoId: string) => { + let conversation = await findConversation(memberOneId, memberTwoId) || await findConversation(memberTwoId, memberOneId); + + if (!conversation) + { + conversation = await createNewConversation(memberOneId, memberTwoId); + } + + return conversation; +} + +const findConversation = async (memberOneId: string, memberTwoId: string) => { + try + { + return await db.conversation.findFirst({ + where: { + AND: [ + { memberOneId: memberOneId}, + { memberTwoId: memberTwoId}, + ], + }, + include: { + MemberOne: { + include: { + profile: true, + } + }, + MemberTwo: { + include: { + profile: true, + } + } + } + }); + } + catch (error) + { + return null; + } + +} + +const createNewConversation = async (memberOneId: string, memberTwoId: string) => { + try + { + return await db.conversation.create({ + data:{ + memberOneId, + memberTwoId, + }, + include: { + MemberOne: { + include: { + profile: true, + } + }, + MemberTwo: { + include: { + profile: true, + } + } + }, + + }); + } + catch (error) + { + return null; + } +} \ No newline at end of file