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 ( -
{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