feat(chat): improve resilience and collapsible sidebar

问题描述:\n- 刷新页面、切后台或手机锁屏后,进行中的对话容易丢失,SSE 断开时前端还会插入假的错误气泡\n- 移动端首屏会话列表会短暂遮住聊天区\n- 桌面端侧栏无法折叠,在窄窗口和缩放场景占用过多横向空间\n\n复现路径:\n- 发起一轮对话,在模型仍在输出时刷新页面或锁屏后再回到页面\n- 在窄屏设备首次打开聊天页,观察会话列表首帧覆盖聊天内容\n- 在桌面端缩窄浏览器窗口,观察侧栏始终保持完整宽度\n\n修复思路:\n- 为 chat store 增加本地缓存、水合、in-flight 标记和轮询恢复,SSE 断开后静默从服务端回补真实结果\n- 将运行中指示统一到 isRunActive,让实时流式与恢复轮询共享同一状态\n- 在 ChatPanel 首帧同步读取媒体查询,避免移动端会话列表闪烁覆盖\n- 为侧栏增加可持久化的桌面折叠状态,并补充对应文案与回归测试
This commit is contained in:
zksnet
2026-04-18 00:00:24 +08:00
parent 4d98209d13
commit 7e777fd661
10 changed files with 890 additions and 48 deletions
+15
View File
@@ -4,8 +4,12 @@ import { checkHealth, fetchAvailableModels, updateDefaultModel, triggerUpdate, t
const WEB_UI_VERSION = __APP_VERSION__
const SIDEBAR_COLLAPSED_KEY = 'hermes_sidebar_collapsed'
export const useAppStore = defineStore('app', () => {
const sidebarOpen = ref(false)
// Desktop-only collapsed state (icon-rail mode). Persisted to localStorage.
const sidebarCollapsed = ref(localStorage.getItem(SIDEBAR_COLLAPSED_KEY) === '1')
const connected = ref(false)
const serverVersion = ref(WEB_UI_VERSION)
@@ -90,10 +94,21 @@ export const useAppStore = defineStore('app', () => {
sidebarOpen.value = false
}
function toggleSidebarCollapsed() {
sidebarCollapsed.value = !sidebarCollapsed.value
try {
localStorage.setItem(SIDEBAR_COLLAPSED_KEY, sidebarCollapsed.value ? '1' : '0')
} catch {
// ignore quota errors — fallback to in-memory only
}
}
return {
sidebarOpen,
sidebarCollapsed,
toggleSidebar,
closeSidebar,
toggleSidebarCollapsed,
connected,
serverVersion,
latestVersion,