1import { useCanGoBack, useNavigate } from "@tanstack/react-router";
2import { useCallback, useEffect } from "react";
3
4/** Returns to the previous app page, or home when opened without app history. */
5function useNavigateBack() {
6 const navigate = useNavigate();
7 const canGoBack = useCanGoBack();
8
9 return useCallback(() => {
10 if (canGoBack) {
11 window.history.back();
12 return;
13 }
14 void navigate({ to: "/" });
15 }, [canGoBack, navigate]);
16}
17
18/** Enables page-level Escape navigation, letting controls consume Escape first. */
19export function useEscapeToGoBack(onEscape?: () => void) {
20 const navigateBack = useNavigateBack();
21 const handleEscape = onEscape ?? navigateBack;
22
23 useEffect(() => {
24 const onKeyDown = (event: KeyboardEvent) => {
25 if (event.defaultPrevented || event.repeat || event.isComposing || event.key !== "Escape")
26 return;
27 event.preventDefault();
28
29 const activeElement = document.activeElement;
30 if (activeElement instanceof HTMLElement) {
31 activeElement.blur();
32 }
33
34 handleEscape();
35 };
36
37 window.addEventListener("keydown", onKeyDown);
38 return () => window.removeEventListener("keydown", onKeyDown);
39 }, [handleEscape]);
40}