index.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React, { useState } from 'react'
  4. import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem'
  5. export type TooltipProps = {
  6. position?: 'top' | 'right' | 'bottom' | 'left'
  7. triggerMethod?: 'hover' | 'click'
  8. popupContent: React.ReactNode
  9. children: React.ReactNode
  10. hideArrow?: boolean
  11. }
  12. const arrow = (
  13. <svg className="absolute text-white h-2 w-full left-0 top-full" x="0px" y="0px" viewBox="0 0 255 255"><polygon className="fill-current" points="0,0 127.5,127.5 255,0"></polygon></svg>
  14. )
  15. const Tooltip: FC<TooltipProps> = ({
  16. position = 'top',
  17. triggerMethod = 'hover',
  18. popupContent,
  19. children,
  20. hideArrow,
  21. }) => {
  22. const [open, setOpen] = useState(false)
  23. return (
  24. <PortalToFollowElem
  25. open={open}
  26. onOpenChange={setOpen}
  27. placement={position}
  28. offset={10}
  29. >
  30. <PortalToFollowElemTrigger
  31. onClick={() => triggerMethod === 'click' && setOpen(v => !v)}
  32. onMouseEnter={() => triggerMethod === 'hover' && setOpen(true)}
  33. onMouseLeave={() => triggerMethod === 'hover' && setOpen(false)}
  34. >
  35. {children}
  36. </PortalToFollowElemTrigger>
  37. <PortalToFollowElemContent
  38. className="z-[9999]"
  39. >
  40. <div className='relative px-3 py-2 text-xs font-normal text-gray-700 bg-white rounded-md shadow-lg'>
  41. {popupContent}
  42. {!hideArrow && arrow}
  43. </div>
  44. </PortalToFollowElemContent>
  45. </PortalToFollowElem>
  46. )
  47. }
  48. export default React.memo(Tooltip)