mirror of https://github.com/msgbyte/tailchat
feat: 插件文档增加渲染图片的能力
parent
e0225cfb76
commit
61f4ea35c8
@ -0,0 +1,11 @@
|
||||
## 喵语翻译
|
||||
|
||||
允许用户将自然语言转换为加密后的喵语
|
||||
|
||||
在任意聊天款的右侧添加喵语翻译
|
||||
|
||||

|
||||
|
||||
在此输入的任意内容都会被转换为加密后的喵语言,只有安装了相同插件的用户才能翻译
|
||||
|
||||

|
Binary file not shown.
After Width: | Height: | Size: 9.6 KiB |
Binary file not shown.
After Width: | Height: | Size: 4.5 KiB |
@ -1,3 +1,56 @@
|
||||
import { Alert } from 'antd';
|
||||
import React from 'react';
|
||||
import { t } from 'tailchat-shared';
|
||||
import { Problem } from './Problem';
|
||||
|
||||
export const ErrorBoundary = Alert.ErrorBoundary;
|
||||
interface ErrorBoundaryProps {
|
||||
message?: React.ReactNode;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export class ErrorBoundary extends React.Component<
|
||||
ErrorBoundaryProps,
|
||||
{
|
||||
error?: Error | null;
|
||||
info: {
|
||||
componentStack?: string;
|
||||
};
|
||||
}
|
||||
> {
|
||||
state = {
|
||||
error: undefined,
|
||||
info: {
|
||||
componentStack: '',
|
||||
},
|
||||
};
|
||||
|
||||
componentDidCatch(error: Error | null, info: any) {
|
||||
this.setState({ error, info });
|
||||
}
|
||||
|
||||
render() {
|
||||
const { message, description, children } = this.props;
|
||||
const { error, info } = this.state;
|
||||
const componentStack =
|
||||
info && info.componentStack ? info.componentStack : null;
|
||||
const errorMessage =
|
||||
typeof message === 'undefined' ? (error || '').toString() : message;
|
||||
const errorDescription =
|
||||
typeof description === 'undefined' ? componentStack : description;
|
||||
if (error) {
|
||||
return (
|
||||
<div className="p-2">
|
||||
<Problem
|
||||
text={
|
||||
<>
|
||||
<h3>{t('页面出现了一些问题')}</h3>
|
||||
<p title={errorDescription ?? ''}>{errorMessage}</p>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return children;
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,14 @@
|
||||
import { markAbsoluteUrl } from '../url-helper';
|
||||
|
||||
describe('markAbsoluteUrl', () => {
|
||||
test.each([
|
||||
['bar', 'https://www.example.com/foo/bar'],
|
||||
['./bar', 'https://www.example.com/foo/bar'],
|
||||
['../bar', 'https://www.example.com/bar'],
|
||||
['/bar', 'https://www.example.com/bar'],
|
||||
['https://www.baidu.com', 'https://www.baidu.com/'],
|
||||
['https://www.baidu.com/search', 'https://www.baidu.com/search'],
|
||||
])('%s', (input, output) => {
|
||||
expect(markAbsoluteUrl(input)).toBe(output);
|
||||
});
|
||||
});
|
@ -0,0 +1,8 @@
|
||||
/**
|
||||
* 根据输入url返回绝对url
|
||||
* @param relativeUrl 相对或绝对url
|
||||
* @returns 绝对url
|
||||
*/
|
||||
export function markAbsoluteUrl(relativeUrl: string): string {
|
||||
return new URL(relativeUrl, location.href).href;
|
||||
}
|
Loading…
Reference in New Issue