import { HTMLProps, ReactNode, useContext, useLayoutEffect, useRef } from "react"; import { Box, BoxProperties } from "./Box"; import { SizedConnectionContext } from "./SizedConnection"; import { ElementUtil } from "@web-package/utility"; import { DeepOmit } from "../types"; /** * This widget is used to imperatively resolve situations where, due to the lack of * dependencies, size changes and reflows do not occur based on certain elements * that perform independent layout calculations. * * Used with `SizedConnection` and `SizedSlaver` widgets. */ export function SizedMaster(props: DeepOmit) { const controller = useContext(SizedConnectionContext); const wrapperRef = useRef(null); console.assert( controller != null, "The `SizedConnection` component does not exist among the ancestor components of this `SizedMaster` component, " + "Therefore you need to insert a `SizedConnection` component into ancestor tree of the `SizedMaster` component." ); useLayoutEffect(() => { const wrapper = wrapperRef.current; const target = wrapper.firstElementChild as HTMLElement; // Called when a intrinsic and viewport size of an element changed. const observer = new ResizeObserver(() => { controller?.notifyListeners(ElementUtil.intrinsicSizeOf(target)); }); observer.observe(target, {box: "border-box"}); return () => observer.disconnect(); }, []); return }