index.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import React from "react";
  2. import dynamic from "next/dynamic";
  3. import toast from "react-hot-toast";
  4. import { FiCopy } from "react-icons/fi";
  5. import { vscDarkPlus } from "react-syntax-highlighter/dist/cjs/styles/prism";
  6. import { vs } from "react-syntax-highlighter/dist/cjs/styles/prism";
  7. import { Button } from "src/components/Button";
  8. import { Modal } from "src/components/Modal";
  9. import useStored from "src/store/useStored";
  10. const SyntaxHighlighter = dynamic(
  11. () => import("react-syntax-highlighter/dist/esm/prism-async").then(c => c),
  12. {
  13. ssr: false,
  14. }
  15. );
  16. interface EdgeModalProps {
  17. selectedEdge: string;
  18. visible: boolean;
  19. closeModal: () => void;
  20. }
  21. export const EdgeModal = ({ selectedEdge, visible, closeModal }: EdgeModalProps) => {
  22. const lightmode = useStored(state => state.lightmode);
  23. const handleClipboard = () => {
  24. toast.success("Content copied to clipboard!");
  25. navigator.clipboard.writeText(selectedEdge);
  26. closeModal();
  27. };
  28. return (
  29. <Modal visible={visible} setVisible={closeModal}>
  30. <Modal.Header>Edge Content</Modal.Header>
  31. <Modal.Content>
  32. <SyntaxHighlighter
  33. style={lightmode ? vs : vscDarkPlus}
  34. customStyle={{
  35. borderRadius: "4px",
  36. fontSize: "14px",
  37. margin: "0",
  38. }}
  39. language="javascript"
  40. >
  41. {selectedEdge}
  42. </SyntaxHighlighter>
  43. </Modal.Content>
  44. <Modal.Controls setVisible={closeModal}>
  45. <Button status="SECONDARY" onClick={handleClipboard}>
  46. <FiCopy size={18} /> Clipboard
  47. </Button>
  48. </Modal.Controls>
  49. </Modal>
  50. );
  51. };