diff options
| author | 2024-08-30 15:47:20 +0200 | |
|---|---|---|
| committer | 2024-08-30 15:47:20 +0200 | |
| commit | fe61544bafafc8b4de78cc71cb641af2dfb7b72d (patch) | |
| tree | 7edff48c1638fcc26915dc1f40982ec2563cf3bf /src/components/RequestDetails/RequestDetails.tsx | |
| parent | f183536067dc694f37445148c15821f1621f5034 (diff) | |
| parent | 2f2048160fac06e94703bb03eea43185fc01f76c (diff) | |
| download | client-fe61544bafafc8b4de78cc71cb641af2dfb7b72d.tar.gz client-fe61544bafafc8b4de78cc71cb641af2dfb7b72d.tar.bz2 client-fe61544bafafc8b4de78cc71cb641af2dfb7b72d.zip | |
Merge pull request #15 from tomvanderlee/feature/websocketsv2.1.0
Feature/websockets
Diffstat (limited to 'src/components/RequestDetails/RequestDetails.tsx')
| -rw-r--r-- | src/components/RequestDetails/RequestDetails.tsx | 82 |
1 files changed, 51 insertions, 31 deletions
diff --git a/src/components/RequestDetails/RequestDetails.tsx b/src/components/RequestDetails/RequestDetails.tsx index f34ef6f..22b3fe2 100644 --- a/src/components/RequestDetails/RequestDetails.tsx +++ b/src/components/RequestDetails/RequestDetails.tsx | |||
| @@ -1,11 +1,13 @@ | |||
| 1 | import * as React from "react"; | 1 | import * as React from "react"; |
| 2 | import { useCallback, useMemo, useState } from "react"; | 2 | import { useCallback, useContext, useMemo, useState } from "react"; |
| 3 | import { Headers, RequestResponse } from "~/hooks/useRequests"; | ||
| 4 | import styles from "~/components/RequestDetails/RequestDetails.module.scss"; | 3 | import styles from "~/components/RequestDetails/RequestDetails.module.scss"; |
| 5 | import RequestSummary from "~/components/RequestSummary/RequestSummary"; | 4 | import RequestSummary from "~/components/RequestSummary/RequestSummary"; |
| 6 | import Content from "~/components/Content/Content"; | 5 | import Content from "~/components/Content/Content"; |
| 7 | import { getHost } from "~/utils"; | 6 | import { getHost } from "~/utils"; |
| 8 | import { Button, Card, Col, Container, Nav, Row, Table } from "react-bootstrap"; | 7 | import { Button, Card, Col, Container, Nav, Row, Table } from "react-bootstrap"; |
| 8 | import { Call, Headers, selectedCall } from "~/types"; | ||
| 9 | import { ConnectionContext } from "~/contexts/Connection"; | ||
| 10 | import Frames from "~/components/Frames/Frames"; | ||
| 9 | 11 | ||
| 10 | interface TimingProps { | 12 | interface TimingProps { |
| 11 | timing: number; | 13 | timing: number; |
| @@ -49,37 +51,35 @@ function HeaderTable({ title, headers }: HeaderTableProps) { | |||
| 49 | ); | 51 | ); |
| 50 | } | 52 | } |
| 51 | 53 | ||
| 52 | interface DetailsProps { | 54 | type Tab = "headers" | "request" | "response" | "messages"; |
| 53 | requestResponse: RequestResponse | null; | ||
| 54 | } | ||
| 55 | 55 | ||
| 56 | type Tab = "headers" | "request" | "response"; | 56 | export default function RequestDetails() { |
| 57 | const { selectedCall } = useContext(ConnectionContext); | ||
| 57 | 58 | ||
| 58 | export default function RequestDetails({ requestResponse }: DetailsProps) { | ||
| 59 | const [tab, selectTab] = useState<Tab>("headers"); | 59 | const [tab, selectTab] = useState<Tab>("headers"); |
| 60 | const [raw, setRaw] = useState(false); | 60 | const [raw, setRaw] = useState(false); |
| 61 | 61 | ||
| 62 | const resend = useCallback( | 62 | const resend = useCallback( |
| 63 | async () => | 63 | async () => |
| 64 | requestResponse !== null && | 64 | selectedCall !== null && |
| 65 | fetch(`http://${getHost()}/resend/`, { | 65 | fetch(`http://${getHost()}/resend/`, { |
| 66 | method: "POST", | 66 | method: "POST", |
| 67 | body: JSON.stringify({ | 67 | body: JSON.stringify({ |
| 68 | ...requestResponse.request, | 68 | ...selectedCall.request, |
| 69 | id: undefined, | 69 | id: undefined, |
| 70 | }), | 70 | }), |
| 71 | }), | 71 | }), |
| 72 | [requestResponse] | 72 | [selectedCall] |
| 73 | ); | 73 | ); |
| 74 | 74 | ||
| 75 | return requestResponse !== null ? ( | 75 | return selectedCall !== null ? ( |
| 76 | <div className={styles.details}> | 76 | <div className={styles.details}> |
| 77 | <div className={styles.header}> | 77 | <div className={styles.header}> |
| 78 | <Row> | 78 | <Row> |
| 79 | <Col> | 79 | <Col> |
| 80 | <Container fluid style={{ fontSize: "1.5em" }} className="py-3"> | 80 | <Container fluid style={{ fontSize: "1.5em" }} className="py-3"> |
| 81 | <RequestSummary | 81 | <RequestSummary |
| 82 | requestResponse={requestResponse} | 82 | requestResponse={selectedCall} |
| 83 | className={styles.summary} | 83 | className={styles.summary} |
| 84 | /> | 84 | /> |
| 85 | </Container> | 85 | </Container> |
| @@ -98,18 +98,29 @@ export default function RequestDetails({ requestResponse }: DetailsProps) { | |||
| 98 | <Nav.Item> | 98 | <Nav.Item> |
| 99 | <Nav.Link eventKey="request">Request</Nav.Link> | 99 | <Nav.Link eventKey="request">Request</Nav.Link> |
| 100 | </Nav.Item> | 100 | </Nav.Item> |
| 101 | <Nav.Item> | 101 | {selectedCall.type === "RequestResponse" && ( |
| 102 | <Nav.Link | 102 | <> |
| 103 | eventKey="response" | 103 | <Nav.Item> |
| 104 | disabled={requestResponse.response === undefined} | 104 | <Nav.Link |
| 105 | > | 105 | eventKey="response" |
| 106 | Response | 106 | disabled={selectedCall.response === undefined} |
| 107 | </Nav.Link> | 107 | > |
| 108 | </Nav.Item> | 108 | Response |
| 109 | </Nav.Link> | ||
| 110 | </Nav.Item> | ||
| 111 | </> | ||
| 112 | )} | ||
| 113 | {selectedCall.type === "WebsocketConnection" && ( | ||
| 114 | <> | ||
| 115 | <Nav.Item> | ||
| 116 | <Nav.Link eventKey="response">Messages</Nav.Link> | ||
| 117 | </Nav.Item> | ||
| 118 | </> | ||
| 119 | )} | ||
| 109 | </Nav> | 120 | </Nav> |
| 110 | </Col> | 121 | </Col> |
| 111 | <Col className="border-bottom px-3 " xs="auto"> | 122 | <Col className="border-bottom px-3 " xs="auto"> |
| 112 | <Timing timing={requestResponse.response?.timing ?? NaN} /> | 123 | <Timing timing={selectedCall.response?.timing ?? NaN} /> |
| 113 | <Button | 124 | <Button |
| 114 | variant="outline-primary" | 125 | variant="outline-primary" |
| 115 | onClick={() => resend()} | 126 | onClick={() => resend()} |
| @@ -125,21 +136,30 @@ export default function RequestDetails({ requestResponse }: DetailsProps) { | |||
| 125 | <> | 136 | <> |
| 126 | <HeaderTable | 137 | <HeaderTable |
| 127 | title="request headers" | 138 | title="request headers" |
| 128 | headers={requestResponse.request.headers} | 139 | headers={selectedCall.request.headers} |
| 129 | /> | 140 | /> |
| 130 | {requestResponse.response && ( | 141 | |
| 131 | <HeaderTable | 142 | {selectedCall.type === "RequestResponse" && |
| 132 | title="response headers" | 143 | selectedCall.response !== undefined && ( |
| 133 | headers={requestResponse.response.headers} | 144 | <HeaderTable |
| 134 | /> | 145 | title="response headers" |
| 135 | )} | 146 | headers={selectedCall.response.headers} |
| 147 | /> | ||
| 148 | )} | ||
| 136 | </> | 149 | </> |
| 137 | )} | 150 | )} |
| 138 | {tab === "request" && ( | 151 | {tab === "request" && ( |
| 139 | <Content data={requestResponse.request} raw={raw} setRaw={setRaw} /> | 152 | <Content data={selectedCall.request} raw={raw} setRaw={setRaw} /> |
| 140 | )} | 153 | )} |
| 141 | {tab === "response" && requestResponse.response !== undefined && ( | 154 | {selectedCall.type === "RequestResponse" && |
| 142 | <Content data={requestResponse.response} raw={raw} setRaw={setRaw} /> | 155 | tab === "response" && |
| 156 | selectedCall.response !== undefined && ( | ||
| 157 | <Content data={selectedCall.response} raw={raw} setRaw={setRaw} /> | ||
| 158 | )} | ||
| 159 | {selectedCall.type === "WebsocketConnection" && tab === "response" && ( | ||
| 160 | <Frames frames={selectedCall.frames} /> | ||
| 161 | // <Content data={selectedCall.frames} raw={false} setRaw={setRaw} /> | ||
| 162 | // <pre>{JSON.stringify(selectedCall.frames, undefined, 2)}</pre> | ||
| 143 | )} | 163 | )} |
| 144 | </div> | 164 | </div> |
| 145 | </div> | 165 | </div> |
