From 35e40d2c55e86407f9e8f6fdfc230ca8baa98e8a Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Sun, 7 Jan 2024 21:32:25 -0800 Subject: [PATCH] Fix hotkeys getting stuck on cmd+tab --- src-web/components/Sidebar.tsx | 9 +++++++-- src-web/components/core/HotKey.tsx | 4 ++-- src-web/hooks/useHotkey.ts | 6 ++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src-web/components/Sidebar.tsx b/src-web/components/Sidebar.tsx index cf2ab151..5912beef 100644 --- a/src-web/components/Sidebar.tsx +++ b/src-web/components/Sidebar.tsx @@ -55,6 +55,7 @@ export function Sidebar({ className }: Props) { const { hidden } = useSidebarHidden(); const sidebarRef = useRef(null); const activeRequestId = useActiveRequestId(); + const duplicateRequest = useDuplicateRequest({ id: activeRequestId ?? '', navigateAfter: true }); const activeEnvironmentId = useActiveEnvironmentId(); const requests = useRequests(); const folders = useFolders(); @@ -75,6 +76,8 @@ export function Sidebar({ className }: Props) { namespace: NAMESPACE_NO_SYNC, }); + useHotkey('request.duplicate', () => duplicateRequest.mutate()); + const isCollapsed = useCallback( (id: string) => collapsed.value?.[id] ?? false, [collapsed.value], @@ -581,7 +584,6 @@ const SidebarItem = forwardRef(function SidebarItem( const handleContextMenu = useCallback((e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); - console.log('CONTEXT MENU'); setShowContextMenu({ x: e.clientX, y: e.clientY }); }, []); @@ -647,7 +649,10 @@ const SidebarItem = forwardRef(function SidebarItem( label: 'Duplicate', hotkeyAction: 'request.duplicate', leftSlot: , - onSelect: () => duplicateRequest.mutate(), + onSelect: () => { + console.log('DUPLICATE'); + duplicateRequest.mutate(); + }, }, { key: 'deleteRequest', diff --git a/src-web/components/core/HotKey.tsx b/src-web/components/core/HotKey.tsx index 6802e1e6..f162c883 100644 --- a/src-web/components/core/HotKey.tsx +++ b/src-web/components/core/HotKey.tsx @@ -8,9 +8,9 @@ interface Props { } export function HotKey({ action }: Props) { - const osinfo = useOsInfo(); + const osInfo = useOsInfo(); const label = useFormattedHotkey(action); - if (label === null || osinfo == null) { + if (label === null || osInfo == null) { return null; } diff --git a/src-web/hooks/useHotkey.ts b/src-web/hooks/useHotkey.ts index b8b45cb6..cef32974 100644 --- a/src-web/hooks/useHotkey.ts +++ b/src-web/hooks/useHotkey.ts @@ -1,5 +1,6 @@ import type { OsType } from '@tauri-apps/api/os'; import { useEffect, useRef } from 'react'; +import { debounce } from '../lib/debounce'; import { useOsInfo } from './useOsInfo'; export type HotkeyAction = @@ -40,8 +41,12 @@ export function useAnyHotkey(callback: (action: HotkeyAction, e: KeyboardEvent) }, [callback]); useEffect(() => { + // Sometimes the keyup event doesn't fire, so we clear the keys after a timeout + const clearCurrentKeys = debounce(() => currentKeys.current.clear(), 1000); + const down = (e: KeyboardEvent) => { currentKeys.current.add(normalizeKey(e.key, os)); + for (const [hkAction, hkKeys] of Object.entries(hotkeys) as [HotkeyAction, string[]][]) { for (const hkKey of hkKeys) { const keys = hkKey.split('+'); @@ -56,6 +61,7 @@ export function useAnyHotkey(callback: (action: HotkeyAction, e: KeyboardEvent) } } } + clearCurrentKeys(); }; const up = (e: KeyboardEvent) => { currentKeys.current.delete(normalizeKey(e.key, os));