summaryrefslogtreecommitdiffstats
path: root/src/hooks/useRequests.tsx
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/hooks/useRequests.tsx
parent7c48533571e9f9d3731a59433a56cc8d6e008123 (diff)
downloadclient-871a85d9343cf49646d13dc455c062efadcb959a.tar.gz
client-871a85d9343cf49646d13dc455c062efadcb959a.tar.bz2
client-871a85d9343cf49646d13dc455c062efadcb959a.zip
Beatified codev1.3.0
Diffstat (limited to 'src/hooks/useRequests.tsx')
-rw-r--r--src/hooks/useRequests.tsx145
1 files changed, 82 insertions, 63 deletions
diff --git a/src/hooks/useRequests.tsx b/src/hooks/useRequests.tsx
index c3fc2be..108232f 100644
--- a/src/hooks/useRequests.tsx
+++ b/src/hooks/useRequests.tsx
@@ -1,43 +1,43 @@
1import {useCallback, useEffect, useMemo, useState} from "react"; 1import { useCallback, useEffect, useMemo, useState } from "react";
2import {getHost} from "../utils"; 2import { getHost } from "../utils";
3 3
4export type Headers = [string, string][] 4export type Headers = [string, string][];
5export type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' 5export type Method = "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
6 6
7export interface RequestPayload { 7export interface RequestPayload {
8 id: string 8 id: string;
9 body: string 9 body: string;
10 headers: Headers 10 headers: Headers;
11 method: Method 11 method: Method;
12 path: string 12 path: string;
13} 13}
14 14
15interface Request { 15interface Request {
16 type: 'request', 16 type: "request";
17 payload: RequestPayload, 17 payload: RequestPayload;
18} 18}
19 19
20export interface ResponsePayload { 20export interface ResponsePayload {
21 id: string 21 id: string;
22 timing: number 22 timing: number;
23 body: string 23 body: string;
24 headers: Headers 24 headers: Headers;
25 status: number 25 status: number;
26} 26}
27 27
28interface Response { 28interface Response {
29 type: 'response', 29 type: "response";
30 payload: ResponsePayload, 30 payload: ResponsePayload;
31} 31}
32 32
33interface Historic { 33interface Historic {
34 type: 'historic' 34 type: "historic";
35 payload: (Request | Response)[] 35 payload: (Request | Response)[];
36} 36}
37 37
38export interface RequestResponse { 38export interface RequestResponse {
39 request: RequestPayload 39 request: RequestPayload;
40 response?: ResponsePayload 40 response?: ResponsePayload;
41} 41}
42 42
43export enum ReadyState { 43export enum ReadyState {
@@ -48,26 +48,28 @@ export enum ReadyState {
48} 48}
49 49
50export interface useRequestsProps { 50export interface useRequestsProps {
51 onConnect: () => Promise<void> 51 onConnect: () => Promise<void>;
52} 52}
53 53
54export interface UseRequests { 54export interface UseRequests {
55 calls: RequestResponse[] 55 calls: RequestResponse[];
56 readyState: ReadyState 56 readyState: ReadyState;
57 clear: () => void 57 clear: () => void;
58} 58}
59 59
60export default function useRequests({ onConnect }: useRequestsProps): UseRequests { 60export default function useRequests({
61 onConnect,
62}: useRequestsProps): UseRequests {
61 const wsHost = useMemo(getHost, []); 63 const wsHost = useMemo(getHost, []);
62 64
63 const [initialConnection, setInitialConnection] = useState(true); 65 const [initialConnection, setInitialConnection] = useState(true);
64 const [requests, setRequests] = useState<RequestPayload[]>([]); 66 const [requests, setRequests] = useState<RequestPayload[]>([]);
65 const [responses, setResponses] = useState<ResponsePayload[]>([]); 67 const [responses, setResponses] = useState<ResponsePayload[]>([]);
66 68
67 69 const connect = useCallback(
68 const connect = useCallback(() => ( 70 () => new WebSocket(`ws://${wsHost}/inspect/`),
69 new WebSocket(`ws://${wsHost}/inspect/`) 71 [wsHost]
70 ), [wsHost]); 72 );
71 73
72 const [ws, setWs] = useState<WebSocket>(() => connect()); 74 const [ws, setWs] = useState<WebSocket>(() => connect());
73 const [readyState, setReadyState] = useState<ReadyState>(ws.readyState); 75 const [readyState, setReadyState] = useState<ReadyState>(ws.readyState);
@@ -78,53 +80,70 @@ export default function useRequests({ onConnect }: useRequestsProps): UseRequest
78 const onClose = () => { 80 const onClose = () => {
79 setReadyState(ws.readyState); 81 setReadyState(ws.readyState);
80 setWs(connect()); 82 setWs(connect());
81 } 83 };
82 const onOpen = () => { 84 const onOpen = () => {
83 onConnect(); 85 onConnect();
84 setInitialConnection(false); 86 setInitialConnection(false);
85 setReadyState(ws.readyState); 87 setReadyState(ws.readyState);
86 } 88 };
87 const onMessage = ({ data }) => { 89 const onMessage = ({ data }) => {
88 const { type, payload } = JSON.parse(data) as Historic | Request | Response 90 const { type, payload } = JSON.parse(data) as
91 | Historic
92 | Request
93 | Response;
89 94
90 switch (type) { 95 switch (type) {
91 case 'historic': 96 case "historic":
92 if (initialConnection) { 97 if (initialConnection) {
93 const requests = (payload as (Request | Response)[]).filter(({ type }) => type === 'request'); 98 const requests = (payload as (Request | Response)[]).filter(
94 const responses = (payload as (Request | Response)[]).filter(({ type }) => type === 'response'); 99 ({ type }) => type === "request"
95 setRequests((rqs) => [...rqs, ...requests.map(({ payload }) => payload as RequestPayload)]); 100 );
96 setResponses((rps) => [...rps, ...responses.map(({ payload }) => payload as ResponsePayload)]); 101 const responses = (payload as (Request | Response)[]).filter(
102 ({ type }) => type === "response"
103 );
104 setRequests((rqs) => [
105 ...rqs,
106 ...requests.map(({ payload }) => payload as RequestPayload),
107 ]);
108 setResponses((rps) => [
109 ...rps,
110 ...responses.map(({ payload }) => payload as ResponsePayload),
111 ]);
97 } 112 }
98 break 113 break;
99 case 'request': 114 case "request":
100 setRequests((rqs) => [...rqs, payload as RequestPayload]) 115 setRequests((rqs) => [...rqs, payload as RequestPayload]);
101 break 116 break;
102 case 'response': 117 case "response":
103 setResponses((rps) => [...rps, payload as ResponsePayload]) 118 setResponses((rps) => [...rps, payload as ResponsePayload]);
104 break 119 break;
105 } 120 }
106 } 121 };
107 122
108 ws.addEventListener('message', onMessage) 123 ws.addEventListener("message", onMessage);
109 ws.addEventListener('close', onClose) 124 ws.addEventListener("close", onClose);
110 ws.addEventListener('open', onOpen) 125 ws.addEventListener("open", onOpen);
111 126
112 return () => { 127 return () => {
113 ws.removeEventListener('message', onMessage); 128 ws.removeEventListener("message", onMessage);
114 ws.removeEventListener('close', onClose); 129 ws.removeEventListener("close", onClose);
115 ws.removeEventListener('open', onOpen) 130 ws.removeEventListener("open", onOpen);
116 } 131 };
117 }, [ws]) 132 }, [ws]);
118 133
119 return { 134 return {
120 calls: useMemo<RequestResponse[]>(() => requests.map((request) => ({ 135 calls: useMemo<RequestResponse[]>(
121 request: request, 136 () =>
122 response: responses.find(({id}) => id === request.id) 137 requests.map((request) => ({
123 })), [requests, responses]), 138 request: request,
139 response: responses.find(({ id }) => id === request.id),
140 })),
141 [requests, responses]
142 ),
124 readyState, 143 readyState,
125 clear: () => { 144 clear: () => {
126 setRequests([]) 145 setRequests([]);
127 setResponses([]) 146 setResponses([]);
128 } 147 },
129 } 148 };
130} 149}