Skip to content

Commit 3d291d6

Browse files
authored
feat: live update request preview on submit (#29)
1 parent 42d42e8 commit 3d291d6

File tree

5 files changed

+61
-7
lines changed

5 files changed

+61
-7
lines changed

api/detail.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { request as octokitRequest } from "@octokit/request";
2+
import fetch from "node-fetch";
23

34
import { OPENAPI_PATHS } from "../public/components/openapi-paths.js";
45
import { parameterField } from "../public/components/parameter-field.js";
@@ -21,7 +22,13 @@ module.exports = async (request, response) => {
2122
let apiResponse;
2223
if (request.method === "POST") {
2324
const options = JSON.parse(decodeURIComponent(request.body.requestOptions));
24-
apiResponse = await octokitRequest(options);
25+
const { url, ...rest } = octokitRequest.endpoint(options);
26+
const response = await fetch(url, rest);
27+
apiResponse = {
28+
status: response.status,
29+
headers: Object.fromEntries(response.headers.entries()),
30+
data: await response.json()
31+
};
2532
}
2633

2734
if (method && path) {
@@ -84,6 +91,7 @@ module.exports = async (request, response) => {
8491
const options = Object.fromEntries(
8592
Object.entries(rest).filter(([key, value]) => value !== "")
8693
);
94+
8795
const requestOptions = {
8896
baseUrl: "https://api.github.com",
8997
method,
@@ -130,7 +138,7 @@ module.exports = async (request, response) => {
130138
131139
<section>
132140
<h2>Parameters</h2>
133-
<form>
141+
<form id="parametersForm">
134142
<table>
135143
<thead>
136144
<tr>
@@ -158,11 +166,9 @@ module.exports = async (request, response) => {
158166
</form>
159167
160168
<form method="POST">
161-
<input type="hidden" name="requestOptions" value="${encodeURIComponent(
162-
JSON.stringify(requestOptions)
163-
)}">
164-
169+
<div id="requestPreview">
165170
${requestPreview(requestOptions)}
171+
</div>
166172
167173
<p><button type="submit">Send request</button></p>
168174
</form>
@@ -173,6 +179,8 @@ module.exports = async (request, response) => {
173179
<p>See documentation on <a href="${
174180
endpoint.documentationUrl
175181
}">GitHub developer guides</a></p>
182+
183+
<script type="module" src="/detail.js"></script>
176184
</body>
177185
</html>
178186
`);

api/search.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ What would you like to request?<br />
7070
${searchResults({ query, results })}
7171
</div>
7272
73-
<script type="module" src="/client.js"></script>
73+
<script type="module" src="/search.js"></script>
7474
</body>
7575
</html>
7676
`);

public/components/request-preview.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ ${Object.entries(headers)
1212
${body ? JSON.stringify(body, null, 2) : ""}
1313
</code></pre>
1414
</section>
15+
16+
<input type="hidden" name="requestOptions" value="${encodeURIComponent(
17+
JSON.stringify(options)
18+
)}">
1519
`;
1620
}
1721

public/detail.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { requestPreview } from "/components/request-preview.js";
2+
3+
const $parametersForm = document.querySelector(`#parametersForm`);
4+
const $requestPreview = document.querySelector(`#requestPreview`);
5+
6+
$parametersForm.addEventListener("submit", event => {
7+
const form = new FormData($parametersForm);
8+
const { token, ...rest } = Object.fromEntries(form.entries());
9+
10+
const options = Object.fromEntries(
11+
Object.entries(rest).filter(([key, value]) => value !== "")
12+
);
13+
14+
const path = decodeURIComponent(location.pathname);
15+
const [method] = path.substr(1).split("/");
16+
const url = path.substr(method.length + 1);
17+
18+
const requestOptions = {
19+
baseUrl: "https://api.github.com",
20+
method,
21+
url,
22+
headers: {
23+
authorization: `token ${token}`,
24+
accept: "application/vnd.github.v3+json",
25+
"user-agent": `octokit.rest`
26+
},
27+
mediaType: {
28+
previews: []
29+
},
30+
...options
31+
};
32+
33+
$requestPreview.innerHTML = requestPreview(requestOptions);
34+
35+
const query = new URLSearchParams();
36+
for (const [parameter, value] of Object.entries({ token, ...rest })) {
37+
query.append(parameter, value);
38+
}
39+
window.history.pushState({}, null, `?${query}`);
40+
41+
event.preventDefault();
42+
});
File renamed without changes.

0 commit comments

Comments
 (0)