summaryrefslogtreecommitdiffstats
path: root/src/components/Frames
diff options
context:
space:
mode:
authorGravatar Tom van der Lee <tom@vanderlee.io>2024-08-30 11:19:30 +0200
committerGravatar Tom van der Lee <tom@vanderlee.io>2024-08-30 15:33:15 +0200
commit648b804e72d4831e41e02dfd7d6b5a9ac7660b58 (patch)
tree34c0e284df0510c868606a01833aa0e57f6678c2 /src/components/Frames
parentb19c1877d088fbe01bcdea9fbdef282e66ab114f (diff)
downloadclient-648b804e72d4831e41e02dfd7d6b5a9ac7660b58.tar.gz
client-648b804e72d4831e41e02dfd7d6b5a9ac7660b58.tar.bz2
client-648b804e72d4831e41e02dfd7d6b5a9ac7660b58.zip
Added ui
Diffstat (limited to 'src/components/Frames')
-rw-r--r--src/components/Frames/Frames.module.scss9
-rw-r--r--src/components/Frames/Frames.tsx75
2 files changed, 84 insertions, 0 deletions
diff --git a/src/components/Frames/Frames.module.scss b/src/components/Frames/Frames.module.scss
new file mode 100644
index 0000000..821f0b8
--- /dev/null
+++ b/src/components/Frames/Frames.module.scss
@@ -0,0 +1,9 @@
1.arrow {
2 &.outbound {
3 color: green;
4 }
5
6 &.inbound {
7 color: red;
8 }
9}
diff --git a/src/components/Frames/Frames.tsx b/src/components/Frames/Frames.tsx
new file mode 100644
index 0000000..83c4c96
--- /dev/null
+++ b/src/components/Frames/Frames.tsx
@@ -0,0 +1,75 @@
1import { Frame } from "~/types";
2import React, { PropsWithChildren, useContext } from "react";
3import { Col, ListGroup, Row } from "react-bootstrap";
4import classNames from "classnames";
5import styles from "./Frames.module.scss";
6import dayjs from "dayjs";
7import ReactJson from "react-json-view";
8import { DarkModeContext } from "~/contexts/DarkMode";
9
10function isJson(data: any): boolean {
11 try {
12 JSON.parse(data);
13 return true;
14 } catch {
15 return false;
16 }
17}
18
19interface FramesProps {
20 frames: Frame[];
21}
22
23export default function Frames({
24 frames,
25}: PropsWithChildren<FramesProps>): JSX.Element {
26 const { darkMode } = useContext(DarkModeContext);
27 return (
28 <ListGroup variant="flush" as="ul" className={"flex-grow-1"}>
29 {frames.length > 0 ? (
30 frames.map((frame) => {
31 // Inbound relative to the client
32 const inbound = frame.type !== "websocket_inbound";
33
34 const body =
35 frame.type !== "websocket_disconnect"
36 ? atob(frame.payload.body)
37 : null;
38
39 return (
40 <ListGroup.Item
41 as="li"
42 key={frame.payload.id}
43 className={classNames({
44 "border-bottom": true,
45 })}
46 >
47 <Row>
48 <Col className="flex-grow-0 d-flex align-items-center text-nowrap text-muted">
49 {dayjs(frame.payload?.timestamp).format("HH:mm:ss.SSS")}
50 </Col>
51 <Col
52 className={classNames(
53 styles.arrow,
54 "flex-grow-0 d-flex align-items-center flex-nowrap",
55 {
56 [styles.inbound]: inbound,
57 [styles.outbound]: !inbound,
58 }
59 )}
60 >
61 {inbound ? "▼" : "▲"}
62 </Col>
63 <Col className="flex-grow-1">{body}</Col>
64 </Row>
65 </ListGroup.Item>
66 );
67 })
68 ) : (
69 <div className={styles.noRequest}>
70 <p>No messages</p>
71 </div>
72 )}
73 </ListGroup>
74 );
75}