Skip to content

Commit

Permalink
feat: add conversation viewer(#86)
Browse files Browse the repository at this point in the history
  • Loading branch information
loopy-lim authored Nov 5, 2024
2 parents 0bb6eb7 + a1f70be commit 8f29782
Show file tree
Hide file tree
Showing 27 changed files with 592 additions and 195 deletions.
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,15 @@
"@radix-ui/react-icons": "^1.3.0",
"@radix-ui/react-label": "^2.1.0",
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-tabs": "^1.1.1",
"@tanstack/react-query": "^5.59.15",
"@tanstack/react-query-devtools": "^5.59.15",
"axios": "^1.7.7",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"framer-motion": "^11.11.10",
"html-to-image": "^1.11.11",
"js-base64": "^3.7.7",
"lucide-react": "^0.453.0",
"monaco-editor": "^0.52.0",
"next-themes": "^0.3.0",
Expand Down
40 changes: 40 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file removed public/exalidraw_test.jpg
Binary file not shown.
103 changes: 80 additions & 23 deletions src/apis/conversation/dtos.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,65 @@ interface UserData {
email: string;
name: string;
}

export interface Conversation {
pk: number;
// TODO : 추후에 BE가 변경될 때 이야기 하기.
creatorPk: number;
participantPk: number;
//
dataPk: number;
title: string;
startedAt: string;
finishedAt: string;
deleteAt: Date;
creator: UserData;
participant: UserData;
}

export interface Data {
total: number;
conversations: Conversation[];
}

export interface GetPreviousRoomResponseDto {
export class GetPreviousRoomsResponseDto {
success: boolean;
data: Data;
data: {
total: number;
conversations: {
pk: number;
creatorPk: number;
participantPk: number;
dataPk: number;
title: string;
startedAt: Date;
finishedAt: Date;
deleteAt: Date;
creator: UserData;
participant: UserData;
conversationDatas: {
uuid: string;
canShared: boolean;
}
}[];
};
constructor({ success, data }: {
success: boolean; data: {
total: number, conversations: {
pk: number;
creatorPk: number;
participantPk: number;
dataPk: number;
title: string;
startedAt: string;
finishedAt: string;
deleteAt: Date;
creator: UserData;
participant: UserData;
conversationDatas: {
uuid: string;
canShared: boolean;
}
}[];
}
}) {
this.success = success;
this.data = {
total: data.total,
conversations: data.conversations.map(conversation => ({
pk: conversation.pk,
creatorPk: conversation.creatorPk,
participantPk: conversation.participantPk,
dataPk: conversation.dataPk,
title: conversation.title,
startedAt: new Date(conversation.startedAt),
finishedAt: new Date(conversation.finishedAt),
deleteAt: new Date(conversation.deleteAt),
creator: conversation.creator,
participant: conversation.participant,
conversationDatas: conversation.conversationDatas,
}))
};
}
}

export class ChattingSocketResponse {
Expand All @@ -50,3 +85,25 @@ export class ChattingSocketResponse {
this.date = new Date(date);
}
}


export interface GetPreviousRoomResponseDto {
chat: {
url: string,
isShared: boolean
},
note: {
url: string,
isShared: boolean
},
drawBoard: {
url: string,
isShared: boolean
},
voice: {
url: string,
isShared: boolean
},
canShared: boolean;
}

16 changes: 0 additions & 16 deletions src/apis/previousRoomApi.tsx

This file was deleted.

18 changes: 18 additions & 0 deletions src/apis/room/previousRoomApi.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { GetPreviousRoomResponseDto, GetPreviousRoomsResponseDto } from "@/apis/conversation/dtos";
import https from "@/lib/https";

export const getPreviousRoomsApi = async (
currentPage: number,
): Promise<GetPreviousRoomsResponseDto> => {
const { data } = await https.get("/conversations", {
params: { page: currentPage },
});
return new GetPreviousRoomsResponseDto(data);
};

export const getPreviousRoom = async (
conversationId: string,
) => {
const { data } = await https.get<GetPreviousRoomResponseDto>(`/conversations/${conversationId}`);
return data;
}
Empty file.
42 changes: 42 additions & 0 deletions src/components/Conversation/Save/DrawBoard.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { useFetcher } from "@/hooks/useFetcher";
import { Excalidraw } from "@excalidraw/excalidraw";
import { toUint8Array } from "js-base64";
import { yjsToExcalidraw } from "y-excalidraw";
import * as Y from "yjs";

interface ConversationSaveDrawBoardViewerProps {
data: {
url: string;
isShared: boolean;
};
}

const ConversationSaveDrawBoardViewer = ({
data: { url },
}: ConversationSaveDrawBoardViewerProps) => {
const { data } = useFetcher({ url });

if (!data) return null;

const ydoc = new Y.Doc();
const binaryEndcoed = toUint8Array(data.data || "");
Y.applyUpdate(ydoc, binaryEndcoed);

const yElements = ydoc.getArray<Y.Map<unknown>>("elements");

return (
<div className="h-[calc(100vh-12rem)]">
<Excalidraw
initialData={{
elements: yjsToExcalidraw(yElements || new Y.Array<Y.Map<unknown>>()),
appState: {
viewModeEnabled: true,
},
}}
theme="light"
/>
</div>
);
};

export default ConversationSaveDrawBoardViewer;
19 changes: 14 additions & 5 deletions src/components/Conversation/Save/Header.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,25 @@
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Link } from "react-router-dom";

const ConversationSaveHeader = () => {
interface ConversationSaveHeaderProps {
initialTitle?: string;
}

const ConversationSaveHeader = ({
initialTitle,
}: ConversationSaveHeaderProps) => {
return (
<div className="flex justify-between px-12">
<div className="flex justify-between pb-6">
<div className="flex items-center">
<span className="min-w-12 text-lg">제목: </span>
<Input />
<Input defaultValue={initialTitle} />
</div>
<div className="flex gap-4">
<Button variant="secondary">종료하기</Button>
<Button>저장하기</Button>
<Button variant="secondary">홈으로</Button>
<Button asChild>
<Link to="/room">저장하기</Link>
</Button>
</div>
</div>
);
Expand Down
37 changes: 37 additions & 0 deletions src/components/Conversation/Save/NoteViewer.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { useFetcher } from "@/hooks/useFetcher";
import { BlockNoteView } from "@blocknote/mantine";
import { useCreateBlockNote } from "@blocknote/react";
import "@blocknote/mantine/style.css";
import { useEffect } from "react";

interface ConversationSaveNoteViewerProps {
data: {
url: string;
isShared: boolean;
};
}

const ConversationSaveNoteViewer = ({
data: { url },
}: ConversationSaveNoteViewerProps) => {
const { data } = useFetcher({ url });
const editor = useCreateBlockNote({
animations: false,
});

useEffect(() => {
async function loadInitialHTML() {
const blocks = await editor.tryParseMarkdownToBlocks(data?.data || "");
editor.replaceBlocks(editor.document, blocks);
}
loadInitialHTML();
}, [data]);

return (
<div className="h-[calc(100vh-12rem)] py-2">
<BlockNoteView editor={editor} sideMenu={true} theme="light" />
</div>
);
};

export default ConversationSaveNoteViewer;
Loading

0 comments on commit 8f29782

Please sign in to comment.