From 3f40f36217d4f1cfdbad48c5ccb862f2bc0a5084 Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Mon, 13 May 2024 23:20:30 -0700 Subject: [PATCH] Fixed asset:// loading and tweak curl stuff --- src-tauri/Cargo.lock | 57 +++++++++++++----------- src-tauri/Cargo.toml | 5 +-- src-tauri/capabilities/capabilities.json | 3 +- src-tauri/gen/schemas/capabilities.json | 2 +- src-tauri/src/lib.rs | 28 +++--------- src-tauri/tauri.conf.json | 51 +++------------------ src-web/components/ImportCurlButton.tsx | 20 +++++---- src-web/components/RequestPane.tsx | 2 +- src-web/hooks/useClipboardText.ts | 19 +++++--- src-web/hooks/useCreateHttpRequest.ts | 11 ++--- src-web/hooks/useImportCurl.ts | 22 ++++++--- 11 files changed, 91 insertions(+), 129 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index c47a62dd..17b82503 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2447,6 +2447,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + [[package]] name = "httparse" version = "1.8.0" @@ -4936,9 +4942,9 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" +checksum = "fc6e7ed6919cb46507fb01ff1654309219f62b4d603822501b0b80d42f6f21ef" dependencies = [ "dyn-clone", "indexmap 1.9.3", @@ -4950,14 +4956,14 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" +checksum = "185f2b7aa7e02d418e453790dde16890256bbd2bcd04b7dc5348811052b53f49" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 1.0.109", + "syn 2.0.58", ] [[package]] @@ -5072,13 +5078,13 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.26.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +checksum = "330f01ce65a3a5fe59a60c82f3c9a024b573b8a6e875bd233fe5f934e71d54e3" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.58", ] [[package]] @@ -5771,9 +5777,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.27.1" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92bcf8885e147b56d6e26751263b45876284f32ca404703f6d3b8f80d16ff4dd" +checksum = "12a8121bd5721ebbbe0889f8286d5824673beeb04071519b68916fbed04f3093" dependencies = [ "bitflags 2.5.0", "cocoa", @@ -5844,9 +5850,9 @@ checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" [[package]] name = "tauri" -version = "2.0.0-beta.17" +version = "2.0.0-beta.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fedd5490eddf117253945f0baedafded43474c971cba546a818f527d5c26266" +checksum = "6f8e5bc2e4f5eb7496d1a3e5f4d272f69f1333db5f8efed28d79d7f93334fe95" dependencies = [ "anyhow", "bytes", @@ -5860,6 +5866,7 @@ dependencies = [ "gtk", "heck 0.5.0", "http 1.1.0", + "http-range", "jni", "libc", "log", @@ -5893,9 +5900,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.0.0-beta.13" +version = "2.0.0-beta.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abcf98a9b4527567c3e5ca9723431d121e001c2145651b3fa044d22b5e025a7e" +checksum = "8aa28eebafcda490fa7097a6e3a4d07f65967614d35dd88b2aaa19dbb49241cd" dependencies = [ "anyhow", "cargo_toml", @@ -5915,9 +5922,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.0.0-beta.13" +version = "2.0.0-beta.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b383f341efb803852b0235a2f330ca90c4c113f422dd6d646b888685b372cace" +checksum = "727d13a28e9ec895f537d90a09acb0aa3593f703a715fe8a77f87269d3245b52" dependencies = [ "base64 0.22.0", "brotli", @@ -5942,11 +5949,11 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.0.0-beta.13" +version = "2.0.0-beta.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71be71718cfe48b149507157bfbad0e2ba0e98ea51658be26c7c677eb188fb0c" +checksum = "258667612ad901d256e04ace71ac54d4b3dd8fb1e5baa24403b50991cade4365" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", "syn 2.0.58", @@ -6121,9 +6128,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.0.0-beta.14" +version = "2.0.0-beta.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "148b6e6aff8e63fe5d4ae1d50159d50cfc0b4309abdeca64833c887c6b5631ef" +checksum = "574f3d59cbe6c76b6d849bc35aa3a9e8061ff8f75f557dc33f38c0e43cf55a41" dependencies = [ "dpi", "gtk", @@ -6140,9 +6147,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.0.0-beta.14" +version = "2.0.0-beta.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "398d065c6e0fbf3c4304583759b6e153bc1e0daeb033bede6834ebe4df371fc3" +checksum = "d6d1f223de1d674aaa561c900ac650b3160f11520e9b191a3574f6c493fc77fa" dependencies = [ "cocoa", "gtk", @@ -6164,9 +6171,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.0.0-beta.13" +version = "2.0.0-beta.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4709765385f035338ecc330f3fba753b8ee283c659c235da9768949cdb25469" +checksum = "2b4251529d92b5c611ccaa611f8a31cb41b1aa00db8bcc0a49efe5d966bfa911" dependencies = [ "brotli", "cargo_metadata", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 9e23d5eb..ef7c3d2e 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -34,10 +34,7 @@ reqwest = { version = "0.11.23", features = ["multipart", "cookies", "gzip", "br serde = { version = "1.0.198", features = ["derive"] } serde_json = { version = "1.0.116", features = ["raw_value"] } sqlx = { version = "0.7.4", features = ["sqlite", "runtime-tokio-rustls", "json", "chrono", "time"] } -tauri = { version = "2.0.0-beta.17", features = [ - "config-toml", - "devtools", -] } +tauri = { version = "2.0.0-beta.19", features = ["config-toml", "devtools", "protocol-asset"] } tauri-plugin-clipboard-manager = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tauri-plugin-dialog = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tauri-plugin-log = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2", features = ["colored"] } diff --git a/src-tauri/capabilities/capabilities.json b/src-tauri/capabilities/capabilities.json index 3c57cb36..dc6094c7 100644 --- a/src-tauri/capabilities/capabilities.json +++ b/src-tauri/capabilities/capabilities.json @@ -47,6 +47,7 @@ "window:allow-set-title", "window:allow-start-dragging", "window:allow-unmaximize", - "clipboard-manager:default" + "clipboard-manager:allow-read-text", + "clipboard-manager:allow-write-text" ] } diff --git a/src-tauri/gen/schemas/capabilities.json b/src-tauri/gen/schemas/capabilities.json index 42234e30..691b21f6 100644 --- a/src-tauri/gen/schemas/capabilities.json +++ b/src-tauri/gen/schemas/capabilities.json @@ -1 +1 @@ -{"main":{"identifier":"main","description":"Main permissions","local":true,"windows":["*"],"permissions":["os:allow-os-type","event:allow-emit","clipboard-manager:allow-write-text","clipboard-manager:allow-read-text","dialog:allow-open","dialog:allow-save","event:allow-listen","event:allow-unlisten","fs:allow-read-file","fs:allow-read-text-file",{"identifier":"fs:scope","allow":[{"path":"$APPDATA"},{"path":"$APPDATA/**"}]},"shell:allow-open",{"identifier":"shell:allow-execute","allow":[{"args":true,"name":"protoc","sidecar":true}]},"window:allow-close","window:allow-is-fullscreen","window:allow-maximize","window:allow-minimize","window:allow-set-decorations","window:allow-set-title","window:allow-start-dragging","window:allow-unmaximize","clipboard-manager:default"]}} \ No newline at end of file +{"main":{"identifier":"main","description":"Main permissions","local":true,"windows":["*"],"permissions":["os:allow-os-type","event:allow-emit","clipboard-manager:allow-write-text","clipboard-manager:allow-read-text","dialog:allow-open","dialog:allow-save","event:allow-listen","event:allow-unlisten","fs:allow-read-file","fs:allow-read-text-file",{"identifier":"fs:scope","allow":[{"path":"$APPDATA"},{"path":"$APPDATA/**"}]},"shell:allow-open",{"identifier":"shell:allow-execute","allow":[{"args":true,"name":"protoc","sidecar":true}]},"window:allow-close","window:allow-is-fullscreen","window:allow-maximize","window:allow-minimize","window:allow-set-decorations","window:allow-set-title","window:allow-start-dragging","window:allow-unmaximize","clipboard-manager:allow-read-text","clipboard-manager:allow-write-text"]}} \ No newline at end of file diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 1247928d..4107acc5 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -48,7 +48,7 @@ use crate::models::{ get_cookie_jar, get_environment, get_folder, get_grpc_connection, get_grpc_request, get_http_request, get_http_response, get_key_value_raw, get_or_create_settings, get_workspace, get_workspace_export_resources, GrpcConnection, GrpcEvent, - GrpcEventType, GrpcRequest, HttpRequest, HttpRequestHeader, HttpResponse, + GrpcEventType, GrpcRequest, HttpRequest, HttpResponse, KeyValue, list_cookie_jars, list_environments, list_folders, list_grpc_connections, list_grpc_events, list_grpc_requests, list_http_requests, list_responses, list_workspaces, ModelType, set_key_value_raw, Settings, update_response_if_id, update_settings, upsert_cookie_jar, @@ -1184,30 +1184,12 @@ async fn cmd_duplicate_grpc_request(id: &str, w: WebviewWindow) -> Result, - method: Option<&str>, - headers: Option>, - body_type: Option<&str>, + request: HttpRequest, w: WebviewWindow, ) -> Result { - upsert_http_request( - &w, - HttpRequest { - workspace_id: workspace_id.to_string(), - name: name.to_string(), - folder_id: folder_id.map(|s| s.to_string()), - body_type: body_type.map(|s| s.to_string()), - method: method.map(|s| s.to_string()).unwrap_or("GET".to_string()), - headers: Json(headers.unwrap_or_default()), - sort_priority, - ..Default::default() - }, - ) - .await - .map_err(|e| e.to_string()) + upsert_http_request(&w, request) + .await + .map_err(|e| e.to_string()) } #[tauri::command] diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 0473910d..01589ec7 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -12,9 +12,12 @@ "withGlobalTauri": false, "security": { "assetProtocol": { - "scope": [ - "$APPDATA/responses/*" - ] + "enable": true, + "scope": { + "allow": [ + "$APPDATA/responses/*" + ] + } } } }, @@ -24,48 +27,6 @@ "https://update.yaak.app/check/{{target}}/{{arch}}/{{current_version}}" ], "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEMxRDJFREQ1MjExQjdGN0IKUldSN2Z4c2gxZTNTd1FHNCtmYnFXMHVVQzhuNkJOM1cwOFBodmdLall3ckhKenpKUytHSTR1MlkK" - }, - "allowlist": { - "all": false, - "os": { - "allow-os-type": true - }, - "fs": { - "readFile": true, - "scope": [ - "$RESOURCE/*", - "$APPDATA/responses/*" - ] - }, - "shell": { - "all": false, - "open": true, - "sidecar": true, - "scope": [ - { - "name": "protoc", - "sidecar": true, - "args": true - } - ] - }, - "window": { - "close": true, - "maximize": true, - "minimize": true, - "setDecorations": true, - "setTitle": true, - "startDragging": true, - "unmaximize": true - }, - "dialog": { - "all": false, - "open": true, - "save": true - }, - "path": { - "all": true - } } }, "bundle": { diff --git a/src-web/components/ImportCurlButton.tsx b/src-web/components/ImportCurlButton.tsx index 19c77b5f..34a62d4b 100644 --- a/src-web/components/ImportCurlButton.tsx +++ b/src-web/components/ImportCurlButton.tsx @@ -7,10 +7,10 @@ import { motion } from 'framer-motion'; export function ImportCurlButton() { const [clipboardText] = useClipboardText(); - const [lastImportedCmd, setLastImportedCmd] = useState(''); - const importCurl = useImportCurl(); + const importCurl = useImportCurl({ clearClipboard: true }); + const [isLoading, setIsLoading] = useState(false); - if (!clipboardText?.trim().startsWith('curl ') || lastImportedCmd === clipboardText) { + if (!clipboardText?.trim().startsWith('curl ')) { return null; } @@ -25,13 +25,15 @@ export function ImportCurlButton() { variant="border" color="secondary" leftSlot={} + isLoading={isLoading} onClick={() => { - importCurl.mutate({ - requestId: null, // Create request - command: clipboardText, - }); - // setClipboardText(''); - setLastImportedCmd(clipboardText); + setIsLoading(true); + importCurl + .mutateAsync({ + requestId: null, // Create request + command: clipboardText, + }) + .finally(() => setIsLoading(false)); }} > Import Curl diff --git a/src-web/components/RequestPane.tsx b/src-web/components/RequestPane.tsx index 6efd6eb3..72bcb92d 100644 --- a/src-web/components/RequestPane.tsx +++ b/src-web/components/RequestPane.tsx @@ -230,7 +230,7 @@ export const RequestPane = memo(function RequestPane({ const isLoading = useIsResponseLoading(activeRequestId ?? null); const { updateKey } = useRequestUpdateKey(activeRequestId ?? null); - const importCurl = useImportCurl(); + const importCurl = useImportCurl({ clearClipboard: true }); return (
(''); export function useClipboardText() { - const [value, setValue] = useState(''); + const [value, setValue] = useClipboardTextState(); const focused = useWindowFocus(); useEffect(() => { readText().then(setValue); - }, [focused]); + }, [focused, setValue]); - const setText = useCallback((text: string) => { - writeText(text).catch(console.error); - }, []); + const setText = useCallback( + (text: string) => { + writeText(text).catch(console.error); + setValue(text); + }, + [setValue], + ); return [value, setText] as const; } diff --git a/src-web/hooks/useCreateHttpRequest.ts b/src-web/hooks/useCreateHttpRequest.ts index 465d8abd..65ca4c1c 100644 --- a/src-web/hooks/useCreateHttpRequest.ts +++ b/src-web/hooks/useCreateHttpRequest.ts @@ -13,13 +13,7 @@ export function useCreateHttpRequest() { const activeRequest = useActiveRequest(); const routes = useAppRoutes(); - return useMutation< - HttpRequest, - unknown, - Partial< - Pick - > - >({ + return useMutation>({ mutationFn: (patch) => { if (workspaceId === null) { throw new Error("Cannot create request when there's no active workspace"); @@ -34,7 +28,8 @@ export function useCreateHttpRequest() { } } patch.folderId = patch.folderId || activeRequest?.folderId; - return invoke('cmd_create_http_request', { workspaceId, name: '', ...patch }); + console.log('PATCH', patch); + return invoke('cmd_create_http_request', { request: { workspaceId, ...patch } }); }, onSettled: () => trackEvent('http_request', 'create'), onSuccess: async (request) => { diff --git a/src-web/hooks/useImportCurl.ts b/src-web/hooks/useImportCurl.ts index 06e46348..c5afce3b 100644 --- a/src-web/hooks/useImportCurl.ts +++ b/src-web/hooks/useImportCurl.ts @@ -5,13 +5,15 @@ import { useRequestUpdateKey } from './useRequestUpdateKey'; import { useUpdateAnyHttpRequest } from './useUpdateAnyHttpRequest'; import { useToast } from '../components/ToastContext'; import { useCreateHttpRequest } from './useCreateHttpRequest'; +import { useClipboardText } from './useClipboardText'; -export function useImportCurl() { +export function useImportCurl({ clearClipboard }: { clearClipboard?: boolean } = {}) { const workspaceId = useActiveWorkspaceId(); const updateRequest = useUpdateAnyHttpRequest(); const createRequest = useCreateHttpRequest(); const { wasUpdatedExternally } = useRequestUpdateKey(null); const toast = useToast(); + const [, setClipboardText] = useClipboardText(); return useMutation({ mutationFn: async ({ requestId, command }: { requestId: string | null; command: string }) => { @@ -21,16 +23,24 @@ export function useImportCurl() { }); delete request.id; - const id = requestId ?? (await createRequest.mutateAsync({})).id; - await updateRequest.mutateAsync({ id, update: request }); + let verb; + if (requestId == null) { + verb = 'Created'; + await createRequest.mutateAsync(request); + } else { + verb = 'Updated'; + await updateRequest.mutateAsync({ id: requestId, update: request }); + setTimeout(() => wasUpdatedExternally(requestId), 100); + } - const verb = requestId ? 'updated' : 'created'; toast.show({ variant: 'success', - message: `Request ${verb} from Curl`, + message: `${verb} request from Curl`, }); - wasUpdatedExternally(id); + if (clearClipboard) { + setClipboardText(''); + } }, }); }