-
Notifications
You must be signed in to change notification settings - Fork 2.4k
Expand file tree
/
Copy pathevent-view.tsx
More file actions
97 lines (86 loc) · 3.54 KB
/
Copy pathevent-view.tsx
File metadata and controls
97 lines (86 loc) · 3.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import { PREVIEW_MODE_FRIENDLY, PREVIEW_MODE_RAW, PREVIEW_MODE_SOURCE } from 'insomnia-data/common';
import React, { type FC, useCallback, useRef } from 'react';
import { useParams } from 'react-router';
import { utf8StringFromBytes } from '~/common/utils/utf8-bytes';
import { CodeEditor, type CodeEditorHandle } from '~/ui/components/.client/codemirror/code-editor';
import type { CurlEvent, CurlMessageEvent } from '../../../main/network/curl';
import type { SocketIOEvent } from '../../../main/network/socket-io';
import type { WebSocketEvent, WebSocketMessageEvent } from '../../../main/network/websocket';
import { useRequestLoaderData } from '../../../routes/organization.$organizationId.project.$projectId.workspace.$workspaceId.debug.request.$requestId';
import { useRequestMetaPatcher } from '../../hooks/use-request';
import { WebSocketPreviewModeDropdown } from './websocket-preview-dropdown';
interface Props<T> {
event: T;
}
export const MessageEventView: FC<Props<CurlMessageEvent | WebSocketMessageEvent>> = ({ event }) => {
const { requestId } = useParams() as { requestId: string };
const editorRef = useRef<CodeEditorHandle>(null);
let raw = event.data.toString();
// Best effort to parse the binary data as a string
try {
if ('data' in event && typeof event.data === 'object' && 'data' in event.data && Array.isArray(event.data.data)) {
raw = utf8StringFromBytes(new Uint8Array(event.data.data));
}
} catch (err) {
console.error('Failed to parse event data to string, defaulting to JSON.stringify', err);
raw = JSON.stringify(event.data);
}
const handleDownloadResponseBody = useCallback(async () => {
const { canceled, filePath: outputPath } = await window.dialog.showSaveDialog({
title: 'Save Response Body',
buttonLabel: 'Save',
});
if (canceled || !outputPath) {
return;
}
await window.main.writeFile({
path: outputPath,
content: raw,
});
}, [raw]);
const handleCopyResponseToClipboard = useCallback(() => {
window.clipboard.writeText(raw);
}, [raw]);
const patchRequestMeta = useRequestMetaPatcher();
let pretty = raw;
try {
const parsed = JSON.parse(raw);
pretty = JSON.stringify(parsed, null, '\t');
} catch {
// Can't parse as JSON.
}
const { activeRequestMeta } = useRequestLoaderData()!;
const previewMode = ('previewMode' in activeRequestMeta && activeRequestMeta.previewMode) || PREVIEW_MODE_SOURCE;
return (
<div className="flex h-full flex-col">
<div className="box-border flex h-8 items-center border-b border-(--hl-sm) p-2">
<WebSocketPreviewModeDropdown
download={handleDownloadResponseBody}
copyToClipboard={handleCopyResponseToClipboard}
previewMode={previewMode}
setPreviewMode={previewMode => {
patchRequestMeta(requestId, { previewMode });
editorRef.current?.setValue(previewMode === PREVIEW_MODE_FRIENDLY ? pretty : raw);
}}
/>
</div>
<div className="grow p-4 pb-0">
<CodeEditor
id="websocket-body-preview"
hideLineNumbers
mode={previewMode === PREVIEW_MODE_RAW ? 'text/plain' : 'text/json'}
defaultValue={previewMode === PREVIEW_MODE_FRIENDLY ? pretty : raw}
historyKey={event._id}
ref={editorRef}
readOnly
/>
</div>
</div>
);
};
export const EventView: FC<Props<CurlEvent | WebSocketEvent | SocketIOEvent>> = ({ event }) => {
if (event.type === 'message') {
return <MessageEventView event={event} />;
}
return null;
};