Dialog.jsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import './dialog.css';
  2. import { DialogLogic } from './dialog.js';
  3. import { useEffect, useRef } from 'react';
  4. function Dialog({ messages = [], isLoading = false }) {
  5. const { formatTime } = DialogLogic(messages);
  6. const messagesEndRef = useRef(null);
  7. // 自动滚动到底部
  8. useEffect(() => {
  9. messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
  10. }, [messages, isLoading]);
  11. return (
  12. <div className="Dialog-container">
  13. <div className="Dialog-messages">
  14. {messages.length === 0 && !isLoading && (
  15. <div className="Dialog-message assistant">
  16. <div className="Dialog-message-avatar">
  17. AI
  18. </div>
  19. <div className="Dialog-message-content">
  20. <div className="Dialog-message-text">请直接描述你想要生成的自动化工作流,我会帮你生成对应的配置文件。</div>
  21. <div className="Dialog-message-time">{formatTime(new Date())}</div>
  22. </div>
  23. </div>
  24. )}
  25. {messages.map((msg, index) => (
  26. <div key={index} className={`Dialog-message ${msg.role === 'user' ? 'user' : 'assistant'}`}>
  27. <div className="Dialog-message-avatar">
  28. {msg.role === 'user' ? '我' : 'AI'}
  29. </div>
  30. <div className="Dialog-message-content">
  31. {msg.images && msg.images.length > 0 && (
  32. <div className="Dialog-message-images">
  33. {msg.images.map((img, imgIndex) => (
  34. <img
  35. key={imgIndex}
  36. src={`data:image/png;base64,${img.base64}`}
  37. alt={img.originalName || `图片${imgIndex + 1}`}
  38. className="Dialog-message-image"
  39. title={img.originalName}
  40. />
  41. ))}
  42. </div>
  43. )}
  44. {msg.content && (
  45. <div className="Dialog-message-text">{msg.content}</div>
  46. )}
  47. <div className="Dialog-message-time">{formatTime(msg.timestamp)}</div>
  48. </div>
  49. </div>
  50. ))}
  51. {isLoading && (
  52. <div className="Dialog-message assistant">
  53. <div className="Dialog-message-avatar">
  54. AI
  55. </div>
  56. <div className="Dialog-message-content">
  57. <div className="Dialog-message-text Dialog-loading">
  58. <span className="Dialog-loading-dots">
  59. <span>.</span>
  60. <span>.</span>
  61. <span>.</span>
  62. </span>
  63. </div>
  64. </div>
  65. </div>
  66. )}
  67. <div ref={messagesEndRef} />
  68. </div>
  69. </div>
  70. );
  71. }
  72. export default Dialog;