diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns
index bc6522e1..24843975 100644
Binary files a/src-tauri/icons/icon.icns and b/src-tauri/icons/icon.icns differ
diff --git a/src-web/App.tsx b/src-web/App.tsx
new file mode 100644
index 00000000..cd24ca62
--- /dev/null
+++ b/src-web/App.tsx
@@ -0,0 +1,89 @@
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+import { listen } from '@tauri-apps/api/event';
+import { MotionConfig } from 'framer-motion';
+import { HelmetProvider } from 'react-helmet-async';
+import { AppRouter } from './components/AppRouter';
+import { requestsQueryKey } from './hooks/useRequest';
+import { responsesQueryKey } from './hooks/useResponses';
+import { DEFAULT_FONT_SIZE } from './lib/constants';
+import type { HttpRequest, HttpResponse } from './lib/models';
+import { convertDates } from './lib/models';
+
+const queryClient = new QueryClient();
+
+await listen('updated_request', ({ payload: request }: { payload: HttpRequest }) => {
+ queryClient.setQueryData(
+ requestsQueryKey(request.workspaceId),
+ (requests: HttpRequest[] = []) => {
+ const newRequests = [];
+ let found = false;
+ for (const r of requests) {
+ if (r.id === request.id) {
+ found = true;
+ newRequests.push(convertDates(request));
+ } else {
+ newRequests.push(r);
+ }
+ }
+ if (!found) {
+ newRequests.push(convertDates(request));
+ }
+ return newRequests;
+ },
+ );
+});
+
+await listen('deleted_request', ({ payload: request }: { payload: HttpRequest }) => {
+ queryClient.setQueryData(requestsQueryKey(request.workspaceId), (requests: HttpRequest[] = []) =>
+ requests.filter((r) => r.id !== request.id),
+ );
+});
+
+await listen('updated_response', ({ payload: response }: { payload: HttpResponse }) => {
+ queryClient.setQueryData(
+ responsesQueryKey(response.requestId),
+ (responses: HttpResponse[] = []) => {
+ const newResponses = [];
+ let found = false;
+ for (const r of responses) {
+ if (r.id === response.id) {
+ found = true;
+ newResponses.push(convertDates(response));
+ } else {
+ newResponses.push(r);
+ }
+ }
+ if (!found) {
+ newResponses.push(convertDates(response));
+ }
+ return newResponses;
+ },
+ );
+});
+
+await listen('zoom', ({ payload: zoomDelta }: { payload: number }) => {
+ 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`;
+});
+
+export function App() {
+ return (
+
+
+
+
+
+
+
+ );
+}
diff --git a/src-web/components/AppRouter.tsx b/src-web/components/AppRouter.tsx
index 34f215c5..85f244c1 100644
--- a/src-web/components/AppRouter.tsx
+++ b/src-web/components/AppRouter.tsx
@@ -1,6 +1,6 @@
import { Router } from 'preact-router';
import { Workspaces } from '../pages/Workspaces';
-import { Workspace } from '../Workspace';
+import { Workspace } from '../pages/Workspace';
export function AppRouter() {
return (
diff --git a/src-web/main.tsx b/src-web/main.tsx
index 9c04ae37..a46f22fe 100644
--- a/src-web/main.tsx
+++ b/src-web/main.tsx
@@ -1,93 +1,9 @@
-import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
-import { listen } from '@tauri-apps/api/event';
-import { MotionConfig } from 'framer-motion';
import { render } from 'preact';
-import { HelmetProvider } from 'react-helmet-async';
-import { AppRouter } from './components/AppRouter';
-import { requestsQueryKey } from './hooks/useRequest';
-import { responsesQueryKey } from './hooks/useResponses';
-import { DEFAULT_FONT_SIZE } from './lib/constants';
-import type { HttpRequest, HttpResponse } from './lib/models';
-import { convertDates } from './lib/models';
+import { App } from './App';
import { setAppearance } from './lib/theme/window';
import './main.css';
setAppearance();
-const queryClient = new QueryClient();
-
-await listen('updated_request', ({ payload: request }: { payload: HttpRequest }) => {
- queryClient.setQueryData(
- requestsQueryKey(request.workspaceId),
- (requests: HttpRequest[] = []) => {
- const newRequests = [];
- let found = false;
- for (const r of requests) {
- if (r.id === request.id) {
- found = true;
- newRequests.push(convertDates(request));
- } else {
- newRequests.push(r);
- }
- }
- if (!found) {
- newRequests.push(convertDates(request));
- }
- return newRequests;
- },
- );
-});
-
-await listen('deleted_request', ({ payload: request }: { payload: HttpRequest }) => {
- queryClient.setQueryData(requestsQueryKey(request.workspaceId), (requests: HttpRequest[] = []) =>
- requests.filter((r) => r.id !== request.id),
- );
-});
-
-await listen('updated_response', ({ payload: response }: { payload: HttpResponse }) => {
- queryClient.setQueryData(
- responsesQueryKey(response.requestId),
- (responses: HttpResponse[] = []) => {
- const newResponses = [];
- let found = false;
- for (const r of responses) {
- if (r.id === response.id) {
- found = true;
- newResponses.push(convertDates(response));
- } else {
- newResponses.push(r);
- }
- }
- if (!found) {
- newResponses.push(convertDates(response));
- }
- return newResponses;
- },
- );
-});
-
-await listen('zoom', ({ payload: zoomDelta }: { payload: number }) => {
- 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`;
-});
-
-render(
-
-
-
-
-
-
- ,
- document.getElementById('root') as HTMLElement,
-);
+// root holds our app's root DOM Element:
+render(, document.getElementById('root') as HTMLElement);
diff --git a/src-web/Workspace.tsx b/src-web/pages/Workspace.tsx
similarity index 81%
rename from src-web/Workspace.tsx
rename to src-web/pages/Workspace.tsx
index ca48b197..cac408c3 100644
--- a/src-web/Workspace.tsx
+++ b/src-web/pages/Workspace.tsx
@@ -1,11 +1,11 @@
import classnames from 'classnames';
import { useWindowSize } from 'react-use';
-import { RequestPane } from './components/RequestPane';
-import { ResponsePane } from './components/ResponsePane';
-import { Sidebar } from './components/Sidebar';
-import { HStack } from './components/Stacks';
-import { WindowDragRegion } from './components/WindowDragRegion';
-import { useRequests } from './hooks/useRequest';
+import { RequestPane } from '../components/RequestPane';
+import { ResponsePane } from '../components/ResponsePane';
+import { Sidebar } from '../components/Sidebar';
+import { HStack } from '../components/Stacks';
+import { WindowDragRegion } from '../components/WindowDragRegion';
+import { useRequests } from '../hooks/useRequest';
type Params = {
workspaceId: string;
diff --git a/tsconfig.json b/tsconfig.json
index 0b7339bb..b0edfc87 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -16,7 +16,11 @@
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
- "jsxImportSource": "preact"
+ "jsxImportSource": "preact",
+ "paths": {
+ "react": ["./node_modules/preact/compat/"],
+ "react-dom": ["./node_modules/preact/compat/"]
+ },
},
"include": [
"src-web"