tooltip.tsx 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { cloneElement } from 'react'
  2. import {
  3. OverlayTrigger,
  4. OverlayTriggerProps,
  5. Tooltip as BSTooltip,
  6. } from 'react-bootstrap'
  7. import { callFnsInSequence } from '../../utils/functions'
  8. type OverlayProps = Omit<OverlayTriggerProps, 'overlay'> & {
  9. shouldUpdatePosition?: boolean // Not officially documented https://stackoverflow.com/a/43138470
  10. }
  11. export type TooltipProps = {
  12. description: React.ReactNode
  13. id: string
  14. overlayProps?: OverlayProps
  15. tooltipProps?: BSTooltip.TooltipProps
  16. hidden?: boolean
  17. children: React.ReactElement
  18. }
  19. function Tooltip({
  20. id,
  21. description,
  22. children,
  23. tooltipProps,
  24. overlayProps,
  25. hidden,
  26. }: TooltipProps) {
  27. const hideTooltip = (e: React.MouseEvent) => {
  28. if (e.currentTarget instanceof HTMLElement) {
  29. e.currentTarget.blur()
  30. }
  31. }
  32. return (
  33. <OverlayTrigger
  34. overlay={
  35. <BSTooltip
  36. id={`${id}-tooltip`}
  37. {...tooltipProps}
  38. style={{ display: hidden ? 'none' : 'block' }}
  39. >
  40. {description}
  41. </BSTooltip>
  42. }
  43. {...overlayProps}
  44. placement={overlayProps?.placement || 'top'}
  45. >
  46. {cloneElement(children, {
  47. onClick: callFnsInSequence(children.props.onClick, hideTooltip),
  48. })}
  49. </OverlayTrigger>
  50. )
  51. }
  52. export default Tooltip