-
🌐 async-utils.jsWeb, 3.69 kB⬇
-
🌐 auth-storage.jsWeb, 735 B⬇
-
🌐 chat-helpers.jsWeb, 8.85 kB⬇
-
🌐 chat-renderer.jsWeb, 70.00 kB⬇
-
🌐 code-overlay.jsWeb, 21.77 kB⬇
-
🌐 confirm-dialog.jsWeb, 3.17 kB⬇
-
🌐 conversation-format-utils.jsWeb, 21.51 kB⬇
-
🌐 diagram-overlay.jsWeb, 7.93 kB⬇
-
🌐 dialog.jsWeb, 2.50 kB⬇
-
🌐 dom-utils.jsWeb, 8.33 kB⬇
-
🌐 drag-reorder.jsWeb, 4.82 kB⬇
-
🌐 elements.jsWeb, 11.06 kB⬇
-
🌐 export-utils.jsWeb, 1.53 kB⬇
-
🌐 format-utils.jsWeb, 29.60 kB⬇
-
🌐 history-navigation.jsWeb, 1.95 kB⬇
-
🌐 hljs-yaml.jsWeb, 5.07 kB⬇
-
🌐 inline-format.jsWeb, 7.35 kB⬇
-
🌐 instant-answer.jsWeb, 19.82 kB⬇
-
🌐 interactive-tools.jsWeb, 38.77 kB⬇
-
🌐 mermaid-fixes.jsWeb, 4.60 kB⬇
-
🌐 mermaid-render.jsWeb, 5.10 kB⬇
-
🌐 mermaid.jsWeb, 195 B⬇
-
🌐 migrations.jsWeb, 12.11 kB⬇
-
🌐 multi-choice-dialog.jsWeb, 1.33 kB⬇
-
🌐 notification-stack.jsWeb, 2.50 kB⬇
-
🌐 options-manager.jsWeb, 45.56 kB⬇
-
🌐 overlay-utils.jsWeb, 4.14 kB⬇
-
🌐 pdf-export.jsWeb, 23.59 kB⬇
-
🌐 pinch-zoom.jsWeb, 3.21 kB⬇
-
🌐 plugin-dialog.jsWeb, 2.17 kB⬇
-
🌐 read-aloud.jsWeb, 33.84 kB⬇
-
🌐 response-pipeline.jsWeb, 55.19 kB⬇
-
🌐 scratchpad-editor.jsWeb, 8.64 kB⬇
-
🌐 scratchpad-export.jsWeb, 3.56 kB⬇
-
🌐 scrollbars.jsWeb, 3.12 kB⬇
-
🌐 selection-manager.jsWeb, 3.76 kB⬇
-
🌐 settings-utils.jsWeb, 31.08 kB⬇
-
🌐 share.jsWeb, 10.75 kB⬇
-
🌐 side-drawer.jsWeb, 9.37 kB⬇
-
🌐 speech-text.jsWeb, 6.60 kB⬇
-
🌐 swipe-navigation.jsWeb, 6.16 kB⬇
-
🌐 table-overlay.jsWeb, 8.10 kB⬇
-
🌐 theme-utils.jsWeb, 8.34 kB⬇
-
🌐 thinking-panel-base.jsWeb, 14.88 kB⬇
-
🌐 ui-sets.jsWeb, 1.00 kB⬇
-
🌐 version-overlay.jsWeb, 4.63 kB⬇
/**
* Mobile back-action support: the browser/gesture back closes the topmost
* dialog, or in single-column mode steps back toward the conversations list,
* before a "Press back again to close." confirmation is shown; a second back
* press within a short window leaves the page.
*/
import { customConfirm } from './confirm-dialog.js';
import { step_panels_back_single_column } from './swipe-navigation.js';
/** Milliseconds during which a second back press is treated as "close". */
const EXIT_PROMPT_WINDOW_MS = 2500;
/** @typedef {import('../app.js').default} App */
let app = null;
let exit_prompted_at = 0;
let exit_prompt_visible = false;
/**
* Initializes history-based back navigation: pushes a sentinel entry so the
* first back action reaches this handler instead of leaving the app.
* @param {App} app_instance - The main application instance.
*/
export function init_history_navigation(app_instance) {
app = app_instance;
history.pushState({ tinai_sentinel: true }, '', location.href);
window.addEventListener('popstate', on_popstate);
}
/**
* Handles a back navigation: closes the topmost dialog, or in single-column
* mode steps back one panel toward panel 1, or shows the exit confirmation;
* a second press leaves the app.
*/
function on_popstate() {
if (app.dismiss_topmost_overlay()) {
arm_sentinel();
return;
}
if (step_panels_back_single_column()) {
arm_sentinel();
return;
}
const now = Date.now();
if (exit_prompt_visible || now - exit_prompted_at < EXIT_PROMPT_WINDOW_MS) {
exit_prompt_visible = false;
history.back();
return;
}
exit_prompted_at = now;
exit_prompt_visible = true;
arm_sentinel();
void customConfirm('Close TinAI?', 'Press back again to close.').then(() => {
exit_prompt_visible = false;
});
}
/**
* Re-arms the intercepted history entry so the next back action fires
* popstate again instead of leaving the app.
*/
function arm_sentinel() {
history.pushState({ tinai_sentinel: true }, '', location.href);
}
history-navigation.js
×
Type: Web, text/x-java
1.95 Kilobytes
Last Modified 2026-11-04 09:48:28
⬇ Download File
Type: Web, text/x-java
1.95 Kilobytes
Last Modified 2026-11-04 09:48:28
⬇ Download File