Files
twenty_crm/front/src/modules/ui/utilities/dimensions/components/ComputeNodeDimensions.tsx
Nimra Ahmed 0008c4b9d5 Fix UI components (#2771)
* fixes radio button's label (issue #2566)

* fixes entity title double text input's width (issue #2562)

* fixed checkmark placement on color scheme card

* fix failing CI Docs

* fixes computed node dimensions and color scheme card

* fix color scheme card background

* fix color scheme card background

* updated color scheme card docs

* Fix

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
2023-11-30 12:13:05 +01:00

53 lines
1.3 KiB
TypeScript

import { ReactNode, useLayoutEffect, useRef, useState } from 'react';
import styled from '@emotion/styled';
type ComputeNodeDimensionsProps = {
children: (
dimensions: { height: number; width: number } | undefined,
) => ReactNode;
node?: ReactNode;
};
const StyledNodeWrapper = styled.span`
pointer-events: none;
position: fixed;
visibility: hidden;
`;
export const ComputeNodeDimensions = ({
children,
node = children(undefined),
}: ComputeNodeDimensionsProps) => {
const nodeWrapperRef = useRef<HTMLSpanElement>(null);
const [nodeDimensions, setNodeDimensions] = useState<
| {
width: number;
height: number;
}
| undefined
>(undefined);
useLayoutEffect(() => {
if (!nodeWrapperRef.current) {
return;
}
const resizeObserver = new ResizeObserver(() => {
if (nodeWrapperRef.current) {
setNodeDimensions({
width: nodeWrapperRef.current.offsetWidth,
height: nodeWrapperRef.current.offsetHeight,
});
}
});
resizeObserver.observe(nodeWrapperRef.current);
return () => resizeObserver.disconnect();
}, [nodeWrapperRef]);
return (
<>
<StyledNodeWrapper ref={nodeWrapperRef}>{node}</StyledNodeWrapper>
{nodeDimensions && children(nodeDimensions)}
</>
);
};