From 11207f70bbd3f08209027808a89906c9ad9c1a42 Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Fri, 27 Sep 2024 19:10:15 +0200 Subject: [PATCH] fix(ui): turn "copy as fetch" into text button --- .../trace-viewer/src/ui/copyToClipboard.css | 25 ++++++++++++++ .../trace-viewer/src/ui/copyToClipboard.tsx | 33 +++++++++++++++++++ .../src/ui/networkResourceDetails.css | 4 --- .../src/ui/networkResourceDetails.tsx | 11 +++---- 4 files changed, 63 insertions(+), 10 deletions(-) create mode 100644 packages/trace-viewer/src/ui/copyToClipboard.css diff --git a/packages/trace-viewer/src/ui/copyToClipboard.css b/packages/trace-viewer/src/ui/copyToClipboard.css new file mode 100644 index 0000000000..14cb477939 --- /dev/null +++ b/packages/trace-viewer/src/ui/copyToClipboard.css @@ -0,0 +1,25 @@ +/* + Copyright (c) Microsoft Corporation. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +.copy-to-clipboard-text-button { + background-color: var(--vscode-editor-inactiveSelectionBackground); + border: none; + margin: 8px 8px 8px 0px; + width: 120px; + cursor: pointer; + display: inline-block; + text-align: center; +} \ No newline at end of file diff --git a/packages/trace-viewer/src/ui/copyToClipboard.tsx b/packages/trace-viewer/src/ui/copyToClipboard.tsx index 301be3dd03..768e603367 100644 --- a/packages/trace-viewer/src/ui/copyToClipboard.tsx +++ b/packages/trace-viewer/src/ui/copyToClipboard.tsx @@ -16,6 +16,7 @@ import * as React from 'react'; import { ToolbarButton } from '@web/components/toolbarButton'; +import './copyToClipboard.css'; export const CopyToClipboard: React.FunctionComponent<{ value: string | (() => Promise), @@ -34,8 +35,40 @@ export const CopyToClipboard: React.FunctionComponent<{ }, () => { setIcon('close'); }); + }, () => { + setIcon('close'); }); }, [value]); return ; }; + +export const CopyToClipboardTextButton: React.FunctionComponent<{ + value: string | (() => Promise), + description: string, +}> = ({ value, description }) => { + const [copied, setCopied] = React.useState(); + + const handleCopy = React.useCallback(() => { + const valuePromise = typeof value === 'function' ? value() : Promise.resolve(value); + valuePromise.then(value => { + navigator.clipboard.writeText(value).then(() => { + setCopied(true); + setTimeout(() => { + setCopied(undefined); + }, 3000); + }, () => { + setCopied(false); + }); + }, () => { + setCopied(false); + }); + + }, [value]); + + return + {copied === true && 'Copied!'} + {copied === false && 'Copy failed.'} + {copied === undefined && description} + ; +}; diff --git a/packages/trace-viewer/src/ui/networkResourceDetails.css b/packages/trace-viewer/src/ui/networkResourceDetails.css index ac1245f70d..3c726c2f26 100644 --- a/packages/trace-viewer/src/ui/networkResourceDetails.css +++ b/packages/trace-viewer/src/ui/networkResourceDetails.css @@ -54,10 +54,6 @@ margin-left: 10px; } -.network-request-details-copy button { - border-radius: 4px -} - .network-font-preview { font-family: font-preview; font-size: 30px; diff --git a/packages/trace-viewer/src/ui/networkResourceDetails.tsx b/packages/trace-viewer/src/ui/networkResourceDetails.tsx index 1f9fcc4581..7fe5c7f732 100644 --- a/packages/trace-viewer/src/ui/networkResourceDetails.tsx +++ b/packages/trace-viewer/src/ui/networkResourceDetails.tsx @@ -21,7 +21,7 @@ import { TabbedPane } from '@web/components/tabbedPane'; import { CodeMirrorWrapper } from '@web/components/codeMirrorWrapper'; import { ToolbarButton } from '@web/components/toolbarButton'; import { generateCurlCommand, generateFetchCall } from '../third_party/devtools'; -import { CopyToClipboard } from './copyToClipboard'; +import { CopyToClipboardTextButton } from './copyToClipboard'; export const NetworkResourceDetails: React.FunctionComponent<{ resource: ResourceSnapshot; @@ -92,13 +92,12 @@ const RequestTab: React.FunctionComponent<{ : null}
Request Headers
{resource.request.headers.map(pair => `${pair.name}: ${pair.value}`).join('\n')}
-
Copy Request
+
- As cURL: generateCurlCommand(resource)}/> -
-
- As Fetch: generateFetchCall(resource)}/> + generateCurlCommand(resource)} /> + generateFetchCall(resource)} />
+ {requestBody &&
Request Body
} {requestBody && } ;