Skip to content

Commit 8c2f769

Browse files
Fixes #289 save history on demand. Added setting to enable or disable it
1 parent c70aa52 commit 8c2f769

File tree

5 files changed

+54
-11
lines changed

5 files changed

+54
-11
lines changed

ui/src/components/ApiAction.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,8 @@ export default function ApiAction(props: Props) {
319319

320320
{activeTab == 'response' && (
321321
<ApiActionResponse
322+
requestUri={requestUri}
323+
method={method}
322324
responseHeaders={responseHeaders}
323325
responseData={responseData}
324326
timeTaken={timeTaken}

ui/src/components/App.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export default function App() {
3030
const [showPut] = useLocalStorage('showPut', 'true');
3131
const [showPatch] = useLocalStorage('showPatch', 'true');
3232
const [showHead] = useLocalStorage('showHead', 'false');
33+
const [savePreviousResponse] = useLocalStorage('savePreviousResponse', 'false');
3334

3435
const searchOptions = {
3536
keys: ['uri', 'doc_block'],

ui/src/components/TopNav.tsx

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export default function TopNav(props: Props) {
3939
const [showPut, setShowPut] = useLocalStorage('showPut', 'true');
4040
const [showPatch, setShowPatch] = useLocalStorage('showPatch', 'true');
4141
const [showHead, setShowHead] = useLocalStorage('showHead', 'false');
42+
const [savePreviousResponse, setSavePreviousResponse] = useLocalStorage('savePreviousResponse', 'false');
4243

4344
// eslint-disable-next-line @typescript-eslint/no-unused-vars
4445
const handleChangeGroupby = (e: any) => {
@@ -73,6 +74,9 @@ export default function TopNav(props: Props) {
7374
setShowHead(e.target.checked)
7475
handleChangeSettings(showGet, showPost, showDelete, showPut, showPatch, e.target.checked, sort, groupby)
7576
}
77+
const handleSavePreviousResponse = (e: any) => {
78+
setSavePreviousResponse(e.target.checked)
79+
}
7680

7781
const handleClearLocalStorage = () => {
7882
localStorage.clear()
@@ -147,7 +151,7 @@ export default function TopNav(props: Props) {
147151
<div className="modal-box">
148152
<div className="modal-action float-right">
149153
<a href="#" className="btn btn-sm btn-ghost">
150-
<XMarkIcon className="h-6 w-6" /> Close
154+
<span className='text-error'> <XMarkIcon className="h-6 w-6 inline" /> Close</span>
151155
</a>
152156
</div>
153157
<h3 className="font-bold text-lg mt-7">
@@ -222,6 +226,18 @@ export default function TopNav(props: Props) {
222226
<input type="checkbox" onChange={handleChangeHead} className="toggle toggle-success" checked={showHead == 'true'} />
223227
</label>
224228
</div>
229+
<h4 className="font-bold mt-10">
230+
<CircleStackIcon className="inline-block h-6 w-6 mr-1" />
231+
Save Responses
232+
</h4>
233+
<div className='divider'></div>
234+
<div className="form-control">
235+
<label className="label">
236+
<span className="label-text">Save</span>
237+
<input type="checkbox" onChange={handleSavePreviousResponse} className="toggle toggle-success" checked={savePreviousResponse == 'true'} />
238+
</label>
239+
<small className='pl-1'>Should you want to save previous response on local storage</small>
240+
</div>
225241
<h4 className="font-bold mt-10">
226242
<CircleStackIcon className="inline-block h-6 w-6 mr-1" />
227243
Storage
@@ -236,11 +252,6 @@ export default function TopNav(props: Props) {
236252
<button className="btn btn-sm btn-error" onClick={handleClearLocalStorage}>Clear</button>
237253
</label>
238254
</div>
239-
{/* <div className="modal-action">
240-
<a href="#" className="btn btn-sm">
241-
<XMarkIcon className="h-6 w-6" /> Close
242-
</a>
243-
</div> */}
244255
</div>
245256
</div>
246257
</div>

ui/src/components/elements/ApiActionRequest.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ export default function ApiActionRequest(props: Props) {
7676
<>
7777
<div className="form-control">
7878
<label className="input-group input-group-sm">
79-
<span className={`method-${method} pr-2`}>{method}</span>
80-
<input type="text" defaultValue={requestUri} onChange={(e) => setRequestUri(e.target.value)} placeholder="Type here" className="focus:outline-none input w-4/5 input-bordered input-sm mr-2" />
79+
<span className={`method-${method} pr-1`}>{method}</span>
80+
<input type="text" defaultValue={requestUri} onChange={(e) => setRequestUri(e.target.value)} placeholder="Type here" className="focus:outline-none input w-4/6 input-bordered input-sm mr-2" />
8181
<button className="btn btn-sm btn-success" onClick={handleSendRequest}>
8282
GO <PaperAirplaneIcon className='inline-block w-4 h-4 ml-1' />
8383
</button>

ui/src/components/elements/ApiActionResponse.tsx

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
import React from 'react';
1+
import React, { useEffect, useState } from 'react';
22
import "ace-builds";
33
import jsonWorkerUrl from 'ace-builds/src-min-noconflict/worker-json?url';
4+
45
ace.config.setModuleUrl('ace/mode/json_worker', jsonWorkerUrl);
56

67
import AceEditor from 'react-ace';
78
import "ace-builds/src-noconflict/mode-json";
89
import "ace-builds/src-noconflict/theme-one_dark";
910
import "ace-builds/src-noconflict/ext-language_tools";
11+
import useLocalStorage from 'react-use-localstorage';
1012

1113

1214
interface Props {
@@ -15,10 +17,19 @@ interface Props {
1517
timeTaken: number,
1618
responseStatus: number,
1719
serverMemory: string,
20+
requestUri: string,
21+
method: string,
1822
}
1923

2024
export default function ApiActionResponse(props: Props) {
21-
const { responseHeaders, responseData, timeTaken, responseStatus, serverMemory } = props
25+
const { responseHeaders, responseData, timeTaken, responseStatus, serverMemory, requestUri, method } = props
26+
const [savePreviousResponse] = useLocalStorage('savePreviousResponse', 'false');
27+
const [previousResponse, setPreviousResponse] = useLocalStorage('previousResponse' + requestUri + method, '');
28+
useEffect(() => {
29+
if (responseData && savePreviousResponse === 'true') {
30+
setPreviousResponse(responseData)
31+
}
32+
}, [])
2233

2334
return (
2435
<>
@@ -48,11 +59,29 @@ export default function ApiActionResponse(props: Props) {
4859
<br />
4960
</>
5061
)}
51-
{!responseData && (
62+
{(!responseData && !previousResponse) && (
5263
<div className='text-center text-sm text-slate-500'>
5364
No Response Data
5465
</div>
5566
)}
67+
{(!responseData && previousResponse) && (
68+
<div className="mockup-code mb-5">
69+
<span className='pl-5 text-sm text-warning'>Previous Response</span>
70+
<AceEditor
71+
maxLines={50}
72+
width='100%'
73+
mode="json"
74+
wrapEnabled={true}
75+
readOnly={true}
76+
value={previousResponse}
77+
theme="one_dark"
78+
onLoad={function (editor) { editor.renderer.setPadding(0); editor.renderer.setScrollMargin(5, 5, 5, 5); editor.renderer.setShowPrintMargin(false); }}
79+
editorProps={{
80+
$blockScrolling: true
81+
}}
82+
/>
83+
</div>
84+
)}
5685
{responseData && (
5786
<div className="mockup-code">
5887
<span className='pl-5 text-sm text-slate-500'>RESPONSE</span>

0 commit comments

Comments
 (0)