feat: 增加消息reactions渲染

pull/81/head
moonrailgun 4 years ago
parent ea30bb8894
commit 66fbf1a024

@ -23,6 +23,7 @@ import { useChatMessageItemAction } from './useChatMessageItemAction';
import { useChatMessageReaction } from './useChatMessageReaction';
import { DevContainer } from '@/components/DevContainer';
import { TcPopover } from '@/components/TcPopover';
import { useMessageReactions } from './useMessageReactions';
/**
*
@ -62,6 +63,8 @@ const NormalMessage: React.FC<ChatMessageItemProps> = React.memo((props) => {
const userInfo = useCachedUserInfo(payload.author ?? '');
const [isActionBtnActive, setIsActionBtnActive] = useState(false);
const reactions = useMessageReactions(payload);
const emojiAction = useChatMessageReaction(payload);
const moreActions = useChatMessageItemAction(payload);
@ -102,6 +105,8 @@ const NormalMessage: React.FC<ChatMessageItemProps> = React.memo((props) => {
{/* 解释器按钮 */}
{useRenderPluginMessageInterpreter(payload.content)}
</div>
{reactions}
</div>
{/* 操作 */}

@ -4,6 +4,13 @@
max-height: 60px !important;
}
}
.chat-message-reactions {
.emoji-mart-emoji {
display: flex;
align-items: center;
}
}
}
.chat-message-item_action-popover {

@ -1,4 +1,4 @@
import { EmojiPanel } from '@/components/EmojiPanel';
import { EmojiPanel } from '@/components/Emoji';
import { useTcPopoverContext } from '@/components/TcPopover';
import type { RenderFunction } from 'antd/lib/_util/getRenderPropValue';
import React, { useMemo } from 'react';

@ -0,0 +1,42 @@
import type { ChatMessage } from 'tailchat-shared';
import _groupBy from 'lodash/groupBy';
import _uniqBy from 'lodash/uniqBy';
import { useMemo } from 'react';
import { Emoji } from '@/components/Emoji';
import React from 'react';
import { Tooltip } from 'antd';
/**
*
*/
export function useMessageReactions(payload: ChatMessage) {
const reactions = payload.reactions ?? [];
const groupedReactions = useMemo(() => {
const groups = _groupBy(reactions, 'name');
return Object.keys(groups).map((name) => {
const reactions = _uniqBy(groups[name], 'author');
return {
name,
length: reactions.length,
users: reactions.map((r) => r.author),
};
});
}, [reactions]);
return (
<div className="flex chat-message-reactions gap-1">
{groupedReactions.map((reaction) => (
<div
key={reaction.name}
className="py-0.5 px-1 bg-black bg-opacity-20 rounded flex"
>
<Emoji emoji={reaction.name} />
{reaction.length > 1 && <span>{reaction.length}</span>}
</div>
))}
</div>
);
}

@ -0,0 +1,12 @@
import { Emoji as OriginEmoji, EmojiProps } from 'emoji-mart';
import React from 'react';
interface Props extends Omit<EmojiProps, 'size'> {
size?: number;
}
const Emoji: React.FC<Props> = React.memo((props) => {
return <OriginEmoji size={16} {...props} />;
});
Emoji.displayName = 'Emoji';
export default Emoji;

@ -1,6 +1,13 @@
import React from 'react';
import { Loadable } from '../Loadable';
const Emoji = Loadable(
() =>
import(
/* webpackChunkName: 'emoji' */ /* webpackPrefetch: true */ './Emoji'
)
);
const EmojiPicker = Loadable(
() =>
import(
@ -8,6 +15,8 @@ const EmojiPicker = Loadable(
)
);
export { Emoji };
/**
* emoji
*/
Loading…
Cancel
Save