From 71c8d9e7aa2cfdb9a40da81d83f9c604aa20b100 Mon Sep 17 00:00:00 2001 From: Pedro Veloso Date: Thu, 31 Jul 2025 18:11:50 +0200 Subject: [PATCH] Add support for mouse back nav button to Settings screen (#3195) --- ui/desktop/src/components/ui/BackButton.tsx | 37 +++++++++++++++++++-- ui/desktop/src/main.ts | 15 +++++++++ ui/desktop/src/preload.ts | 11 ++++++ ui/desktop/src/types/electron.d.ts | 14 ++++++++ ui/desktop/src/types/electron.ts | 13 ++++++++ ui/desktop/src/types/index.ts | 1 + 6 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 ui/desktop/src/types/electron.d.ts create mode 100644 ui/desktop/src/types/electron.ts create mode 100644 ui/desktop/src/types/index.ts diff --git a/ui/desktop/src/components/ui/BackButton.tsx b/ui/desktop/src/components/ui/BackButton.tsx index f927ff67ae..606e246d94 100644 --- a/ui/desktop/src/components/ui/BackButton.tsx +++ b/ui/desktop/src/components/ui/BackButton.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useEffect, useCallback } from 'react'; import { ArrowLeft } from 'lucide-react'; import { Button } from './button'; import type { VariantProps } from 'class-variance-authority'; @@ -21,7 +21,7 @@ const BackButton: React.FC = ({ showText = true, ...props }) => { - const handleExit = () => { + const handleExit = useCallback(() => { if (onClick) { onClick(); // Custom onClick handler passed via props } else if (window.history.length > 1) { @@ -29,7 +29,38 @@ const BackButton: React.FC = ({ } else { console.warn('No history to go back to'); } - }; + }, [onClick]); + + // Set up mouse back button event listener. + useEffect(() => { + const handleMouseBack = () => { + handleExit(); + }; + + if (window.electron) { + const mouseBackHandler = (e: MouseEvent) => { + // MouseButton 3 or 4 is typically back button. + if (e.button === 3 || e.button === 4) { + handleExit(); + e.preventDefault(); + } + }; + + window.electron.on('mouse-back-button-clicked', handleMouseBack); + + // Also listen for mouseup events directly, for better OS compatibility. + document.addEventListener('mouseup', mouseBackHandler); + + return () => { + if (window.electron) { + window.electron.off('mouse-back-button-clicked', handleMouseBack); + } + document.removeEventListener('mouseup', mouseBackHandler); + }; + } + + return undefined; + }, [handleExit]); return (