import React, { useContext } from "react"; type CellMeasurements = { width: number; height: number }; type MeasurementContextValue = { componentsHeightMap: React.RefObject; addComponentMeasurement: ( componentId: string, measurements: CellMeasurements ) => MeasurementContextValue["componentsHeightMap"]; }; const ReactContext = React.createContext({ componentsHeightMap: React.createRef(), addComponentMeasurement: () => ({ current: {} }), }); export function useMeasurementContext() { return useContext(ReactContext); } const Provider = ({ children }: { children: React.ReactNode }) => { const componentsHeightMap = React.useRef({}); const addComponentMeasurement = ( componentId: string, measurements: CellMeasurements ) => { componentsHeightMap.current[componentId] = measurements; return componentsHeightMap; }; const contextValue = React.useMemo( () => ({ componentsHeightMap, addComponentMeasurement }), [addComponentMeasurement] ); return ( {children} ); }; function withProvider(Component) { return function withProvider(props) { return ( ); }; } export const MeasurementContext = { withProvider, ReactContext };