From cb4ce9fdba06d4ac28b6305b089fcd60de6f807d Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Sun, 9 Apr 2023 22:12:16 -0700 Subject: [PATCH] Toggle settings --- src-tauri/src/main.rs | 5 +++ src-web/components/RequestActionsDropdown.tsx | 10 ++++- src-web/components/Sidebar.tsx | 44 ++++++++++++------- src-web/components/core/Dropdown.tsx | 10 +++-- 4 files changed, 47 insertions(+), 22 deletions(-) diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index d8806ca4..5abb731d 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -630,6 +630,10 @@ fn create_window(handle: &AppHandle) -> Window { CustomMenuItem::new("new_request".to_string(), "New Request") .accelerator("CmdOrCtrl+n"), ) + .add_item( + CustomMenuItem::new("toggle_settings".to_string(), "Toggle Settings") + .accelerator("CmdOrCtrl+,"), + ) .add_item( CustomMenuItem::new("duplicate_request".to_string(), "Duplicate Request") .accelerator("CmdOrCtrl+d"), @@ -684,6 +688,7 @@ fn create_window(handle: &AppHandle) -> Window { "focus_sidebar" => win2.emit("focus_sidebar", true).unwrap(), "send_request" => win2.emit("send_request", true).unwrap(), "new_request" => _ = win2.emit("new_request", true).unwrap(), + "toggle_settings" => _ = win2.emit("toggle_settings", true).unwrap(), "duplicate_request" => _ = win2.emit("duplicate_request", true).unwrap(), "refresh" => win2.eval("location.reload()").unwrap(), "new_window" => _ = create_window(&handle2), diff --git a/src-web/components/RequestActionsDropdown.tsx b/src-web/components/RequestActionsDropdown.tsx index 988262fc..a4da9a76 100644 --- a/src-web/components/RequestActionsDropdown.tsx +++ b/src-web/components/RequestActionsDropdown.tsx @@ -1,8 +1,10 @@ import type { HTMLAttributes, ReactElement } from 'react'; -import React from 'react'; +import React, { useRef } from 'react'; import { useDeleteRequest } from '../hooks/useDeleteRequest'; import { useDuplicateRequest } from '../hooks/useDuplicateRequest'; +import { useTauriEvent } from '../hooks/useTauriEvent'; import { useTheme } from '../hooks/useTheme'; +import type { DropdownRef } from './core/Dropdown'; import { Dropdown } from './core/Dropdown'; import { HotKey } from './core/HotKey'; import { Icon } from './core/Icon'; @@ -15,10 +17,16 @@ interface Props { export function RequestActionsDropdown({ requestId, children }: Props) { const deleteRequest = useDeleteRequest(requestId); const duplicateRequest = useDuplicateRequest({ id: requestId, navigateAfter: true }); + const dropdownRef = useRef(null); const { appearance, toggleAppearance } = useTheme(); + useTauriEvent('toggle_settings', () => { + dropdownRef.current?.toggle(); + }); + return ( { - if (!hasFocus) return; - let newIndex = (selectedIndex ?? requests.length) - 1; - if (newIndex < 0) { - newIndex = requests.length - 1; - } - setSelectedIndex(newIndex); - }); + useKey( + 'ArrowUp', + () => { + if (!hasFocus) return; + let newIndex = (selectedIndex ?? requests.length) - 1; + if (newIndex < 0) { + newIndex = requests.length - 1; + } + setSelectedIndex(newIndex); + }, + undefined, + [hasFocus, requests, selectedIndex], + ); - useKeyPressEvent('ArrowDown', () => { - if (!hasFocus) return; - let newIndex = (selectedIndex ?? -1) + 1; - if (newIndex > requests.length - 1) { - newIndex = 0; - } - setSelectedIndex(newIndex); - }); + useKey( + 'ArrowDown', + () => { + if (!hasFocus) return; + let newIndex = (selectedIndex ?? -1) + 1; + if (newIndex > requests.length - 1) { + newIndex = 0; + } + setSelectedIndex(newIndex); + }, + undefined, + [hasFocus, requests, selectedIndex], + ); useKeyPressEvent('Backspace', (e) => { if (!hasFocus) return; diff --git a/src-web/components/core/Dropdown.tsx b/src-web/components/core/Dropdown.tsx index 9907bee0..05c26bb2 100644 --- a/src-web/components/core/Dropdown.tsx +++ b/src-web/components/core/Dropdown.tsx @@ -13,7 +13,7 @@ import React, { useRef, useState, } from 'react'; -import { useKeyPressEvent } from 'react-use'; +import { useKey, useKeyPressEvent } from 'react-use'; import { Portal } from '../Portal'; import { Separator } from './Separator'; import { VStack } from './Stacks'; @@ -44,6 +44,7 @@ export interface DropdownProps { export interface DropdownRef { isOpen: boolean; open: (activeIndex?: number) => void; + toggle: () => void; close?: () => void; next?: () => void; prev?: () => void; @@ -62,6 +63,7 @@ export const Dropdown = forwardRef(function Dropdown useImperativeHandle(ref, () => ({ ...menuRef.current, isOpen: open, + toggle: () => setOpen(!open), open: (activeIndex?: number) => { if (activeIndex === undefined) { setDefaultSelectedIndex(undefined); @@ -129,7 +131,7 @@ interface MenuProps { onClose: () => void; } -const Menu = forwardRef, MenuProps>(function Menu( +const Menu = forwardRef, MenuProps>(function Menu( { className, items, onClose, triggerRect, defaultSelectedIndex }: MenuProps, ref, ) { @@ -195,12 +197,12 @@ const Menu = forwardRef, MenuProps>(functio }); }, [items]); - useKeyPressEvent('ArrowUp', (e) => { + useKey('ArrowUp', (e) => { e.preventDefault(); handlePrev(); }); - useKeyPressEvent('ArrowDown', (e) => { + useKey('ArrowDown', (e) => { e.preventDefault(); handleNext(); });