MessageCard.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { useTranslation } from 'react-i18next';
  2. import ReactMarkdown from 'react-markdown';
  3. import styles from './MessageCard.module.scss';
  4. const moduleClass = styles['message-card'] ?? '';
  5. const userMessageCardModuleClass = styles['user-message-card'] ?? '';
  6. const UserMessageCard = ({ children }: { children: string }): JSX.Element => (
  7. <div className={`card d-inline-flex align-self-end bg-success-subtle bg-info-subtle ${moduleClass} ${userMessageCardModuleClass}`}>
  8. <div className="card-body">
  9. <ReactMarkdown>{children}</ReactMarkdown>
  10. </div>
  11. </div>
  12. );
  13. const assistantMessageCardModuleClass = styles['assistant-message-card'] ?? '';
  14. const AssistantMessageCard = ({ children }: { children: string }): JSX.Element => {
  15. const { t } = useTranslation();
  16. return (
  17. <div className={`card border-0 ${moduleClass} ${assistantMessageCardModuleClass}`}>
  18. <div className="card-body d-flex">
  19. <div className="me-2 me-lg-3">
  20. <span className="growi-custom-icons grw-ai-icon rounded-pill">growi_ai</span>
  21. </div>
  22. { children.length > 0
  23. ? (
  24. <ReactMarkdown>{children}</ReactMarkdown>
  25. )
  26. : (
  27. <span className="text-thinking">
  28. {t('modal_aichat.progress_label')} <span className="material-symbols-outlined">more_horiz</span>
  29. </span>
  30. )
  31. }
  32. </div>
  33. </div>
  34. );
  35. };
  36. type Props = {
  37. role: 'user' | 'assistant',
  38. children: string,
  39. }
  40. export const MessageCard = (props: Props): JSX.Element => {
  41. const { role, children } = props;
  42. return role === 'user'
  43. ? <UserMessageCard>{children}</UserMessageCard>
  44. : <AssistantMessageCard>{children}</AssistantMessageCard>;
  45. };