diff --git a/src-web/components/RequestPane.tsx b/src-web/components/RequestPane.tsx index eb5b9c52..cff1b453 100644 --- a/src-web/components/RequestPane.tsx +++ b/src-web/components/RequestPane.tsx @@ -135,7 +135,6 @@ export const RequestPane = memo(function RequestPane({ style, fullHeight, classN 'send_request', async ({ windowLabel }) => { if (windowLabel !== appWindow.label) return; - console.log('SEND REQUEST', activeRequest?.url); await invoke('send_request', { requestId: activeRequestId }); }, [activeRequestId], diff --git a/src-web/components/TauriListeners.tsx b/src-web/components/TauriListeners.tsx index 9175c941..91e4e577 100644 --- a/src-web/components/TauriListeners.tsx +++ b/src-web/components/TauriListeners.tsx @@ -1,6 +1,124 @@ -import { useTauriListeners } from '../hooks/useTauriListeners'; +import { useQueryClient } from '@tanstack/react-query'; +import { appWindow } from '@tauri-apps/api/window'; +import { keyValueQueryKey } from '../hooks/useKeyValue'; +import { requestsQueryKey } from '../hooks/useRequests'; +import { useRequestUpdateKey } from '../hooks/useRequestUpdateKey'; +import { responsesQueryKey } from '../hooks/useResponses'; +import { useTauriEvent } from '../hooks/useTauriEvent'; +import { workspacesQueryKey } from '../hooks/useWorkspaces'; +import { DEFAULT_FONT_SIZE } from '../lib/constants'; +import { debounce } from '../lib/debounce'; +import { NAMESPACE_NO_SYNC } from '../lib/keyValueStore'; +import type { HttpRequest, HttpResponse, Model, Workspace } from '../lib/models'; +import { modelsEq } from '../lib/models'; export function TauriListeners() { - useTauriListeners(); + const queryClient = useQueryClient(); + const { wasUpdatedExternally } = useRequestUpdateKey(null); + + useTauriEvent('created_model', ({ payload, windowLabel }) => { + if (shouldIgnoreEvent(payload, windowLabel)) return; + + const queryKey = + payload.model === 'http_request' + ? requestsQueryKey(payload) + : payload.model === 'http_response' + ? responsesQueryKey(payload) + : payload.model === 'workspace' + ? workspacesQueryKey(payload) + : payload.model === 'key_value' + ? keyValueQueryKey(payload) + : null; + + if (queryKey === null) { + if (payload.model) { + console.log('Unrecognized created model:', payload); + } + return; + } + + if (!shouldIgnoreModel(payload)) { + queryClient.setQueryData(queryKey, (values) => [...(values ?? []), payload]); + } + }); + + useTauriEvent( + 'updated_model', + debounce(({ payload, windowLabel }) => { + if (shouldIgnoreEvent(payload, windowLabel)) return; + + const queryKey = + payload.model === 'http_request' + ? requestsQueryKey(payload) + : payload.model === 'http_response' + ? responsesQueryKey(payload) + : payload.model === 'workspace' + ? workspacesQueryKey(payload) + : payload.model === 'key_value' + ? keyValueQueryKey(payload) + : null; + + if (queryKey === null) { + if (payload.model) { + console.log('Unrecognized updated model:', payload); + } + return; + } + + if (payload.model === 'http_request') { + wasUpdatedExternally(payload.id); + } + + if (!shouldIgnoreModel(payload)) { + queryClient.setQueryData(queryKey, (values) => + values?.map((v) => (modelsEq(v, payload) ? payload : v)), + ); + } + }, 500), + ); + + useTauriEvent('deleted_model', ({ payload, windowLabel }) => { + if (shouldIgnoreEvent(payload, windowLabel)) return; + + if (shouldIgnoreModel(payload)) return; + + if (payload.model === 'workspace') { + queryClient.setQueryData(workspacesQueryKey(), removeById(payload)); + } else if (payload.model === 'http_request') { + queryClient.setQueryData(requestsQueryKey(payload), removeById(payload)); + } else if (payload.model === 'http_response') { + queryClient.setQueryData(responsesQueryKey(payload), removeById(payload)); + } else if (payload.model === 'key_value') { + queryClient.setQueryData(keyValueQueryKey(payload), undefined); + } + }); + useTauriEvent('zoom', ({ payload: zoomDelta, windowLabel }) => { + if (windowLabel !== appWindow.label) return; + const fontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize); + + let newFontSize; + if (zoomDelta === 0) { + newFontSize = DEFAULT_FONT_SIZE; + } else if (zoomDelta > 0) { + newFontSize = Math.min(fontSize * 1.1, DEFAULT_FONT_SIZE * 5); + } else if (zoomDelta < 0) { + newFontSize = Math.max(fontSize * 0.9, DEFAULT_FONT_SIZE * 0.4); + } + + document.documentElement.style.fontSize = `${newFontSize}px`; + }); return <>; } + +function removeById(model: T) { + return (entries: T[] | undefined) => entries?.filter((e) => e.id !== model.id); +} + +const shouldIgnoreEvent = (payload: Model, windowLabel: string) => + windowLabel === appWindow.label && payload.model !== 'http_response'; + +const shouldIgnoreModel = (payload: Model) => { + if (payload.model === 'http_response') return false; + if (payload.model === 'key_value' && payload.namespace === NAMESPACE_NO_SYNC) return false; + return true; +}; diff --git a/src-web/hooks/useTauriListeners.ts b/src-web/hooks/useTauriListeners.ts deleted file mode 100644 index 6870ad32..00000000 --- a/src-web/hooks/useTauriListeners.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { useQueryClient } from '@tanstack/react-query'; -import { appWindow } from '@tauri-apps/api/window'; -import { DEFAULT_FONT_SIZE } from '../lib/constants'; -import { debounce } from '../lib/debounce'; -import { NAMESPACE_NO_SYNC } from '../lib/keyValueStore'; -import type { HttpRequest, HttpResponse, Model, Workspace } from '../lib/models'; -import { modelsEq } from '../lib/models'; -import { keyValueQueryKey } from './useKeyValue'; -import { requestsQueryKey } from './useRequests'; -import { useRequestUpdateKey } from './useRequestUpdateKey'; -import { responsesQueryKey } from './useResponses'; -import { useTauriEvent } from './useTauriEvent'; -import { workspacesQueryKey } from './useWorkspaces'; - -export function useTauriListeners() { - const queryClient = useQueryClient(); - const { wasUpdatedExternally } = useRequestUpdateKey(null); - - useTauriEvent('created_model', ({ payload, windowLabel }) => { - if (windowLabel === appWindow.label && payload.model !== 'http_response') return; - - const queryKey = - payload.model === 'http_request' - ? requestsQueryKey(payload) - : payload.model === 'http_response' - ? responsesQueryKey(payload) - : payload.model === 'workspace' - ? workspacesQueryKey(payload) - : payload.model === 'key_value' - ? keyValueQueryKey(payload) - : null; - - if (queryKey === null) { - if (payload.model) { - console.log('Unrecognized created model:', payload); - } - return; - } - - const skipSync = payload.model === 'key_value' && payload.namespace === NAMESPACE_NO_SYNC; - - if (!skipSync) { - queryClient.setQueryData(queryKey, (values) => [...(values ?? []), payload]); - } - }); - - useTauriEvent( - 'updated_model', - debounce(({ payload, windowLabel }) => { - if (windowLabel === appWindow.label && payload.model !== 'http_response') return; - - const queryKey = - payload.model === 'http_request' - ? requestsQueryKey(payload) - : payload.model === 'http_response' - ? responsesQueryKey(payload) - : payload.model === 'workspace' - ? workspacesQueryKey(payload) - : payload.model === 'key_value' - ? keyValueQueryKey(payload) - : null; - - if (queryKey === null) { - if (payload.model) { - console.log('Unrecognized updated model:', payload); - } - return; - } - - const skipSync = payload.model === 'key_value' && payload.namespace === NAMESPACE_NO_SYNC; - - if (payload.model === 'http_request') { - wasUpdatedExternally(payload.id); - } - - if (!skipSync) { - queryClient.setQueryData(queryKey, (values) => - values?.map((v) => (modelsEq(v, payload) ? payload : v)), - ); - } - }, 500), - ); - - useTauriEvent('deleted_model', ({ payload }) => { - function removeById(model: T) { - return (entries: T[] | undefined) => entries?.filter((e) => e.id !== model.id); - } - - if (payload.model === 'workspace') { - queryClient.setQueryData(workspacesQueryKey(), removeById(payload)); - } else if (payload.model === 'http_request') { - queryClient.setQueryData(requestsQueryKey(payload), removeById(payload)); - } else if (payload.model === 'http_response') { - queryClient.setQueryData(responsesQueryKey(payload), removeById(payload)); - } else if (payload.model === 'key_value') { - queryClient.setQueryData(keyValueQueryKey(payload), undefined); - } - }); - - useTauriEvent('zoom', ({ payload: zoomDelta, windowLabel }) => { - if (windowLabel !== appWindow.label) return; - const fontSize = parseFloat(window.getComputedStyle(document.documentElement).fontSize); - - let newFontSize; - if (zoomDelta === 0) { - newFontSize = DEFAULT_FONT_SIZE; - } else if (zoomDelta > 0) { - newFontSize = Math.min(fontSize * 1.1, DEFAULT_FONT_SIZE * 5); - } else if (zoomDelta < 0) { - newFontSize = Math.max(fontSize * 0.9, DEFAULT_FONT_SIZE * 0.4); - } - - document.documentElement.style.fontSize = `${newFontSize}px`; - }); -}