Fix GRPC with files not refreshing, and tight render loop

This commit is contained in:
Gregory Schier
2024-06-20 08:40:10 -07:00
parent 92b1582232
commit 88aeb0e530
62 changed files with 221 additions and 163 deletions

View File

@@ -185,29 +185,39 @@ impl GrpcHandle {
pub async fn services_from_files( pub async fn services_from_files(
&mut self, &mut self,
id: &str, id: &str,
uri: &str,
paths: Vec<PathBuf>, paths: Vec<PathBuf>,
) -> Result<Vec<ServiceDefinition>, String> { ) -> Result<Vec<ServiceDefinition>, String> {
let pool_key = format!(
"{}-{}",
id,
paths
.iter()
.map(|p| p.to_string_lossy().to_string())
.collect::<Vec<String>>()
.join(":")
);
let pool = fill_pool_from_files(&self.app_handle, paths).await?; let pool = fill_pool_from_files(&self.app_handle, paths).await?;
let uri = uri_from_str(uri)?; self.pools.insert(pool_key, pool.clone());
self.pools.insert(self.get_pool_key(id, &uri), pool.clone());
Ok(self.services_from_pool(&pool)) Ok(self.services_from_pool(&pool))
} }
pub async fn services_from_reflection( pub async fn services_from_reflection(
&mut self, &mut self,
id: &str, id: &str,
uri: &str, uri: &str,
) -> Result<Vec<ServiceDefinition>, String> { ) -> Result<Vec<ServiceDefinition>, String> {
// Short-circuit if no URL is set
if uri.is_empty() {
return Ok(Vec::new());
}
let uri = uri_from_str(uri)?; let uri = uri_from_str(uri)?;
let pool = fill_pool(&uri).await?; let pool = fill_pool(&uri).await?;
self.pools.insert(self.get_pool_key(id, &uri), pool.clone()); let pool_key = format!("{}-{}", id, uri);
self.pools.insert(pool_key, pool.clone());
Ok(self.services_from_pool(&pool)) Ok(self.services_from_pool(&pool))
} }
fn get_pool_key(&self, id: &str, uri: &Uri) -> String {
format!("{}-{}", id, uri)
}
fn services_from_pool(&self, pool: &DescriptorPool) -> Vec<ServiceDefinition> { fn services_from_pool(&self, pool: &DescriptorPool) -> Vec<ServiceDefinition> {
pool.services() pool.services()
.map(|s| { .map(|s| {
@@ -274,6 +284,6 @@ fn uri_from_str(uri_str: &str) -> Result<Uri, String> {
Err(err) => { Err(err) => {
// Uri::from_str basically only returns "invalid format" so we add more context here // Uri::from_str basically only returns "invalid format" so we add more context here
Err(format!("Failed to parse URL, {}", err.to_string())) Err(format!("Failed to parse URL, {}", err.to_string()))
}, }
} }
} }

View File

@@ -134,12 +134,7 @@ async fn cmd_grpc_reflect(
let req = get_grpc_request(&window, request_id) let req = get_grpc_request(&window, request_id)
.await .await
.map_err(|e| e.to_string())?; .map_err(|e| e.to_string())?;
// Short-circuit if no URL is set
if req.url.is_empty() {
return Ok(Vec::new());
}
let uri = safe_uri(req.url.as_str()); let uri = safe_uri(req.url.as_str());
if proto_files.len() > 0 { if proto_files.len() > 0 {
grpc_handle grpc_handle
@@ -147,7 +142,6 @@ async fn cmd_grpc_reflect(
.await .await
.services_from_files( .services_from_files(
&req.id, &req.id,
uri.as_str(),
proto_files proto_files
.iter() .iter()
.map(|p| PathBuf::from_str(p).unwrap()) .map(|p| PathBuf::from_str(p).unwrap())

View File

@@ -1,6 +1,7 @@
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
import { MotionConfig } from 'framer-motion'; import { MotionConfig } from 'framer-motion';
import { Suspense } from 'react'; import React, { Suspense } from 'react';
import { DndProvider } from 'react-dnd'; import { DndProvider } from 'react-dnd';
import { HTML5Backend } from 'react-dnd-html5-backend'; import { HTML5Backend } from 'react-dnd-html5-backend';
import { HelmetProvider } from 'react-helmet-async'; import { HelmetProvider } from 'react-helmet-async';
@@ -19,12 +20,12 @@ const queryClient = new QueryClient({
export function App() { export function App() {
return ( return (
<QueryClientProvider client={queryClient}> <QueryClientProvider client={queryClient}>
<ReactQueryDevtools initialIsOpen={false} />
<MotionConfig transition={{ duration: 0.1 }}> <MotionConfig transition={{ duration: 0.1 }}>
<HelmetProvider> <HelmetProvider>
<DndProvider backend={HTML5Backend}> <DndProvider backend={HTML5Backend}>
<Suspense> <Suspense>
<AppRouter /> <AppRouter />
{/*<ReactQueryDevtools initialIsOpen={false} />*/}
</Suspense> </Suspense>
</DndProvider> </DndProvider>
</HelmetProvider> </HelmetProvider>

View File

@@ -1,4 +1,3 @@
import { invoke } from '@tauri-apps/api/core';
import classNames from 'classnames'; import classNames from 'classnames';
import { search } from 'fast-fuzzy'; import { search } from 'fast-fuzzy';
import type { KeyboardEvent, ReactNode } from 'react'; import type { KeyboardEvent, ReactNode } from 'react';
@@ -25,6 +24,7 @@ import { useRequests } from '../hooks/useRequests';
import { useSidebarHidden } from '../hooks/useSidebarHidden'; import { useSidebarHidden } from '../hooks/useSidebarHidden';
import { useWorkspaces } from '../hooks/useWorkspaces'; import { useWorkspaces } from '../hooks/useWorkspaces';
import { fallbackRequestName } from '../lib/fallbackRequestName'; import { fallbackRequestName } from '../lib/fallbackRequestName';
import { invokeCmd } from '../lib/tauri';
import { CookieDialog } from './CookieDialog'; import { CookieDialog } from './CookieDialog';
import { Button } from './core/Button'; import { Button } from './core/Button';
import { Heading } from './core/Heading'; import { Heading } from './core/Heading';
@@ -82,7 +82,7 @@ export function CommandPalette({ onClose }: { onClose: () => void }) {
action: 'settings.show', action: 'settings.show',
onSelect: async () => { onSelect: async () => {
if (workspaceId == null) return; if (workspaceId == null) return;
await invoke('cmd_new_nested_window', { await invokeCmd('cmd_new_nested_window', {
url: routes.paths.workspaceSettings({ workspaceId }), url: routes.paths.workspaceSettings({ workspaceId }),
label: 'settings', label: 'settings',
title: 'Yaak Settings', title: 'Yaak Settings',

View File

@@ -1,9 +1,9 @@
import { invoke } from '@tauri-apps/api/core';
import { save } from '@tauri-apps/plugin-dialog'; import { save } from '@tauri-apps/plugin-dialog';
import { useCallback, useMemo, useState } from 'react'; import { useCallback, useMemo, useState } from 'react';
import slugify from 'slugify'; import slugify from 'slugify';
import type { Workspace } from '../lib/models'; import type { Workspace } from '../lib/models';
import { count } from '../lib/pluralize'; import { count } from '../lib/pluralize';
import { invokeCmd } from '../lib/tauri';
import { Button } from './core/Button'; import { Button } from './core/Button';
import { Checkbox } from './core/Checkbox'; import { Checkbox } from './core/Checkbox';
import { HStack, VStack } from './core/Stacks'; import { HStack, VStack } from './core/Stacks';
@@ -49,7 +49,7 @@ export function ExportDataDialog({
return; return;
} }
await invoke('cmd_export_data', { workspaceIds: ids, exportPath }); await invokeCmd('cmd_export_data', { workspaceIds: ids, exportPath });
onHide(); onHide();
onSuccess(exportPath); onSuccess(exportPath);
}, [onHide, onSuccess, selectedWorkspaces, workspaces]); }, [onHide, onSuccess, selectedWorkspaces, workspaces]);

View File

@@ -66,7 +66,6 @@ export function GraphQLEditor({ defaultValue, onChange, baseRequest, ...extraEdi
// Refetch the schema when the URL changes // Refetch the schema when the URL changes
useEffect(() => { useEffect(() => {
if (editorViewRef.current === null) return; if (editorViewRef.current === null) return;
console.log('SET SCHEMA', schema);
updateSchema(editorViewRef.current, schema ?? undefined); updateSchema(editorViewRef.current, schema ?? undefined);
}, [schema]); }, [schema]);

View File

@@ -17,14 +17,16 @@ interface Props {
style: CSSProperties; style: CSSProperties;
} }
const emptyArray: string[] = [];
export function GrpcConnectionLayout({ style }: Props) { export function GrpcConnectionLayout({ style }: Props) {
const activeRequest = useActiveRequest('grpc_request'); const activeRequest = useActiveRequest('grpc_request');
const updateRequest = useUpdateGrpcRequest(activeRequest?.id ?? null); const { mutateAsync: updateRequest } = useUpdateGrpcRequest(activeRequest?.id ?? null);
const connections = useGrpcConnections(activeRequest?.id ?? null); const connections = useGrpcConnections(activeRequest?.id ?? null);
const activeConnection = connections[0] ?? null; const activeConnection = connections[0] ?? null;
const messages = useGrpcEvents(activeConnection?.id ?? null); const messages = useGrpcEvents(activeConnection?.id ?? null);
const protoFilesKv = useGrpcProtoFiles(activeRequest?.id ?? null); const protoFilesKv = useGrpcProtoFiles(activeRequest?.id ?? null);
const protoFiles = protoFilesKv.value ?? []; const protoFiles = protoFilesKv.value ?? emptyArray;
const grpc = useGrpc(activeRequest, activeConnection, protoFiles); const grpc = useGrpc(activeRequest, activeConnection, protoFiles);
const services = grpc.reflect.data ?? null; const services = grpc.reflect.data ?? null;
@@ -32,7 +34,7 @@ export function GrpcConnectionLayout({ style }: Props) {
if (services == null || activeRequest == null) return; if (services == null || activeRequest == null) return;
const s = services.find((s) => s.name === activeRequest.service); const s = services.find((s) => s.name === activeRequest.service);
if (s == null) { if (s == null) {
updateRequest.mutate({ updateRequest({
service: services[0]?.name ?? null, service: services[0]?.name ?? null,
method: services[0]?.methods[0]?.name ?? null, method: services[0]?.methods[0]?.name ?? null,
}); });
@@ -41,7 +43,7 @@ export function GrpcConnectionLayout({ style }: Props) {
const m = s.methods.find((m) => m.name === activeRequest.method); const m = s.methods.find((m) => m.name === activeRequest.method);
if (m == null) { if (m == null) {
updateRequest.mutate({ method: s.methods[0]?.name ?? null }); updateRequest({ method: s.methods[0]?.name ?? null });
return; return;
} }
}, [activeRequest, services, updateRequest]); }, [activeRequest, services, updateRequest]);

View File

@@ -1,9 +1,9 @@
import { invoke } from '@tauri-apps/api/core';
import { open } from '@tauri-apps/plugin-dialog'; import { open } from '@tauri-apps/plugin-dialog';
import React, { useState } from 'react'; import React, { useState } from 'react';
import { useLocalStorage } from 'react-use'; import { useLocalStorage } from 'react-use';
import { useThemes } from '../../hooks/useThemes'; import { useThemes } from '../../hooks/useThemes';
import { capitalize } from '../../lib/capitalize'; import { capitalize } from '../../lib/capitalize';
import { invokeCmd } from '../../lib/tauri';
import { yaakDark } from '../../lib/theme/themes/yaak'; import { yaakDark } from '../../lib/theme/themes/yaak';
import { getThemeCSS } from '../../lib/theme/window'; import { getThemeCSS } from '../../lib/theme/window';
import { Banner } from '../core/Banner'; import { Banner } from '../core/Banner';
@@ -58,11 +58,11 @@ export function SettingsDesign() {
const coreThemeCSS = [yaakDark].map(getThemeCSS).join('\n\n'); const coreThemeCSS = [yaakDark].map(getThemeCSS).join('\n\n');
try { try {
await invoke('cmd_write_file_dev', { await invokeCmd('cmd_write_file_dev', {
pathname: exportDir + '/themes-all.css', pathname: exportDir + '/themes-all.css',
contents: allThemesCSS, contents: allThemesCSS,
}); });
await invoke('cmd_write_file_dev', { await invokeCmd('cmd_write_file_dev', {
pathname: exportDir + '/themes-slim.css', pathname: exportDir + '/themes-slim.css',
contents: coreThemeCSS, contents: coreThemeCSS,
}); });

View File

@@ -1,4 +1,3 @@
import { invoke } from '@tauri-apps/api/core';
import { open } from '@tauri-apps/plugin-shell'; import { open } from '@tauri-apps/plugin-shell';
import { useRef } from 'react'; import { useRef } from 'react';
import { useActiveWorkspaceId } from '../hooks/useActiveWorkspaceId'; import { useActiveWorkspaceId } from '../hooks/useActiveWorkspaceId';
@@ -8,6 +7,7 @@ import { useCheckForUpdates } from '../hooks/useCheckForUpdates';
import { useExportData } from '../hooks/useExportData'; import { useExportData } from '../hooks/useExportData';
import { useImportData } from '../hooks/useImportData'; import { useImportData } from '../hooks/useImportData';
import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent'; import { useListenToTauriEvent } from '../hooks/useListenToTauriEvent';
import { invokeCmd } from '../lib/tauri';
import type { DropdownRef } from './core/Dropdown'; import type { DropdownRef } from './core/Dropdown';
import { Dropdown } from './core/Dropdown'; import { Dropdown } from './core/Dropdown';
import { Icon } from './core/Icon'; import { Icon } from './core/Icon';
@@ -27,7 +27,7 @@ export function SettingsDropdown() {
const showSettings = async () => { const showSettings = async () => {
if (!workspaceId) return; if (!workspaceId) return;
await invoke('cmd_new_nested_window', { await invokeCmd('cmd_new_nested_window', {
url: routes.paths.workspaceSettings({ workspaceId }), url: routes.paths.workspaceSettings({ workspaceId }),
label: 'settings', label: 'settings',
title: 'Yaak Settings', title: 'Yaak Settings',

View File

@@ -1,5 +1,5 @@
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core'; import { invokeCmd } from '../lib/tauri';
export interface AppInfo { export interface AppInfo {
isDev: boolean; isDev: boolean;
@@ -13,7 +13,7 @@ export function useAppInfo() {
return useQuery({ return useQuery({
queryKey: ['appInfo'], queryKey: ['appInfo'],
queryFn: async () => { queryFn: async () => {
const metadata = await invoke('cmd_metadata'); const metadata = await invokeCmd('cmd_metadata');
return metadata as AppInfo; return metadata as AppInfo;
}, },
}).data; }).data;

View File

@@ -1,7 +1,7 @@
import { useMutation } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { InlineCode } from '../components/core/InlineCode'; import { InlineCode } from '../components/core/InlineCode';
import { minPromiseMillis } from '../lib/minPromiseMillis'; import { minPromiseMillis } from '../lib/minPromiseMillis';
import { invokeCmd } from '../lib/tauri';
import { useAlert } from './useAlert'; import { useAlert } from './useAlert';
import { useAppInfo } from './useAppInfo'; import { useAppInfo } from './useAppInfo';
@@ -10,7 +10,7 @@ export function useCheckForUpdates() {
const appInfo = useAppInfo(); const appInfo = useAppInfo();
return useMutation({ return useMutation({
mutationFn: async () => { mutationFn: async () => {
const hasUpdate: boolean = await minPromiseMillis(invoke('cmd_check_for_updates'), 500); const hasUpdate: boolean = await minPromiseMillis(invokeCmd('cmd_check_for_updates'), 500);
if (!hasUpdate) { if (!hasUpdate) {
alert({ alert({
id: 'no-updates', id: 'no-updates',

View File

@@ -1,6 +1,6 @@
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { CookieJar } from '../lib/models'; import type { CookieJar } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useActiveWorkspaceId } from './useActiveWorkspaceId'; import { useActiveWorkspaceId } from './useActiveWorkspaceId';
export function cookieJarsQueryKey({ workspaceId }: { workspaceId: string }) { export function cookieJarsQueryKey({ workspaceId }: { workspaceId: string }) {
@@ -15,7 +15,7 @@ export function useCookieJars() {
queryKey: cookieJarsQueryKey({ workspaceId: workspaceId ?? 'n/a' }), queryKey: cookieJarsQueryKey({ workspaceId: workspaceId ?? 'n/a' }),
queryFn: async () => { queryFn: async () => {
if (workspaceId == null) return []; if (workspaceId == null) return [];
return (await invoke('cmd_list_cookie_jars', { workspaceId })) as CookieJar[]; return (await invokeCmd('cmd_list_cookie_jars', { workspaceId })) as CookieJar[];
}, },
}).data ?? [] }).data ?? []
); );

View File

@@ -1,4 +1,4 @@
import { invoke } from '@tauri-apps/api/core'; import { invokeCmd } from '../lib/tauri';
import { useActiveEnvironmentId } from './useActiveEnvironmentId'; import { useActiveEnvironmentId } from './useActiveEnvironmentId';
import { useClipboardText } from './useClipboardText'; import { useClipboardText } from './useClipboardText';
@@ -6,7 +6,7 @@ export function useCopyAsCurl(requestId: string) {
const [, copy] = useClipboardText(); const [, copy] = useClipboardText();
const environmentId = useActiveEnvironmentId(); const environmentId = useActiveEnvironmentId();
return async () => { return async () => {
const cmd: string = await invoke('cmd_request_to_curl', { requestId, environmentId }); const cmd: string = await invokeCmd('cmd_request_to_curl', { requestId, environmentId });
copy(cmd); copy(cmd);
return cmd; return cmd;
}; };

View File

@@ -1,7 +1,7 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import type { CookieJar } from '../lib/models'; import type { CookieJar } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useActiveWorkspaceId } from './useActiveWorkspaceId'; import { useActiveWorkspaceId } from './useActiveWorkspaceId';
import { cookieJarsQueryKey } from './useCookieJars'; import { cookieJarsQueryKey } from './useCookieJars';
import { usePrompt } from './usePrompt'; import { usePrompt } from './usePrompt';
@@ -24,7 +24,7 @@ export function useCreateCookieJar() {
label: 'Name', label: 'Name',
defaultValue: 'My Jar', defaultValue: 'My Jar',
}); });
return invoke('cmd_create_cookie_jar', { workspaceId, name }); return invokeCmd('cmd_create_cookie_jar', { workspaceId, name });
}, },
onSettled: () => trackEvent('cookie_jar', 'create'), onSettled: () => trackEvent('cookie_jar', 'create'),
onSuccess: async (cookieJar) => { onSuccess: async (cookieJar) => {

View File

@@ -1,7 +1,7 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import type { Environment } from '../lib/models'; import type { Environment } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useActiveWorkspaceId } from './useActiveWorkspaceId'; import { useActiveWorkspaceId } from './useActiveWorkspaceId';
import { useAppRoutes } from './useAppRoutes'; import { useAppRoutes } from './useAppRoutes';
import { environmentsQueryKey } from './useEnvironments'; import { environmentsQueryKey } from './useEnvironments';
@@ -24,7 +24,7 @@ export function useCreateEnvironment() {
placeholder: 'My Environment', placeholder: 'My Environment',
defaultValue: 'My Environment', defaultValue: 'My Environment',
}); });
return invoke('cmd_create_environment', { name, variables: [], workspaceId }); return invokeCmd('cmd_create_environment', { name, variables: [], workspaceId });
}, },
onSettled: () => trackEvent('environment', 'create'), onSettled: () => trackEvent('environment', 'create'),
onSuccess: async (environment) => { onSuccess: async (environment) => {

View File

@@ -1,7 +1,7 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import type { Folder } from '../lib/models'; import type { Folder } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useActiveRequest } from './useActiveRequest'; import { useActiveRequest } from './useActiveRequest';
import { useActiveWorkspaceId } from './useActiveWorkspaceId'; import { useActiveWorkspaceId } from './useActiveWorkspaceId';
import { foldersQueryKey } from './useFolders'; import { foldersQueryKey } from './useFolders';
@@ -31,7 +31,7 @@ export function useCreateFolder() {
})); }));
patch.sortPriority = patch.sortPriority || -Date.now(); patch.sortPriority = patch.sortPriority || -Date.now();
patch.folderId = patch.folderId || activeRequest?.folderId; patch.folderId = patch.folderId || activeRequest?.folderId;
return invoke('cmd_create_folder', { workspaceId, ...patch }); return invokeCmd('cmd_create_folder', { workspaceId, ...patch });
}, },
onSettled: () => trackEvent('folder', 'create'), onSettled: () => trackEvent('folder', 'create'),
onSuccess: async (request) => { onSuccess: async (request) => {

View File

@@ -1,7 +1,7 @@
import { useMutation } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import type { GrpcRequest } from '../lib/models'; import type { GrpcRequest } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useActiveEnvironmentId } from './useActiveEnvironmentId'; import { useActiveEnvironmentId } from './useActiveEnvironmentId';
import { useActiveRequest } from './useActiveRequest'; import { useActiveRequest } from './useActiveRequest';
import { useActiveWorkspaceId } from './useActiveWorkspaceId'; import { useActiveWorkspaceId } from './useActiveWorkspaceId';
@@ -32,7 +32,7 @@ export function useCreateGrpcRequest() {
} }
} }
patch.folderId = patch.folderId || activeRequest?.folderId; patch.folderId = patch.folderId || activeRequest?.folderId;
return invoke('cmd_create_grpc_request', { workspaceId, name: '', ...patch }); return invokeCmd('cmd_create_grpc_request', { workspaceId, name: '', ...patch });
}, },
onSettled: () => trackEvent('grpc_request', 'create'), onSettled: () => trackEvent('grpc_request', 'create'),
onSuccess: async (request) => { onSuccess: async (request) => {

View File

@@ -1,7 +1,7 @@
import { useMutation } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import type { HttpRequest } from '../lib/models'; import type { HttpRequest } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useActiveEnvironmentId } from './useActiveEnvironmentId'; import { useActiveEnvironmentId } from './useActiveEnvironmentId';
import { useActiveRequest } from './useActiveRequest'; import { useActiveRequest } from './useActiveRequest';
import { useActiveWorkspaceId } from './useActiveWorkspaceId'; import { useActiveWorkspaceId } from './useActiveWorkspaceId';
@@ -28,7 +28,7 @@ export function useCreateHttpRequest() {
} }
} }
patch.folderId = patch.folderId || activeRequest?.folderId; patch.folderId = patch.folderId || activeRequest?.folderId;
return invoke('cmd_create_http_request', { request: { workspaceId, ...patch } }); return invokeCmd('cmd_create_http_request', { request: { workspaceId, ...patch } });
}, },
onSettled: () => trackEvent('http_request', 'create'), onSettled: () => trackEvent('http_request', 'create'),
onSuccess: async (request) => { onSuccess: async (request) => {

View File

@@ -1,6 +1,6 @@
import { useMutation } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { Workspace } from '../lib/models'; import type { Workspace } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useAppRoutes } from './useAppRoutes'; import { useAppRoutes } from './useAppRoutes';
import { usePrompt } from './usePrompt'; import { usePrompt } from './usePrompt';
@@ -18,7 +18,7 @@ export function useCreateWorkspace() {
confirmLabel: 'Create', confirmLabel: 'Create',
placeholder: 'My Workspace', placeholder: 'My Workspace',
}); });
return invoke('cmd_create_workspace', { name }); return invokeCmd('cmd_create_workspace', { name });
}, },
onSuccess: async (workspace) => { onSuccess: async (workspace) => {
routes.navigate('workspace', { workspaceId: workspace.id }); routes.navigate('workspace', { workspaceId: workspace.id });

View File

@@ -1,10 +1,10 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { InlineCode } from '../components/core/InlineCode'; import { InlineCode } from '../components/core/InlineCode';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import { fallbackRequestName } from '../lib/fallbackRequestName'; import { fallbackRequestName } from '../lib/fallbackRequestName';
import type { GrpcRequest } from '../lib/models'; import type { GrpcRequest } from '../lib/models';
import { getGrpcRequest } from '../lib/store'; import { getGrpcRequest } from '../lib/store';
import { invokeCmd } from '../lib/tauri';
import { useConfirm } from './useConfirm'; import { useConfirm } from './useConfirm';
import { grpcRequestsQueryKey } from './useGrpcRequests'; import { grpcRequestsQueryKey } from './useGrpcRequests';
@@ -28,7 +28,7 @@ export function useDeleteAnyGrpcRequest() {
), ),
}); });
if (!confirmed) return null; if (!confirmed) return null;
return invoke('cmd_delete_grpc_request', { requestId: id }); return invokeCmd('cmd_delete_grpc_request', { requestId: id });
}, },
onSettled: () => trackEvent('grpc_request', 'delete'), onSettled: () => trackEvent('grpc_request', 'delete'),
onSuccess: async (request) => { onSuccess: async (request) => {

View File

@@ -1,10 +1,10 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { InlineCode } from '../components/core/InlineCode'; import { InlineCode } from '../components/core/InlineCode';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import { fallbackRequestName } from '../lib/fallbackRequestName'; import { fallbackRequestName } from '../lib/fallbackRequestName';
import type { HttpRequest } from '../lib/models'; import type { HttpRequest } from '../lib/models';
import { getHttpRequest } from '../lib/store'; import { getHttpRequest } from '../lib/store';
import { invokeCmd } from '../lib/tauri';
import { useConfirm } from './useConfirm'; import { useConfirm } from './useConfirm';
import { httpRequestsQueryKey } from './useHttpRequests'; import { httpRequestsQueryKey } from './useHttpRequests';
import { httpResponsesQueryKey } from './useHttpResponses'; import { httpResponsesQueryKey } from './useHttpResponses';
@@ -29,7 +29,7 @@ export function useDeleteAnyHttpRequest() {
), ),
}); });
if (!confirmed) return null; if (!confirmed) return null;
return invoke('cmd_delete_http_request', { requestId: id }); return invokeCmd('cmd_delete_http_request', { requestId: id });
}, },
onSettled: () => trackEvent('http_request', 'delete'), onSettled: () => trackEvent('http_request', 'delete'),
onSuccess: async (request) => { onSuccess: async (request) => {

View File

@@ -1,8 +1,8 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { InlineCode } from '../components/core/InlineCode'; import { InlineCode } from '../components/core/InlineCode';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import type { CookieJar } from '../lib/models'; import type { CookieJar } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useConfirm } from './useConfirm'; import { useConfirm } from './useConfirm';
import { cookieJarsQueryKey } from './useCookieJars'; import { cookieJarsQueryKey } from './useCookieJars';
@@ -23,7 +23,7 @@ export function useDeleteCookieJar(cookieJar: CookieJar | null) {
), ),
}); });
if (!confirmed) return null; if (!confirmed) return null;
return invoke('cmd_delete_cookie_jar', { cookieJarId: cookieJar?.id }); return invokeCmd('cmd_delete_cookie_jar', { cookieJarId: cookieJar?.id });
}, },
onSettled: () => trackEvent('cookie_jar', 'delete'), onSettled: () => trackEvent('cookie_jar', 'delete'),
onSuccess: async (cookieJar) => { onSuccess: async (cookieJar) => {

View File

@@ -1,8 +1,8 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { InlineCode } from '../components/core/InlineCode'; import { InlineCode } from '../components/core/InlineCode';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import type { Environment, Workspace } from '../lib/models'; import type { Environment, Workspace } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useConfirm } from './useConfirm'; import { useConfirm } from './useConfirm';
import { environmentsQueryKey } from './useEnvironments'; import { environmentsQueryKey } from './useEnvironments';
@@ -23,7 +23,7 @@ export function useDeleteEnvironment(environment: Environment | null) {
), ),
}); });
if (!confirmed) return null; if (!confirmed) return null;
return invoke('cmd_delete_environment', { environmentId: environment?.id }); return invokeCmd('cmd_delete_environment', { environmentId: environment?.id });
}, },
onSettled: () => trackEvent('environment', 'delete'), onSettled: () => trackEvent('environment', 'delete'),
onSuccess: async (environment) => { onSuccess: async (environment) => {

View File

@@ -1,9 +1,9 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { InlineCode } from '../components/core/InlineCode'; import { InlineCode } from '../components/core/InlineCode';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import type { Folder } from '../lib/models'; import type { Folder } from '../lib/models';
import { getFolder } from '../lib/store'; import { getFolder } from '../lib/store';
import { invokeCmd } from '../lib/tauri';
import { useConfirm } from './useConfirm'; import { useConfirm } from './useConfirm';
import { foldersQueryKey } from './useFolders'; import { foldersQueryKey } from './useFolders';
import { httpRequestsQueryKey } from './useHttpRequests'; import { httpRequestsQueryKey } from './useHttpRequests';
@@ -26,7 +26,7 @@ export function useDeleteFolder(id: string | null) {
), ),
}); });
if (!confirmed) return null; if (!confirmed) return null;
return invoke('cmd_delete_folder', { folderId: id }); return invokeCmd('cmd_delete_folder', { folderId: id });
}, },
onSettled: () => trackEvent('folder', 'delete'), onSettled: () => trackEvent('folder', 'delete'),
onSuccess: async (folder) => { onSuccess: async (folder) => {

View File

@@ -1,14 +1,14 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import type { GrpcConnection } from '../lib/models'; import type { GrpcConnection } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { grpcConnectionsQueryKey } from './useGrpcConnections'; import { grpcConnectionsQueryKey } from './useGrpcConnections';
export function useDeleteGrpcConnection(id: string | null) { export function useDeleteGrpcConnection(id: string | null) {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
return useMutation<GrpcConnection>({ return useMutation<GrpcConnection>({
mutationFn: async () => { mutationFn: async () => {
return await invoke('cmd_delete_grpc_connection', { id: id }); return await invokeCmd('cmd_delete_grpc_connection', { id: id });
}, },
onSettled: () => trackEvent('grpc_connection', 'delete'), onSettled: () => trackEvent('grpc_connection', 'delete'),
onSuccess: ({ requestId, id: connectionId }) => { onSuccess: ({ requestId, id: connectionId }) => {

View File

@@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import { invokeCmd } from '../lib/tauri';
import { grpcConnectionsQueryKey } from './useGrpcConnections'; import { grpcConnectionsQueryKey } from './useGrpcConnections';
export function useDeleteGrpcConnections(requestId?: string) { export function useDeleteGrpcConnections(requestId?: string) {
@@ -8,7 +8,7 @@ export function useDeleteGrpcConnections(requestId?: string) {
return useMutation({ return useMutation({
mutationFn: async () => { mutationFn: async () => {
if (requestId === undefined) return; if (requestId === undefined) return;
await invoke('cmd_delete_all_grpc_connections', { requestId }); await invokeCmd('cmd_delete_all_grpc_connections', { requestId });
}, },
onSettled: () => trackEvent('grpc_connection', 'delete_many'), onSettled: () => trackEvent('grpc_connection', 'delete_many'),
onSuccess: async () => { onSuccess: async () => {

View File

@@ -1,14 +1,14 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import type { HttpResponse } from '../lib/models'; import type { HttpResponse } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { httpResponsesQueryKey } from './useHttpResponses'; import { httpResponsesQueryKey } from './useHttpResponses';
export function useDeleteHttpResponse(id: string | null) { export function useDeleteHttpResponse(id: string | null) {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
return useMutation<HttpResponse>({ return useMutation<HttpResponse>({
mutationFn: async () => { mutationFn: async () => {
return await invoke('cmd_delete_http_response', { id: id }); return await invokeCmd('cmd_delete_http_response', { id: id });
}, },
onSettled: () => trackEvent('http_response', 'delete'), onSettled: () => trackEvent('http_response', 'delete'),
onSuccess: ({ requestId, id: responseId }) => { onSuccess: ({ requestId, id: responseId }) => {

View File

@@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import { invokeCmd } from '../lib/tauri';
import { httpResponsesQueryKey } from './useHttpResponses'; import { httpResponsesQueryKey } from './useHttpResponses';
export function useDeleteHttpResponses(requestId?: string) { export function useDeleteHttpResponses(requestId?: string) {
@@ -8,7 +8,7 @@ export function useDeleteHttpResponses(requestId?: string) {
return useMutation({ return useMutation({
mutationFn: async () => { mutationFn: async () => {
if (requestId === undefined) return; if (requestId === undefined) return;
await invoke('cmd_delete_all_http_responses', { requestId }); await invokeCmd('cmd_delete_all_http_responses', { requestId });
}, },
onSettled: () => trackEvent('http_response', 'delete_many'), onSettled: () => trackEvent('http_response', 'delete_many'),
onSuccess: async () => { onSuccess: async () => {

View File

@@ -1,8 +1,8 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { InlineCode } from '../components/core/InlineCode'; import { InlineCode } from '../components/core/InlineCode';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import type { Workspace } from '../lib/models'; import type { Workspace } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useActiveWorkspaceId } from './useActiveWorkspaceId'; import { useActiveWorkspaceId } from './useActiveWorkspaceId';
import { useAppRoutes } from './useAppRoutes'; import { useAppRoutes } from './useAppRoutes';
import { useConfirm } from './useConfirm'; import { useConfirm } from './useConfirm';
@@ -28,7 +28,7 @@ export function useDeleteWorkspace(workspace: Workspace | null) {
), ),
}); });
if (!confirmed) return null; if (!confirmed) return null;
return invoke('cmd_delete_workspace', { workspaceId: workspace?.id }); return invokeCmd('cmd_delete_workspace', { workspaceId: workspace?.id });
}, },
onSettled: () => trackEvent('workspace', 'delete'), onSettled: () => trackEvent('workspace', 'delete'),
onSuccess: async (workspace) => { onSuccess: async (workspace) => {

View File

@@ -1,8 +1,8 @@
import { useMutation } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import { setKeyValue } from '../lib/keyValueStore'; import { setKeyValue } from '../lib/keyValueStore';
import type { GrpcRequest } from '../lib/models'; import type { GrpcRequest } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useActiveEnvironmentId } from './useActiveEnvironmentId'; import { useActiveEnvironmentId } from './useActiveEnvironmentId';
import { useActiveWorkspaceId } from './useActiveWorkspaceId'; import { useActiveWorkspaceId } from './useActiveWorkspaceId';
import { useAppRoutes } from './useAppRoutes'; import { useAppRoutes } from './useAppRoutes';
@@ -22,7 +22,7 @@ export function useDuplicateGrpcRequest({
return useMutation<GrpcRequest, string>({ return useMutation<GrpcRequest, string>({
mutationFn: async () => { mutationFn: async () => {
if (id === null) throw new Error("Can't duplicate a null grpc request"); if (id === null) throw new Error("Can't duplicate a null grpc request");
return invoke('cmd_duplicate_grpc_request', { id }); return invokeCmd('cmd_duplicate_grpc_request', { id });
}, },
onSettled: () => trackEvent('grpc_request', 'duplicate'), onSettled: () => trackEvent('grpc_request', 'duplicate'),
onSuccess: async (request) => { onSuccess: async (request) => {

View File

@@ -1,7 +1,7 @@
import { useMutation } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import type { HttpRequest } from '../lib/models'; import type { HttpRequest } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useActiveEnvironmentId } from './useActiveEnvironmentId'; import { useActiveEnvironmentId } from './useActiveEnvironmentId';
import { useActiveWorkspaceId } from './useActiveWorkspaceId'; import { useActiveWorkspaceId } from './useActiveWorkspaceId';
import { useAppRoutes } from './useAppRoutes'; import { useAppRoutes } from './useAppRoutes';
@@ -19,7 +19,7 @@ export function useDuplicateHttpRequest({
return useMutation<HttpRequest, string>({ return useMutation<HttpRequest, string>({
mutationFn: async () => { mutationFn: async () => {
if (id === null) throw new Error("Can't duplicate a null request"); if (id === null) throw new Error("Can't duplicate a null request");
return invoke('cmd_duplicate_http_request', { id }); return invokeCmd('cmd_duplicate_http_request', { id });
}, },
onSettled: () => trackEvent('http_request', 'duplicate'), onSettled: () => trackEvent('http_request', 'duplicate'),
onSuccess: async (request) => { onSuccess: async (request) => {

View File

@@ -1,6 +1,6 @@
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { Environment } from '../lib/models'; import type { Environment } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useActiveWorkspaceId } from './useActiveWorkspaceId'; import { useActiveWorkspaceId } from './useActiveWorkspaceId';
export function environmentsQueryKey({ workspaceId }: { workspaceId: string }) { export function environmentsQueryKey({ workspaceId }: { workspaceId: string }) {
@@ -15,7 +15,7 @@ export function useEnvironments() {
queryKey: environmentsQueryKey({ workspaceId: workspaceId ?? 'n/a' }), queryKey: environmentsQueryKey({ workspaceId: workspaceId ?? 'n/a' }),
queryFn: async () => { queryFn: async () => {
if (workspaceId == null) return []; if (workspaceId == null) return [];
return (await invoke('cmd_list_environments', { workspaceId })) as Environment[]; return (await invokeCmd('cmd_list_environments', { workspaceId })) as Environment[];
}, },
}).data ?? [] }).data ?? []
); );

View File

@@ -1,5 +1,5 @@
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core'; import { invokeCmd } from '../lib/tauri';
export function useFilterResponse({ export function useFilterResponse({
responseId, responseId,
@@ -16,7 +16,7 @@ export function useFilterResponse({
return null; return null;
} }
return (await invoke('cmd_filter_response', { responseId, filter })) as string | null; return (await invokeCmd('cmd_filter_response', { responseId, filter })) as string | null;
}, },
}).data ?? '' }).data ?? ''
); );

View File

@@ -1,6 +1,6 @@
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { Folder } from '../lib/models'; import type { Folder } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useActiveWorkspaceId } from './useActiveWorkspaceId'; import { useActiveWorkspaceId } from './useActiveWorkspaceId';
export function foldersQueryKey({ workspaceId }: { workspaceId: string }) { export function foldersQueryKey({ workspaceId }: { workspaceId: string }) {
@@ -15,7 +15,7 @@ export function useFolders() {
queryKey: foldersQueryKey({ workspaceId: workspaceId ?? 'n/a' }), queryKey: foldersQueryKey({ workspaceId: workspaceId ?? 'n/a' }),
queryFn: async () => { queryFn: async () => {
if (workspaceId == null) return []; if (workspaceId == null) return [];
return (await invoke('cmd_list_folders', { workspaceId })) as Folder[]; return (await invokeCmd('cmd_list_folders', { workspaceId })) as Folder[];
}, },
}).data ?? [] }).data ?? []
); );

View File

@@ -1,9 +1,9 @@
import { useMutation, useQuery } from '@tanstack/react-query'; import { useMutation, useQuery } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { emit } from '@tauri-apps/api/event'; import { emit } from '@tauri-apps/api/event';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import { minPromiseMillis } from '../lib/minPromiseMillis'; import { minPromiseMillis } from '../lib/minPromiseMillis';
import type { GrpcConnection, GrpcRequest } from '../lib/models'; import type { GrpcConnection, GrpcRequest } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useActiveEnvironmentId } from './useActiveEnvironmentId'; import { useActiveEnvironmentId } from './useActiveEnvironmentId';
import { useDebouncedValue } from './useDebouncedValue'; import { useDebouncedValue } from './useDebouncedValue';
@@ -21,7 +21,8 @@ export function useGrpc(
const environmentId = useActiveEnvironmentId(); const environmentId = useActiveEnvironmentId();
const go = useMutation<void, string>({ const go = useMutation<void, string>({
mutationFn: async () => await invoke('cmd_grpc_go', { requestId, environmentId, protoFiles }), mutationFn: async () =>
await invokeCmd('cmd_grpc_go', { requestId, environmentId, protoFiles }),
onSettled: () => trackEvent('grpc_request', 'send'), onSettled: () => trackEvent('grpc_request', 'send'),
}); });
@@ -48,12 +49,11 @@ export function useGrpc(
enabled: req != null, enabled: req != null,
queryKey: ['grpc_reflect', req?.id ?? 'n/a', debouncedUrl, protoFiles], queryKey: ['grpc_reflect', req?.id ?? 'n/a', debouncedUrl, protoFiles],
refetchOnWindowFocus: false, refetchOnWindowFocus: false,
queryFn: async () => { queryFn: async () =>
return (await minPromiseMillis( (await minPromiseMillis(
invoke('cmd_grpc_reflect', { requestId, protoFiles }), invokeCmd('cmd_grpc_reflect', { requestId, protoFiles }),
300, 300,
)) as ReflectResponseService[]; )) as ReflectResponseService[],
},
}); });
return { return {

View File

@@ -1,6 +1,6 @@
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { GrpcConnection } from '../lib/models'; import type { GrpcConnection } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
export function grpcConnectionsQueryKey({ requestId }: { requestId: string }) { export function grpcConnectionsQueryKey({ requestId }: { requestId: string }) {
return ['grpc_connections', { requestId }]; return ['grpc_connections', { requestId }];
@@ -13,7 +13,7 @@ export function useGrpcConnections(requestId: string | null) {
initialData: [], initialData: [],
queryKey: grpcConnectionsQueryKey({ requestId: requestId ?? 'n/a' }), queryKey: grpcConnectionsQueryKey({ requestId: requestId ?? 'n/a' }),
queryFn: async () => { queryFn: async () => {
return (await invoke('cmd_list_grpc_connections', { return (await invokeCmd('cmd_list_grpc_connections', {
requestId, requestId,
limit: 200, limit: 200,
})) as GrpcConnection[]; })) as GrpcConnection[];

View File

@@ -1,6 +1,6 @@
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { GrpcEvent } from '../lib/models'; import type { GrpcEvent } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
export function grpcEventsQueryKey({ connectionId }: { connectionId: string }) { export function grpcEventsQueryKey({ connectionId }: { connectionId: string }) {
return ['grpc_events', { connectionId }]; return ['grpc_events', { connectionId }];
@@ -13,7 +13,7 @@ export function useGrpcEvents(connectionId: string | null) {
initialData: [], initialData: [],
queryKey: grpcEventsQueryKey({ connectionId: connectionId ?? 'n/a' }), queryKey: grpcEventsQueryKey({ connectionId: connectionId ?? 'n/a' }),
queryFn: async () => { queryFn: async () => {
return (await invoke('cmd_list_grpc_events', { return (await invokeCmd('cmd_list_grpc_events', {
connectionId, connectionId,
limit: 200, limit: 200,
})) as GrpcEvent[]; })) as GrpcEvent[];

View File

@@ -1,6 +1,6 @@
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { GrpcRequest } from '../lib/models'; import type { GrpcRequest } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useActiveWorkspaceId } from './useActiveWorkspaceId'; import { useActiveWorkspaceId } from './useActiveWorkspaceId';
export function grpcRequestsQueryKey({ workspaceId }: { workspaceId: string }) { export function grpcRequestsQueryKey({ workspaceId }: { workspaceId: string }) {
@@ -15,7 +15,7 @@ export function useGrpcRequests() {
queryKey: grpcRequestsQueryKey({ workspaceId: workspaceId ?? 'n/a' }), queryKey: grpcRequestsQueryKey({ workspaceId: workspaceId ?? 'n/a' }),
queryFn: async () => { queryFn: async () => {
if (workspaceId == null) return []; if (workspaceId == null) return [];
return (await invoke('cmd_list_grpc_requests', { workspaceId })) as GrpcRequest[]; return (await invokeCmd('cmd_list_grpc_requests', { workspaceId })) as GrpcRequest[];
}, },
}).data ?? [] }).data ?? []
); );

View File

@@ -1,6 +1,6 @@
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { HttpRequest } from '../lib/models'; import type { HttpRequest } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useActiveWorkspaceId } from './useActiveWorkspaceId'; import { useActiveWorkspaceId } from './useActiveWorkspaceId';
export function httpRequestsQueryKey({ workspaceId }: { workspaceId: string }) { export function httpRequestsQueryKey({ workspaceId }: { workspaceId: string }) {
@@ -15,7 +15,7 @@ export function useHttpRequests() {
queryKey: httpRequestsQueryKey({ workspaceId: workspaceId ?? 'n/a' }), queryKey: httpRequestsQueryKey({ workspaceId: workspaceId ?? 'n/a' }),
queryFn: async () => { queryFn: async () => {
if (workspaceId == null) return []; if (workspaceId == null) return [];
return (await invoke('cmd_list_http_requests', { workspaceId })) as HttpRequest[]; return (await invokeCmd('cmd_list_http_requests', { workspaceId })) as HttpRequest[];
}, },
}).data ?? [] }).data ?? []
); );

View File

@@ -1,6 +1,6 @@
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { HttpResponse } from '../lib/models'; import type { HttpResponse } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
export function httpResponsesQueryKey({ requestId }: { requestId: string }) { export function httpResponsesQueryKey({ requestId }: { requestId: string }) {
return ['http_responses', { requestId }]; return ['http_responses', { requestId }];
@@ -13,7 +13,7 @@ export function useHttpResponses(requestId: string | null) {
initialData: [], initialData: [],
queryKey: httpResponsesQueryKey({ requestId: requestId ?? 'n/a' }), queryKey: httpResponsesQueryKey({ requestId: requestId ?? 'n/a' }),
queryFn: async () => { queryFn: async () => {
return (await invoke('cmd_list_http_responses', { return (await invokeCmd('cmd_list_http_responses', {
requestId, requestId,
limit: 200, limit: 200,
})) as HttpResponse[]; })) as HttpResponse[];

View File

@@ -1,5 +1,5 @@
import { invoke } from '@tauri-apps/api/core';
import { useMutation } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query';
import { invokeCmd } from '../lib/tauri';
import { useActiveWorkspaceId } from './useActiveWorkspaceId'; import { useActiveWorkspaceId } from './useActiveWorkspaceId';
import { useRequestUpdateKey } from './useRequestUpdateKey'; import { useRequestUpdateKey } from './useRequestUpdateKey';
import { useUpdateAnyHttpRequest } from './useUpdateAnyHttpRequest'; import { useUpdateAnyHttpRequest } from './useUpdateAnyHttpRequest';
@@ -17,7 +17,7 @@ export function useImportCurl({ clearClipboard }: { clearClipboard?: boolean } =
return useMutation({ return useMutation({
mutationFn: async ({ requestId, command }: { requestId: string | null; command: string }) => { mutationFn: async ({ requestId, command }: { requestId: string | null; command: string }) => {
const request: Record<string, unknown> = await invoke('cmd_curl_to_request', { const request: Record<string, unknown> = await invokeCmd('cmd_curl_to_request', {
command, command,
workspaceId, workspaceId,
}); });

View File

@@ -1,5 +1,4 @@
import { useMutation } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { open } from '@tauri-apps/plugin-dialog'; import { open } from '@tauri-apps/plugin-dialog';
import { Button } from '../components/core/Button'; import { Button } from '../components/core/Button';
import { FormattedError } from '../components/core/FormattedError'; import { FormattedError } from '../components/core/FormattedError';
@@ -7,6 +6,7 @@ import { VStack } from '../components/core/Stacks';
import { useDialog } from '../components/DialogContext'; import { useDialog } from '../components/DialogContext';
import type { Environment, Folder, GrpcRequest, HttpRequest, Workspace } from '../lib/models'; import type { Environment, Folder, GrpcRequest, HttpRequest, Workspace } from '../lib/models';
import { count } from '../lib/pluralize'; import { count } from '../lib/pluralize';
import { invokeCmd } from '../lib/tauri';
import { useActiveWorkspaceId } from './useActiveWorkspaceId'; import { useActiveWorkspaceId } from './useActiveWorkspaceId';
import { useAlert } from './useAlert'; import { useAlert } from './useAlert';
import { useAppRoutes } from './useAppRoutes'; import { useAppRoutes } from './useAppRoutes';
@@ -33,7 +33,7 @@ export function useImportData() {
folders: Folder[]; folders: Folder[];
httpRequests: HttpRequest[]; httpRequests: HttpRequest[];
grpcRequests: GrpcRequest[]; grpcRequests: GrpcRequest[];
} = await invoke('cmd_import_data', { } = await invokeCmd('cmd_import_data', {
filePath: selected.path, filePath: selected.path,
workspaceId: activeWorkspaceId, workspaceId: activeWorkspaceId,
}); });

View File

@@ -1,14 +1,14 @@
import { invoke } from '@tauri-apps/api/core';
import { open } from '@tauri-apps/plugin-shell'; import { open } from '@tauri-apps/plugin-shell';
import { Button } from '../components/core/Button'; import { Button } from '../components/core/Button';
import { useToast } from '../components/ToastContext'; import { useToast } from '../components/ToastContext';
import { invokeCmd } from '../lib/tauri';
import { useListenToTauriEvent } from './useListenToTauriEvent'; import { useListenToTauriEvent } from './useListenToTauriEvent';
export function useNotificationToast() { export function useNotificationToast() {
const toast = useToast(); const toast = useToast();
const markRead = (id: string) => { const markRead = (id: string) => {
invoke('cmd_dismiss_notification', { notificationId: id }).catch(console.error); invokeCmd('cmd_dismiss_notification', { notificationId: id }).catch(console.error);
}; };
useListenToTauriEvent<{ useListenToTauriEvent<{

View File

@@ -1,5 +1,5 @@
import { useMutation } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core'; import { invokeCmd } from '../lib/tauri';
import { useAppRoutes } from './useAppRoutes'; import { useAppRoutes } from './useAppRoutes';
import { getRecentEnvironments } from './useRecentEnvironments'; import { getRecentEnvironments } from './useRecentEnvironments';
import { getRecentRequests } from './useRecentRequests'; import { getRecentRequests } from './useRecentRequests';
@@ -26,7 +26,7 @@ export function useOpenWorkspace() {
requestId, requestId,
}) })
: routes.paths.workspace({ workspaceId, environmentId }); : routes.paths.workspace({ workspaceId, environmentId });
await invoke('cmd_new_window', { url: path }); await invokeCmd('cmd_new_window', { url: path });
} else { } else {
const environmentId = (await getRecentEnvironments(workspaceId))[0]; const environmentId = (await getRecentEnvironments(workspaceId))[0];
const requestId = (await getRecentRequests(workspaceId))[0]; const requestId = (await getRecentRequests(workspaceId))[0];

View File

@@ -1,5 +1,4 @@
import { useMutation } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { save } from '@tauri-apps/plugin-dialog'; import { save } from '@tauri-apps/plugin-dialog';
import mime from 'mime'; import mime from 'mime';
import slugify from 'slugify'; import slugify from 'slugify';
@@ -8,6 +7,7 @@ import { useToast } from '../components/ToastContext';
import type { HttpResponse } from '../lib/models'; import type { HttpResponse } from '../lib/models';
import { getContentTypeHeader } from '../lib/models'; import { getContentTypeHeader } from '../lib/models';
import { getHttpRequest } from '../lib/store'; import { getHttpRequest } from '../lib/store';
import { invokeCmd } from '../lib/tauri';
export function useSaveResponse(response: HttpResponse) { export function useSaveResponse(response: HttpResponse) {
const toast = useToast(); const toast = useToast();
@@ -24,7 +24,7 @@ export function useSaveResponse(response: HttpResponse) {
defaultPath: ext ? `${slug}.${ext}` : slug, defaultPath: ext ? `${slug}.${ext}` : slug,
title: 'Save Response', title: 'Save Response',
}); });
await invoke('cmd_save_response', { responseId: response.id, filepath }); await invokeCmd('cmd_save_response', { responseId: response.id, filepath });
toast.show({ toast.show({
message: ( message: (
<> <>

View File

@@ -1,10 +1,10 @@
import { useMutation } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import { save } from '@tauri-apps/plugin-dialog'; import { save } from '@tauri-apps/plugin-dialog';
import slugify from 'slugify'; import slugify from 'slugify';
import { trackEvent } from '../lib/analytics'; import { trackEvent } from '../lib/analytics';
import type { HttpResponse } from '../lib/models'; import type { HttpResponse } from '../lib/models';
import { getHttpRequest } from '../lib/store'; import { getHttpRequest } from '../lib/store';
import { invokeCmd } from '../lib/tauri';
import { useActiveCookieJar } from './useActiveCookieJar'; import { useActiveCookieJar } from './useActiveCookieJar';
import { useActiveEnvironment } from './useActiveEnvironment'; import { useActiveEnvironment } from './useActiveEnvironment';
import { useAlert } from './useAlert'; import { useAlert } from './useAlert';
@@ -31,7 +31,7 @@ export function useSendAnyRequest(options: { download?: boolean } = {}) {
} }
} }
return invoke('cmd_send_http_request', { return invokeCmd('cmd_send_http_request', {
requestId: id, requestId: id,
environmentId: environment?.id, environmentId: environment?.id,
downloadDir: downloadDir, downloadDir: downloadDir,

View File

@@ -1,6 +1,6 @@
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { Settings } from '../lib/models'; import type { Settings } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
export function settingsQueryKey() { export function settingsQueryKey() {
return ['settings']; return ['settings'];
@@ -11,7 +11,7 @@ export function useSettings() {
useQuery({ useQuery({
queryKey: settingsQueryKey(), queryKey: settingsQueryKey(),
queryFn: async () => { queryFn: async () => {
const settings = (await invoke('cmd_get_settings')) as Settings; const settings = (await invokeCmd('cmd_get_settings')) as Settings;
return [settings]; return [settings];
}, },
}).data?.[0] ?? undefined }).data?.[0] ?? undefined

View File

@@ -1,7 +1,7 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { Folder } from '../lib/models'; import type { Folder } from '../lib/models';
import { getFolder } from '../lib/store'; import { getFolder } from '../lib/store';
import { invokeCmd } from '../lib/tauri';
import { foldersQueryKey } from './useFolders'; import { foldersQueryKey } from './useFolders';
export function useUpdateAnyFolder() { export function useUpdateAnyFolder() {
@@ -14,7 +14,7 @@ export function useUpdateAnyFolder() {
throw new Error("Can't update a null folder"); throw new Error("Can't update a null folder");
} }
await invoke('cmd_update_folder', { folder: update(folder) }); await invokeCmd('cmd_update_folder', { folder: update(folder) });
}, },
onMutate: async ({ id, update }) => { onMutate: async ({ id, update }) => {
const folder = await getFolder(id); const folder = await getFolder(id);

View File

@@ -1,7 +1,7 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { GrpcRequest } from '../lib/models'; import type { GrpcRequest } from '../lib/models';
import { getGrpcRequest } from '../lib/store'; import { getGrpcRequest } from '../lib/store';
import { invokeCmd } from '../lib/tauri';
import { grpcRequestsQueryKey } from './useGrpcRequests'; import { grpcRequestsQueryKey } from './useGrpcRequests';
export function useUpdateAnyGrpcRequest() { export function useUpdateAnyGrpcRequest() {
@@ -20,7 +20,7 @@ export function useUpdateAnyGrpcRequest() {
const patchedRequest = const patchedRequest =
typeof update === 'function' ? update(request) : { ...request, ...update }; typeof update === 'function' ? update(request) : { ...request, ...update };
await invoke('cmd_update_grpc_request', { request: patchedRequest }); await invokeCmd('cmd_update_grpc_request', { request: patchedRequest });
}, },
onMutate: async ({ id, update }) => { onMutate: async ({ id, update }) => {
const request = await getGrpcRequest(id); const request = await getGrpcRequest(id);

View File

@@ -1,7 +1,7 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { HttpRequest } from '../lib/models'; import type { HttpRequest } from '../lib/models';
import { getHttpRequest } from '../lib/store'; import { getHttpRequest } from '../lib/store';
import { invokeCmd } from '../lib/tauri';
import { httpRequestsQueryKey } from './useHttpRequests'; import { httpRequestsQueryKey } from './useHttpRequests';
export function useUpdateAnyHttpRequest() { export function useUpdateAnyHttpRequest() {
@@ -20,7 +20,7 @@ export function useUpdateAnyHttpRequest() {
const patchedRequest = const patchedRequest =
typeof update === 'function' ? update(request) : { ...request, ...update }; typeof update === 'function' ? update(request) : { ...request, ...update };
await invoke('cmd_update_http_request', { request: patchedRequest }); await invokeCmd('cmd_update_http_request', { request: patchedRequest });
}, },
onMutate: async ({ id, update }) => { onMutate: async ({ id, update }) => {
const request = await getHttpRequest(id); const request = await getHttpRequest(id);

View File

@@ -1,7 +1,7 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { CookieJar } from '../lib/models'; import type { CookieJar } from '../lib/models';
import { getCookieJar } from '../lib/store'; import { getCookieJar } from '../lib/store';
import { invokeCmd } from '../lib/tauri';
import { cookieJarsQueryKey } from './useCookieJars'; import { cookieJarsQueryKey } from './useCookieJars';
export function useUpdateCookieJar(id: string | null) { export function useUpdateCookieJar(id: string | null) {
@@ -15,7 +15,7 @@ export function useUpdateCookieJar(id: string | null) {
const newCookieJar = typeof v === 'function' ? v(cookieJar) : { ...cookieJar, ...v }; const newCookieJar = typeof v === 'function' ? v(cookieJar) : { ...cookieJar, ...v };
console.log('NEW COOKIE JAR', newCookieJar.cookies.length); console.log('NEW COOKIE JAR', newCookieJar.cookies.length);
await invoke('cmd_update_cookie_jar', { cookieJar: newCookieJar }); await invokeCmd('cmd_update_cookie_jar', { cookieJar: newCookieJar });
}, },
onMutate: async (v) => { onMutate: async (v) => {
const cookieJar = await getCookieJar(id); const cookieJar = await getCookieJar(id);

View File

@@ -1,7 +1,7 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { Environment } from '../lib/models'; import type { Environment } from '../lib/models';
import { getEnvironment } from '../lib/store'; import { getEnvironment } from '../lib/store';
import { invokeCmd } from '../lib/tauri';
import { environmentsQueryKey } from './useEnvironments'; import { environmentsQueryKey } from './useEnvironments';
export function useUpdateEnvironment(id: string | null) { export function useUpdateEnvironment(id: string | null) {
@@ -14,7 +14,7 @@ export function useUpdateEnvironment(id: string | null) {
} }
const newEnvironment = typeof v === 'function' ? v(environment) : { ...environment, ...v }; const newEnvironment = typeof v === 'function' ? v(environment) : { ...environment, ...v };
await invoke('cmd_update_environment', { environment: newEnvironment }); await invokeCmd('cmd_update_environment', { environment: newEnvironment });
}, },
onMutate: async (v) => { onMutate: async (v) => {
const environment = await getEnvironment(id); const environment = await getEnvironment(id);

View File

@@ -1,6 +1,6 @@
import { useMutation } from '@tanstack/react-query'; import { useMutation } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { Settings } from '../lib/models'; import type { Settings } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
import { useSettings } from './useSettings'; import { useSettings } from './useSettings';
export function useUpdateSettings() { export function useUpdateSettings() {
@@ -10,7 +10,7 @@ export function useUpdateSettings() {
mutationFn: async (patch) => { mutationFn: async (patch) => {
if (settings == null) return; if (settings == null) return;
const newSettings: Settings = { ...settings, ...patch }; const newSettings: Settings = { ...settings, ...patch };
await invoke('cmd_update_settings', { settings: newSettings }); await invokeCmd('cmd_update_settings', { settings: newSettings });
}, },
}); });
} }

View File

@@ -1,7 +1,7 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { Workspace } from '../lib/models'; import type { Workspace } from '../lib/models';
import { getWorkspace } from '../lib/store'; import { getWorkspace } from '../lib/store';
import { invokeCmd } from '../lib/tauri';
import { workspacesQueryKey } from './useWorkspaces'; import { workspacesQueryKey } from './useWorkspaces';
export function useUpdateWorkspace(id: string | null) { export function useUpdateWorkspace(id: string | null) {
@@ -14,7 +14,7 @@ export function useUpdateWorkspace(id: string | null) {
} }
const newWorkspace = typeof v === 'function' ? v(workspace) : { ...workspace, ...v }; const newWorkspace = typeof v === 'function' ? v(workspace) : { ...workspace, ...v };
await invoke('cmd_update_workspace', { workspace: newWorkspace }); await invokeCmd('cmd_update_workspace', { workspace: newWorkspace });
}, },
onMutate: async (v) => { onMutate: async (v) => {
const workspace = await getWorkspace(id); const workspace = await getWorkspace(id);

View File

@@ -1,18 +0,0 @@
import { useQuery } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { EnvironmentVariable } from '../lib/models';
export function variablesQueryKey({ environmentId }: { environmentId: string }) {
return ['variables', { environmentId }];
}
export function useVariables({ environmentId }: { environmentId: string }) {
return (
useQuery({
queryKey: variablesQueryKey({ environmentId }),
queryFn: async () => {
return (await invoke('cmd_list_variables', { environmentId })) as EnvironmentVariable[];
},
}).data ?? []
);
}

View File

@@ -1,6 +1,6 @@
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { invoke } from '@tauri-apps/api/core';
import type { Workspace } from '../lib/models'; import type { Workspace } from '../lib/models';
import { invokeCmd } from '../lib/tauri';
// eslint-disable-next-line @typescript-eslint/no-unused-vars,@typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/no-unused-vars,@typescript-eslint/ban-types
export function workspacesQueryKey(_?: {}) { export function workspacesQueryKey(_?: {}) {
@@ -12,7 +12,7 @@ export function useWorkspaces() {
useQuery({ useQuery({
queryKey: workspacesQueryKey(), queryKey: workspacesQueryKey(),
queryFn: async () => { queryFn: async () => {
const workspaces = await invoke('cmd_list_workspaces'); const workspaces = await invokeCmd('cmd_list_workspaces');
return workspaces as Workspace[]; return workspaces as Workspace[];
}, },
}).data ?? [] }).data ?? []

View File

@@ -1,4 +1,4 @@
import { invoke } from '@tauri-apps/api/core'; import { invokeCmd } from './tauri';
export type TrackResource = export type TrackResource =
| 'appearance' | 'appearance'
@@ -37,7 +37,7 @@ export function trackEvent(
action: TrackAction, action: TrackAction,
attributes: Record<string, string | number> = {}, attributes: Record<string, string | number> = {},
) { ) {
invoke('cmd_track_event', { invokeCmd('cmd_track_event', {
resource: resource, resource: resource,
action, action,
attributes, attributes,

View File

@@ -1,5 +1,5 @@
import { invoke } from '@tauri-apps/api/core';
import type { KeyValue } from './models'; import type { KeyValue } from './models';
import { invokeCmd } from './tauri';
export async function setKeyValue<T>({ export async function setKeyValue<T>({
namespace = 'global', namespace = 'global',
@@ -10,7 +10,7 @@ export async function setKeyValue<T>({
key: string | string[]; key: string | string[];
value: T; value: T;
}): Promise<void> { }): Promise<void> {
await invoke('cmd_set_key_value', { await invokeCmd('cmd_set_key_value', {
namespace, namespace,
key: buildKeyValueKey(key), key: buildKeyValueKey(key),
value: JSON.stringify(value), value: JSON.stringify(value),
@@ -26,7 +26,7 @@ export async function getKeyValue<T>({
key: string | string[]; key: string | string[];
fallback: T; fallback: T;
}) { }) {
const kv = (await invoke('cmd_get_key_value', { const kv = (await invokeCmd('cmd_get_key_value', {
namespace, namespace,
key: buildKeyValueKey(key), key: buildKeyValueKey(key),
})) as KeyValue | null; })) as KeyValue | null;

View File

@@ -1,5 +1,5 @@
import { invoke } from '@tauri-apps/api/core';
import type { HttpRequest, HttpResponse } from './models'; import type { HttpRequest, HttpResponse } from './models';
import { invokeCmd } from './tauri';
export async function sendEphemeralRequest( export async function sendEphemeralRequest(
request: HttpRequest, request: HttpRequest,
@@ -7,5 +7,5 @@ export async function sendEphemeralRequest(
): Promise<HttpResponse> { ): Promise<HttpResponse> {
// Remove some things that we don't want to associate // Remove some things that we don't want to associate
const newRequest = { ...request }; const newRequest = { ...request };
return invoke('cmd_send_ephemeral_request', { request: newRequest, environmentId }); return invokeCmd('cmd_send_ephemeral_request', { request: newRequest, environmentId });
} }

View File

@@ -1,4 +1,3 @@
import { invoke } from '@tauri-apps/api/core';
import type { import type {
CookieJar, CookieJar,
Environment, Environment,
@@ -8,14 +7,15 @@ import type {
Settings, Settings,
Workspace, Workspace,
} from './models'; } from './models';
import { invokeCmd } from './tauri';
export async function getSettings(): Promise<Settings> { export async function getSettings(): Promise<Settings> {
return invoke('cmd_get_settings', {}); return invokeCmd('cmd_get_settings', {});
} }
export async function getGrpcRequest(id: string | null): Promise<GrpcRequest | null> { export async function getGrpcRequest(id: string | null): Promise<GrpcRequest | null> {
if (id === null) return null; if (id === null) return null;
const request: GrpcRequest = (await invoke('cmd_get_grpc_request', { id })) ?? null; const request: GrpcRequest = (await invokeCmd('cmd_get_grpc_request', { id })) ?? null;
if (request == null) { if (request == null) {
return null; return null;
} }
@@ -24,7 +24,7 @@ export async function getGrpcRequest(id: string | null): Promise<GrpcRequest | n
export async function getHttpRequest(id: string | null): Promise<HttpRequest | null> { export async function getHttpRequest(id: string | null): Promise<HttpRequest | null> {
if (id === null) return null; if (id === null) return null;
const request: HttpRequest = (await invoke('cmd_get_http_request', { id })) ?? null; const request: HttpRequest = (await invokeCmd('cmd_get_http_request', { id })) ?? null;
if (request == null) { if (request == null) {
return null; return null;
} }
@@ -33,7 +33,7 @@ export async function getHttpRequest(id: string | null): Promise<HttpRequest | n
export async function getEnvironment(id: string | null): Promise<Environment | null> { export async function getEnvironment(id: string | null): Promise<Environment | null> {
if (id === null) return null; if (id === null) return null;
const environment: Environment = (await invoke('cmd_get_environment', { id })) ?? null; const environment: Environment = (await invokeCmd('cmd_get_environment', { id })) ?? null;
if (environment == null) { if (environment == null) {
return null; return null;
} }
@@ -42,7 +42,7 @@ export async function getEnvironment(id: string | null): Promise<Environment | n
export async function getFolder(id: string | null): Promise<Folder | null> { export async function getFolder(id: string | null): Promise<Folder | null> {
if (id === null) return null; if (id === null) return null;
const folder: Folder = (await invoke('cmd_get_folder', { id })) ?? null; const folder: Folder = (await invokeCmd('cmd_get_folder', { id })) ?? null;
if (folder == null) { if (folder == null) {
return null; return null;
} }
@@ -51,7 +51,7 @@ export async function getFolder(id: string | null): Promise<Folder | null> {
export async function getWorkspace(id: string | null): Promise<Workspace | null> { export async function getWorkspace(id: string | null): Promise<Workspace | null> {
if (id === null) return null; if (id === null) return null;
const workspace: Workspace = (await invoke('cmd_get_workspace', { id })) ?? null; const workspace: Workspace = (await invokeCmd('cmd_get_workspace', { id })) ?? null;
if (workspace == null) { if (workspace == null) {
return null; return null;
} }
@@ -60,7 +60,7 @@ export async function getWorkspace(id: string | null): Promise<Workspace | null>
export async function getCookieJar(id: string | null): Promise<CookieJar | null> { export async function getCookieJar(id: string | null): Promise<CookieJar | null> {
if (id === null) return null; if (id === null) return null;
const cookieJar: CookieJar = (await invoke('cmd_get_cookie_jar', { id })) ?? null; const cookieJar: CookieJar = (await invokeCmd('cmd_get_cookie_jar', { id })) ?? null;
if (cookieJar == null) { if (cookieJar == null) {
return null; return null;
} }

70
src-web/lib/tauri.ts Normal file
View File

@@ -0,0 +1,70 @@
import type { InvokeArgs } from '@tauri-apps/api/core';
import { invoke } from '@tauri-apps/api/core';
type TauriCmd =
| 'cmd_check_for_updates'
| 'cmd_create_cookie_jar'
| 'cmd_create_environment'
| 'cmd_create_folder'
| 'cmd_create_grpc_request'
| 'cmd_create_http_request'
| 'cmd_create_workspace'
| 'cmd_curl_to_request'
| 'cmd_delete_all_grpc_connections'
| 'cmd_delete_all_http_responses'
| 'cmd_delete_cookie_jar'
| 'cmd_delete_environment'
| 'cmd_delete_folder'
| 'cmd_delete_grpc_connection'
| 'cmd_delete_grpc_request'
| 'cmd_delete_http_request'
| 'cmd_delete_http_response'
| 'cmd_delete_workspace'
| 'cmd_duplicate_grpc_request'
| 'cmd_duplicate_http_request'
| 'cmd_export_data'
| 'cmd_filter_response'
| 'cmd_get_cookie_jar'
| 'cmd_get_environment'
| 'cmd_get_folder'
| 'cmd_get_grpc_request'
| 'cmd_get_http_request'
| 'cmd_get_key_value'
| 'cmd_get_settings'
| 'cmd_get_workspace'
| 'cmd_grpc_go'
| 'cmd_grpc_reflect'
| 'cmd_import_data'
| 'cmd_list_cookie_jars'
| 'cmd_list_environments'
| 'cmd_list_folders'
| 'cmd_list_grpc_connections'
| 'cmd_list_grpc_events'
| 'cmd_list_grpc_requests'
| 'cmd_list_http_requests'
| 'cmd_list_http_responses'
| 'cmd_list_workspaces'
| 'cmd_metadata'
| 'cmd_new_nested_window'
| 'cmd_new_window'
| 'cmd_request_to_curl'
| 'cmd_dismiss_notification'
| 'cmd_save_response'
| 'cmd_send_ephemeral_request'
| 'cmd_send_http_request'
| 'cmd_set_key_value'
| 'cmd_set_update_mode'
| 'cmd_track_event'
| 'cmd_update_cookie_jar'
| 'cmd_update_environment'
| 'cmd_update_folder'
| 'cmd_update_grpc_request'
| 'cmd_update_http_request'
| 'cmd_update_settings'
| 'cmd_update_workspace'
| 'cmd_write_file_dev';
export async function invokeCmd<T>(cmd: TauriCmd, args?: InvokeArgs): Promise<T> {
// console.log('RUN COMMAND', cmd, args);
return invoke(cmd, args);
}

View File

@@ -2,10 +2,10 @@ import { getCurrent } from '@tauri-apps/api/webviewWindow';
import { type } from '@tauri-apps/plugin-os'; import { type } from '@tauri-apps/plugin-os';
import { StrictMode } from 'react'; import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client'; import { createRoot } from 'react-dom/client';
import { pdfjs } from 'react-pdf';
import { attachConsole } from 'tauri-plugin-log-api'; import { attachConsole } from 'tauri-plugin-log-api';
import { App } from './components/App'; import { App } from './components/App';
import './main.css'; import './main.css';
import { pdfjs } from 'react-pdf';
pdfjs.GlobalWorkerOptions.workerSrc = new URL( pdfjs.GlobalWorkerOptions.workerSrc = new URL(
'pdfjs-dist/build/pdf.worker.min.mjs', 'pdfjs-dist/build/pdf.worker.min.mjs',