fix: 普通对话返回后不再显示智能体对话
- showConversationList 简化为直接返回主页 - 主页对话列表正确过滤(只显示没有 agentId 的普通对话) - 添加操作菜单支持(重命名、分享、置顶、删除) - 统一使用全局变量 currentActionConvId
This commit is contained in:
279
www/app.js
279
www/app.js
@@ -494,6 +494,28 @@ function renderChatsPage() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 操作菜单 -->
|
||||
<div class="action-menu" id="actionMenu">
|
||||
<div class="action-menu-content">
|
||||
<div class="action-menu-item" data-action="rename">
|
||||
<svg viewBox="0 0 24 24" width="18" height="18"><path fill="currentColor" d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"/></svg>
|
||||
<span>重命名</span>
|
||||
</div>
|
||||
<div class="action-menu-item" data-action="share">
|
||||
<svg viewBox="0 0 24 24" width="18" height="18"><path fill="currentColor" d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.35 2.92 3 2.92s3-1.31 3-2.92c0-1.61-1.35-2.92-3-2.92z"/></svg>
|
||||
<span>分享</span>
|
||||
</div>
|
||||
<div class="action-menu-item" data-action="pin">
|
||||
<svg viewBox="0 0 24 24" width="18" height="18"><path fill="currentColor" d="M16 12V4h1V2H7v2h1v8l-2 2v2h5.2v6h1.6v-6H18v-2l-2-2z"/></svg>
|
||||
<span id="pinText">置顶</span>
|
||||
</div>
|
||||
<div class="action-menu-item delete-action" data-action="delete">
|
||||
<svg viewBox="0 0 24 24" width="18" height="18"><path fill="currentColor" d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"/></svg>
|
||||
<span>删除</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 搜索栏 -->
|
||||
<div class="search-bar" id="searchBar">
|
||||
<div class="search-input-wrapper">
|
||||
@@ -592,6 +614,26 @@ function bindChatsPageEvents() {
|
||||
// 长按事件
|
||||
setupLongPressEvents(conversationList);
|
||||
}
|
||||
|
||||
// 操作菜单事件
|
||||
const actionMenu = document.getElementById('actionMenu');
|
||||
if (actionMenu) {
|
||||
actionMenu.addEventListener('click', (e) => {
|
||||
const item = e.target.closest('.action-menu-item');
|
||||
if (item && currentActionConvId) {
|
||||
const action = item.getAttribute('data-action');
|
||||
handleActionMenuAction(action, currentActionConvId);
|
||||
hideActionMenu();
|
||||
}
|
||||
});
|
||||
|
||||
// 点击其他地方关闭菜单
|
||||
document.addEventListener('click', (e) => {
|
||||
if (actionMenu.classList.contains('show') && !actionMenu.contains(e.target)) {
|
||||
hideActionMenu();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 智能体页面 ====================
|
||||
@@ -1349,7 +1391,7 @@ function renderProfilePage() {
|
||||
</div>
|
||||
|
||||
<div class="profile-footer">
|
||||
<p>AI助手 v3.3.0</p>
|
||||
<p>AI助手 v3.3.1</p>
|
||||
<p>基于智谱 GLM-4.5-Air</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1983,9 +2025,11 @@ function showAgentChatPage() {
|
||||
}
|
||||
|
||||
// 设置长按事件
|
||||
// 全局变量:当前操作的对话ID
|
||||
let currentActionConvId = null;
|
||||
|
||||
function setupLongPressEvents(container) {
|
||||
let longPressTimer = null;
|
||||
let currentActionConvId = null;
|
||||
|
||||
container.addEventListener('touchstart', (e) => {
|
||||
const item = e.target.closest('.conversation-item');
|
||||
@@ -2038,236 +2082,7 @@ function setupLongPressEvents(container) {
|
||||
|
||||
function showConversationList() {
|
||||
currentConversation = null;
|
||||
|
||||
// 渲染对话列表
|
||||
const listHtml = `
|
||||
<div class="conversation-list-page">
|
||||
<header class="list-header">
|
||||
<div class="header-title">
|
||||
<span class="logo">🤖</span>
|
||||
<h1>AI助手</h1>
|
||||
</div>
|
||||
<div class="header-actions">
|
||||
<button class="header-btn search-toggle-btn" id="searchToggleBtn" title="搜索">
|
||||
<svg viewBox="0 0 24 24" width="20" height="20"><path fill="currentColor" d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 7 9.5 7 14 9.01 14 9.5 11.99 14 9.5 14z"/></svg>
|
||||
</button>
|
||||
<button class="header-btn new-chat-btn-header" id="newChatBtn" title="新建对话">
|
||||
<svg viewBox="0 0 24 24" width="20" height="20"><path fill="currentColor" d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/></svg>
|
||||
</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="list-content">
|
||||
<div class="conversation-list" id="conversationList">
|
||||
${conversations.length === 0
|
||||
? '<div class="empty-list">暂无对话记录</div>'
|
||||
: sortConversations().map(conv => `
|
||||
<div class="conversation-item ${conv.is_pinned ? 'pinned' : ''}" data-id="${conv.id}">
|
||||
${conv.is_pinned ? '<span class="pin-icon">📌</span>' : ''}
|
||||
<div class="conv-title">${escapeHtml(conv.title)}</div>
|
||||
<div class="conv-meta">${conv.messages.length} 条消息 · ${formatTime(conv.updatedAt)}</div>
|
||||
</div>
|
||||
`).join('')
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 操作菜单 -->
|
||||
<div class="action-menu" id="actionMenu">
|
||||
<div class="action-menu-content">
|
||||
<div class="action-menu-item" data-action="rename">
|
||||
<svg viewBox="0 0 24 24" width="18" height="18"><path fill="currentColor" d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"/></svg>
|
||||
<span>重命名</span>
|
||||
</div>
|
||||
<div class="action-menu-item" data-action="share">
|
||||
<svg viewBox="0 0 24 24" width="18" height="18"><path fill="currentColor" d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.35 2.92 3 2.92s3-1.31 3-2.92c0-1.61-1.35-2.92-3-2.92z"/></svg>
|
||||
<span>分享</span>
|
||||
</div>
|
||||
<div class="action-menu-item" data-action="pin">
|
||||
<svg viewBox="0 0 24 24" width="18" height="18"><path fill="currentColor" d="M16 12V4h1V2H7v2h1v8l-2 2v2h5.2v6h1.6v-6H18v-2l-2-2z"/></svg>
|
||||
<span id="pinText">置顶</span>
|
||||
</div>
|
||||
<div class="action-menu-item delete-action" data-action="delete">
|
||||
<svg viewBox="0 0 24 24" width="18" height="18"><path fill="currentColor" d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"/></svg>
|
||||
<span>删除</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 搜索栏 -->
|
||||
<div class="search-bar" id="searchBar">
|
||||
<div class="search-input-wrapper">
|
||||
<svg viewBox="0 0 24 24" width="20" height="20"><path fill="currentColor" d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 7 9.5 7 14 9.01 14 9.5 11.99 14 9.5 14z"/></svg>
|
||||
<input type="text" id="searchInput" placeholder="搜索对话标题或内容...">
|
||||
<button class="search-close-btn" id="searchCloseBtn">
|
||||
<svg viewBox="0 0 24 24" width="18" height="18"><path fill="currentColor" d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
|
||||
</button>
|
||||
</div>
|
||||
<div class="search-results" id="searchResults"></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
appContainer.innerHTML = listHtml;
|
||||
|
||||
// 绑定事件
|
||||
const newChatBtn = document.getElementById('newChatBtn');
|
||||
if (newChatBtn) {
|
||||
newChatBtn.addEventListener('click', createNewConversation);
|
||||
}
|
||||
|
||||
// 搜索功能
|
||||
const searchToggleBtn = document.getElementById('searchToggleBtn');
|
||||
const searchBar = document.getElementById('searchBar');
|
||||
const searchInput = document.getElementById('searchInput');
|
||||
const searchCloseBtn = document.getElementById('searchCloseBtn');
|
||||
const searchResults = document.getElementById('searchResults');
|
||||
|
||||
if (searchToggleBtn) {
|
||||
searchToggleBtn.addEventListener('click', () => {
|
||||
if (searchBar) {
|
||||
searchBar.classList.add('show');
|
||||
if (searchInput) {
|
||||
searchInput.focus();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (searchCloseBtn) {
|
||||
searchCloseBtn.addEventListener('click', () => {
|
||||
hideSearchBar();
|
||||
});
|
||||
}
|
||||
|
||||
if (searchInput) {
|
||||
searchInput.addEventListener('input', (e) => {
|
||||
const keyword = e.target.value.trim();
|
||||
if (keyword) {
|
||||
searchConversations(keyword);
|
||||
} else {
|
||||
if (searchResults) searchResults.innerHTML = '';
|
||||
}
|
||||
});
|
||||
|
||||
searchInput.addEventListener('keydown', (e) => {
|
||||
if (e.key === 'Escape') {
|
||||
hideSearchBar();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 点击搜索结果
|
||||
if (searchResults) {
|
||||
searchResults.addEventListener('click', (e) => {
|
||||
const item = e.target.closest('.search-result-item');
|
||||
if (item) {
|
||||
const id = item.getAttribute('data-id');
|
||||
hideSearchBar();
|
||||
openConversation(id);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function hideSearchBar() {
|
||||
if (searchBar) {
|
||||
searchBar.classList.remove('show');
|
||||
}
|
||||
if (searchInput) {
|
||||
searchInput.value = '';
|
||||
}
|
||||
if (searchResults) {
|
||||
searchResults.innerHTML = '';
|
||||
}
|
||||
}
|
||||
|
||||
const conversationList = document.getElementById('conversationList');
|
||||
const actionMenu = document.getElementById('actionMenu');
|
||||
let longPressTimer = null;
|
||||
let currentActionConvId = null;
|
||||
|
||||
if (conversationList) {
|
||||
// 点击事件
|
||||
conversationList.addEventListener('click', (e) => {
|
||||
const item = e.target.closest('.conversation-item');
|
||||
|
||||
if (item) {
|
||||
const id = item.getAttribute('data-id');
|
||||
openConversation(id);
|
||||
}
|
||||
});
|
||||
|
||||
// 长按事件
|
||||
conversationList.addEventListener('touchstart', (e) => {
|
||||
const item = e.target.closest('.conversation-item');
|
||||
if (item) {
|
||||
longPressTimer = setTimeout(() => {
|
||||
currentActionConvId = item.getAttribute('data-id');
|
||||
showActionMenu(currentActionConvId);
|
||||
}, 500); // 500ms长按
|
||||
}
|
||||
});
|
||||
|
||||
conversationList.addEventListener('touchend', () => {
|
||||
if (longPressTimer) {
|
||||
clearTimeout(longPressTimer);
|
||||
longPressTimer = null;
|
||||
}
|
||||
});
|
||||
|
||||
conversationList.addEventListener('touchmove', () => {
|
||||
if (longPressTimer) {
|
||||
clearTimeout(longPressTimer);
|
||||
longPressTimer = null;
|
||||
}
|
||||
});
|
||||
|
||||
// 鼠标长按(PC端)
|
||||
conversationList.addEventListener('mousedown', (e) => {
|
||||
const item = e.target.closest('.conversation-item');
|
||||
if (item) {
|
||||
longPressTimer = setTimeout(() => {
|
||||
currentActionConvId = item.getAttribute('data-id');
|
||||
showActionMenu(currentActionConvId);
|
||||
}, 500);
|
||||
}
|
||||
});
|
||||
|
||||
conversationList.addEventListener('mouseup', () => {
|
||||
if (longPressTimer) {
|
||||
clearTimeout(longPressTimer);
|
||||
longPressTimer = null;
|
||||
}
|
||||
});
|
||||
|
||||
conversationList.addEventListener('mouseleave', () => {
|
||||
if (longPressTimer) {
|
||||
clearTimeout(longPressTimer);
|
||||
longPressTimer = null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 操作菜单事件
|
||||
if (actionMenu) {
|
||||
actionMenu.addEventListener('click', (e) => {
|
||||
const item = e.target.closest('.action-menu-item');
|
||||
if (item && currentActionConvId) {
|
||||
const action = item.getAttribute('data-action');
|
||||
handleActionMenuAction(action, currentActionConvId);
|
||||
hideActionMenu();
|
||||
}
|
||||
});
|
||||
|
||||
// 点击其他地方关闭菜单
|
||||
document.addEventListener('click', (e) => {
|
||||
if (actionMenu.classList.contains('show') && !actionMenu.contains(e.target)) {
|
||||
hideActionMenu();
|
||||
}
|
||||
});
|
||||
}
|
||||
showMainPage(); // 返回主页,会正确显示过滤后的对话列表
|
||||
}
|
||||
|
||||
// 排序对话(置顶在前)
|
||||
|
||||
@@ -8,12 +8,12 @@
|
||||
<meta http-equiv="Pragma" content="no-cache">
|
||||
<meta http-equiv="Expires" content="0">
|
||||
<title>AI助手</title>
|
||||
<link rel="stylesheet" href="style.css?v=3.3.0">
|
||||
<link rel="stylesheet" href="style.css?v=3.3.1">
|
||||
<link rel="manifest" href="manifest.json">
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script src="marked.min.js?v=3.3.0"></script>
|
||||
<script src="app.js?v=3.3.0"></script>
|
||||
<script src="marked.min.js?v=3.3.1"></script>
|
||||
<script src="app.js?v=3.3.1"></script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user