43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
import Link from '@docusaurus/Link';
|
|
import block from 'bem-css-modules';
|
|
import React, { ReactNode } from 'react';
|
|
|
|
import { MD } from '@docuservix/entities/markdown';
|
|
|
|
import { IChatSource, sourceToPath, sourceToUrl } from '@docuservix/models/chat';
|
|
|
|
import styles from './Message.module.css';
|
|
|
|
const b = block(styles, 'Message');
|
|
|
|
interface MessageProps {
|
|
role: 'user' | 'assistant';
|
|
content: string;
|
|
sources?: IChatSource[];
|
|
}
|
|
|
|
export function Message({ role, content, sources }: MessageProps): ReactNode {
|
|
return (
|
|
<div className={b({ role })}>
|
|
<div className={b('content')}>
|
|
<MD>{content}</MD>
|
|
</div>
|
|
|
|
{sources && sources.length > 0 && (
|
|
<div className={b('sources')}>
|
|
<div className={b('sourcesLabel')}>Источники:</div>
|
|
{sources.map((src, j) => (
|
|
<Link
|
|
key={j}
|
|
to={sourceToUrl(src.file, src.anchor)}
|
|
className={b('sourceLink')}
|
|
>
|
|
{src.heading || sourceToPath(src.file)}
|
|
</Link>
|
|
))}
|
|
</div>
|
|
)}
|
|
</div>
|
|
);
|
|
}
|