index.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import React from "react";
  2. import toast from "react-hot-toast";
  3. import styled from "styled-components";
  4. import { useCopyToClipboard } from "usehooks-ts";
  5. import { Modal, ModalProps } from "src/components/Modal";
  6. import { Button } from "src/components/Button";
  7. import { compress } from "compress-json";
  8. import { useConfig } from "src/hocs/config";
  9. const StyledInput = styled.input`
  10. background: ${({ theme }) => theme.BACKGROUND_TERTIARY};
  11. color: ${({ theme }) => theme.INTERACTIVE_NORMAL};
  12. outline: none;
  13. border: none;
  14. border-radius: 4px;
  15. line-height: 32px;
  16. padding: 12px 8px;
  17. width: 100%;
  18. margin-bottom: 10px;
  19. height: 30px;
  20. `;
  21. export const ShareModal: React.FC<ModalProps> = ({ visible, setVisible }) => {
  22. const { json } = useConfig();
  23. const [url, setURL] = React.useState("");
  24. const [_, copy] = useCopyToClipboard();
  25. React.useEffect(() => {
  26. const jsonEncode = compress(JSON.parse(json));
  27. setURL(`https://jsonvisio.com/editor?json=${JSON.stringify(jsonEncode)}`);
  28. }, [json]);
  29. const handleShare = () => {
  30. copy(url);
  31. toast.success(`Link copied to clipboard.`);
  32. setVisible(false);
  33. };
  34. return (
  35. <Modal visible={visible} setVisible={setVisible}>
  36. <Modal.Header>Create a Share Link</Modal.Header>
  37. <Modal.Content>
  38. <StyledInput value={url} type="url" readOnly />
  39. </Modal.Content>
  40. <Modal.Controls setVisible={setVisible}>
  41. <Button status="SECONDARY" onClick={handleShare}>
  42. Copy
  43. </Button>
  44. </Modal.Controls>
  45. </Modal>
  46. );
  47. };