Skip to content

Commit 1c4c2b6

Browse files
committed
Enhance API request handling and UI interaction
- Added a refresh button in the sidebar to update the request list. - Improved request selection logic to fetch detailed request data. - Updated the API store to handle asynchronous operations for fetching requests. - Cleaned up the main entry file by removing unnecessary CSS import.
1 parent e34819e commit 1c4c2b6

4 files changed

Lines changed: 96 additions & 21 deletions

File tree

frontend/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<meta charset="UTF-8">
55
<link rel="icon" href="/favicon.ico">
66
<meta name="viewport" content="width=device-width, initial-scale=1.0">
7+
<link rel="stylesheet" href="/public/main.css">
78
<title>Vite App</title>
89
</head>
910
<body>

frontend/src/App.vue

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
<script setup lang="ts"></script>
1+
<script setup lang="ts">
2+
import { useApiStore } from './stores/apiStore';
3+
4+
5+
const apiStore = useApiStore();
6+
apiStore.updateRequestList();
7+
</script>
28

39
<template>
410
<!-- Header -->
@@ -12,27 +18,40 @@
1218
<!-- Sidebar -->
1319
<aside class="w-64 bg-white shadow-md p-4 overflow-y-auto">
1420
<h2 class="text-lg font-semibold mb-4">Menu</h2>
21+
<button class="w-full mb-4 px-3 py-2 bg-blue-500 text-white rounded hover:bg-blue-600" @click="apiStore.updateRequestList()">
22+
Refresh Requests
23+
</button>
1524
<ul class="space-y-2">
16-
<li>
17-
<button class="w-full text-left px-3 py-2 rounded hover:bg-blue-100">Item 1</button>
18-
</li>
19-
<li>
20-
<button class="w-full text-left px-3 py-2 rounded hover:bg-blue-100">Item 2</button>
21-
</li>
22-
<li>
23-
<button class="w-full text-left px-3 py-2 rounded hover:bg-blue-100">Item 3</button>
24-
</li>
25-
<li>
26-
<button class="w-full text-left px-3 py-2 rounded hover:bg-blue-100">Item 4</button>
27-
</li>
25+
<template v-for="request in apiStore.requestList" :key="request.id">
26+
<li :class="apiStore.selectedRequest?.id === request.id ? 'bg-blue-200' : ''">
27+
<button class="w-full text-left px-3 py-2 rounded hover:bg-blue-100" @click="apiStore.selectRequest(request.id)">
28+
{{ request.method }} {{ request.path }}
29+
</button>
30+
</li>
31+
</template>
2832
</ul>
2933
</aside>
3034

3135
<!-- Main Content -->
3236
<main class="flex-1 p-6 overflow-y-auto">
3337
<h2 class="text-2xl font-bold mb-4">Main Content</h2>
34-
<p class="mb-2">This is where your main content will go. You can add text, images, tables, or any other elements here.</p>
35-
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras sit amet urna a orci elementum fermentum.</p>
38+
<template v-if="apiStore.selectedRequest">
39+
<div>
40+
<h3 class="text-xl font-semibold mb-2">Request Details</h3>
41+
<p><strong>Method:</strong> {{ apiStore.selectedRequest.method }}</p>
42+
<p><strong>Path:</strong> {{ apiStore.selectedRequest.path }}</p>
43+
44+
<p><strong>Headers:</strong></p>
45+
<pre class="bg-gray-100 p-2 rounded mb-2">{{ JSON.stringify(apiStore.selectedRequest.headers, null, 2) }}</pre>
46+
<p><strong>Body:</strong></p>
47+
<pre class="bg-gray-100 p-2 rounded">{{ apiStore.selectedRequest.body_text }}</pre>
48+
<p><strong>Body (Base64):</strong></p>
49+
<pre class="bg-gray-100 p-2 rounded">{{ apiStore.selectedRequest.body_bytes_b64 }}</pre>
50+
</div>
51+
</template>
52+
<template v-else>
53+
<p>Please select a request from the sidebar to view details.</p>
54+
</template>
3655
</main>
3756

3857
</div>

frontend/src/main.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { createApp } from 'vue'
22
import { createPinia } from 'pinia'
3-
import '../public/main.css'
43
import App from './App.vue'
54
import router from './router'
65

frontend/src/stores/apiStore.ts

Lines changed: 61 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,72 @@
11
import { ref, computed } from 'vue'
22
import { defineStore } from 'pinia'
33

4+
// from pydantic import BaseModel:
5+
6+
// class RequestSummary(BaseModel):
7+
// id: int
8+
// method: str
9+
// path: str
10+
// ts: float
11+
// ip: str
12+
// content_length: int
13+
14+
export type ApiRequestSummary = {
15+
id: string
16+
method: string
17+
path: string
18+
ts: number
19+
ip: string
20+
content_length: number
21+
}
22+
23+
// class StoredRequest(BaseModel):
24+
// id: int
25+
// method: str
26+
// path: str
27+
// ts: float
28+
// ip: str
29+
// headers: Dict[str, str]
30+
// query: Dict[str, str]
31+
// body_text: Optional[str] = None
32+
// body_bytes_b64: Optional[str] = None
33+
// body_length: int = 0
34+
35+
36+
export type ApiRequest = {
37+
id: string
38+
method: string
39+
path: string
40+
ts: number
41+
ip: string
42+
headers: Record<string, string>
43+
query: Record<string, string>
44+
body_text?: string
45+
body_bytes_b64?: string
46+
body_length: number
47+
}
48+
49+
50+
451
export const useApiStore = defineStore('api', () => {
5-
const requestList = ref([])
6-
const selectedRequest = ref(null)
52+
const requestList = ref<ApiRequestSummary[]>([])
53+
const selectedRequest = ref<ApiRequest | null>(null)
754

8-
function updateRequestList() {
55+
async function updateRequestList() {
956
// Call API to fetch updated request list
57+
const response = await fetch('/api/requests')
58+
if (response.ok) {
59+
const data = await response.json()
60+
requestList.value = data as ApiRequestSummary[]
61+
}
1062
}
1163

12-
function selectRequest(requestId: string) {
13-
selectedRequest.value = requestList.value.find(req => req.id === requestId) || null
64+
async function selectRequest(requestId: string) {
65+
const response = await fetch(`/api/requests/${requestId}`)
66+
if (response.ok) {
67+
const data = await response.json()
68+
selectedRequest.value = data as ApiRequest
69+
}
1470
}
1571

1672
return { requestList, selectedRequest, updateRequestList, selectRequest }

0 commit comments

Comments
 (0)