mirror of https://github.com/msgbyte/tailchat
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
3.0 KiB
TypeScript
147 lines
3.0 KiB
TypeScript
import type { ChatInputActionContextProps } from '@/components/ChatBox/ChatInputBox/context';
|
|
import {
|
|
buildRegFn,
|
|
buildRegList,
|
|
ChatMessage,
|
|
FastFormFieldMeta,
|
|
GroupPanel,
|
|
regSocketEventListener,
|
|
} from 'tailchat-shared';
|
|
|
|
/**
|
|
* 注册自定义面板
|
|
*/
|
|
export interface PluginCustomPanel {
|
|
/**
|
|
* 面板位置:
|
|
*
|
|
* - personal: 个人面板中的一项
|
|
* - setting: 设置面板
|
|
* - navbar: 导航栏(未实装)
|
|
*/
|
|
position: 'personal' | 'setting' | 'navbar';
|
|
|
|
/**
|
|
* Iconify 名
|
|
*/
|
|
icon: string;
|
|
|
|
/**
|
|
* 自定义面板唯一标识名
|
|
*/
|
|
name: string;
|
|
|
|
/**
|
|
* 自定义面板显示名
|
|
*/
|
|
label: string;
|
|
|
|
/**
|
|
* 渲染组件
|
|
*/
|
|
render: React.ComponentType;
|
|
}
|
|
export const [pluginCustomPanel, regCustomPanel] =
|
|
buildRegList<PluginCustomPanel>();
|
|
|
|
/**
|
|
* 注册群组面板
|
|
*/
|
|
export interface PluginGroupPanel {
|
|
/**
|
|
* 面板唯一标识
|
|
* @example com.msgbyte.webview/grouppanel
|
|
*/
|
|
name: string;
|
|
|
|
/**
|
|
* 面板显示名
|
|
*/
|
|
label: string;
|
|
|
|
/**
|
|
* 插件提供者, 用于引导没有安装插件的用户安装插件
|
|
*/
|
|
provider: string;
|
|
|
|
/**
|
|
* 额外的表单数据, 用于创建面板时使用
|
|
*/
|
|
extraFormMeta: FastFormFieldMeta[];
|
|
|
|
/**
|
|
* 该面板如何渲染
|
|
*/
|
|
render: React.ComponentType<{ panelInfo: GroupPanel }>;
|
|
}
|
|
export const [pluginGroupPanel, regGroupPanel] =
|
|
buildRegList<PluginGroupPanel>();
|
|
|
|
export interface PluginMessageInterpreter {
|
|
name?: string;
|
|
explainMessage: (message: string) => React.ReactNode;
|
|
}
|
|
|
|
/**
|
|
* 消息解释器
|
|
* 即用于解释消息内容, 并把结果渲染到消息下面
|
|
*/
|
|
export const [messageInterpreter, regMessageInterpreter] =
|
|
buildRegList<PluginMessageInterpreter>();
|
|
|
|
/**
|
|
* 消息渲染器
|
|
* 输入消息,返回渲染节点
|
|
*/
|
|
export const [getMessageRender, regMessageRender] = buildRegFn<
|
|
(message: string) => React.ReactNode
|
|
>('message-render', (message) => message);
|
|
|
|
/**
|
|
* 消息渲染器
|
|
* 输入消息,返回渲染节点
|
|
*/
|
|
export const [getMessageTextDecorators, regMessageTextDecorators] = buildRegFn<
|
|
() => {
|
|
url: (plain: string) => string;
|
|
image: (plain: string, attrs: Record<string, unknown>) => string;
|
|
}
|
|
>('message-text-decorators', () => ({
|
|
url: (plain: string) => plain,
|
|
image: (plain: string) => plain,
|
|
}));
|
|
|
|
interface ChatInputAction {
|
|
label: string;
|
|
onClick: (actions: ChatInputActionContextProps) => void;
|
|
}
|
|
export type { ChatInputActionContextProps };
|
|
export const [pluginChatInputActions, regChatInputAction] =
|
|
buildRegList<ChatInputAction>();
|
|
|
|
export { regSocketEventListener };
|
|
|
|
/**
|
|
* 注册配色方案
|
|
*/
|
|
export const [pluginColorScheme, regPluginColorScheme] = buildRegList<{
|
|
label: string;
|
|
name: string;
|
|
}>();
|
|
|
|
/**
|
|
* 注册检查服务方案
|
|
*/
|
|
export const [pluginInspectServices, regInspectService] = buildRegList<{
|
|
label: string;
|
|
name: string;
|
|
}>();
|
|
|
|
/**
|
|
* 注册对消息的额外解释函数
|
|
*/
|
|
export const [pluginMessageExtraParsers, regMessageExtraParser] = buildRegList<{
|
|
name: string;
|
|
render: (payload: ChatMessage) => React.ReactNode;
|
|
}>();
|