feat: 增加喵语发送功能

pull/13/head
moonrailgun 4 years ago
parent f6d5321c1e
commit 1fff755586

@ -0,0 +1,47 @@
import React from 'react';
import { useCallback } from 'react';
import { useState } from 'react';
import {
ModalWrapper,
useModalContext,
ChatInputActionContextProps,
} from '@capital/common';
import { Button, TextArea } from '@capital/component';
import { encode } from './trans';
interface SendMiaoModalProps {
actions: ChatInputActionContextProps;
}
export const SendMiaoModal: React.FC<SendMiaoModalProps> = React.memo(
(props) => {
const [text, setText] = useState('');
const modalContext = useModalContext();
const handleSendMiao = useCallback(() => {
const miao = encode(text);
props.actions.sendMsg(miao);
modalContext?.closeModal();
}, [text, modalContext, props.actions]);
return (
<ModalWrapper title="喵言喵语">
<TextArea
placeholder="输入人话"
value={text}
onChange={(e) => setText(e.target.value)}
/>
<Button
style={{ marginTop: 8 }}
type="primary"
block={true}
onClick={handleSendMiao}
>
</Button>
</ModalWrapper>
);
}
);
SendMiaoModal.displayName = 'SendMiaoModal';

@ -1,5 +1,11 @@
import { decode, encode, isMiao } from './trans'; import { decode, encode, isMiao } from './trans';
import { regMessageInterpreter } from '@capital/common'; import {
regMessageInterpreter,
regChatInputAction,
openModal,
} from '@capital/common';
import { createElement } from 'react';
import { SendMiaoModal } from './SendMiaoModal';
const miao = encode('喵语翻译已加载'); const miao = encode('喵语翻译已加载');
const human = decode(miao); const human = decode(miao);
@ -17,3 +23,10 @@ regMessageInterpreter({
return decode(message); return decode(message);
}, },
}); });
regChatInputAction({
label: '喵言喵语',
onClick: (actions) => {
openModal(createElement(SendMiaoModal, { actions }));
},
});

@ -1,25 +1,33 @@
import { chatInputActions } from '@/plugin/common'; import { chatInputActions } from '@/plugin/common';
import { Icon } from '@iconify/react'; import { Icon } from '@iconify/react';
import { Dropdown, Menu } from 'antd'; import { Dropdown, Menu } from 'antd';
import React, { useMemo } from 'react'; import React from 'react';
import { useChatInputActionContext } from './context';
export const ChatInputAddon: React.FC = React.memo(() => { export const ChatInputAddon: React.FC = React.memo(() => {
const menu = useMemo(() => { const actionContext = useChatInputActionContext();
return (
<Menu>
{chatInputActions.map((item, i) => (
<Menu.Item key={item.label + i} onClick={item.onClick}>
{item.label}
</Menu.Item>
))}
</Menu>
);
}, []);
if (chatInputActions.length === 0) { if (chatInputActions.length === 0) {
return null; return null;
} }
if (actionContext === null) {
return null;
}
const menu = (
<Menu>
{chatInputActions.map((item, i) => (
<Menu.Item
key={item.label + i}
onClick={() => item.onClick(actionContext)}
>
{item.label}
</Menu.Item>
))}
</Menu>
);
return ( return (
<Dropdown overlay={menu} placement="topRight" trigger={['click']}> <Dropdown overlay={menu} placement="topRight" trigger={['click']}>
<Icon <Icon

@ -0,0 +1,12 @@
import React, { useContext } from 'react';
export interface ChatInputActionContextProps {
sendMsg: (message: string) => void;
}
export const ChatInputActionContext =
React.createContext<ChatInputActionContextProps | null>(null);
ChatInputActionContext.displayName = 'ChatInputContext';
export function useChatInputActionContext() {
return useContext(ChatInputActionContext);
}

@ -3,6 +3,7 @@ import { Input } from 'antd';
import React, { useCallback, useRef, useState } from 'react'; import React, { useCallback, useRef, useState } from 'react';
import { t } from 'tailchat-shared'; import { t } from 'tailchat-shared';
import { ChatInputAddon } from './Addon'; import { ChatInputAddon } from './Addon';
import { ChatInputActionContext } from './context';
interface ChatInputBoxProps { interface ChatInputBoxProps {
onSendMsg: (msg: string) => void; onSendMsg: (msg: string) => void;
@ -27,22 +28,24 @@ export const ChatInputBox: React.FC<ChatInputBoxProps> = React.memo((props) => {
); );
return ( return (
<div className="px-4 py-2"> <ChatInputActionContext.Provider value={{ sendMsg: props.onSendMsg }}>
<div className="bg-gray-600 flex rounded-md items-center"> <div className="px-4 py-2">
<Input <div className="bg-gray-600 flex rounded-md items-center">
ref={inputRef} <Input
className="outline-none shadow-none border-0 py-2.5 px-4 flex-1" ref={inputRef}
placeholder={t('输入一些什么')} className="outline-none shadow-none border-0 py-2.5 px-4 flex-1"
value={message} placeholder={t('输入一些什么')}
onChange={(e) => setMessage(e.target.value)} value={message}
onKeyDown={handleKeyDown} onChange={(e) => setMessage(e.target.value)}
/> onKeyDown={handleKeyDown}
/>
<div className="px-2"> <div className="px-2">
<ChatInputAddon /> <ChatInputAddon />
</div>
</div> </div>
</div> </div>
</div> </ChatInputActionContext.Provider>
); );
}); });
ChatInputBox.displayName = 'ChatInputBox'; ChatInputBox.displayName = 'ChatInputBox';

@ -8,3 +8,4 @@ export {
useGroupPanelParams, useGroupPanelParams,
useCurrentGroupPanelInfo, useCurrentGroupPanelInfo,
} from '@/routes/Main/Content/Group/utils'; } from '@/routes/Main/Content/Group/utils';
export { openModal, ModalWrapper, useModalContext } from '@/components/Modal';

@ -1,3 +1,4 @@
import type { ChatInputActionContextProps } from '@/components/ChatBox/ChatInputBox/context';
import { buildRegFn, buildRegList, FastFormFieldMeta } from 'tailchat-shared'; import { buildRegFn, buildRegList, FastFormFieldMeta } from 'tailchat-shared';
/** /**
@ -55,7 +56,8 @@ export const [getMessageRender, regMessageRender] = buildRegFn<
interface ChatInputAction { interface ChatInputAction {
label: string; label: string;
onClick: () => void; onClick: (actions: ChatInputActionContextProps) => void;
} }
export type { ChatInputActionContextProps };
export const [chatInputActions, regChatInputAction] = export const [chatInputActions, regChatInputAction] =
buildRegList<ChatInputAction>(); buildRegList<ChatInputAction>();

@ -0,0 +1,4 @@
import Button from 'antd/lib/button';
import TextArea from 'antd/lib/input/TextArea';
export { Button, TextArea };

@ -17,4 +17,5 @@ function registerDependencies() {
function registerModules() { function registerModules() {
regSharedModule('@capital/common', () => import('./common/index')); regSharedModule('@capital/common', () => import('./common/index'));
regSharedModule('@capital/component', () => import('./component/index'));
} }

Loading…
Cancel
Save