返回 presentation-ai
discussion-kit.tsx
根目录 / src / components / plate / plugins / discussion-kit.tsx
1 "use client";
2
3 import { createPlatePlugin, type PlateEditor } from "platejs/react";
4
5 import {
6 type DiscussionUser,
7 type DiscussionUsersMap,
8 type StoredDiscussion,
9 } from "@/lib/notes/discussions";
10 import { BlockDiscussion } from "../ui/block-discussion";
11 import { type TComment } from "../ui/comment";
12
13 export type TDiscussion = {
14 id: string;
15 comments: TComment[];
16 createdAt: Date | string;
17 isResolved: boolean;
18 user?: DiscussionUser;
19 userId: string;
20 documentContent?: string;
21 };
22
23 type DiscussionChangeHandler = (discussions: StoredDiscussion[]) => void;
24
25 type DiscussionPluginOptions = {
26 currentUserId: string;
27 discussions: StoredDiscussion[];
28 onDiscussionsChange?: DiscussionChangeHandler;
29 users: DiscussionUsersMap;
30 };
31
32 const discussionPluginOptions: DiscussionPluginOptions = {
33 currentUserId: "",
34 discussions: [],
35 onDiscussionsChange: undefined,
36 users: {},
37 };
38
39 export const discussionPlugin = createPlatePlugin({
40 key: "discussion",
41 options: discussionPluginOptions,
42 })
43 .configure({
44 render: { aboveNodes: BlockDiscussion },
45 })
46 .extendSelectors(({ getOption }) => ({
47 currentUser: () => getOption("users")[getOption("currentUserId")],
48 user: (id: string) => getOption("users")[id],
49 }));
50
51 export function updateDiscussionState(
52 editor: PlateEditor,
53 discussions: StoredDiscussion[],
54 ) {
55 editor.setOption(discussionPlugin, "discussions", discussions);
56
57 const onDiscussionsChange = editor.getOption(
58 discussionPlugin,
59 "onDiscussionsChange",
60 );
61
62 onDiscussionsChange?.(discussions);
63 }
64
65 export const DiscussionKit = [discussionPlugin];
66
66 lines Plain Text