From b1ac320193288537f4589392952e0e26a349a08e Mon Sep 17 00:00:00 2001 From: Lucas Rayan Date: Sun, 18 Oct 2026 23:09:26 -0300 Subject: [PATCH] =?UTF-8?q?Corrige=20sess=C3=B5es=20duplicadas=20ao=20reab?= =?UTF-8?q?rir=20uma=20sess=C3=A3o=20recente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 --- apps/gui/ui/app.js | 14 ++++++++++---- crates/guara-core/src/service.rs | 11 +++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/apps/gui/ui/app.js b/apps/gui/ui/app.js index 4c096b2..1dbb556 100644 --- a/apps/gui/ui/app.js +++ b/apps/gui/ui/app.js @@ -215,8 +215,11 @@ async function openRecent(r) { try { const { job } = await rpc('session_load', { path: r.path }); const st = await rpc('status', { job }); - const s = { job, target: st.target, label: 'Sessão: ' + st.target.split(/[\\/]/).pop() }; - S.sessions.unshift(s); + let s = S.sessions.find((x) => x.job === job); + if (!s) { + s = { job, target: st.target, label: 'Sessão: ' + st.target.split(/[\\/]/).pop() }; + S.sessions.unshift(s); + } openJob(s); } catch (e) { info({ title: 'Não foi possível abrir a sessão', html: `

${esc(e.message)}

` }); } } @@ -246,8 +249,11 @@ $('#loadSessionBtn').onclick = async () => { try { const { job } = await rpc('session_load', { path }); const st = await rpc('status', { job }); - const s = { job, target: st.target, label: 'Sessão: ' + st.target.split(/[\\/]/).pop() }; - S.sessions.unshift(s); + let s = S.sessions.find((x) => x.job === job); + if (!s) { + s = { job, target: st.target, label: 'Sessão: ' + st.target.split(/[\\/]/).pop() }; + S.sessions.unshift(s); + } openJob(s); } catch (e) { info({ title: 'Não foi possível abrir a sessão', html: `

${esc(e.message)}

` }); } }; diff --git a/crates/guara-core/src/service.rs b/crates/guara-core/src/service.rs index fe86a34..23f647d 100644 --- a/crates/guara-core/src/service.rs +++ b/crates/guara-core/src/service.rs @@ -721,6 +721,17 @@ impl Engine { } pub fn load_session(&self, path: &str) -> Result { + // Clicar de novo numa sessão já aberta reaproveita o job em vez de criar outro igual. + let want = Path::new(path); + if let Some(j) = self + .jobs + .lock() + .unwrap() + .values() + .find(|j| j.session_file.lock().unwrap().as_deref() == Some(want)) + { + return Ok(j.id.clone()); + } let bytes = std::fs::read(path).map_err(|e| { if e.kind() == std::io::ErrorKind::PermissionDenied { Error::msg(format!(