From 6bb08c2297be1b6415c8bc02e6917eba6ee355e5 Mon Sep 17 00:00:00 2001
From: shimai <shimai@example.com>
Date: Fri, 03 Apr 2026 10:42:08 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/test/tony.cheng/260312' into test/shimai.huang/260309

---
 web-app/src/components/call-record/ConversationList.jsx |   88 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 88 insertions(+), 0 deletions(-)

diff --git a/web-app/src/components/call-record/ConversationList.jsx b/web-app/src/components/call-record/ConversationList.jsx
new file mode 100644
index 0000000..826c32d
--- /dev/null
+++ b/web-app/src/components/call-record/ConversationList.jsx
@@ -0,0 +1,88 @@
+import React from 'react';
+import { RobotOutlined, UserOutlined } from '@ant-design/icons';
+import './ConversationList.css';
+
+/**
+ * 单条对话组件
+ * 展示单条对话消息
+ */
+const ConversationItem = ({ item, contactName }) => {
+  const isRobot = item.speaker === 'Robot';
+  
+  // 格式化时间戳
+  const formatTimestamp = (timestamp) => {
+    if (!timestamp) return '';
+    const date = new Date(timestamp);
+    const year = date.getFullYear();
+    const month = String(date.getMonth() + 1).padStart(2, '0');
+    const day = String(date.getDate()).padStart(2, '0');
+    const hours = String(date.getHours()).padStart(2, '0');
+    const minutes = String(date.getMinutes()).padStart(2, '0');
+    return `${year}-${month}-${day} ${hours}:${minutes}`;
+  };
+
+  // 获取头像首字
+  const getAvatarText = () => {
+    if (isRobot) return <RobotOutlined />;
+    return contactName ? contactName.charAt(0) : <UserOutlined />;
+  };
+
+  return (
+    <div className={`conversation-item ${isRobot ? 'robot-item' : 'contact-item'}`}>
+      {/* 头像 */}
+      <div className={`avatar ${isRobot ? 'robot-avatar' : 'contact-avatar'}`}>
+        {getAvatarText()}
+      </div>
+      
+      {/* 消息内容 */}
+      <div className="message-wrapper">
+        <div className="message-header">
+          <span className="speaker-name">
+            {isRobot ? 'AI调解员' : contactName}
+          </span>
+        </div>
+        
+        <div className={`message-bubble ${isRobot ? 'robot-bubble' : 'contact-bubble'}`}>
+          {item.script}
+        </div>
+        
+        <div className="message-time">
+          {formatTimestamp(item.timestamp)}
+        </div>
+      </div>
+    </div>
+  );
+};
+
+/**
+ * 对话记录列表组件
+ * 展示双方对话记录,类似微信聊天界面
+ */
+const ConversationList = ({ conversations, contactName }) => {
+  // 过滤无效对话记录
+  const validConversations = conversations.filter(
+    item => item.script && item.script.trim() !== ''
+  );
+
+  if (!validConversations || validConversations.length === 0) {
+    return (
+      <div className="conversation-empty">
+        暂无对话记录
+      </div>
+    );
+  }
+
+  return (
+    <div className="conversation-list">
+      {validConversations.map((item, index) => (
+        <ConversationItem
+          key={index}
+          item={item}
+          contactName={contactName}
+        />
+      ))}
+    </div>
+  );
+};
+
+export default ConversationList;

--
Gitblit v1.8.0