refactor: emoji面板调整

并增加点击后的回调事件
release/desktop
moonrailgun 3 years ago
parent b3e4359920
commit f5d36de237

@ -15,13 +15,14 @@ import { Avatar } from '@/components/Avatar';
import { useRenderPluginMessageInterpreter } from './useRenderPluginMessageInterpreter'; import { useRenderPluginMessageInterpreter } from './useRenderPluginMessageInterpreter';
import { getMessageRender } from '@/plugin/common'; import { getMessageRender } from '@/plugin/common';
import { Icon } from '@iconify/react'; import { Icon } from '@iconify/react';
import { Divider, Dropdown } from 'antd'; import { Divider, Dropdown, Popover } from 'antd';
import { UserName } from '@/components/UserName'; import { UserName } from '@/components/UserName';
import './item.less'; import './item.less';
import clsx from 'clsx'; import clsx from 'clsx';
import { useChatMessageItemAction } from './useChatMessageItemAction'; import { useChatMessageItemAction } from './useChatMessageItemAction';
import { useChatMessageReaction } from './useChatMessageReaction'; import { useChatMessageReaction } from './useChatMessageReaction';
import { DevContainer } from '@/components/DevContainer'; import { DevContainer } from '@/components/DevContainer';
import { TcPopover } from '@/components/TcPopover';
/** /**
* *
@ -115,8 +116,9 @@ const NormalMessage: React.FC<ChatMessageItemProps> = React.memo((props) => {
)} )}
> >
<DevContainer> <DevContainer>
<Dropdown <TcPopover
overlay={emojiAction} overlayClassName="chat-message-item_action-popover"
content={emojiAction}
placement="bottomLeft" placement="bottomLeft"
trigger={['click']} trigger={['click']}
onVisibleChange={setIsActionBtnActive} onVisibleChange={setIsActionBtnActive}
@ -124,7 +126,7 @@ const NormalMessage: React.FC<ChatMessageItemProps> = React.memo((props) => {
<div> <div>
<MessageActionIcon icon="mdi:emoticon-happy-outline" /> <MessageActionIcon icon="mdi:emoticon-happy-outline" />
</div> </div>
</Dropdown> </TcPopover>
</DevContainer> </DevContainer>
<Dropdown <Dropdown

@ -5,3 +5,17 @@
} }
} }
} }
.chat-message-item_action-popover {
.ant-popover-arrow {
display: none;
}
.ant-popover-inner {
background-color: transparent;
.ant-popover-inner-content {
padding: 0;
}
}
}

@ -1,16 +1,28 @@
import { EmojiPanel } from '@/components/EmojiPanel'; import { EmojiPanel } from '@/components/EmojiPanel';
import React, { useCallback } from 'react'; import { useTcPopoverContext } from '@/components/TcPopover';
import type { ChatMessage } from 'tailchat-shared'; import type { RenderFunction } from 'antd/lib/_util/getRenderPropValue';
import React, { useCallback, useMemo } from 'react';
import { ChatMessage, useUpdateRef } from 'tailchat-shared';
/** /**
* *
*/ */
export function useChatMessageReaction( export function useChatMessageReaction(payload: ChatMessage): RenderFunction {
payload: ChatMessage const payloadRef = useUpdateRef(payload);
): React.ReactElement { const Component = useMemo(
() =>
(() => {
const { closePopover } = useTcPopoverContext();
const handleSelect = useCallback((code: string) => { const handleSelect = useCallback((code: string) => {
console.log('code', code); console.log('code', code, payloadRef.current);
closePopover();
}, []); }, []);
return <EmojiPanel onSelect={handleSelect} />; return <EmojiPanel onSelect={handleSelect} />;
}) as RenderFunction,
[]
);
return Component;
} }

@ -0,0 +1,10 @@
.emoji-picker {
.emoji-mart-anchors {
justify-content: flex-start;
gap: 6px;
.emoji-mart-anchor {
flex: initial;
}
}
}

@ -1,57 +1,10 @@
import React, { useCallback } from 'react'; import React, { useCallback } from 'react';
import { NimblePicker, Data, EmojiData } from 'emoji-mart'; import { NimblePicker, EmojiData } from 'emoji-mart';
import data from 'emoji-mart/data/twitter.json'; import { isValidStr, useColorScheme } from 'tailchat-shared';
import { emojiData } from './const';
import 'emoji-mart/css/emoji-mart.css'; import 'emoji-mart/css/emoji-mart.css';
import { isValidStr } from 'tailchat-shared'; import './Picker.less';
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,
};
interface EmojiPickerProps { interface EmojiPickerProps {
onSelect: (code: string) => void; onSelect: (code: string) => void;
@ -61,6 +14,7 @@ interface EmojiPickerProps {
* emoji * emoji
*/ */
const EmojiPicker: React.FC<EmojiPickerProps> = React.memo((props) => { const EmojiPicker: React.FC<EmojiPickerProps> = React.memo((props) => {
const { isDarkMode } = useColorScheme();
const handleSelect = useCallback( const handleSelect = useCallback(
(emoji: EmojiData) => { (emoji: EmojiData) => {
const code = emoji.colons; const code = emoji.colons;
@ -72,7 +26,17 @@ const EmojiPicker: React.FC<EmojiPickerProps> = React.memo((props) => {
); );
return ( return (
<NimblePicker set="twitter" data={emojiData} onSelect={handleSelect} /> <div className="emoji-picker">
<NimblePicker
set="twitter"
data={emojiData}
theme={isDarkMode ? 'dark' : 'light'}
showPreview={false}
showSkinTones={false}
emojiTooltip={false}
onSelect={handleSelect}
/>
</div>
); );
}); });
EmojiPicker.displayName = 'EmojiPicker'; EmojiPicker.displayName = 'EmojiPicker';

@ -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,
};
Loading…
Cancel
Save