From 060ae2d2a1bfd2c6d3ff192d98f1f23f683e4f97 Mon Sep 17 00:00:00 2001 From: StefanDjokovic Date: Sun, 6 Nov 2022 19:48:32 +0200 Subject: [PATCH 01/14] feat(devtools): add copy object data explorer --- .../react-query-devtools/src/Explorer.tsx | 38 +++++++++++++++++++ .../src/__tests__/Explorer.test.tsx | 1 + .../react-query-devtools/src/devtools.tsx | 1 + 3 files changed, 40 insertions(+) diff --git a/packages/react-query-devtools/src/Explorer.tsx b/packages/react-query-devtools/src/Explorer.tsx index bc55515ade..cbb8b4112d 100644 --- a/packages/react-query-devtools/src/Explorer.tsx +++ b/packages/react-query-devtools/src/Explorer.tsx @@ -29,6 +29,16 @@ export const ExpandButton = styled('button', { padding: 0, }) +export const CopyButton = styled('button', { + cursor: 'pointer', + color: 'inherit', + font: 'inherit', + outline: 'inherit', + background: 'transparent', + border: 'none', + padding: 0, +}) + export const Value = styled('span', (_props, theme) => ({ color: theme.danger, })) @@ -49,6 +59,11 @@ type ExpanderProps = { style?: React.CSSProperties } +type CopierProps = { + onClick: () => {} + style?: React.CSSProperties +} + export const Expander = ({ expanded, style = {} }: ExpanderProps) => ( ( ) +export const Copier = ({ onClick, style = {} }: CopierProps) => ( + + + + + +) + type Entry = { label: string } @@ -74,6 +103,7 @@ type RendererProps = { subEntryPages: Entry[][] type: string expanded: boolean + copiable: boolean toggleExpanded: () => void pageSize: number } @@ -108,6 +138,7 @@ export const DefaultRenderer: Renderer = ({ subEntryPages = [], type, expanded = false, + copiable = false, toggleExpanded, pageSize, }) => { @@ -124,6 +155,9 @@ export const DefaultRenderer: Renderer = ({ {subEntries.length} {subEntries.length > 1 ? `items` : `item`} + {copiable ? ( + navigator.clipboard.writeText(displayValue(value))} /> + ) : null} {expanded ? ( subEntryPages.length === 1 ? ( {subEntries.map(handleEntry)} @@ -166,6 +200,7 @@ export const DefaultRenderer: Renderer = ({ type ExplorerProps = Partial & { renderer?: Renderer defaultExpanded?: true | Record + copiable?: boolean, } type Property = { @@ -183,6 +218,7 @@ export default function Explorer({ defaultExpanded, renderer = DefaultRenderer, pageSize = 100, + copiable = false, ...rest }: ExplorerProps) { const [expanded, setExpanded] = React.useState(Boolean(defaultExpanded)) @@ -241,6 +277,7 @@ export default function Explorer({ key={entry.label} value={value} renderer={renderer} + copiable={copiable} {...rest} {...entry} /> @@ -250,6 +287,7 @@ export default function Explorer({ subEntryPages, value, expanded, + copiable, toggleExpanded, pageSize, ...rest, diff --git a/packages/react-query-devtools/src/__tests__/Explorer.test.tsx b/packages/react-query-devtools/src/__tests__/Explorer.test.tsx index 5cdccec1f6..20f2756ee0 100644 --- a/packages/react-query-devtools/src/__tests__/Explorer.test.tsx +++ b/packages/react-query-devtools/src/__tests__/Explorer.test.tsx @@ -38,6 +38,7 @@ describe('Explorer', () => { toggleExpanded={toggleExpanded} pageSize={10} expanded={false} + copiable={false} subEntryPages={[[{ label: 'A lovely label' }]]} handleEntry={() => <>} value={undefined} diff --git a/packages/react-query-devtools/src/devtools.tsx b/packages/react-query-devtools/src/devtools.tsx index 7d6d0fcc4e..abf797db04 100644 --- a/packages/react-query-devtools/src/devtools.tsx +++ b/packages/react-query-devtools/src/devtools.tsx @@ -966,6 +966,7 @@ const ActiveQuery = ({ label="Data" value={activeQueryState.data} defaultExpanded={{}} + copiable />
Date: Sun, 6 Nov 2022 22:00:13 +0200 Subject: [PATCH 02/14] fix: address code comments --- .../react-query-devtools/src/Explorer.tsx | 26 ++++++++----------- .../src/__tests__/Explorer.test.tsx | 2 +- .../react-query-devtools/src/devtools.tsx | 2 +- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/packages/react-query-devtools/src/Explorer.tsx b/packages/react-query-devtools/src/Explorer.tsx index cbb8b4112d..313345df40 100644 --- a/packages/react-query-devtools/src/Explorer.tsx +++ b/packages/react-query-devtools/src/Explorer.tsx @@ -60,7 +60,6 @@ type ExpanderProps = { } type CopierProps = { - onClick: () => {} style?: React.CSSProperties } @@ -77,17 +76,14 @@ export const Expander = ({ expanded, style = {} }: ExpanderProps) => ( ) -export const Copier = ({ onClick, style = {} }: CopierProps) => ( - ( + - + }} > - ) @@ -103,7 +99,7 @@ type RendererProps = { subEntryPages: Entry[][] type: string expanded: boolean - copiable: boolean + copyable: boolean toggleExpanded: () => void pageSize: number } @@ -138,7 +134,7 @@ export const DefaultRenderer: Renderer = ({ subEntryPages = [], type, expanded = false, - copiable = false, + copyable = false, toggleExpanded, pageSize, }) => { @@ -155,8 +151,8 @@ export const DefaultRenderer: Renderer = ({ {subEntries.length} {subEntries.length > 1 ? `items` : `item`} - {copiable ? ( - navigator.clipboard.writeText(displayValue(value))} /> + {copyable ? ( navigator.clipboard.writeText(JSON.stringify(value))} > + ) : null} {expanded ? ( subEntryPages.length === 1 ? ( @@ -200,7 +196,7 @@ export const DefaultRenderer: Renderer = ({ type ExplorerProps = Partial & { renderer?: Renderer defaultExpanded?: true | Record - copiable?: boolean, + copyable?: boolean, } type Property = { @@ -218,7 +214,7 @@ export default function Explorer({ defaultExpanded, renderer = DefaultRenderer, pageSize = 100, - copiable = false, + copyable = false, ...rest }: ExplorerProps) { const [expanded, setExpanded] = React.useState(Boolean(defaultExpanded)) @@ -277,7 +273,7 @@ export default function Explorer({ key={entry.label} value={value} renderer={renderer} - copiable={copiable} + copyable={copyable} {...rest} {...entry} /> @@ -287,7 +283,7 @@ export default function Explorer({ subEntryPages, value, expanded, - copiable, + copyable, toggleExpanded, pageSize, ...rest, diff --git a/packages/react-query-devtools/src/__tests__/Explorer.test.tsx b/packages/react-query-devtools/src/__tests__/Explorer.test.tsx index 20f2756ee0..08e91d09d4 100644 --- a/packages/react-query-devtools/src/__tests__/Explorer.test.tsx +++ b/packages/react-query-devtools/src/__tests__/Explorer.test.tsx @@ -38,7 +38,7 @@ describe('Explorer', () => { toggleExpanded={toggleExpanded} pageSize={10} expanded={false} - copiable={false} + copyable={false} subEntryPages={[[{ label: 'A lovely label' }]]} handleEntry={() => <>} value={undefined} diff --git a/packages/react-query-devtools/src/devtools.tsx b/packages/react-query-devtools/src/devtools.tsx index abf797db04..38ce21c99d 100644 --- a/packages/react-query-devtools/src/devtools.tsx +++ b/packages/react-query-devtools/src/devtools.tsx @@ -966,7 +966,7 @@ const ActiveQuery = ({ label="Data" value={activeQueryState.data} defaultExpanded={{}} - copiable + copyable />
Date: Sun, 6 Nov 2022 22:27:46 +0200 Subject: [PATCH 03/14] fix: add logs to investigate iframe copy issue --- .../react-query-devtools/src/Explorer.tsx | 70 ++++++++++++++++--- 1 file changed, 61 insertions(+), 9 deletions(-) diff --git a/packages/react-query-devtools/src/Explorer.tsx b/packages/react-query-devtools/src/Explorer.tsx index 313345df40..a967f9fca6 100644 --- a/packages/react-query-devtools/src/Explorer.tsx +++ b/packages/react-query-devtools/src/Explorer.tsx @@ -77,16 +77,51 @@ export const Expander = ({ expanded, style = {} }: ExpanderProps) => ( ) export const Copier = ({ style = {} }: CopierProps) => ( - + ) +export const Copied = ({ style = {} }: CopierProps) => ( + + + +) + type Entry = { label: string } @@ -139,6 +174,8 @@ export const DefaultRenderer: Renderer = ({ pageSize, }) => { const [expandedPages, setExpandedPages] = React.useState([]) + // TODO: shouldn't be here + const [copied, setCopied] = React.useState(false) return ( @@ -151,9 +188,24 @@ export const DefaultRenderer: Renderer = ({ {subEntries.length} {subEntries.length > 1 ? `items` : `item`} - {copyable ? ( navigator.clipboard.writeText(JSON.stringify(value))} > - - ) : null} + {copyable ? ( + + navigator.clipboard.writeText(JSON.stringify(value)).then( + // Adding logging on console to temporarily get data on why it's not working on the iframe + () => { + console.log('successfully copied') + setCopied(true) + }, + (err) => { + console.log('failed to copy', err) + }, + ) + } + > + {copied ? : } + + ) : null} {expanded ? ( subEntryPages.length === 1 ? ( {subEntries.map(handleEntry)} @@ -196,7 +248,7 @@ export const DefaultRenderer: Renderer = ({ type ExplorerProps = Partial & { renderer?: Renderer defaultExpanded?: true | Record - copyable?: boolean, + copyable?: boolean } type Property = { From ef04eddd6911b588d15831448efe7a7cc1c1f758 Mon Sep 17 00:00:00 2001 From: StefanDjokovic Date: Sun, 6 Nov 2022 22:41:05 +0200 Subject: [PATCH 04/14] feat: add checkmark on copy --- .../react-query-devtools/src/Explorer.tsx | 85 ++++++++++--------- 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/packages/react-query-devtools/src/Explorer.tsx b/packages/react-query-devtools/src/Explorer.tsx index a967f9fca6..c12cbb3787 100644 --- a/packages/react-query-devtools/src/Explorer.tsx +++ b/packages/react-query-devtools/src/Explorer.tsx @@ -29,15 +29,39 @@ export const ExpandButton = styled('button', { padding: 0, }) -export const CopyButton = styled('button', { - cursor: 'pointer', - color: 'inherit', - font: 'inherit', - outline: 'inherit', - background: 'transparent', - border: 'none', - padding: 0, -}) +export const CopyButton = ({ value }: { value: unknown}) => { + const [copied, setCopied] = React.useState(false); + + return ( + + ) +} export const Value = styled('span', (_props, theme) => ({ color: theme.danger, @@ -107,18 +131,18 @@ export const Copied = ({ style = {} }: CopierProps) => ( ...style, }} > - + ) @@ -174,8 +198,6 @@ export const DefaultRenderer: Renderer = ({ pageSize, }) => { const [expandedPages, setExpandedPages] = React.useState([]) - // TODO: shouldn't be here - const [copied, setCopied] = React.useState(false) return ( @@ -189,22 +211,7 @@ export const DefaultRenderer: Renderer = ({ {copyable ? ( - - navigator.clipboard.writeText(JSON.stringify(value)).then( - // Adding logging on console to temporarily get data on why it's not working on the iframe - () => { - console.log('successfully copied') - setCopied(true) - }, - (err) => { - console.log('failed to copy', err) - }, - ) - } - > - {copied ? : } - + ) : null} {expanded ? ( subEntryPages.length === 1 ? ( From 3101359a51f0a23fe181c93b9b2c2abb3eb068b6 Mon Sep 17 00:00:00 2001 From: StefanDjokovic Date: Mon, 7 Nov 2022 19:35:58 +0200 Subject: [PATCH 05/14] add: error state --- .../react-query-devtools/src/Explorer.tsx | 66 +++++++++++++------ 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/packages/react-query-devtools/src/Explorer.tsx b/packages/react-query-devtools/src/Explorer.tsx index c12cbb3787..4d8eae0235 100644 --- a/packages/react-query-devtools/src/Explorer.tsx +++ b/packages/react-query-devtools/src/Explorer.tsx @@ -29,22 +29,31 @@ export const ExpandButton = styled('button', { padding: 0, }) -export const CopyButton = ({ value }: { value: unknown}) => { - const [copied, setCopied] = React.useState(false); +enum CopyState { + NoCopy, + SuccessCopy, + ErrorCopy, +} + +export const CopyButton = ({ value }: { value: unknown }) => { + const [copyState, setCopyState] = React.useState(CopyState.NoCopy) return ( ) } @@ -109,7 +124,7 @@ export const Copier = ({ style = {} }: CopierProps) => ( ...style, }} > - + + + See console + + +) + export const Copied = ({ style = {} }: CopierProps) => ( ( ...style, }} > - ( ) -export const Copier = ({ style = {} }: CopierProps) => ( +export const Copier = () => ( - ) -export const Error = ({ style = {} }: CopierProps) => ( - ( + - + See console + + ) -export const Copied = ({ style = {} }: CopierProps) => ( +export const CopiedCopier = () => ( - ) -export const Copier = () => ( +const Copier = () => ( ( ) -export const ErrorCopier = () => ( - ( + ( See console - - ) -export const CopiedCopier = () => ( +const CopiedCopier = () => ( Date: Sat, 12 Nov 2022 11:37:40 +0200 Subject: [PATCH 11/14] prettier --- .../react-query-devtools/src/Explorer.tsx | 56 +++++++++++-------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/packages/react-query-devtools/src/Explorer.tsx b/packages/react-query-devtools/src/Explorer.tsx index b6783d2063..04871143fd 100644 --- a/packages/react-query-devtools/src/Explorer.tsx +++ b/packages/react-query-devtools/src/Explorer.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { displayValue, styled } from './utils' -import superjson from 'superjson'; +import superjson from 'superjson' export const Entry = styled('div', { fontFamily: 'Menlo, monospace', @@ -30,29 +30,33 @@ export const ExpandButton = styled('button', { padding: 0, }) -type CopyState = "NoCopy" | "SuccessCopy" | "ErrorCopy"; +type CopyState = 'NoCopy' | 'SuccessCopy' | 'ErrorCopy' export const CopyButton = ({ value }: { value: unknown }) => { - const [copyState, setCopyState] = React.useState("NoCopy") + const [copyState, setCopyState] = React.useState('NoCopy') return (