Tooltip.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import React, { createRef } from 'react';
  2. import * as PopperJS from 'popper.js';
  3. import Popper from './Popper';
  4. import PopperController, { UsingPopperProps } from './PopperController';
  5. export enum Themes {
  6. Default = 'popper__background--default',
  7. Error = 'popper__background--error',
  8. Brand = 'popper__background--brand',
  9. }
  10. interface TooltipProps extends UsingPopperProps {
  11. theme?: Themes;
  12. }
  13. export const Tooltip = ({ children, theme, ...controllerProps }: TooltipProps) => {
  14. const tooltipTriggerRef = createRef<PopperJS.ReferenceObject>();
  15. const popperBackgroundClassName = 'popper__background' + (theme ? ' ' + theme : '');
  16. return (
  17. <PopperController {...controllerProps}>
  18. {(showPopper, hidePopper, popperProps) => {
  19. return (
  20. <>
  21. {tooltipTriggerRef.current && (
  22. <Popper
  23. {...popperProps}
  24. onMouseEnter={showPopper}
  25. onMouseLeave={hidePopper}
  26. referenceElement={tooltipTriggerRef.current}
  27. wrapperClassName='popper'
  28. className={popperBackgroundClassName}
  29. renderArrow={({ arrowProps, placement }) => (
  30. <div className="popper__arrow" data-placement={placement} {...arrowProps} />
  31. )}
  32. />
  33. )}
  34. {React.cloneElement(children, {
  35. ref: tooltipTriggerRef,
  36. onMouseEnter: showPopper,
  37. onMouseLeave: hidePopper,
  38. })}
  39. </>
  40. );
  41. }}
  42. </PopperController>
  43. );
  44. };