Add support for mouse back nav button to Settings screen (#3195)

This commit is contained in:
Pedro Veloso
2025-07-31 18:11:50 +02:00
committed by GitHub
parent 5b6dd1387a
commit 71c8d9e7aa
6 changed files with 88 additions and 3 deletions
+34 -3
View File
@@ -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<BackButtonProps> = ({
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<BackButtonProps> = ({
} 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 (
<Button
+15
View File
@@ -16,6 +16,7 @@ import {
Tray,
} from 'electron';
import { Buffer } from 'node:buffer';
import { MouseUpEvent } from './types/electron';
import fs from 'node:fs/promises';
import fsSync from 'node:fs';
import started from 'electron-squirrel-startup';
@@ -762,6 +763,20 @@ const createChat = async (
}
});
mainWindow.on('app-command', (e, cmd) => {
if (cmd === 'browser-backward') {
mainWindow.webContents.send('mouse-back-button-clicked');
e.preventDefault();
}
});
mainWindow.webContents.on('mouse-up', (_event: MouseUpEvent, mouseButton: number) => {
// MouseButton 3 is the back button.
if (mouseButton === 3) {
mainWindow.webContents.send('mouse-back-button-clicked');
}
});
windowMap.set(windowId, mainWindow);
// Handle recipe decoding in the background after window is created
+11
View File
@@ -83,6 +83,8 @@ type ElectronAPI = {
setWakelock: (enable: boolean) => Promise<boolean>;
getWakelockState: () => Promise<boolean>;
openNotificationsSettings: () => Promise<boolean>;
onMouseBackButtonClicked: (callback: () => void) => void;
offMouseBackButtonClicked: (callback: () => void) => void;
on: (
channel: string,
callback: (event: Electron.IpcRendererEvent, ...args: unknown[]) => void
@@ -175,6 +177,15 @@ const electronAPI: ElectronAPI = {
setWakelock: (enable: boolean) => ipcRenderer.invoke('set-wakelock', enable),
getWakelockState: () => ipcRenderer.invoke('get-wakelock-state'),
openNotificationsSettings: () => ipcRenderer.invoke('open-notifications-settings'),
onMouseBackButtonClicked: (callback: () => void) => {
// Wrapper that ignores the event parameter.
const wrappedCallback = (_event: Electron.IpcRendererEvent) => callback();
ipcRenderer.on('mouse-back-button-clicked', wrappedCallback);
return wrappedCallback;
},
offMouseBackButtonClicked: (callback: () => void) => {
ipcRenderer.removeListener('mouse-back-button-clicked', callback);
},
on: (
channel: string,
callback: (event: Electron.IpcRendererEvent, ...args: unknown[]) => void
+14
View File
@@ -0,0 +1,14 @@
declare namespace ElectronTypes {
interface Event {
preventDefault: () => void;
sender: unknown;
}
interface IpcRendererEvent extends Event {
senderId: number;
}
interface MouseUpEvent extends Event {
button: number;
}
}
+13
View File
@@ -0,0 +1,13 @@
export interface ElectronEvent {
preventDefault: () => void;
sender: unknown;
}
export interface IpcRendererEvent extends ElectronEvent {
senderId: number;
}
// Mouse event
export interface MouseUpEvent extends ElectronEvent {
button: number;
}
+1
View File
@@ -0,0 +1 @@
export * from './electron';