UNPKG

@moxy/next-layout

Version:

Add persistent and nested layouts to your Next.js projects in a declarative way

107 lines (81 loc) 3.98 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _memoizeOne = _interopRequireDefault(require("memoize-one")); var _context = _interopRequireDefault(require("./util/context")); var _fullTree = _interopRequireDefault(require("./util/full-tree")); var _withLayout = require("./with-layout"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } const LayoutProvider = _context.default.Provider; class LayoutTree extends _react.PureComponent { constructor(...args) { super(...args); _defineProperty(this, "state", {}); _defineProperty(this, "updateLayoutTree", layoutTree => this.setState({ layoutTree })); _defineProperty(this, "getProviderValue", (0, _memoizeOne.default)((Component, pageKey) => ({ Component, pageKey, updateLayoutTree: this.updateLayoutTree }))); } static getDerivedStateFromProps(props, state) { const { Component, pageProps, pageKey } = props; const didPageChange = Component !== state.Component || pageKey !== state.pageKey; const layoutTree = didPageChange ? (0, _withLayout.getInitialLayoutTree)(Component, pageProps) : state.layoutTree; return { Component, pageKey, layoutTree }; } render() { const { defaultLayout, Component, pageProps, pageKey, children: render } = this.props; const { layoutTree } = this.state; // Do not forward pageKey if the component is not wrapped, otherwise it would cause // an error if props were spreaded into a DOM element: // "React does not recognize the `pageKey` prop on a DOM element". const isWrapped = (0, _withLayout.isComponentWrapped)(Component); const page = /*#__PURE__*/_react.default.createElement(Component, Object.assign({}, pageProps, isWrapped && { pageKey }, { key: pageKey })); const fullTree = (0, _fullTree.default)(layoutTree !== null && layoutTree !== void 0 ? layoutTree : defaultLayout, page); const providerValue = this.getProviderValue(Component, pageKey); return /*#__PURE__*/_react.default.createElement(LayoutProvider, { value: providerValue }, render(fullTree)); } } exports.default = LayoutTree; _defineProperty(LayoutTree, "propTypes", { Component: _propTypes.default.elementType.isRequired, pageProps: _propTypes.default.object, pageKey: _propTypes.default.string, defaultLayout: _propTypes.default.element, children: _propTypes.default.func }); _defineProperty(LayoutTree, "defaultProps", { children: rootNode => rootNode }); module.exports = exports.default;