Skip to content

Commit d13845c

Browse files
committed
fix: add history
1 parent 01e220e commit d13845c

File tree

2 files changed

+129
-22
lines changed

2 files changed

+129
-22
lines changed

src/containers/Inspector.tsx

+121-22
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import SplitPane from "react-split-pane";
33
import JSONRPCRequestEditor from "./JSONRPCRequestEditor";
44
import PlayCircle from "@material-ui/icons/PlayCircleFilled";
55
import CloseIcon from "@material-ui/icons/Close";
6+
import History from "@material-ui/icons/History";
67
import PlusIcon from "@material-ui/icons/Add";
78
import CheckCircle from "@material-ui/icons/CheckCircle";
89
import {
@@ -16,6 +17,11 @@ import {
1617
Tabs,
1718
Tooltip,
1819
Grid,
20+
Dialog,
21+
ListItem,
22+
List,
23+
ListItemText,
24+
Container,
1925
} from "@material-ui/core";
2026
import { Client, RequestManager, HTTPTransport, WebSocketTransport } from "@open-rpc/client-js";
2127
import Brightness3Icon from "@material-ui/icons/Brightness3";
@@ -126,6 +132,9 @@ const Inspector: React.FC<IProps> = (props) => {
126132
const [url, setUrl] = useState(props.url || "");
127133
const [debouncedUrl] = useDebounce(url, 1000);
128134
const [client, error] = useClient(debouncedUrl);
135+
const [historyOpen, setHistoryOpen] = useState();
136+
const [requestHistory, setRequestHistory]: [any[], Dispatch<any>] = useState([]);
137+
const [historySelectedIndex, setHistorySelectedIndex] = useState(0);
129138
useEffect(() => {
130139
if (props.openrpcMethodObject) {
131140
setJson({
@@ -173,7 +182,11 @@ const Inspector: React.FC<IProps> = (props) => {
173182
const r = { jsonrpc: "2.0", result, id };
174183
setResults(r);
175184
setTabResults(tabIndex, r);
185+
const newHistory: any = [...requestHistory, { ...tabs[tabIndex] }];
186+
setRequestHistory(newHistory);
176187
} catch (e) {
188+
const newHistory: any = [...requestHistory, { ...tabs[tabIndex] }];
189+
setRequestHistory(newHistory);
177190
setResults(e);
178191
setTabResults(tabIndex, e);
179192
}
@@ -229,8 +242,70 @@ const Inspector: React.FC<IProps> = (props) => {
229242
setTabIndex(newValue);
230243
};
231244

245+
const onHistoryPlayClick = () => {
246+
if (requestHistory[historySelectedIndex]) {
247+
setJson(requestHistory[historySelectedIndex].content);
248+
setUrl(requestHistory[historySelectedIndex].url);
249+
setOpenRpcDocument(requestHistory[historySelectedIndex].openrpcDocument);
250+
setResults(undefined);
251+
setHistoryOpen(false);
252+
}
253+
};
254+
232255
return (
233256
<>
257+
<Dialog onClose={() => setHistoryOpen(false)} aria-labelledby="simple-dialog-title" open={historyOpen} >
258+
<Container maxWidth="sm">
259+
<Grid
260+
container
261+
justify="space-between"
262+
alignItems="center"
263+
style={{ padding: "30px", paddingTop: "10px", paddingBottom: "10px" }}>
264+
<Typography color="textPrimary">History</Typography>
265+
{
266+
requestHistory.length === 0
267+
? null
268+
: <Tooltip title="Use">
269+
<IconButton onClick={onHistoryPlayClick}>
270+
<PlayCircle />
271+
</IconButton>
272+
</Tooltip>
273+
}
274+
</Grid>
275+
{
276+
requestHistory.length === 0
277+
? <Typography style={{ padding: "30px" }}>No History Yet.</Typography>
278+
: <Grid container style={{ paddingBottom: "30px" }}>
279+
<List style={{ padding: "10px", overflowY: "scroll", height: "250px", width: "200px" }}>
280+
{requestHistory.map((requestHistoryItem: any, historyIndex: number) => (
281+
<ListItem button
282+
onClick={() => setHistorySelectedIndex(historyIndex)}
283+
selected={historyIndex === historySelectedIndex}>
284+
<ListItemText
285+
primary={requestHistoryItem.content.method || "Empty Method"}
286+
secondary={requestHistoryItem.url || "Empty Url"}
287+
/>
288+
</ListItem>
289+
))}
290+
</List>
291+
<MonacoEditor
292+
width="300px"
293+
height="250px"
294+
value={
295+
requestHistory[historySelectedIndex]
296+
? JSON.stringify(requestHistory[historySelectedIndex].content, null, 4)
297+
: ""
298+
}
299+
language="json"
300+
editorDidMount={() => {
301+
// noop
302+
}}
303+
/>
304+
</Grid>
305+
}
306+
</Container>
307+
</Dialog>
308+
234309
<div style={{ position: "relative" }}>
235310
<Tabs
236311
style={{ background: "transparent" }}
@@ -258,28 +333,32 @@ const Inspector: React.FC<IProps> = (props) => {
258333
}
259334
{tabIndex === index
260335
?
261-
<IconButton onClick={
262-
(ev) => handleClose(ev, index)
263-
} style={{ position: "absolute", right: "10px", top: "25%" }} size="small">
264-
<CloseIcon />
265-
</IconButton>
336+
<Tooltip title="Close Tab">
337+
<IconButton onClick={
338+
(ev) => handleClose(ev, index)
339+
} style={{ position: "absolute", right: "10px", top: "25%" }} size="small">
340+
<CloseIcon />
341+
</IconButton>
342+
</Tooltip>
266343
: null
267344
}
268345
</div>
269346
}></Tab>
270347
))}
271348
<Tab disableRipple style={{ minWidth: "50px" }} label={
272-
<IconButton onClick={() => setTabs([
273-
...tabs,
274-
{
275-
name: "New Tab",
276-
content: { ...emptyJSONRPC },
277-
url: "",
278-
},
279-
],
280-
)}>
281-
<PlusIcon scale={0.5} />
282-
</IconButton>
349+
<Tooltip title="Create New Tab">
350+
<IconButton onClick={() => setTabs([
351+
...tabs,
352+
{
353+
name: "New Tab",
354+
content: { ...emptyJSONRPC },
355+
url: "",
356+
},
357+
],
358+
)}>
359+
<PlusIcon scale={0.5} />
360+
</IconButton>
361+
</Tooltip>
283362
}>
284363
</Tab>
285364
</Tabs>
@@ -293,9 +372,21 @@ const Inspector: React.FC<IProps> = (props) => {
293372
src="https://github.com/open-rpc/design/raw/master/icons/open-rpc-logo-noText/open-rpc-logo-noText%20(PNG)/128x128.png" //tslint:disable-line
294373
/>
295374
<Typography variant="h6" color="textSecondary">Inspector</Typography>
296-
<IconButton onClick={handlePlayButton}>
297-
<PlayCircle />
298-
</IconButton>
375+
{/* <Button
376+
onClick={() => setHistoryOpen(true)}
377+
variant="outlined"
378+
style={{
379+
fontSize: "0.6rem",
380+
marginRight: "5px",
381+
marginLeft: "15px",
382+
paddingLeft: "10px",
383+
paddingRight: "10px",
384+
}}>History</Button> */}
385+
<Tooltip title="Play">
386+
<IconButton onClick={handlePlayButton}>
387+
<PlayCircle />
388+
</IconButton>
389+
</Tooltip>
299390
<InputBase
300391
startAdornment={openrpcDocument
301392
?
@@ -323,12 +414,20 @@ const Inspector: React.FC<IProps> = (props) => {
323414
fullWidth
324415
style={{ background: "rgba(0,0,0,0.1)", borderRadius: "4px", padding: "0px 10px", marginRight: "5px" }}
325416
/>
417+
<Tooltip title="History">
418+
<IconButton onClick={() => setHistoryOpen(true)}>
419+
<History />
420+
</IconButton>
421+
</Tooltip>
326422
{
327423
props.hideToggleTheme
328424
? null
329-
: <IconButton onClick={handleToggleDarkMode}>
330-
{props.darkMode ? <Brightness3Icon /> : <WbSunnyIcon />}
331-
</IconButton>
425+
:
426+
<Tooltip title="Toggle Theme">
427+
<IconButton onClick={handleToggleDarkMode}>
428+
{props.darkMode ? <Brightness3Icon /> : <WbSunnyIcon />}
429+
</IconButton>
430+
</Tooltip>
332431
}
333432
</Toolbar>
334433
</AppBar>

src/hooks/useHistory.ts

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { useState } from "react";
2+
3+
const useHistory = () => {
4+
const history = useState([]);
5+
6+
};
7+
8+
export default useHistory;

0 commit comments

Comments
 (0)