47 lines
1.7 KiB
TypeScript
47 lines
1.7 KiB
TypeScript
|
|
import { Badge } from "@/components/bs-ui/badge";
|
||
|
|
import { InfoCircledIcon } from "@radix-ui/react-icons";
|
||
|
|
import { useTranslation } from "react-i18next";
|
||
|
|
|
||
|
|
const enum SourceType {
|
||
|
|
/** 无溯源 */
|
||
|
|
NONE = 0,
|
||
|
|
/** 文件 */
|
||
|
|
FILE = 1,
|
||
|
|
/** 无权限 */
|
||
|
|
NO_PERMISSION = 2,
|
||
|
|
/** 链接s */
|
||
|
|
LINK = 3,
|
||
|
|
/** 已命中的QA */
|
||
|
|
HAS_QA = 4,
|
||
|
|
}
|
||
|
|
|
||
|
|
export default function SourceEntry({ extra, end, source, className = '', onSource }) {
|
||
|
|
const { t } = useTranslation()
|
||
|
|
|
||
|
|
if (source === SourceType.NONE || !end) return <div className={className}></div>
|
||
|
|
const extraObj = extra ? JSON.parse(extra) : null
|
||
|
|
|
||
|
|
return <div className={className}>
|
||
|
|
{(() => {
|
||
|
|
switch (source) {
|
||
|
|
case SourceType.FILE:
|
||
|
|
return <Badge className="cursor-pointer" onClick={onSource}>{t('chat.source')}</Badge>;
|
||
|
|
case SourceType.NO_PERMISSION:
|
||
|
|
return <p className="flex text-xs text-gray-400 gap-1 items-center"><InfoCircledIcon className="text-red-300" />{t('chat.noAccess')}</p>;
|
||
|
|
case SourceType.LINK:
|
||
|
|
return (
|
||
|
|
<div className="flex flex-col text-blue-500 text-xs">
|
||
|
|
{
|
||
|
|
extraObj.doc?.map(el => <a key={el.url} href={el.url} target="_blank">{el.title}</a>)
|
||
|
|
}
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
case SourceType.HAS_QA:
|
||
|
|
return <a href={extraObj.url} target="_blank" className="text-blue-500 text-xs">{extraObj.qa}</a>;
|
||
|
|
default:
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
})()}
|
||
|
|
</div>
|
||
|
|
};
|