@atlaskit/editor-common
Version:
A package that contains common classes and components for editor and renderer
66 lines (63 loc) • 1.78 kB
JavaScript
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
/**
* @jsxRuntime classic
* @jsx jsx
*/
import React, { memo, useEffect, useRef, useState } from 'react';
// eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
import { css, jsx } from '@emotion/react';
import { WidthObserver } from '@atlaskit/width-detector';
/**
*
* Problem:
* While using WidthObserver, there's no initial width.
* That may cause problems, but not limited to, something like a lag between
* renders for conditionally rendered components.
*
* solution:
* useContainerWidth() hook
* it pre-measures the width of a parent container on initial mount
* and gives you back the containerWidth.
*
*
* Example hook usage:
*
* const { containerWidth, ContainerWidthMonitor } = useContainerWidth();
*
* return (
* <>
* <ContainerWidthMonitor />
* {containerWidth < 600 ? <MobileComponent /> : <DesktopComponent />}
* </>
* );
*
*/
var widthObserverWrapper = css({
position: 'relative'
});
export default function useContainerWidth() {
var _useState = useState(0),
_useState2 = _slicedToArray(_useState, 2),
containerWidth = _useState2[0],
setContainerWidth = _useState2[1];
var ref = useRef(null);
useEffect(function () {
var current = ref.current;
if (ref && current) {
setContainerWidth(current.getBoundingClientRect().width);
}
}, [ref]);
var ContainerWidthMonitor = /*#__PURE__*/memo(function () {
return jsx("div", {
css: widthObserverWrapper,
ref: ref,
tabIndex: -1
}, jsx(WidthObserver, {
setWidth: setContainerWidth
}));
});
return {
containerWidth: containerWidth,
ContainerWidthMonitor: ContainerWidthMonitor
};
}