clipboardTooltip.tsx 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import * as React from 'react';
  2. import styled from '@emotion/styled';
  3. import Clipboard from 'sentry/components/clipboard';
  4. import TextOverflow from 'sentry/components/textOverflow';
  5. import Tooltip from 'sentry/components/tooltip';
  6. import {IconCopy} from 'sentry/icons';
  7. import {t} from 'sentry/locale';
  8. import space from 'sentry/styles/space';
  9. type Props = Omit<React.ComponentProps<typeof Tooltip>, 'isHoverable' | 'title'> & {
  10. title: string;
  11. onSuccess?: () => void;
  12. };
  13. function ClipboardTooltip({title, onSuccess, ...props}: Props) {
  14. return (
  15. <Tooltip
  16. {...props}
  17. title={
  18. <TooltipClipboardWrapper
  19. onClick={event => {
  20. event.stopPropagation();
  21. }}
  22. >
  23. <TextOverflow>{title}</TextOverflow>
  24. <Clipboard value={title} onSuccess={onSuccess}>
  25. <TooltipClipboardIconWrapper>
  26. <IconCopy size="xs" aria-label={t('Copy to clipboard')} />
  27. </TooltipClipboardIconWrapper>
  28. </Clipboard>
  29. </TooltipClipboardWrapper>
  30. }
  31. isHoverable
  32. />
  33. );
  34. }
  35. export default ClipboardTooltip;
  36. const TooltipClipboardWrapper = styled('div')`
  37. display: grid;
  38. grid-template-columns: auto max-content;
  39. align-items: center;
  40. grid-gap: ${space(0.5)};
  41. `;
  42. const TooltipClipboardIconWrapper = styled('div')`
  43. pointer-events: auto;
  44. position: relative;
  45. bottom: -${space(0.25)};
  46. :hover {
  47. cursor: pointer;
  48. }
  49. `;