๐Ÿ“ Sign Up | ๐Ÿ” Log In

โ† Root | โ†‘ Up

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๐Ÿ“„ shadcn/directory/udecode/plate/(plugins)/(collaboration)/discussion.cn โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘

title: ่ฎจ่ฎบ docs:

  • route: /docs/components/block-discussion title: ๅ—่ฎจ่ฎบ

<ComponentPreview name="discussion-demo" /> <PackageInfo>

ๅŠŸ่ƒฝ็‰น็‚น

  • ็”จๆˆท็ฎก็†: ๅญ˜ๅ‚จๅ’Œ็ฎก็†ๅธฆๆœ‰ๅคดๅƒๅ’Œๅ็งฐ็š„็”จๆˆทๆ•ฐๆฎ
  • ่ฎจ่ฎบ็บฟ็จ‹: ็ฎก็†ๅธฆๆœ‰่ฏ„่ฎบ็š„่ฎจ่ฎบๆ•ฐๆฎ็ป“ๆž„
  • ๅฝ“ๅ‰็”จๆˆท่ทŸ่ธช: ่ทŸ่ธชๅฝ“ๅ‰ๆดป่ทƒ็”จๆˆทไปฅ่ฟ›่กŒๅไฝœ
  • ๆ•ฐๆฎๅญ˜ๅ‚จ: ็”จไบŽๅญ˜ๅ‚จๅไฝœ็Šถๆ€็š„็บฏ UI ๆ’ไปถ
  • ้€‰ๆ‹ฉๅ™จ API: ้€š่ฟ‡ๆ’ไปถ้€‰ๆ‹ฉๅ™จ่ฝปๆพ่ฎฟ้—ฎ็”จๆˆทๆ•ฐๆฎ
</PackageInfo>

Kit ไฝฟ็”จ

<Steps>

ๅฎ‰่ฃ…

ๆทปๅŠ ่ฎจ่ฎบๅŠŸ่ƒฝๆœ€ๅฟซ็š„ๆ–นๆณ•ๆ˜ฏไฝฟ็”จ DiscussionKit,ๅฎƒๅŒ…ๅซ้ข„้…็ฝฎ็š„ discussionPlugin ๅŠๅ…ถ Plate UI ็ป„ไปถใ€‚

<ComponentSource name="discussion-kit" />
  • BlockDiscussion: ๅœจ่Š‚็‚นไธŠๆ–นๆธฒๆŸ“่ฎจ่ฎบ UI

ๆทปๅŠ  Kit

import { createPlateEditor } from 'platejs/react';
import { DiscussionKit } from '@/components/editor/plugins/discussion-kit';

const editor = createPlateEditor({
  plugins: [
    // ...ๅ…ถไป–ๆ’ไปถ,
    ...DiscussionKit,
  ],
});
</Steps>

ๆ‰‹ๅŠจไฝฟ็”จ

<Steps>

ๅฎ‰่ฃ…

npm install @platejs/comment @platejs/suggestion

ๅˆ›ๅปบๆ’ไปถ

import { createPlatePlugin } from 'platejs/react';
import { BlockDiscussion } from '@/components/ui/block-discussion';

export interface TDiscussion {
  id: string;
  comments: TComment[];
  createdAt: Date;
  isResolved: boolean;
  userId: string;
  documentContent?: string;
}

const usersData = {
  alice: {
    id: 'alice',
    avatarUrl: 'https://api.dicebear.com/9.x/glass/svg?seed=alice6',
    name: 'Alice',
  },
  bob: {
    id: 'bob', 
    avatarUrl: 'https://api.dicebear.com/9.x/glass/svg?seed=bob4',
    name: 'Bob',
  },
};

export const discussionPlugin = createPlatePlugin({
  key: 'discussion',
  options: {
    currentUserId: 'alice',
    discussions: [],
    users: usersData,
  },
})
  .configure({
    render: { aboveNodes: BlockDiscussion },
  })
  .extendSelectors(({ getOption }) => ({
    currentUser: () => getOption('users')[getOption('currentUserId')],
    user: (id: string) => getOption('users')[id],
  }));
  • options.currentUserId: ๅฝ“ๅ‰ๆดป่ทƒ็”จๆˆท็š„ ID
  • options.discussions: ่ฎจ่ฎบๆ•ฐๆฎ็ป“ๆž„ๆ•ฐ็ป„
  • options.users: ๅฐ†็”จๆˆท ID ๆ˜ ๅฐ„ๅˆฐ็”จๆˆทๆ•ฐๆฎ็š„ๅฏน่ฑก
  • render.aboveNodes: ๅœจ่Š‚็‚นไธŠๆ–นๆธฒๆŸ“ BlockDiscussion ็”จไบŽ่ฎจ่ฎบ UI
  • selectors.currentUser: ่Žทๅ–ๅฝ“ๅ‰็”จๆˆทๆ•ฐๆฎ
  • selectors.user: ้€š่ฟ‡ ID ่Žทๅ–็”จๆˆทๆ•ฐๆฎ

ๆทปๅŠ ๆ’ไปถ

import { createPlateEditor } from 'platejs/react';

const editor = createPlateEditor({
  plugins: [
    // ...ๅ…ถไป–ๆ’ไปถ,
    discussionPlugin,
  ],
});
</Steps>

ๆ’ไปถ

discussionPlugin

็”จไบŽ็ฎก็†ๅŒ…ๆ‹ฌ็”จๆˆทๅ’Œ่ฎจ่ฎบๆ•ฐๆฎๅœจๅ†…็š„ๅไฝœ็Šถๆ€็š„็บฏ UI ๆ’ไปถใ€‚

<API name="discussionPlugin"> <APIOptions> <APIItem name="currentUserId" type="string"> ๅไฝœไผš่ฏไธญๅฝ“ๅ‰ๆดป่ทƒ็”จๆˆท็š„ IDใ€‚ </APIItem> <APIItem name="discussions" type="TDiscussion[]"> ๅŒ…ๅซ่ฏ„่ฎบๅ’Œๅ…ƒๆ•ฐๆฎ็š„่ฎจ่ฎบๅฏน่ฑกๆ•ฐ็ป„ใ€‚ </APIItem> <APIItem name="users" type="Record<string, UserData>"> ๅฐ†็”จๆˆท ID ๆ˜ ๅฐ„ๅˆฐๅŒ…ๆ‹ฌๅ็งฐๅ’Œๅคดๅƒๅœจๅ†…็š„็”จๆˆทไฟกๆฏ็š„ๅฏน่ฑกใ€‚ </APIItem> </APIOptions> </API>

้€‰ๆ‹ฉๅ™จ

currentUser

่Žทๅ–ๅฝ“ๅ‰็”จๆˆทๆ•ฐๆฎใ€‚

<API name="currentUser"> <APIReturns type="UserData"> ๅฝ“ๅ‰็”จๆˆท็š„ๆ•ฐๆฎ,ๅŒ…ๆ‹ฌ idใ€name ๅ’Œ avatarUrlใ€‚ </APIReturns> </API>

user

้€š่ฟ‡ ID ่Žทๅ–็”จๆˆทๆ•ฐๆฎใ€‚

<API name="user"> <APIParameters> <APIItem name="id" type="string"> ่ฆๆŸฅๆ‰พ็š„็”จๆˆท IDใ€‚ </APIItem> </APIParameters> <APIReturns type="UserData | undefined"> ๅฆ‚ๆžœๆ‰พๅˆฐๅˆ™่ฟ”ๅ›ž็”จๆˆทๆ•ฐๆฎ,ๅฆๅˆ™่ฟ”ๅ›ž undefinedใ€‚ </APIReturns> </API>

็ฑปๅž‹

TDiscussion

ๅŒ…ๅซ่ฏ„่ฎบๅ’Œๅ…ƒๆ•ฐๆฎ็š„่ฎจ่ฎบๆ•ฐๆฎ็ป“ๆž„ใ€‚

<API name="TDiscussion"> <APIAttributes> <APIItem name="id" type="string"> ่ฎจ่ฎบ็š„ๅ”ฏไธ€ๆ ‡่ฏ†็ฌฆใ€‚ </APIItem> <APIItem name="comments" type="TComment[]"> ่ฎจ่ฎบ็บฟ็จ‹ไธญ็š„่ฏ„่ฎบๆ•ฐ็ป„ใ€‚ </APIItem> <APIItem name="createdAt" type="Date"> ่ฎจ่ฎบๅˆ›ๅปบ็š„ๆ—ถ้—ดใ€‚ </APIItem> <APIItem name="isResolved" type="boolean"> ่ฎจ่ฎบๆ˜ฏๅฆๅทฒ่งฃๅ†ณใ€‚ </APIItem> <APIItem name="userId" type="string"> ๅˆ›ๅปบ่ฎจ่ฎบ็š„็”จๆˆท IDใ€‚ </APIItem> <APIItem name="documentContent" type="string" optional> ไธŽๆญค่ฎจ่ฎบ็›ธๅ…ณ็š„ๆ–‡ๆกฃๅ†…ๅฎนใ€‚ </APIItem> </APIAttributes> </API>

UserData

็”จไบŽๅไฝœ็š„็”จๆˆทไฟกๆฏ็ป“ๆž„ใ€‚

<API name="UserData"> <APIAttributes> <APIItem name="id" type="string"> ็”จๆˆท็š„ๅ”ฏไธ€ๆ ‡่ฏ†็ฌฆใ€‚ </APIItem> <APIItem name="name" type="string"> ็”จๆˆท็š„ๆ˜พ็คบๅ็งฐใ€‚ </APIItem> <APIItem name="avatarUrl" type="string"> ็”จๆˆทๅคดๅƒๅ›พ็‰‡็š„ URLใ€‚ </APIItem> <APIItem name="hue" type="number" optional> ็”จไบŽ็”จๆˆท่ฏ†ๅˆซ็š„ๅฏ้€‰้ขœ่‰ฒ่‰ฒ่ฐƒใ€‚ </APIItem> </APIAttributes> </API>
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

โ† Root | โ†‘ Up