소스 검색

copy object to clipboard on node double click

AykutSarac 2 년 전
부모
커밋
b5984dcdde
2개의 변경된 파일19개의 추가작업 그리고 4개의 파일을 삭제
  1. 18 1
      src/components/Graph/index.tsx
  2. 1 3
      src/containers/Modals/ShareModal/index.tsx

+ 18 - 1
src/components/Graph/index.tsx

@@ -10,12 +10,14 @@ import {
   EdgeData,
   EdgeData,
   ElkRoot,
   ElkRoot,
   NodeData,
   NodeData,
+  NodeProps,
 } from "reaflow";
 } from "reaflow";
 import { CustomNode } from "src/components/CustomNode";
 import { CustomNode } from "src/components/CustomNode";
 import { getEdgeNodes } from "src/containers/Editor/LiveEditor/helpers";
 import { getEdgeNodes } from "src/containers/Editor/LiveEditor/helpers";
 import useConfig from "src/hooks/store/useConfig";
 import useConfig from "src/hooks/store/useConfig";
 import styled from "styled-components";
 import styled from "styled-components";
 import shallow from "zustand/shallow";
 import shallow from "zustand/shallow";
+import toast from "react-hot-toast";
 
 
 interface GraphProps {
 interface GraphProps {
   json: string;
   json: string;
@@ -80,6 +82,16 @@ export const Graph: React.FC<GraphProps & CanvasContainerProps> = ({
       setSize({ width: layout.width, height: layout.height });
       setSize({ width: layout.width, height: layout.height });
   };
   };
 
 
+  const handleNodeClick = (
+    e: React.MouseEvent<SVGElement>,
+    props: NodeProps
+  ) => {
+    if (e.detail === 2) {
+      toast("Object copied to clipboard!");
+      navigator.clipboard.writeText(JSON.stringify(props.properties.text));
+    }
+  };
+
   return (
   return (
     <StyledEditorWrapper isWidget={isWidget}>
     <StyledEditorWrapper isWidget={isWidget}>
       <TransformWrapper
       <TransformWrapper
@@ -106,7 +118,12 @@ export const Graph: React.FC<GraphProps & CanvasContainerProps> = ({
             key={layout}
             key={layout}
             onCanvasClick={onCanvasClick}
             onCanvasClick={onCanvasClick}
             onLayoutChange={onLayoutChange}
             onLayoutChange={onLayoutChange}
-            node={CustomNode}
+            node={(props) => (
+              <CustomNode
+                onClick={(e) => handleNodeClick(e, props)}
+                {...props}
+              />
+            )}
             zoomable={false}
             zoomable={false}
             readonly
             readonly
             {...props}
             {...props}

+ 1 - 3
src/containers/Modals/ShareModal/index.tsx

@@ -1,7 +1,6 @@
 import React from "react";
 import React from "react";
 import toast from "react-hot-toast";
 import toast from "react-hot-toast";
 import styled from "styled-components";
 import styled from "styled-components";
-import { useCopyToClipboard } from "usehooks-ts";
 import { Modal, ModalProps } from "src/components/Modal";
 import { Modal, ModalProps } from "src/components/Modal";
 import { Button } from "src/components/Button";
 import { Button } from "src/components/Button";
 import { BiErrorAlt } from "react-icons/bi";
 import { BiErrorAlt } from "react-icons/bi";
@@ -46,7 +45,6 @@ const StyledContainer = styled.div`
 export const ShareModal: React.FC<ModalProps> = ({ visible, setVisible }) => {
 export const ShareModal: React.FC<ModalProps> = ({ visible, setVisible }) => {
   const json = useConfig((state) => state.json);
   const json = useConfig((state) => state.json);
   const [encodedJson, setEncodedJson] = React.useState("");
   const [encodedJson, setEncodedJson] = React.useState("");
-  const [_, copy] = useCopyToClipboard();
 
 
   const embedText = `<iframe src="https://jsonvisio.com/widget?json=${encodedJson}" width="512" height="384" style="border: 2px solid #b9bbbe; border-radius: 6px;"></iframe>`;
   const embedText = `<iframe src="https://jsonvisio.com/widget?json=${encodedJson}" width="512" height="384" style="border: 2px solid #b9bbbe; border-radius: 6px;"></iframe>`;
   const shareURL = `https://jsonvisio.com/editor?json=${encodedJson}`;
   const shareURL = `https://jsonvisio.com/editor?json=${encodedJson}`;
@@ -59,7 +57,7 @@ export const ShareModal: React.FC<ModalProps> = ({ visible, setVisible }) => {
   }, [json]);
   }, [json]);
 
 
   const handleShare = (value: string) => {
   const handleShare = (value: string) => {
-    copy(value);
+    navigator.clipboard.writeText(value);
     toast.success(`Link copied to clipboard.`);
     toast.success(`Link copied to clipboard.`);
     setVisible(false);
     setVisible(false);
   };
   };