Toggle settings

This commit is contained in:
Gregory Schier
2023-04-09 22:12:16 -07:00
parent d9916f520e
commit cb4ce9fdba
4 changed files with 47 additions and 22 deletions

View File

@@ -630,6 +630,10 @@ fn create_window(handle: &AppHandle<Wry>) -> Window<Wry> {
CustomMenuItem::new("new_request".to_string(), "New Request") CustomMenuItem::new("new_request".to_string(), "New Request")
.accelerator("CmdOrCtrl+n"), .accelerator("CmdOrCtrl+n"),
) )
.add_item(
CustomMenuItem::new("toggle_settings".to_string(), "Toggle Settings")
.accelerator("CmdOrCtrl+,"),
)
.add_item( .add_item(
CustomMenuItem::new("duplicate_request".to_string(), "Duplicate Request") CustomMenuItem::new("duplicate_request".to_string(), "Duplicate Request")
.accelerator("CmdOrCtrl+d"), .accelerator("CmdOrCtrl+d"),
@@ -684,6 +688,7 @@ fn create_window(handle: &AppHandle<Wry>) -> Window<Wry> {
"focus_sidebar" => win2.emit("focus_sidebar", true).unwrap(), "focus_sidebar" => win2.emit("focus_sidebar", true).unwrap(),
"send_request" => win2.emit("send_request", true).unwrap(), "send_request" => win2.emit("send_request", true).unwrap(),
"new_request" => _ = win2.emit("new_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(), "duplicate_request" => _ = win2.emit("duplicate_request", true).unwrap(),
"refresh" => win2.eval("location.reload()").unwrap(), "refresh" => win2.eval("location.reload()").unwrap(),
"new_window" => _ = create_window(&handle2), "new_window" => _ = create_window(&handle2),

View File

@@ -1,8 +1,10 @@
import type { HTMLAttributes, ReactElement } from 'react'; import type { HTMLAttributes, ReactElement } from 'react';
import React from 'react'; import React, { useRef } from 'react';
import { useDeleteRequest } from '../hooks/useDeleteRequest'; import { useDeleteRequest } from '../hooks/useDeleteRequest';
import { useDuplicateRequest } from '../hooks/useDuplicateRequest'; import { useDuplicateRequest } from '../hooks/useDuplicateRequest';
import { useTauriEvent } from '../hooks/useTauriEvent';
import { useTheme } from '../hooks/useTheme'; import { useTheme } from '../hooks/useTheme';
import type { DropdownRef } from './core/Dropdown';
import { Dropdown } from './core/Dropdown'; import { Dropdown } from './core/Dropdown';
import { HotKey } from './core/HotKey'; import { HotKey } from './core/HotKey';
import { Icon } from './core/Icon'; import { Icon } from './core/Icon';
@@ -15,10 +17,16 @@ interface Props {
export function RequestActionsDropdown({ requestId, children }: Props) { export function RequestActionsDropdown({ requestId, children }: Props) {
const deleteRequest = useDeleteRequest(requestId); const deleteRequest = useDeleteRequest(requestId);
const duplicateRequest = useDuplicateRequest({ id: requestId, navigateAfter: true }); const duplicateRequest = useDuplicateRequest({ id: requestId, navigateAfter: true });
const dropdownRef = useRef<DropdownRef>(null);
const { appearance, toggleAppearance } = useTheme(); const { appearance, toggleAppearance } = useTheme();
useTauriEvent('toggle_settings', () => {
dropdownRef.current?.toggle();
});
return ( return (
<Dropdown <Dropdown
ref={dropdownRef}
items={[ items={[
{ {
label: 'Duplicate', label: 'Duplicate',

View File

@@ -3,7 +3,7 @@ import type { ForwardedRef, KeyboardEvent } from 'react';
import React, { forwardRef, Fragment, memo, useCallback, useMemo, useRef, useState } from 'react'; import React, { forwardRef, Fragment, memo, useCallback, useMemo, useRef, useState } from 'react';
import type { XYCoord } from 'react-dnd'; import type { XYCoord } from 'react-dnd';
import { useDrag, useDrop } from 'react-dnd'; import { useDrag, useDrop } from 'react-dnd';
import { useKeyPressEvent } from 'react-use'; import { useKey, useKeyPressEvent } from 'react-use';
import { useActiveRequestId } from '../hooks/useActiveRequestId'; import { useActiveRequestId } from '../hooks/useActiveRequestId';
import { useAppRoutes } from '../hooks/useAppRoutes'; import { useAppRoutes } from '../hooks/useAppRoutes';
import { useDeleteAnyRequest } from '../hooks/useDeleteAnyRequest'; import { useDeleteAnyRequest } from '../hooks/useDeleteAnyRequest';
@@ -84,23 +84,33 @@ export const Sidebar = memo(function Sidebar({ className }: Props) {
routes.navigate('request', { requestId: request.id, workspaceId: request.workspaceId }); routes.navigate('request', { requestId: request.id, workspaceId: request.workspaceId });
}); });
useKeyPressEvent('ArrowUp', () => { useKey(
if (!hasFocus) return; 'ArrowUp',
let newIndex = (selectedIndex ?? requests.length) - 1; () => {
if (newIndex < 0) { if (!hasFocus) return;
newIndex = requests.length - 1; let newIndex = (selectedIndex ?? requests.length) - 1;
} if (newIndex < 0) {
setSelectedIndex(newIndex); newIndex = requests.length - 1;
}); }
setSelectedIndex(newIndex);
},
undefined,
[hasFocus, requests, selectedIndex],
);
useKeyPressEvent('ArrowDown', () => { useKey(
if (!hasFocus) return; 'ArrowDown',
let newIndex = (selectedIndex ?? -1) + 1; () => {
if (newIndex > requests.length - 1) { if (!hasFocus) return;
newIndex = 0; let newIndex = (selectedIndex ?? -1) + 1;
} if (newIndex > requests.length - 1) {
setSelectedIndex(newIndex); newIndex = 0;
}); }
setSelectedIndex(newIndex);
},
undefined,
[hasFocus, requests, selectedIndex],
);
useKeyPressEvent('Backspace', (e) => { useKeyPressEvent('Backspace', (e) => {
if (!hasFocus) return; if (!hasFocus) return;

View File

@@ -13,7 +13,7 @@ import React, {
useRef, useRef,
useState, useState,
} from 'react'; } from 'react';
import { useKeyPressEvent } from 'react-use'; import { useKey, useKeyPressEvent } from 'react-use';
import { Portal } from '../Portal'; import { Portal } from '../Portal';
import { Separator } from './Separator'; import { Separator } from './Separator';
import { VStack } from './Stacks'; import { VStack } from './Stacks';
@@ -44,6 +44,7 @@ export interface DropdownProps {
export interface DropdownRef { export interface DropdownRef {
isOpen: boolean; isOpen: boolean;
open: (activeIndex?: number) => void; open: (activeIndex?: number) => void;
toggle: () => void;
close?: () => void; close?: () => void;
next?: () => void; next?: () => void;
prev?: () => void; prev?: () => void;
@@ -62,6 +63,7 @@ export const Dropdown = forwardRef<DropdownRef, DropdownProps>(function Dropdown
useImperativeHandle(ref, () => ({ useImperativeHandle(ref, () => ({
...menuRef.current, ...menuRef.current,
isOpen: open, isOpen: open,
toggle: () => setOpen(!open),
open: (activeIndex?: number) => { open: (activeIndex?: number) => {
if (activeIndex === undefined) { if (activeIndex === undefined) {
setDefaultSelectedIndex(undefined); setDefaultSelectedIndex(undefined);
@@ -129,7 +131,7 @@ interface MenuProps {
onClose: () => void; onClose: () => void;
} }
const Menu = forwardRef<Omit<DropdownRef, 'open' | 'isOpen'>, MenuProps>(function Menu( const Menu = forwardRef<Omit<DropdownRef, 'open' | 'isOpen' | 'toggle'>, MenuProps>(function Menu(
{ className, items, onClose, triggerRect, defaultSelectedIndex }: MenuProps, { className, items, onClose, triggerRect, defaultSelectedIndex }: MenuProps,
ref, ref,
) { ) {
@@ -195,12 +197,12 @@ const Menu = forwardRef<Omit<DropdownRef, 'open' | 'isOpen'>, MenuProps>(functio
}); });
}, [items]); }, [items]);
useKeyPressEvent('ArrowUp', (e) => { useKey('ArrowUp', (e) => {
e.preventDefault(); e.preventDefault();
handlePrev(); handlePrev();
}); });
useKeyPressEvent('ArrowDown', (e) => { useKey('ArrowDown', (e) => {
e.preventDefault(); e.preventDefault();
handleNext(); handleNext();
}); });