1- import React from "react" ;
2- import dynamic from "next/dynamic" ;
1+ import React , { useState , useEffect } from 'react' ;
2+ import dynamic from 'next/dynamic' ;
3+ import Tooltip from './tool-tip' ;
34
4- const DynamicReactJson = dynamic ( import ( " react-json-view" ) , { ssr : false } ) ;
5+ const DynamicReactJson = dynamic ( import ( ' react-json-view' ) , { ssr : false } ) ;
56
67function filterObject ( inputObject ) {
78 const unWantedProps = [
8- "uid" ,
9- "_version" ,
10- "ACL" ,
11- "_in_progress" ,
12- "created_at" ,
13- "created_by" ,
14- "updated_at" ,
15- "updated_by" ,
16- "publish_details" ,
9+ '_version' ,
10+ 'ACL' ,
11+ '_in_progress' ,
12+ 'created_at' ,
13+ 'created_by' ,
14+ 'updated_at' ,
15+ 'updated_by' ,
16+ 'publish_details' ,
1717 ] ;
1818 for ( const key in inputObject ) {
1919 unWantedProps . includes ( key ) && delete inputObject [ key ] ;
20- if ( typeof inputObject [ key ] !== " object" ) {
20+ if ( typeof inputObject [ key ] !== ' object' ) {
2121 continue ;
2222 }
2323 inputObject [ key ] = filterObject ( inputObject [ key ] ) ;
@@ -27,6 +27,19 @@ function filterObject(inputObject) {
2727
2828const DevTools = ( { response } ) => {
2929 const filteredJson = filterObject ( response ) ;
30+ const [ forceUpdate , setForceUpdate ] = useState ( 0 ) ;
31+
32+ function copyObject ( object ) {
33+ navigator . clipboard . writeText ( object ) ;
34+ setForceUpdate ( 1 ) ;
35+ }
36+
37+ useEffect ( ( ) => {
38+ if ( forceUpdate !== 0 ) {
39+ setTimeout ( ( ) => setForceUpdate ( 0 ) , 300 ) ;
40+ }
41+ } , [ forceUpdate ] ) ;
42+
3043 return (
3144 < div
3245 className = "modal fade"
@@ -36,13 +49,32 @@ const DevTools = ({ response }) => {
3649 tabIndex = "-1"
3750 aria-labelledby = "staticBackdropLabel"
3851 aria-hidden = "true"
52+ role = "dialog"
3953 >
40- < div className = "modal-dialog modal-lg" >
54+ < div
55+ className = "modal-dialog .modal-lg modal-dialog-centered modal-dialog-scrollable"
56+ role = "document"
57+ >
4158 < div className = "modal-content" >
4259 < div className = "modal-header" >
43- < h2 className = "modal-title" id = "staticBackdropLabel" >
44- Json Response
60+ < h2 className = "devtools- modal-title" id = "staticBackdropLabel" >
61+ JSON Preview
4562 </ h2 >
63+ < span
64+ className = "json-copy"
65+ onClick = { ( e ) => copyObject ( JSON . stringify ( filteredJson ) ) }
66+ aria-hidden = "true"
67+ >
68+ < Tooltip
69+ content = { forceUpdate === 0 ? 'Copy' : 'Copied' }
70+ direction = "top"
71+ dynamic
72+ delay = { 200 }
73+ status = { forceUpdate }
74+ >
75+ < img src = "/copy.svg" alt = "copy icon" />
76+ </ Tooltip >
77+ </ span >
4678 < button
4779 type = "button"
4880 className = "btn-close"
@@ -58,14 +90,25 @@ const DevTools = ({ response }) => {
5890 src = { filteredJson }
5991 collapsed = { 1 }
6092 name = "response"
93+ displayDataTypes = { false }
6194 enableClipboard = { false }
95+ style = { { color : '#C8501E' } }
6296 />
6397 ) }
6498 </ pre >
6599 ) : (
66- ""
100+ ''
67101 ) }
68102 </ div >
103+ < div className = "modal-footer" >
104+ < button
105+ type = "button"
106+ className = "btn tertiary-btn modal-btn"
107+ data-bs-dismiss = "modal"
108+ >
109+ Close
110+ </ button >
111+ </ div >
69112 </ div >
70113 </ div >
71114 </ div >
0 commit comments