Added multiple components, added CodeMirror for body editor and added variable substitution for params and headers

This commit is contained in:
xyroscar
2025-11-24 16:46:02 -08:00
parent 653a23f805
commit e2a7761388
37 changed files with 1596 additions and 173 deletions

View File

@@ -21,9 +21,13 @@
update_request,
delete_request,
} from "$lib/services/collections";
import { get_resolved_variables } from "$lib/services/variables";
import type { Workspace } from "$lib/types/workspace";
import type { Collection } from "$lib/types/collection";
import type { Request, HttpMethod } from "$lib/types/request";
import type { Response } from "$lib/types/response";
import type { ResolvedVariable } from "$lib/types/variable";
import ResponsePanel from "$lib/components/response-panel.svelte";
const { params } = $props<{ params: { id: string } }>();
@@ -31,6 +35,9 @@
let collections = $state<Collection[]>([]);
let standaloneRequests = $state<Request[]>([]);
let selectedRequest = $state<Request | null>(null);
let response = $state<Response | null>(null);
let loading = $state(false);
let resolvedVariables = $state<ResolvedVariable[]>([]);
let collectionDialogOpen = $state(false);
let collectionDialogMode = $state<"create" | "edit">("create");
@@ -59,6 +66,7 @@
workspace = await get_workspace(params.id);
collections = await get_collections_by_workspace(params.id);
standaloneRequests = await get_standalone_requests_by_workspace(params.id);
resolvedVariables = await get_resolved_variables(params.id, null, null);
}
function goBack() {
@@ -67,6 +75,7 @@
function handleRequestSelect(request: Request) {
selectedRequest = request;
response = null;
}
function handleCreateCollection() {
@@ -138,7 +147,9 @@
url: "",
headers: [],
params: [],
bodyType: "none",
body: "",
formData: [],
collectionId: requestCollectionId,
workspaceId: params.id,
});
@@ -169,8 +180,59 @@
deleteTarget = null;
}
function handleSendRequest(request: Request) {
console.log("Sending request:", request);
async function handleSendRequest(request: Request) {
loading = true;
response = null;
// Simulate API request (will be replaced with actual Tauri call later)
const startTime = Date.now();
try {
// Mock response for now
await new Promise((resolve) =>
setTimeout(resolve, 500 + Math.random() * 1000)
);
const mockBody = JSON.stringify(
{
success: true,
message: "This is a mock response",
data: {
id: 1,
name: "Example",
timestamp: new Date().toISOString(),
},
},
null,
2
);
response = {
status: 200,
statusText: "OK",
headers: [
{ key: "Content-Type", value: "application/json" },
{ key: "X-Request-Id", value: crypto.randomUUID() },
{ key: "Cache-Control", value: "no-cache" },
],
body: mockBody,
contentType: "application/json",
duration: Date.now() - startTime,
size: new Blob([mockBody]).size,
};
} catch (error) {
response = {
status: 500,
statusText: "Error",
headers: [],
body: JSON.stringify({ error: "Request failed" }),
contentType: "application/json",
duration: Date.now() - startTime,
size: 0,
};
} finally {
loading = false;
}
}
async function handleUpdateRequest(request: Request) {
@@ -220,13 +282,21 @@
</div>
</header>
<div class="flex-1 overflow-hidden">
<div class="flex-1 overflow-hidden flex flex-col">
{#if selectedRequest}
<RequestPanel
request={selectedRequest}
onSend={handleSendRequest}
onUpdate={handleUpdateRequest}
/>
<div class="flex-1 min-h-0 flex flex-col">
<div class="flex-1 min-h-0 overflow-hidden">
<RequestPanel
request={selectedRequest}
variables={resolvedVariables}
onSend={handleSendRequest}
onUpdate={handleUpdateRequest}
/>
</div>
<div class="h-[300px] min-h-[200px] border-t">
<ResponsePanel {response} {loading} />
</div>
</div>
{:else}
<Empty.Root class="flex h-full items-center justify-center">
<Empty.Header>