feat: 增加消息复制功能

pull/81/head
moonrailgun 3 years ago
parent 1b71d747e4
commit 8d6db59aee

@ -12,11 +12,17 @@ function bbcodeNodeToPlainText(node: AstNode): string {
} else {
if (node.tag === 'img') {
return '[图片]';
} else {
return (node.content ?? [])
.map((sub) => bbcodeNodeToPlainText(sub))
.join('');
}
if (node.tag === 'emoji') {
return `:${node.content.join('')}:`;
}
if (node.tag === 'at') {
return `@${node.content.join('')}`;
}
return (node.content ?? [])
.map((sub) => bbcodeNodeToPlainText(sub))
.join('');
}
}

@ -6,6 +6,10 @@ import {
} from '@capital/common';
const BBCode = Loadable(() => import('./render'));
let serialize: (bbcode: string) => string;
import('./bbcode/serialize').then((module) => {
serialize = module.bbcodeToPlainText;
});
regMessageRender((message) => {
return <BBCode plainText={message} />;
@ -22,6 +26,7 @@ regMessageTextDecorators(() => ({
},
mention: (userId, userName) => `[at=${userId}]${userName}[/at]`,
emoji: (emojiCode) => `[emoji]${stripColons(emojiCode)}[/emoji]`,
serialize: (plain: string) => (serialize ? serialize(plain) : plain),
}));
/**

@ -1,6 +1,6 @@
import { Icon } from '@/components/Icon';
import { Menu } from 'antd';
import React from 'react';
import React, { useCallback } from 'react';
import {
ChatMessage,
deleteMessage,
@ -13,6 +13,8 @@ import {
useUserInfo,
} from 'tailchat-shared';
import { openReconfirmModalP } from '@/components/Modal';
import copy from 'copy-to-clipboard';
import { getMessageTextDecorators } from '@/plugin/common';
/**
*
@ -25,6 +27,10 @@ export function useChatMessageItemAction(
const groupInfo = useGroupInfoContext();
const userInfo = useUserInfo();
const handleCopy = useCallback(() => {
copy(getMessageTextDecorators().serialize(payload.content));
}, [payload.content]);
const [, handleRecallMessage] = useAsyncRequest(async () => {
if (await openReconfirmModalP()) {
await recallMessage(payload._id);
@ -42,6 +48,14 @@ export function useChatMessageItemAction(
return (
<Menu onClick={options.onClick}>
<Menu.Item
key="copy"
icon={<Icon icon="mdi:content-copy" />}
onClick={handleCopy}
>
{t('复制')}
</Menu.Item>
{context.hasContext && (
<Menu.Item
key="reply"

@ -107,6 +107,7 @@ const defaultMessageTextDecorators = {
image: (plain: string, attrs: Record<string, unknown>) => plain,
mention: (userId: string, userName: string) => `@${userName}`,
emoji: (emojiCode: string) => emojiCode,
serialize: (plain: string) => plain,
};
const [_getMessageTextDecorators, regMessageTextDecorators] = buildRegFn<
() => Partial<typeof defaultMessageTextDecorators>

Loading…
Cancel
Save