Files
fusion/packages/dashboard/app/hooks/quickChatLastSessionStorage.ts
gsxdsm 9e00a72d7d FN-5884: preserve quick chat session across reopens
Keep quick chat warm and restore the last opened conversation per project.

- persist the active quick chat session id in per-project local storage and restore it before falling back to latest activity
- retain in-memory quick chat state across close/reopen while resetting chat state correctly when the project changes
- add storage, hook, and FAB coverage for restored sessions, warm reopen behavior, and project switching; document the updated quick chat behavior

Files changed:
 docs/dashboard-guide.md                            |   3 +-
 packages/dashboard/app/components/QuickChatFAB.tsx |  29 ++++--
 .../app/components/__tests__/QuickChatFAB.test.tsx | 112 +++++++++++++++++++--
 .../__tests__/quickChatLastSessionStorage.test.ts  |  55 ++++++++++
 .../app/hooks/__tests__/useQuickChat.test.ts       |  70 +++++++++++++
 .../app/hooks/quickChatLastSessionStorage.ts       |  41 ++++++++
 packages/dashboard/app/hooks/useQuickChat.ts       |  25 +++++
 7 files changed, 319 insertions(+), 16 deletions(-)

Fusion-Task-Id: FN-5884

Fusion-Task-Lineage: 4d689611-1824-41db-8fc2-d543407316ff
2026-06-02 09:34:19 -07:00

42 lines
1.2 KiB
TypeScript

const QUICK_CHAT_LAST_SESSION_STORAGE_PREFIX = "fusion:quick-chat-last-session:";
function getQuickChatLastSessionStorageKey(projectId?: string | null): string {
return `${QUICK_CHAT_LAST_SESSION_STORAGE_PREFIX}${projectId || "default"}`;
}
export function getPersistedLastQuickChatSessionId(projectId?: string | null): string | null {
if (typeof window === "undefined") {
return null;
}
try {
return localStorage.getItem(getQuickChatLastSessionStorageKey(projectId));
} catch {
return null;
}
}
export function setPersistedLastQuickChatSessionId(projectId: string | null | undefined, sessionId: string): void {
if (typeof window === "undefined") {
return;
}
try {
localStorage.setItem(getQuickChatLastSessionStorageKey(projectId), sessionId);
} catch {
// Ignore localStorage failures so quick-chat session selection still works in-memory.
}
}
export function removePersistedLastQuickChatSessionId(projectId?: string | null): void {
if (typeof window === "undefined") {
return;
}
try {
localStorage.removeItem(getQuickChatLastSessionStorageKey(projectId));
} catch {
// Ignore localStorage failures so cleanup paths do not throw.
}
}