fix: persist deleted sessions via localStorage blacklist

Deleted sessions would reappear after page refresh because the
gateway sessions.list response still included them. Now maintains
a localStorage blacklist of deleted session keys that filters them
out on every load, regardless of gateway-side deletion support.
This commit is contained in:
Nicolas Varrot
2026-02-12 21:40:07 +00:00
parent 32bc43d54f
commit d9e1b88a70
2 changed files with 95 additions and 4 deletions

View File

@@ -80,12 +80,27 @@ export function useGateway() {
});
}, []);
// Deleted sessions blacklist (persisted in localStorage)
const getDeletedSessions = useCallback((): Set<string> => {
try {
const raw = localStorage.getItem('pinchchat-deleted-sessions');
return raw ? new Set(JSON.parse(raw)) : new Set();
} catch { return new Set(); }
}, []);
const addDeletedSession = useCallback((key: string) => {
const deleted = getDeletedSessions();
deleted.add(key);
localStorage.setItem('pinchchat-deleted-sessions', JSON.stringify([...deleted]));
}, [getDeletedSessions]);
const loadSessions = useCallback(async () => {
try {
const res = await clientRef.current?.send('sessions.list', {});
const sessionList = res?.sessions as Array<Record<string, unknown>> | undefined;
if (sessionList) {
setSessions(sessionList.map((s) => ({
const deleted = getDeletedSessions();
setSessions(sessionList.filter((s) => !deleted.has((s.key || s.sessionKey) as string)).map((s) => ({
key: (s.key || s.sessionKey) as string,
label: (s.label || s.key || s.sessionKey) as string,
messageCount: s.messageCount as number | undefined,
@@ -104,7 +119,7 @@ export function useGateway() {
} catch {
// Silently ignore session list failures (e.g. disconnected)
}
}, []);
}, [getDeletedSessions]);
const loadHistory = useCallback(async (sessionKey: string) => {
setIsLoadingHistory(true);
@@ -394,8 +409,10 @@ export function useGateway() {
try {
await clientRef.current?.send('sessions.delete', { key, deleteTranscript: true });
} catch {
// Ignore delete failures
// Ignore delete failures — blacklist will hide it anyway
}
// Persist to blacklist so it stays hidden after refresh
addDeletedSession(key);
// Remove from local state
setSessions(prev => prev.filter(s => s.key !== key));
// If we deleted the active session, switch to main
@@ -406,7 +423,7 @@ export function useGateway() {
setMessages([]);
loadHistory(mainKey);
}
}, [loadHistory]);
}, [loadHistory, addDeletedSession]);
const logout = useCallback(() => {
if (clientRef.current) {