Tooltip.tsx 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  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. interface TooltipProps extends UsingPopperProps {
  6. theme?: 'info' | 'error';
  7. }
  8. export const Tooltip = ({ children, theme, ...controllerProps }: TooltipProps) => {
  9. const tooltipTriggerRef = createRef<PopperJS.ReferenceObject>();
  10. const popperBackgroundClassName = 'popper__background' + (theme ? ' popper__background--' + theme : '');
  11. return (
  12. <PopperController {...controllerProps}>
  13. {(showPopper, hidePopper, popperProps) => {
  14. return (
  15. <>
  16. {tooltipTriggerRef.current && (
  17. <Popper
  18. {...popperProps}
  19. onMouseEnter={showPopper}
  20. onMouseLeave={hidePopper}
  21. referenceElement={tooltipTriggerRef.current}
  22. wrapperClassName="popper"
  23. className={popperBackgroundClassName}
  24. renderArrow={({ arrowProps, placement }) => (
  25. <div className="popper__arrow" data-placement={placement} {...arrowProps} />
  26. )}
  27. />
  28. )}
  29. {React.cloneElement(children, {
  30. ref: tooltipTriggerRef,
  31. onMouseEnter: showPopper,
  32. onMouseLeave: hidePopper,
  33. })}
  34. </>
  35. );
  36. }}
  37. </PopperController>
  38. );
  39. };