diff --git a/web/plugins/com.msgbyte.bbcode/src/index.tsx b/web/plugins/com.msgbyte.bbcode/src/index.tsx index ab5635f4..9d394191 100644 --- a/web/plugins/com.msgbyte.bbcode/src/index.tsx +++ b/web/plugins/com.msgbyte.bbcode/src/index.tsx @@ -20,4 +20,5 @@ regMessageTextDecorators(() => ({ return `[img]${plain}[/img]`; }, + mention: (userId, userName) => `[at=${userId}]${userName}[/at]`, })); diff --git a/web/plugins/com.msgbyte.bbcode/src/tags/CodeTag.tsx b/web/plugins/com.msgbyte.bbcode/src/tags/CodeTag.tsx index 6aacdccd..cd7c6ea0 100644 --- a/web/plugins/com.msgbyte.bbcode/src/tags/CodeTag.tsx +++ b/web/plugins/com.msgbyte.bbcode/src/tags/CodeTag.tsx @@ -1,7 +1,8 @@ +import { Loadable } from '@capital/common'; import React from 'react'; import type { TagProps } from '../bbcode/type'; -const Highlight = React.lazy(() => import('../components/Highlight')); +const Highlight = Loadable(() => import('../components/Highlight')); export const CodeTag: React.FC = React.memo((props) => { const { node } = props; diff --git a/web/plugins/com.msgbyte.bbcode/src/tags/MentionTag.tsx b/web/plugins/com.msgbyte.bbcode/src/tags/MentionTag.tsx new file mode 100644 index 00000000..3a373642 --- /dev/null +++ b/web/plugins/com.msgbyte.bbcode/src/tags/MentionTag.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import type { TagProps } from '../bbcode/type'; + +export const MentionTag: React.FC = React.memo((props) => { + const { node } = props; + const userName = node.content.join(''); + const userId = node.attrs.at; + + return ( + + @{userName} + + ); +}); +MentionTag.displayName = 'MentionTag'; diff --git a/web/plugins/com.msgbyte.bbcode/src/tags/__all__.ts b/web/plugins/com.msgbyte.bbcode/src/tags/__all__.ts index 286bbb14..82d9f619 100644 --- a/web/plugins/com.msgbyte.bbcode/src/tags/__all__.ts +++ b/web/plugins/com.msgbyte.bbcode/src/tags/__all__.ts @@ -1,10 +1,14 @@ import { registerBBCodeTag } from '../bbcode/parser'; import { CodeTag } from './CodeTag'; import { ImgTag } from './ImgTag'; +import { MentionTag } from './MentionTag'; import { PlainText } from './PlainText'; import { UrlTag } from './UrlTag'; +import './styles.less'; + registerBBCodeTag('_text', PlainText); registerBBCodeTag('url', UrlTag); registerBBCodeTag('img', ImgTag); registerBBCodeTag('code', CodeTag); +registerBBCodeTag('at', MentionTag); diff --git a/web/plugins/com.msgbyte.bbcode/src/tags/styles.less b/web/plugins/com.msgbyte.bbcode/src/tags/styles.less new file mode 100644 index 00000000..8ebef8a8 --- /dev/null +++ b/web/plugins/com.msgbyte.bbcode/src/tags/styles.less @@ -0,0 +1,9 @@ +.plugin-bbcode-mention-tag { + background-color: rgba(88, 101, 242, 0.3); + border-radius: 2px; + padding: 0 4px; + + &:hover { + background-color: rgb(88, 101, 242); + } +} diff --git a/web/src/plugin/common/reg.ts b/web/src/plugin/common/reg.ts index 66947f99..2c032e6d 100644 --- a/web/src/plugin/common/reg.ts +++ b/web/src/plugin/common/reg.ts @@ -103,15 +103,11 @@ export const [getMessageRender, regMessageRender] = buildRegFn< */ const defaultMessageTextDecorators = { url: (plain: string) => plain, - image: (plain: string) => plain, + image: (plain: string, attrs: Record) => plain, mention: (userId: string, userName: string) => `@${userName}`, }; const [_getMessageTextDecorators, regMessageTextDecorators] = buildRegFn< - () => { - url: (plain: string) => string; - image: (plain: string, attrs: Record) => string; - mention: (userId: string, userName: string) => string; - } + () => Partial >('message-text-decorators', () => defaultMessageTextDecorators); function getMessageTextDecorators() { return {