CopyButton.tsx 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import React, { useState, FC } from 'react';
  2. import { makeStyles, Theme, createStyles } from '@material-ui/core';
  3. import { CopyButtonProps } from './Types';
  4. import icons from '../icons/Icons';
  5. import CustomIconButton from '../customButton/CustomIconButton';
  6. const CopyIcon = icons.copyExpression;
  7. const CopyButton: FC<CopyButtonProps> = props => {
  8. const {
  9. label = 'copy button',
  10. icon,
  11. className,
  12. value = '',
  13. ...others
  14. } = props;
  15. const classes = useStyles();
  16. const [tooltipTitle, setTooltipTitle] = useState('Copy');
  17. const handleClick = (v: string) => {
  18. setTooltipTitle('Copied!');
  19. navigator.clipboard.writeText(v);
  20. setTimeout(() => {
  21. setTooltipTitle('Copy');
  22. }, 1000);
  23. };
  24. return (
  25. <CustomIconButton
  26. tooltip={tooltipTitle}
  27. aria-label={label}
  28. className={`${classes.button} ${className}`}
  29. onClick={() => handleClick(value || '')}
  30. {...others}
  31. >
  32. {icon || <CopyIcon style={{ color: 'transparent' }} />}
  33. </CustomIconButton>
  34. );
  35. };
  36. CopyButton.displayName = 'CopyButton';
  37. const useStyles = makeStyles((theme: Theme) =>
  38. createStyles({
  39. root: {},
  40. button: {
  41. '& svg': {
  42. width: '16px',
  43. height: '16px',
  44. },
  45. },
  46. tooltip: {},
  47. })
  48. );
  49. export default CopyButton;