@atlaskit/editor-common
Version:
A package that contains common classes and components for editor and renderer
70 lines (68 loc) • 3.06 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useContainerWidth;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _react2 = require("@emotion/react");
var _widthDetector = require("@atlaskit/width-detector");
var _templateObject;
/** @jsx jsx */
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/**
*
* 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 = (0, _react2.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n position: relative;\n"])));
function useContainerWidth() {
var _useState = (0, _react.useState)(0),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
containerWidth = _useState2[0],
setContainerWidth = _useState2[1];
var ref = (0, _react.useRef)(null);
(0, _react.useEffect)(function () {
var current = ref.current;
if (ref && current) {
setContainerWidth(current.getBoundingClientRect().width);
}
}, [ref]);
var ContainerWidthMonitor = /*#__PURE__*/(0, _react.memo)(function () {
return (0, _react2.jsx)("div", {
css: widthObserverWrapper,
ref: ref,
tabIndex: -1
}, (0, _react2.jsx)(_widthDetector.WidthObserver, {
setWidth: setContainerWidth
}));
});
return {
containerWidth: containerWidth,
ContainerWidthMonitor: ContainerWidthMonitor
};
}