summaryrefslogtreecommitdiffstats
path: root/src/components/RequestDetails
diff options
context:
space:
mode:
authorGravatar Tom van der Lee <tom@vanderlee.io>2022-02-12 11:33:52 +0100
committerGravatar Tom van der Lee <tom@vanderlee.io>2022-02-12 11:33:52 +0100
commit871a85d9343cf49646d13dc455c062efadcb959a (patch)
tree7d36b14b237719901d71d58c88f74b87b875ee61 /src/components/RequestDetails
parent7c48533571e9f9d3731a59433a56cc8d6e008123 (diff)
downloadclient-871a85d9343cf49646d13dc455c062efadcb959a.tar.gz
client-871a85d9343cf49646d13dc455c062efadcb959a.tar.bz2
client-871a85d9343cf49646d13dc455c062efadcb959a.zip
Beatified codev1.3.0
Diffstat (limited to 'src/components/RequestDetails')
-rw-r--r--src/components/RequestDetails/RequestDetails.tsx159
1 files changed, 72 insertions, 87 deletions
diff --git a/src/components/RequestDetails/RequestDetails.tsx b/src/components/RequestDetails/RequestDetails.tsx
index 34e572c..693f691 100644
--- a/src/components/RequestDetails/RequestDetails.tsx
+++ b/src/components/RequestDetails/RequestDetails.tsx
@@ -1,94 +1,87 @@
1import * as React from "react"; 1import * as React from "react";
2import {useCallback, useMemo, useState} from "react"; 2import { useCallback, useMemo, useState } from "react";
3import {RequestResponse, Headers} from "../../hooks/useRequests"; 3import { RequestResponse, Headers } from "../../hooks/useRequests";
4import styles from "./RequestDetails.module.scss"; 4import styles from "./RequestDetails.module.scss";
5import RequestSummary from "../RequestSummary/RequestSummary"; 5import RequestSummary from "../RequestSummary/RequestSummary";
6import Content from "../Content/Content"; 6import Content from "../Content/Content";
7import {getHost} from "../../utils"; 7import { getHost } from "../../utils";
8import {Button, Card, Col, Container, Nav, Row, Table} from "react-bootstrap"; 8import { Button, Card, Col, Container, Nav, Row, Table } from "react-bootstrap";
9
10 9
11interface TimingProps { 10interface TimingProps {
12 timing: number; 11 timing: number;
13} 12}
14 13
15
16function Timing({ timing }: TimingProps) { 14function Timing({ timing }: TimingProps) {
17 const value = useMemo(() => (Math.round(timing * 1000) / 1000), [timing]); 15 const value = useMemo(() => Math.round(timing * 1000) / 1000, [timing]);
18 const showSeconds = useMemo(() => value > 1, [value]); 16 const showSeconds = useMemo(() => value > 1, [value]);
19 17
20 return !Number.isNaN(value) 18 return !Number.isNaN(value) ? (
21 ? ( 19 <>{`${showSeconds ? value : value * 1000}${showSeconds ? "s" : "ms"}`}</>
22 <> 20 ) : null;
23 {`${showSeconds ? value : value * 1000}${ showSeconds ? 's' : 'ms' }`}
24 </>
25 )
26 : null;
27} 21}
28 22
29interface HeadersProps { 23interface HeadersProps {
30 title: string 24 title: string;
31 headers: Headers 25 headers: Headers;
32} 26}
33 27
34function Headers({ title, headers }: HeadersProps) { 28function Headers({ title, headers }: HeadersProps) {
35 return ( 29 return (
36 <Card className="m-3"> 30 <Card className="m-3">
37 <Table 31 <Table striped responsive borderless hover className="mb-0">
38 striped 32 <thead>
39 responsive 33 <tr>
40 borderless 34 <th colSpan={2} className="bg-dark text-white rounded-top">
41 hover 35 {title}
42 className='mb-0' 36 </th>
43 > 37 </tr>
44 <thead> 38 </thead>
39 <tbody>
40 {headers.map(([key, value]) => (
45 <tr> 41 <tr>
46 <th colSpan={2} className="bg-dark text-white rounded-top">{ title }</th> 42 <td>{key}</td>
43 <td>{value}</td>
47 </tr> 44 </tr>
48 </thead> 45 ))}
49 <tbody> 46 </tbody>
50 { 47 </Table>
51 headers.map(([key, value]) => (
52 <tr>
53 <td>{key}</td>
54 <td>{value}</td>
55 </tr>
56 ))
57 }
58 </tbody>
59 </Table>
60 </Card> 48 </Card>
61 ) 49 );
62} 50}
63 51
64interface DetailsProps { 52interface DetailsProps {
65 requestResponse: RequestResponse | null 53 requestResponse: RequestResponse | null;
66} 54}
67 55
68type Tab = 'headers' | 'request' | 'response' 56type Tab = "headers" | "request" | "response";
69 57
70export default function RequestDetails({ requestResponse }: DetailsProps) { 58export default function RequestDetails({ requestResponse }: DetailsProps) {
71 const [tab, selectTab] = useState<Tab>('headers'); 59 const [tab, selectTab] = useState<Tab>("headers");
72 const [raw, setRaw] = useState(false); 60 const [raw, setRaw] = useState(false);
73 61
74 const resend = useCallback(async () => requestResponse !== null && fetch( 62 const resend = useCallback(
75 `http://${getHost()}/resend/`, 63 async () =>
76 { 64 requestResponse !== null &&
77 method: 'POST', 65 fetch(`http://${getHost()}/resend/`, {
78 body: JSON.stringify({ 66 method: "POST",
79 ...requestResponse.request, 67 body: JSON.stringify({
80 id: undefined 68 ...requestResponse.request,
81 }) 69 id: undefined,
82 } 70 }),
83 ), [requestResponse]); 71 }),
72 [requestResponse]
73 );
84 74
85 return requestResponse !== null ? ( 75 return requestResponse !== null ? (
86 <div className={styles.details}> 76 <div className={styles.details}>
87 <div className={styles.header}> 77 <div className={styles.header}>
88 <Row> 78 <Row>
89 <Col> 79 <Col>
90 <Container fluid style={{ fontSize: '1.5em' }} className="py-3"> 80 <Container fluid style={{ fontSize: "1.5em" }} className="py-3">
91 <RequestSummary requestResponse={requestResponse} className={styles.summary}/> 81 <RequestSummary
82 requestResponse={requestResponse}
83 className={styles.summary}
84 />
92 </Container> 85 </Container>
93 </Col> 86 </Col>
94 </Row> 87 </Row>
@@ -100,14 +93,10 @@ export default function RequestDetails({ requestResponse }: DetailsProps) {
100 onSelect={(tab) => selectTab(tab as Tab)} 93 onSelect={(tab) => selectTab(tab as Tab)}
101 > 94 >
102 <Nav.Item> 95 <Nav.Item>
103 <Nav.Link eventKey="headers"> 96 <Nav.Link eventKey="headers">Headers</Nav.Link>
104 Headers
105 </Nav.Link >
106 </Nav.Item> 97 </Nav.Item>
107 <Nav.Item> 98 <Nav.Item>
108 <Nav.Link eventKey="request"> 99 <Nav.Link eventKey="request">Request</Nav.Link>
109 Request
110 </Nav.Link>
111 </Nav.Item> 100 </Nav.Item>
112 <Nav.Item> 101 <Nav.Item>
113 <Nav.Link 102 <Nav.Link
@@ -121,46 +110,42 @@ export default function RequestDetails({ requestResponse }: DetailsProps) {
121 </Col> 110 </Col>
122 <Col className="border-bottom px-3 " xs="auto"> 111 <Col className="border-bottom px-3 " xs="auto">
123 <Timing timing={requestResponse.response?.timing ?? NaN} /> 112 <Timing timing={requestResponse.response?.timing ?? NaN} />
124 <Button variant="outline-primary" onClick={() => resend()} className="ms-3"> 113 <Button
114 variant="outline-primary"
115 onClick={() => resend()}
116 className="ms-3"
117 >
125 Resend 118 Resend
126 </Button> 119 </Button>
127 </Col> 120 </Col>
128 </Row> 121 </Row>
129 </div> 122 </div>
130 <div className={styles.content}> 123 <div className={styles.content}>
131 { 124 {tab === "headers" && (
132 tab === 'headers' && ( 125 <>
133 <> 126 <Headers
127 title="request headers"
128 headers={requestResponse.request.headers}
129 />
130 {requestResponse.response && (
134 <Headers 131 <Headers
135 title="request headers" 132 title="response headers"
136 headers={requestResponse.request.headers} 133 headers={requestResponse.response.headers}
137 /> 134 />
138 { 135 )}
139 requestResponse.response && ( 136 </>
140 <Headers