mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-06-17 10:15:27 -04:00
fix: prevent document link click from resetting active session (#2055)
* fix: prevent document link click from resetting active session Clicking a #document-<uuid> link in chat caused the session to reset because of two issues: 1. chatRenderer.js: clicking on the text inside an <a> yields a Text node target whose .closest() is undefined, so preventDefault never fires and the browser performs a default hash-navigation 2. sessions.js: the hashchange handler treated the entity hash (document-<uuid>) as a session lookup, found no match, and the subsequent loadSessions created a new default-model chat Fix: walk past Text nodes before calling .closest(), and skip entity-prefixed hashes in the hashchange handler. Fixes #2035 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(documents): move isOpen=true after container check in openPanel isOpen was set to true before the #chat-container existence check. If the container was missing during a race, the function returned early but isOpen stayed true, preventing the panel from ever reopening on subsequent calls. Move isOpen=true to after the container guard so a failed open doesn't leave the flag stuck. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1005,7 +1005,12 @@ document.addEventListener('click', function(e) {
|
|||||||
// matching module via a dynamic import (avoids circular deps —
|
// matching module via a dynamic import (avoids circular deps —
|
||||||
// sessions.js itself imports chatRenderer.js).
|
// sessions.js itself imports chatRenderer.js).
|
||||||
document.addEventListener('click', function(e) {
|
document.addEventListener('click', function(e) {
|
||||||
const a = e.target && e.target.closest && e.target.closest('a[href]');
|
// Walk past Text nodes — clicking link text yields a Text node target
|
||||||
|
// whose .closest is undefined, so preventDefault never fires and the
|
||||||
|
// browser performs a default hash-navigation that resets the session.
|
||||||
|
let _t = e.target;
|
||||||
|
while (_t && _t.nodeType === Node.TEXT_NODE) _t = _t.parentElement;
|
||||||
|
const a = _t && _t.closest && _t.closest('a[href]');
|
||||||
if (!a) return;
|
if (!a) return;
|
||||||
const href = a.getAttribute('href') || '';
|
const href = a.getAttribute('href') || '';
|
||||||
if (!href.startsWith('#')) return;
|
if (!href.startsWith('#')) return;
|
||||||
|
|||||||
@@ -3728,6 +3728,9 @@ import * as Modals from './modalManager.js';
|
|||||||
_minimizedDocId = null;
|
_minimizedDocId = null;
|
||||||
Modals.unregister('doc-panel');
|
Modals.unregister('doc-panel');
|
||||||
}
|
}
|
||||||
|
const container = document.getElementById('chat-container');
|
||||||
|
if (!container) return;
|
||||||
|
|
||||||
isOpen = true;
|
isOpen = true;
|
||||||
// Doc was opened last → it goes in front of the email windows (clears the
|
// Doc was opened last → it goes in front of the email windows (clears the
|
||||||
// email-front flag; the doc/email z-index alternation lives in CSS).
|
// email-front flag; the doc/email z-index alternation lives in CSS).
|
||||||
@@ -3735,9 +3738,6 @@ import * as Modals from './modalManager.js';
|
|||||||
_ensureAgentMode();
|
_ensureAgentMode();
|
||||||
_markDocVisibleState(_lastSessionId, 'open');
|
_markDocVisibleState(_lastSessionId, 'open');
|
||||||
|
|
||||||
const container = document.getElementById('chat-container');
|
|
||||||
if (!container) return;
|
|
||||||
|
|
||||||
document.body.classList.add('doc-view');
|
document.body.classList.add('doc-view');
|
||||||
|
|
||||||
// Sync toggle button state
|
// Sync toggle button state
|
||||||
|
|||||||
@@ -1999,9 +1999,13 @@ export function initDragSort() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hash-based routing: navigate between sessions with browser back/forward
|
// Hash-based routing: navigate between sessions with browser back/forward.
|
||||||
|
// Skip entity-prefixed hashes (document-, note-, etc.) — those are handled
|
||||||
|
// by their own click handlers in chatRenderer.js and must not trigger
|
||||||
|
// session navigation (which would reset the active chat).
|
||||||
window.addEventListener('hashchange', () => {
|
window.addEventListener('hashchange', () => {
|
||||||
const hashId = window.location.hash.replace('#', '');
|
const hashId = window.location.hash.replace('#', '');
|
||||||
|
if (/^(document|note|image|email|event|task|skill|research)-/.test(hashId)) return;
|
||||||
if (hashId && hashId !== currentSessionId) {
|
if (hashId && hashId !== currentSessionId) {
|
||||||
const target = sessions.find(s => s.id === hashId && !s.archived);
|
const target = sessions.find(s => s.id === hashId && !s.archived);
|
||||||
if (target) selectSession(hashId);
|
if (target) selectSession(hashId);
|
||||||
|
|||||||
Reference in New Issue
Block a user