tooltip.tsx 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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. children: React.ReactElement
  17. }
  18. function Tooltip({
  19. id,
  20. description,
  21. children,
  22. tooltipProps,
  23. overlayProps,
  24. }: TooltipProps) {
  25. const hideTooltip = (e: React.MouseEvent) => {
  26. if (e.currentTarget instanceof HTMLElement) {
  27. e.currentTarget.blur()
  28. }
  29. }
  30. return (
  31. <OverlayTrigger
  32. overlay={
  33. <BSTooltip id={`${id}-tooltip`} {...tooltipProps}>
  34. {description}
  35. </BSTooltip>
  36. }
  37. {...overlayProps}
  38. placement={overlayProps?.placement || 'top'}
  39. >
  40. {cloneElement(children, {
  41. onClick: callFnsInSequence(children.props.onClick, hideTooltip),
  42. })}
  43. </OverlayTrigger>
  44. )
  45. }
  46. export default Tooltip