bigbuffet-rw/app/soapbox/components/ui/hoverable/hoverable.tsx
2022-04-01 13:31:08 -05:00

49 lines
1 KiB
TypeScript

import Portal from '@reach/portal';
import React, { useState, useRef } from 'react';
interface IHoverable {
component: React.Component,
}
/** Wrapper to render a given component when hovered */
const Hoverable: React.FC<IHoverable> = ({
component,
children,
}): JSX.Element => {
const [portalActive, setPortalActive] = useState(false);
const ref = useRef<HTMLDivElement>(null);
const handleMouseEnter = () => {
setPortalActive(true);
};
const handleMouseLeave = () => {
setPortalActive(false);
};
const setPortalPosition = (): React.CSSProperties => {
if (!ref.current) return {};
const { top, height, left, width } = ref.current.getBoundingClientRect();
return {
top: top + height,
left,
width,
};
};
return (
<div
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
ref={ref}
>
{children}
{portalActive && <Portal><div className='fixed' style={setPortalPosition()}>{component}</div></Portal>}
</div>
);
};
export default Hoverable;