From 3128e9ce76b43034770bdaa649f62e968953beba Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Mon, 3 Apr 2023 07:59:49 -0700 Subject: [PATCH] Hot keys and cleanup --- .github/workflows/artifacts.yml | 21 +- src-tauri/src/main.rs | 17 +- src-tauri/tauri.conf.json | 2 +- src-web/components/RequestActionsDropdown.tsx | 2 + src-web/components/ResponsePane.tsx | 198 +++++++++--------- src-web/components/SidebarActions.tsx | 14 +- src-web/components/WorkspaceHeader.tsx | 1 + src-web/components/core/Dropdown.tsx | 2 +- .../components/core/Editor/twig/completion.ts | 14 +- src-web/components/core/HotKey.tsx | 2 +- src-web/hooks/useCreateRequest.ts | 5 +- 11 files changed, 149 insertions(+), 129 deletions(-) diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index 3ba59df8..e0fc37a7 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -5,19 +5,22 @@ on: jobs: build-artifacts: - runs-on: ${{ matrix.platform }} - strategy: fail-fast: false matrix: - # platform: [ ubuntu-latest, macos-latest, windows-latest ] - platform: [ macos-latest ] + include: + - os: macos-latest + target: aarch64-apple-darwin + - os: macos-latest + target: x86_64-apple-darwin + + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v3 - uses: dtolnay/rust-toolchain@stable with: - targets: 'aarch64-apple-darwin,x86_64-apple-darwin' + targets: ${{ matrix.target }} - name: Cache Rust uses: actions/cache@v2 with: @@ -31,7 +34,7 @@ jobs: node-version: 18 cache: 'npm' - name: install dependencies (ubuntu only) - if: matrix.platform == 'ubuntu-latest' + if: matrix.os == 'ubuntu-latest' run: | sudo apt-get update sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf @@ -55,7 +58,7 @@ jobs: with: tagName: 'v__VERSION__' releaseName: 'Release __VERSION__' - releaseBody: 'See the assets to download this version and install.' - releaseDraft: false + releaseBody: '' + releaseDraft: true prerelease: false - args: '--target universal-apple-darwin' + args: '--target ${{ matrix.target }}' diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 61224ae8..9556b191 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -79,11 +79,8 @@ async fn actually_send_ephemeral_request( let start = std::time::Instant::now(); let mut url_string = request.url.to_string(); - let mut variables = HashMap::new(); - variables.insert("PROJECT_ID", "project_123"); - variables.insert("TOKEN", "s3cret"); - variables.insert("DOMAIN", "schier.co"); - variables.insert("BASE_URL", "https://schier.co"); + let variables: HashMap<&str, &str> = HashMap::new(); + // variables.insert("", ""); let re = Regex::new(r"\$\{\[\s*([^]\s]+)\s*]}").expect("Failed to create regex"); url_string = re @@ -608,6 +605,14 @@ fn create_window(handle: &AppHandle) -> Window { .add_item( CustomMenuItem::new("focus_url".to_string(), "Focus URL").accelerator("CmdOrCtrl+l"), ) + .add_item( + CustomMenuItem::new("new_request".to_string(), "New Request") + .accelerator("CmdOrCtrl+n"), + ) + .add_item( + CustomMenuItem::new("duplicate_request".to_string(), "Duplicate Request") + .accelerator("CmdOrCtrl+d"), + ) .add_item(CustomMenuItem::new("new_window".to_string(), "New Window")); if is_dev() { test_menu = test_menu @@ -652,6 +657,8 @@ fn create_window(handle: &AppHandle) -> Window { "toggle_sidebar" => win2.emit("toggle_sidebar", true).unwrap(), "focus_url" => win2.emit("focus_url", true).unwrap(), "send_request" => win2.emit("send_request", true).unwrap(), + "new_request" => _ = win2.emit("new_request", true).unwrap(), + "duplicate_request" => _ = win2.emit("duplicate_request", true).unwrap(), "refresh" => win2.eval("location.reload()").unwrap(), "new_window" => _ = create_window(&handle2), "toggle_devtools" => { diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 11d4f4e6..f19f0de4 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -8,7 +8,7 @@ }, "package": { "productName": "Yaak", - "version": "2023.0.10" + "version": "2023.0.11" }, "tauri": { "windows": [], diff --git a/src-web/components/RequestActionsDropdown.tsx b/src-web/components/RequestActionsDropdown.tsx index 5aef02c0..7bb3cf18 100644 --- a/src-web/components/RequestActionsDropdown.tsx +++ b/src-web/components/RequestActionsDropdown.tsx @@ -4,6 +4,7 @@ import { useDeleteRequest } from '../hooks/useDeleteRequest'; import { useDuplicateRequest } from '../hooks/useDuplicateRequest'; import { useRequest } from '../hooks/useRequest'; import { Dropdown } from './core/Dropdown'; +import { HotKey } from './core/HotKey'; import { Icon } from './core/Icon'; import { InlineCode } from './core/InlineCode'; @@ -25,6 +26,7 @@ export function RequestActionsDropdown({ requestId, children }: Props) { label: 'Duplicate', onSelect: duplicateRequest.mutate, leftSlot: , + rightSlot: ⌘D, }, { label: 'Delete', diff --git a/src-web/components/ResponsePane.tsx b/src-web/components/ResponsePane.tsx index b7e4db64..01f79e73 100644 --- a/src-web/components/ResponsePane.tsx +++ b/src-web/components/ResponsePane.tsx @@ -80,105 +80,109 @@ export const ResponsePane = memo(function ResponsePane({ style, className }: Pro 'shadow shadow-gray-100 dark:shadow-gray-0 relative', )} > - - {activeResponse && ( - <> -
- - {activeResponse.status} - {activeResponse.statusReason && ` ${activeResponse.statusReason}`} - -  •  - {activeResponse.elapsed}ms  •  - {Math.round(activeResponse.body.length / 1000)} KB -
+ {activeResponse && ( + <> + + {activeResponse && ( + <> +
+ + {activeResponse.status} + {activeResponse.statusReason && ` ${activeResponse.statusReason}`} + +  •  + {activeResponse.elapsed}ms  •  + {Math.round(activeResponse.body.length / 1000)} KB +
- ({ - label: r.status + ' - ' + r.elapsed + ' ms', - leftSlot: activeResponse?.id === r.id ? : <>, - onSelect: () => setPinnedResponseId(r.id), - })), - ]} + ({ + label: r.status + ' - ' + r.elapsed + ' ms', + leftSlot: activeResponse?.id === r.id ? : <>, + onSelect: () => setPinnedResponseId(r.id), + })), + ]} + > + + + + )} +
+ + {activeResponse?.error ? ( + {activeResponse.error} + ) : ( + - - - - )} -
- - {activeResponse?.error ? ( - {activeResponse.error} - ) : ( - - - {activeResponse === null ? ( - No Response - ) : viewMode === 'pretty' && contentType.includes('html') ? ( - - ) : viewMode === 'pretty' && contentType.includes('json') ? ( - - ) : activeResponse?.body ? ( - - ) : null} - - - - - + + {!activeResponse.body ? ( + No Response + ) : viewMode === 'pretty' && contentType.includes('html') ? ( + + ) : viewMode === 'pretty' && contentType.includes('json') ? ( + + ) : activeResponse?.body ? ( + + ) : null} + + + + + + )} + )} ); diff --git a/src-web/components/SidebarActions.tsx b/src-web/components/SidebarActions.tsx index 7b8df0d7..3a5d556a 100644 --- a/src-web/components/SidebarActions.tsx +++ b/src-web/components/SidebarActions.tsx @@ -1,14 +1,26 @@ import { memo, useCallback } from 'react'; +import { useActiveRequestId } from '../hooks/useActiveRequestId'; import { useCreateRequest } from '../hooks/useCreateRequest'; +import { useDuplicateRequest } from '../hooks/useDuplicateRequest'; import { useSidebarHidden } from '../hooks/useSidebarHidden'; +import { useTauriEvent } from '../hooks/useTauriEvent'; import { IconButton } from './core/IconButton'; export const SidebarActions = memo(function SidebarDisplayToggle() { const { hidden, toggle } = useSidebarHidden(); + const activeRequestId = useActiveRequestId(); const createRequest = useCreateRequest({ navigateAfter: true }); + const duplicateRequest = useDuplicateRequest({ id: activeRequestId, navigateAfter: true }); const handleCreateRequest = useCallback(() => { - createRequest.mutate({ name: 'New Request' }); + createRequest.mutate({}); }, [createRequest]); + useTauriEvent('new_request', () => { + createRequest.mutate({}); + }); + // TODO: Put this somewhere better + useTauriEvent('duplicate_request', () => { + duplicateRequest.mutate(); + }); return ( <> diff --git a/src-web/components/WorkspaceHeader.tsx b/src-web/components/WorkspaceHeader.tsx index 6f9f6ca4..a1c8eaf4 100644 --- a/src-web/components/WorkspaceHeader.tsx +++ b/src-web/components/WorkspaceHeader.tsx @@ -13,6 +13,7 @@ interface Props { export const WorkspaceHeader = memo(function WorkspaceHeader({ className }: Props) { const activeRequest = useActiveRequest(); + return ( ) { return ( diff --git a/src-web/hooks/useCreateRequest.ts b/src-web/hooks/useCreateRequest.ts index aec73975..d0f735e5 100644 --- a/src-web/hooks/useCreateRequest.ts +++ b/src-web/hooks/useCreateRequest.ts @@ -16,8 +16,9 @@ export function useCreateRequest({ navigateAfter }: { navigateAfter: boolean }) if (workspaceId === null) { throw new Error("Cannot create request when there's no active workspace"); } - const sortPriority = maxSortPriority(requests) + 1000; - return invoke('create_request', { sortPriority, workspaceId, ...patch }); + patch.name = patch.name || 'New Request'; + patch.sortPriority = patch.sortPriority || maxSortPriority(requests) + 1000; + return invoke('create_request', { workspaceId, ...patch }); }, onSuccess: async (request) => { queryClient.setQueryData(