tooltip-promo.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import Close from '@/shared/components/close'
  2. import useTutorial from '@/shared/hooks/promotions/use-tutorial'
  3. import { isSplitTestEnabled } from '@/utils/splitTestUtils'
  4. import classNames from 'classnames'
  5. import { useCallback, useEffect } from 'react'
  6. import { Overlay, OverlayProps, Popover } from 'react-bootstrap'
  7. /** @knipignore keep this file around even when there is no current promo using it */
  8. export default function TooltipPromotion({
  9. target,
  10. tutorialKey,
  11. eventData,
  12. className,
  13. content,
  14. header,
  15. placement = 'bottom',
  16. splitTestName,
  17. }: {
  18. target: HTMLElement | null
  19. tutorialKey: string
  20. eventData: Record<string, any>
  21. className?: string
  22. content: string
  23. header?: string
  24. placement?: OverlayProps['placement']
  25. splitTestName?: string
  26. }) {
  27. const {
  28. showPopup,
  29. tryShowingPopup,
  30. hideUntilReload,
  31. dismissTutorial,
  32. checkCompletion,
  33. } = useTutorial(tutorialKey, eventData)
  34. useEffect(() => {
  35. if (!checkCompletion()) {
  36. tryShowingPopup()
  37. }
  38. }, [tryShowingPopup, checkCompletion, tutorialKey])
  39. const isInSplitTestIfNeeded = splitTestName
  40. ? isSplitTestEnabled(splitTestName)
  41. : true
  42. const onHide = useCallback(() => {
  43. hideUntilReload()
  44. }, [hideUntilReload])
  45. const onDismiss = useCallback(() => {
  46. dismissTutorial()
  47. }, [dismissTutorial])
  48. if (!target || !isInSplitTestIfNeeded) {
  49. return null
  50. }
  51. return (
  52. <Overlay
  53. placement={placement}
  54. show={showPopup}
  55. target={target}
  56. rootClose
  57. onHide={onHide}
  58. >
  59. <Popover>
  60. {header && (
  61. <Popover.Header>
  62. {header}
  63. <Close variant="dark" onDismiss={onDismiss} />
  64. </Popover.Header>
  65. )}
  66. <Popover.Body className={classNames(className)}>
  67. {content}
  68. {!header && <Close variant="dark" onDismiss={onDismiss} />}
  69. </Popover.Body>
  70. </Popover>
  71. </Overlay>
  72. )
  73. }