diff --git a/web/src/components/ChatBox/ChatMessageList/Item.tsx b/web/src/components/ChatBox/ChatMessageList/Item.tsx index a78e903d..29f225e9 100644 --- a/web/src/components/ChatBox/ChatMessageList/Item.tsx +++ b/web/src/components/ChatBox/ChatMessageList/Item.tsx @@ -15,13 +15,14 @@ import { Avatar } from '@/components/Avatar'; import { useRenderPluginMessageInterpreter } from './useRenderPluginMessageInterpreter'; import { getMessageRender } from '@/plugin/common'; import { Icon } from '@iconify/react'; -import { Divider, Dropdown } from 'antd'; +import { Divider, Dropdown, Popover } from 'antd'; import { UserName } from '@/components/UserName'; import './item.less'; import clsx from 'clsx'; import { useChatMessageItemAction } from './useChatMessageItemAction'; import { useChatMessageReaction } from './useChatMessageReaction'; import { DevContainer } from '@/components/DevContainer'; +import { TcPopover } from '@/components/TcPopover'; /** * 消息引用 @@ -115,8 +116,9 @@ const NormalMessage: React.FC = React.memo((props) => { )} > - = React.memo((props) => {
-
+
{ - console.log('code', code); - }, []); +export function useChatMessageReaction(payload: ChatMessage): RenderFunction { + const payloadRef = useUpdateRef(payload); + const Component = useMemo( + () => + (() => { + const { closePopover } = useTcPopoverContext(); - return ; + const handleSelect = useCallback((code: string) => { + console.log('code', code, payloadRef.current); + closePopover(); + }, []); + + return ; + }) as RenderFunction, + [] + ); + + return Component; } diff --git a/web/src/components/EmojiPanel/Picker.less b/web/src/components/EmojiPanel/Picker.less new file mode 100644 index 00000000..86012ee6 --- /dev/null +++ b/web/src/components/EmojiPanel/Picker.less @@ -0,0 +1,10 @@ +.emoji-picker { + .emoji-mart-anchors { + justify-content: flex-start; + gap: 6px; + + .emoji-mart-anchor { + flex: initial; + } + } +} diff --git a/web/src/components/EmojiPanel/Picker.tsx b/web/src/components/EmojiPanel/Picker.tsx index 13ea2bb3..4f2efa32 100644 --- a/web/src/components/EmojiPanel/Picker.tsx +++ b/web/src/components/EmojiPanel/Picker.tsx @@ -1,57 +1,10 @@ import React, { useCallback } from 'react'; -import { NimblePicker, Data, EmojiData } from 'emoji-mart'; -import data from 'emoji-mart/data/twitter.json'; +import { NimblePicker, EmojiData } from 'emoji-mart'; +import { isValidStr, useColorScheme } from 'tailchat-shared'; +import { emojiData } from './const'; import 'emoji-mart/css/emoji-mart.css'; -import { isValidStr } from 'tailchat-shared'; - -const emojiData: Data = { - compressed: true, - categories: [ - { - id: 'people', - name: 'Smileys & People', - emojis: data.categories[0].emojis, - }, - { - id: 'nature', - name: 'Animals & Nature', - emojis: data.categories[1].emojis, - }, - { - id: 'foods', - name: 'Food & Drink', - emojis: data.categories[2].emojis, - }, - { - id: 'activity', - name: 'Activities', - emojis: data.categories[3].emojis, - }, - { - id: 'places', - name: 'Travel & Places', - emojis: data.categories[4].emojis, - }, - { - id: 'objects', - name: 'Objects', - emojis: data.categories[5].emojis, - }, - { - id: 'symbols', - name: 'Symbols', - emojis: data.categories[6].emojis, - }, - { - id: 'flags', - name: 'Flags', - emojis: data.categories[7].emojis, - }, - ], - emojis: data.emojis, - aliases: data.aliases, -}; +import './Picker.less'; interface EmojiPickerProps { onSelect: (code: string) => void; @@ -61,6 +14,7 @@ interface EmojiPickerProps { * emoji表情面板 */ const EmojiPicker: React.FC = React.memo((props) => { + const { isDarkMode } = useColorScheme(); const handleSelect = useCallback( (emoji: EmojiData) => { const code = emoji.colons; @@ -72,7 +26,17 @@ const EmojiPicker: React.FC = React.memo((props) => { ); return ( - +
+ +
); }); EmojiPicker.displayName = 'EmojiPicker'; diff --git a/web/src/components/EmojiPanel/const.ts b/web/src/components/EmojiPanel/const.ts new file mode 100644 index 00000000..0636961f --- /dev/null +++ b/web/src/components/EmojiPanel/const.ts @@ -0,0 +1,50 @@ +import type { Data } from 'emoji-mart'; +import data from 'emoji-mart/data/twitter.json'; + +export const emojiData: Data = { + compressed: true, + categories: [ + { + id: 'people', + name: 'Smileys & People', + emojis: data.categories[0].emojis, + }, + { + id: 'nature', + name: 'Animals & Nature', + emojis: data.categories[1].emojis, + }, + // { + // id: 'foods', + // name: 'Food & Drink', + // emojis: data.categories[2].emojis, + // }, + // { + // id: 'activity', + // name: 'Activities', + // emojis: data.categories[3].emojis, + // }, + // { + // id: 'places', + // name: 'Travel & Places', + // emojis: data.categories[4].emojis, + // }, + // { + // id: 'objects', + // name: 'Objects', + // emojis: data.categories[5].emojis, + // }, + // { + // id: 'symbols', + // name: 'Symbols', + // emojis: data.categories[6].emojis, + // }, + // { + // id: 'flags', + // name: 'Flags', + // emojis: data.categories[7].emojis, + // }, + ], + emojis: data.emojis, + aliases: data.aliases, +};