CopyButton.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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. import { useTranslation } from 'react-i18next';
  7. const CopyIcon = icons.copyExpression;
  8. const CopyButton: FC<CopyButtonProps> = props => {
  9. const { label, icon, className, value = '', ...others } = props;
  10. const classes = useStyles();
  11. const { t: commonTrans } = useTranslation();
  12. const copyTrans = commonTrans('copy');
  13. const [tooltipTitle, setTooltipTitle] = useState('Copy');
  14. const handleClick = (event: React.MouseEvent<HTMLElement>, v: string) => {
  15. event.stopPropagation();
  16. setTooltipTitle(copyTrans.copied);
  17. navigator.clipboard.writeText(v);
  18. setTimeout(() => {
  19. setTooltipTitle(copyTrans.copy);
  20. }, 1000);
  21. };
  22. return (
  23. <CustomIconButton
  24. tooltip={tooltipTitle}
  25. aria-label={label}
  26. className={`${classes.button} ${className}`}
  27. onClick={event => handleClick(event, value || '')}
  28. {...others}
  29. >
  30. {icon || <CopyIcon style={{ color: 'transparent' }} />}
  31. </CustomIconButton>
  32. );
  33. };
  34. CopyButton.displayName = 'CopyButton';
  35. const useStyles = makeStyles((theme: Theme) =>
  36. createStyles({
  37. root: {},
  38. button: {
  39. '& svg': {
  40. width: '16px',
  41. height: '16px',
  42. },
  43. },
  44. tooltip: {},
  45. })
  46. );
  47. export default CopyButton;