import React, { useState, useEffect, useRef } from "react"; import { expertQAData, expertInfo } from "@/data/expertQAData"; import "./index.css"; const ExpertSupportPage = () => { // 对话管理 const [selectedConversation, setSelectedConversation] = useState(null); const [messages, setMessages] = useState([]); const [inputMessage, setInputMessage] = useState(""); const [showResolutionModal, setShowResolutionModal] = useState(null); const [isNewConversation, setIsNewConversation] = useState(false); // 用于跟踪最后活动时间 // 初始对话数据 - 整合文旅产业问答内容 const [conversationGroups, setConversationGroups] = useState({ 今天: [], // 清空今天板块的对话记录 "7天内": [ // 导入文旅产业问答数据中的最近记录 ...expertQAData.slice(0, 3).map(qa => ({ ...qa, lastActivityTime: Date.now() - (Math.floor(Math.random() * 6) + 1) * 24 * 60 * 60 * 1000 })), { id: 7, title: "文创产品开发咨询", lastMessage: "如何设计有文化内涵的旅游纪念品", time: "01-03", status: "已解决", statusType: "resolved", hasInactivityAlert: false, lastActivityTime: Date.now() - 5 * 24 * 60 * 60 * 1000, messages: [] }, ], "30天内": [ // 导入文旅产业问答数据中的其余记录 ...expertQAData.slice(3, 6).map(qa => ({ ...qa, lastActivityTime: Date.now() - (Math.floor(Math.random() * 10) + 15) * 24 * 60 * 60 * 1000 })), { id: 11, title: "智慧旅游技术应用", lastMessage: "如何利用数字技术提升游客体验", time: "12-12", status: "已解决", statusType: "resolved", hasInactivityAlert: false, lastActivityTime: Date.now() - 26 * 24 * 60 * 60 * 1000, messages: [] }, ], }); // 当前活跃对话的消息记录 const conversationMessages = [ { id: 1, type: "user", content: "您好,我遇到了一些问题", time: "2025-01-08 16:45", avatar: "👤", }, { id: 2, type: "expert", content: "你好我是多多ai智能问答小助手,有什么问题就来问我吧", time: "2025-01-08 16:46", avatar: "👨‍💻", expertName: "多多机器人", }, { id: 3, type: "user", content: "我需要了解更多关于泛型的使用,特别是在复杂数据结构中的应用", time: "2025-01-08 16:48", avatar: "👤", }, ]; // 创建新对话 const createNewConversation = () => { const newConversation = { id: Date.now(), title: "新的问题咨询", lastMessage: "", time: new Date().toLocaleTimeString("zh-CN", { hour: "2-digit", minute: "2-digit", }), status: "进行中", statusType: "in-progress", hasInactivityAlert: false, lastActivityTime: Date.now(), }; setConversationGroups((prev) => ({ ...prev, 今天: [newConversation, ...prev["今天"]], })); setSelectedConversation(newConversation); setMessages([]); setIsNewConversation(true); }; // 检查非活跃状态 const checkInactivityStatus = () => { const currentTime = Date.now(); const INACTIVITY_THRESHOLD = 10 * 60 * 1000; // 10分钟 setConversationGroups((prev) => { const updated = { ...prev }; Object.keys(updated).forEach((groupKey) => { updated[groupKey] = updated[groupKey].map((conversation) => { if (conversation.statusType === "in-progress") { const timeSinceLastActivity = currentTime - conversation.lastActivityTime; const shouldShowAlert = timeSinceLastActivity >= INACTIVITY_THRESHOLD; if (shouldShowAlert !== conversation.hasInactivityAlert) { return { ...conversation, hasInactivityAlert: shouldShowAlert }; } } return conversation; }); }); return updated; }); }; // 处理对话选择 const handleConversationSelect = (conversation) => { // 如果是带有红点的对话,点击时询问是否已解决 if ( conversation.hasInactivityAlert && conversation.statusType === "in-progress" ) { setShowResolutionModal(conversation); } else { setSelectedConversation(conversation); // 如果对话有预设的消息记录,使用它们;否则使用默认消息 if (conversation.messages && conversation.messages.length > 0) { setMessages(conversation.messages); } else { setMessages(conversationMessages); } setIsNewConversation(false); } }; // 标记问题为已解决 const markAsResolved = (conversationId) => { setConversationGroups((prev) => { const updated = { ...prev }; Object.keys(updated).forEach((groupKey) => { updated[groupKey] = updated[groupKey].map((conversation) => { if (conversation.id === conversationId) { return { ...conversation, status: "已解决", statusType: "resolved", hasInactivityAlert: false, lastMessage: "问题已解决", }; } return conversation; }); }); return updated; }); setShowResolutionModal(null); // 如果当前选中的是这个对话,取消选择 if (selectedConversation?.id === conversationId) { setSelectedConversation(null); setMessages([]); } }; // 继续对话 const continueConversation = (conversation) => { // 更新最后活动时间 setConversationGroups((prev) => { const updated = { ...prev }; Object.keys(updated).forEach((groupKey) => { updated[groupKey] = updated[groupKey].map((conv) => { if (conv.id === conversation.id) { return { ...conv, hasInactivityAlert: false, lastActivityTime: Date.now(), }; } return conv; }); }); return updated; }); setSelectedConversation(conversation); // 如果对话有预设的消息记录,使用它们;否则使用默认消息 if (conversation.messages && conversation.messages.length > 0) { setMessages(conversation.messages); } else { setMessages(conversationMessages); } setShowResolutionModal(null); setIsNewConversation(false); }; // 发送消息 const handleSendMessage = () => { if (!inputMessage.trim()) return; const newMessage = { id: messages.length + 1, type: "user", content: inputMessage, time: new Date().toLocaleString("zh-CN"), avatar: "👤", }; setMessages([...messages, newMessage]); setInputMessage(""); // 更新当前对话的标题和最后消息(如果是新对话) if (selectedConversation && isNewConversation && messages.length === 0) { const title = inputMessage.length > 20 ? inputMessage.substring(0, 20) + "..." : inputMessage; setConversationGroups((prev) => { const updated = { ...prev }; Object.keys(updated).forEach((groupKey) => { updated[groupKey] = updated[groupKey].map((conversation) => { if (conversation.id === selectedConversation.id) { return { ...conversation, title: title, lastMessage: inputMessage, lastActivityTime: Date.now(), }; } return conversation; }); }); return updated; }); setSelectedConversation((prev) => ({ ...prev, title: title, lastMessage: inputMessage, lastActivityTime: Date.now(), })); setIsNewConversation(false); } else if (selectedConversation) { // 更新现有对话的最后活动时间 setConversationGroups((prev) => { const updated = { ...prev }; Object.keys(updated).forEach((groupKey) => { updated[groupKey] = updated[groupKey].map((conversation) => { if (conversation.id === selectedConversation.id) { return { ...conversation, lastMessage: inputMessage, lastActivityTime: Date.now(), hasInactivityAlert: false, }; } return conversation; }); }); return updated; }); } }; // 组件生命周期 useEffect(() => { // 页面加载时自动创建新对话 createNewConversation(); // 定时检查非活跃状态 const interval = setInterval(checkInactivityStatus, 30000); // 每30秒检查一次 return () => clearInterval(interval); }, []); // 组件挂载后进行初始检查 useEffect(() => { const timeoutId = setTimeout(checkInactivityStatus, 1000); return () => clearTimeout(timeoutId); }, []); // 转专家服务 const handleTransferToExpert = () => { if ( selectedConversation && selectedConversation.statusType === "in-progress" ) { // 更新对话状态逻辑 alert("已转交人工专家,将有专业老师为您服务"); } }; return (
{/* 左侧对话记录区域 */}

对话记录

非学员无权限
{/* 按时间分组的对话列表 */}
{Object.entries(conversationGroups).map( ([groupName, conversations]) => (

{groupName}

{conversations.map((conversation) => (
handleConversationSelect(conversation)} >

{conversation.title}

{conversation.hasInactivityAlert && (
)}

{conversation.lastMessage}

{conversation.time} {conversation.status}
))}
) )}
{/* 右侧问答界面 */}
{/* 顶部信息栏 */}
🎓 专家客服
学有所问,向必有答
「我们有创新学习习惯养成方案」
专家答疑
快速响应
24小时服务
{/* 对话内容区域 */}
{selectedConversation ? ( <>

{selectedConversation.title}

{selectedConversation.statusType === "in-progress" && ( )}
{messages.map((message) => (
{message.avatar}
{message.type === "expert" && (
{message.expertName}
)}
{message.content}
{message.time}
))}
) : (
💬
请选择一个对话开始
从左侧列表中选择对话记录
)}
{/* 输入区域 */} {selectedConversation && (
setInputMessage(e.target.value)} placeholder="请输入您的问题..." className="message-input" onKeyPress={(e) => e.key === "Enter" && handleSendMessage()} />
Shift + Enter 可以换行,Enter 发送消息
)}
{/* 问题解决确认模态框 */} {showResolutionModal && (

问题解决确认

您在「{showResolutionModal.title}」中已经超过10分钟没有活动, 请问这个问题是否已经得到解决?

)}
); }; export default ExpertSupportPage;