@blaze-cms/nextjs-tools 0.146.0-node18-tooltips.32 → 0.146.0-node18-tooltips.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/lib/components/HashObserver.js +15 -0
- package/lib/components/HashObserver.js.map +1 -0
- package/lib/components/index.js +7 -0
- package/lib/components/index.js.map +1 -1
- package/lib/hoc/withBlaze.js +2 -1
- package/lib/hoc/withBlaze.js.map +1 -1
- package/lib/hooks/use-hash-observer.js +107 -0
- package/lib/hooks/use-hash-observer.js.map +1 -0
- package/lib-es/components/HashObserver.js +7 -0
- package/lib-es/components/HashObserver.js.map +1 -0
- package/lib-es/components/index.js +2 -1
- package/lib-es/components/index.js.map +1 -1
- package/lib-es/hoc/withBlaze.js +2 -1
- package/lib-es/hoc/withBlaze.js.map +1 -1
- package/lib-es/hooks/use-hash-observer.js +94 -0
- package/lib-es/hooks/use-hash-observer.js.map +1 -0
- package/package.json +7 -7
- package/src/components/HashObserver.js +8 -0
- package/src/components/index.js +2 -1
- package/src/hoc/withBlaze.js +2 -0
- package/src/hooks/use-hash-observer.js +119 -0
- package/tests/unit/src/hooks/use-hash-observer.test.js +260 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [0.146.0-node18-tooltips.33](https://github.com/thebyte9/blaze/compare/v0.146.0-node18-tooltips.32...v0.146.0-node18-tooltips.33) (2025-12-15)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* add hash observer for delayed anchor scrolling in SPAs ([#5038](https://github.com/thebyte9/blaze/issues/5038)) ([6414bc4](https://github.com/thebyte9/blaze/commit/6414bc4be7ace0de088499dc9fe4eeb3747d366e))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
# [0.146.0-node18-tooltips.32](https://github.com/thebyte9/blaze/compare/v0.146.0-node18-tooltips.31...v0.146.0-node18-tooltips.32) (2025-12-15)
|
|
7
18
|
|
|
8
19
|
**Note:** Version bump only for package @blaze-cms/nextjs-tools
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
require("core-js/modules/es.object.define-property.js");
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = void 0;
|
|
9
|
+
var _useHashObserver = _interopRequireDefault(require("../hooks/use-hash-observer"));
|
|
10
|
+
function HashObserver() {
|
|
11
|
+
(0, _useHashObserver["default"])();
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
var _default = exports["default"] = HashObserver;
|
|
15
|
+
//# sourceMappingURL=HashObserver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HashObserver.js","names":["_useHashObserver","_interopRequireDefault","require","HashObserver","useHashObserver","_default","exports"],"sources":["../../src/components/HashObserver.js"],"sourcesContent":["import useHashObserver from '../hooks/use-hash-observer';\n\nfunction HashObserver() {\n useHashObserver();\n return null;\n}\n\nexport default HashObserver;\n"],"mappings":";;;;;;;;AAAA,IAAAA,gBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,SAASC,YAAYA,CAAA,EAAG;EACtB,IAAAC,2BAAe,EAAC,CAAC;EACjB,OAAO,IAAI;AACb;AAAC,IAAAC,QAAA,GAAAC,OAAA,cAEcH,YAAY","ignoreList":[]}
|
package/lib/components/index.js
CHANGED
|
@@ -11,5 +11,12 @@ Object.defineProperty(exports, "DebugSidebar", {
|
|
|
11
11
|
return _DebugSidebar["default"];
|
|
12
12
|
}
|
|
13
13
|
});
|
|
14
|
+
Object.defineProperty(exports, "HashObserver", {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function get() {
|
|
17
|
+
return _HashObserver["default"];
|
|
18
|
+
}
|
|
19
|
+
});
|
|
14
20
|
var _DebugSidebar = _interopRequireDefault(require("./DebugSidebar"));
|
|
21
|
+
var _HashObserver = _interopRequireDefault(require("./HashObserver"));
|
|
15
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_DebugSidebar","_interopRequireDefault","require"],"sources":["../../src/components/index.js"],"sourcesContent":["import DebugSidebar from './DebugSidebar';\n\nexport { DebugSidebar };\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","names":["_DebugSidebar","_interopRequireDefault","require","_HashObserver"],"sources":["../../src/components/index.js"],"sourcesContent":["import DebugSidebar from './DebugSidebar';\nimport HashObserver from './HashObserver';\n\nexport { DebugSidebar, HashObserver };\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,aAAA,GAAAF,sBAAA,CAAAC,OAAA","ignoreList":[]}
|
package/lib/hoc/withBlaze.js
CHANGED
|
@@ -42,6 +42,7 @@ var _dynamic = _interopRequireDefault(require("next/dynamic"));
|
|
|
42
42
|
var _nextjsComponents = require("@blaze-cms/nextjs-components");
|
|
43
43
|
var _blaze = _interopRequireDefault(require("../blaze.config"));
|
|
44
44
|
var _helpers = require("../helpers");
|
|
45
|
+
var _HashObserver = _interopRequireDefault(require("../components/HashObserver"));
|
|
45
46
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
46
47
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
47
48
|
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
|
|
@@ -127,7 +128,7 @@ function getWrappedApp(isSsr, config, blazeApp, App) {
|
|
|
127
128
|
this.setApolloClient();
|
|
128
129
|
return /*#__PURE__*/_react["default"].createElement(ErrorBoundary, {
|
|
129
130
|
app: this.blazeApp
|
|
130
|
-
}, /*#__PURE__*/_react["default"].createElement(_nextjsComponents.AppContext.Provider, {
|
|
131
|
+
}, /*#__PURE__*/_react["default"].createElement(_HashObserver["default"], null), /*#__PURE__*/_react["default"].createElement(_nextjsComponents.AppContext.Provider, {
|
|
131
132
|
value: {
|
|
132
133
|
blazeApp: this.blazeApp
|
|
133
134
|
}
|
package/lib/hoc/withBlaze.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withBlaze.js","names":["_react","_interopRequireWildcard","require","_ssr","_coreUi","_interopRequireDefault","_coreAuthUi","_propTypes","_dynamic","_nextjsComponents","_blaze","_helpers","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","Reflect","construct","constructor","Boolean","prototype","valueOf","call","_getRequireWildcardCache","WeakMap","__esModule","_typeof2","has","get","n","__proto__","a","u","hasOwnProperty","i","set","ErrorBoundary","dynamic","Promise","resolve","then","APP_LOG_NAMESPACE_MAIN","getWrappedApp","isSsr","config","blazeApp","App","_Class","getApolloClient","ctx","requestApp","apolloClient","getClient","createClient","getRequestApp","getBlazeUi","_Component2","props","_this","_classCallCheck2","state","appLoaded","initComplete","_inherits2","_createClass2","key","value","_componentDidMount","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_callee$","_context","prev","next","abrupt","init","setState","stop","componentDidMount","setApolloClient","_this$props","apolloState","processedBlazeEntities","setupCheckAccessToken","render","createElement","app","AppContext","Provider","_extends2","_getInitialProps","_callee2","context","_Component","router","AppTree","appProps","errorProps","_appProps","_appProps$pageProps","pageProps","mainProps","renderAndCheckPromises","sortedState","_callee2$","_context2","Component","req","res","events","emit","getInitialProps","sent","getDataFromTree","openQueryChecker","checkOpenQueries","race","t0","getErrorMessage","errorCode","statusCode","error","log","cache","extract","sort","reduce","acc","getProcessedEntities","_x","PropTypes","object","undefined","withBlaze","buildConfig","_ref","_ref$forceSsr","forceSsr","window","blazeConfig","logNameSpace","_default","exports"],"sources":["../../src/hoc/withBlaze.js"],"sourcesContent":["// see: https://github.com/zeit/next.js/blob/canary/examples/with-apollo-auth/lib/withApollo.js\nimport React, { Component } from 'react';\nimport { getDataFromTree } from '@apollo/client/react/ssr';\nimport getBlazeUi from '@blaze-cms/core-ui';\nimport { setupCheckAccessToken } from '@blaze-cms/core-auth-ui';\nimport PropTypes from 'prop-types';\nimport dynamic from 'next/dynamic'; // Next.js dynamic\nimport { AppContext } from '@blaze-cms/nextjs-components';\nimport blazeConfig from '../blaze.config';\nimport { getErrorMessage } from '../helpers';\n\nconst ErrorBoundary = dynamic(() => import('@blaze-cms/core-errors-ui'));\n\nconst APP_LOG_NAMESPACE_MAIN = 'main';\n\nfunction getWrappedApp(isSsr, config, blazeApp, App) {\n function getApolloClient(ctx, requestApp) {\n return ctx.apolloClient || requestApp.getClient() || requestApp.createClient();\n }\n\n function getRequestApp(requestApp) {\n return !requestApp && isSsr ? getBlazeUi({ config }) : blazeApp;\n }\n return class extends Component {\n static displayName = 'withBlaze(App)';\n\n static propTypes = {\n apolloState: PropTypes.object,\n apolloClient: PropTypes.object,\n processedBlazeEntities: PropTypes.object\n };\n\n static defaultProps = {\n apolloState: {},\n apolloClient: null,\n processedBlazeEntities: undefined\n };\n\n static async getInitialProps(context) {\n const { Component: _Component, router, AppTree, ctx } = context;\n let appProps = {};\n let errorProps = {};\n\n let requestApp = ctx.blazeApp;\n requestApp = getRequestApp(requestApp);\n\n requestApp.ctx.router = router;\n requestApp.ctx.req = ctx.req;\n requestApp.ctx.res = ctx.res;\n\n await blazeApp.init();\n await requestApp.init();\n\n const apolloClient = getApolloClient(ctx, requestApp);\n\n ctx.apolloClient = apolloClient;\n ctx.blazeApp = requestApp;\n\n requestApp.events.emit('page-load:get-initial-props:before', { ctx });\n\n if (App.getInitialProps) {\n appProps = await App.getInitialProps(context);\n }\n\n const { pageProps = {} } = appProps;\n const mainProps = {\n ...appProps,\n pageProps: { ...pageProps, ...errorProps }\n };\n\n if (!isSsr) return mainProps;\n\n try {\n const renderAndCheckPromises = [\n getDataFromTree(\n <AppTree\n {...appProps}\n Component={_Component}\n router={router}\n apolloClient={apolloClient}\n />\n ),\n requestApp.openQueryChecker.checkOpenQueries()\n ];\n // race is so that if getDataFromTree gets stuck the checkOpenQueries will resolve when outstanding queries are done\n await Promise.race(renderAndCheckPromises);\n } catch (error) {\n errorProps = getErrorMessage(error);\n if (errorProps.errorCode) ctx.res.statusCode = errorProps.errorCode;\n ctx.blazeApp.events.emit('monitor:log', { error });\n requestApp.log.error('Error while running `getDataFromTree`', error);\n }\n\n const apolloState = apolloClient.cache.extract();\n const sortedState = Object.keys(apolloState)\n .sort()\n .reduce((acc, key) => {\n acc[key] = apolloState[key];\n return acc;\n }, {});\n\n return {\n ...mainProps,\n pageProps: { ...mainProps.pageProps, ...errorProps },\n apolloState: sortedState,\n processedBlazeEntities: blazeApp.getProcessedEntities()\n };\n }\n\n constructor(props) {\n super(props);\n this.apolloClient = props.apolloClient;\n this.state = {\n appLoaded: isSsr || blazeApp.initComplete()\n };\n this.blazeApp = blazeApp;\n }\n\n async componentDidMount() {\n if (blazeApp.initComplete()) return;\n\n await blazeApp.init();\n\n this.setState({\n appLoaded: blazeApp.initComplete()\n });\n }\n\n setApolloClient() {\n if (!this.apolloClient) {\n const { apolloState, processedBlazeEntities } = this.props;\n this.apolloClient = blazeApp.createClient(apolloState, processedBlazeEntities);\n setupCheckAccessToken(this.apolloClient);\n }\n }\n\n render() {\n const { appLoaded } = this.state;\n\n if (!appLoaded && !isSsr) return '...loading';\n\n this.setApolloClient();\n\n return (\n <ErrorBoundary app={this.blazeApp}>\n <AppContext.Provider value={{ blazeApp: this.blazeApp }}>\n <App {...this.props} apolloClient={this.apolloClient} blazeApp={this.blazeApp} />\n </AppContext.Provider>\n </ErrorBoundary>\n );\n }\n };\n}\n\nconst withBlaze = (App, buildConfig, { forceSsr = false } = {}) => {\n const isSsr = forceSsr || typeof window === 'undefined';\n const config = buildConfig ? buildConfig(blazeConfig) : blazeConfig;\n const blazeApp = getBlazeUi({ config, logNameSpace: APP_LOG_NAMESPACE_MAIN });\n blazeApp.init();\n\n return getWrappedApp(isSsr, config, blazeApp, App);\n};\n\nexport default withBlaze;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"withBlaze.js","names":["_react","_interopRequireWildcard","require","_ssr","_coreUi","_interopRequireDefault","_coreAuthUi","_propTypes","_dynamic","_nextjsComponents","_blaze","_helpers","_HashObserver","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","Reflect","construct","constructor","Boolean","prototype","valueOf","call","_getRequireWildcardCache","WeakMap","__esModule","_typeof2","has","get","n","__proto__","a","u","hasOwnProperty","i","set","ErrorBoundary","dynamic","Promise","resolve","then","APP_LOG_NAMESPACE_MAIN","getWrappedApp","isSsr","config","blazeApp","App","_Class","getApolloClient","ctx","requestApp","apolloClient","getClient","createClient","getRequestApp","getBlazeUi","_Component2","props","_this","_classCallCheck2","state","appLoaded","initComplete","_inherits2","_createClass2","key","value","_componentDidMount","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_callee$","_context","prev","next","abrupt","init","setState","stop","componentDidMount","setApolloClient","_this$props","apolloState","processedBlazeEntities","setupCheckAccessToken","render","createElement","app","AppContext","Provider","_extends2","_getInitialProps","_callee2","context","_Component","router","AppTree","appProps","errorProps","_appProps","_appProps$pageProps","pageProps","mainProps","renderAndCheckPromises","sortedState","_callee2$","_context2","Component","req","res","events","emit","getInitialProps","sent","getDataFromTree","openQueryChecker","checkOpenQueries","race","t0","getErrorMessage","errorCode","statusCode","error","log","cache","extract","sort","reduce","acc","getProcessedEntities","_x","PropTypes","object","undefined","withBlaze","buildConfig","_ref","_ref$forceSsr","forceSsr","window","blazeConfig","logNameSpace","_default","exports"],"sources":["../../src/hoc/withBlaze.js"],"sourcesContent":["// see: https://github.com/zeit/next.js/blob/canary/examples/with-apollo-auth/lib/withApollo.js\nimport React, { Component } from 'react';\nimport { getDataFromTree } from '@apollo/client/react/ssr';\nimport getBlazeUi from '@blaze-cms/core-ui';\nimport { setupCheckAccessToken } from '@blaze-cms/core-auth-ui';\nimport PropTypes from 'prop-types';\nimport dynamic from 'next/dynamic'; // Next.js dynamic\nimport { AppContext } from '@blaze-cms/nextjs-components';\nimport blazeConfig from '../blaze.config';\nimport { getErrorMessage } from '../helpers';\nimport HashObserver from '../components/HashObserver';\n\nconst ErrorBoundary = dynamic(() => import('@blaze-cms/core-errors-ui'));\n\nconst APP_LOG_NAMESPACE_MAIN = 'main';\n\nfunction getWrappedApp(isSsr, config, blazeApp, App) {\n function getApolloClient(ctx, requestApp) {\n return ctx.apolloClient || requestApp.getClient() || requestApp.createClient();\n }\n\n function getRequestApp(requestApp) {\n return !requestApp && isSsr ? getBlazeUi({ config }) : blazeApp;\n }\n return class extends Component {\n static displayName = 'withBlaze(App)';\n\n static propTypes = {\n apolloState: PropTypes.object,\n apolloClient: PropTypes.object,\n processedBlazeEntities: PropTypes.object\n };\n\n static defaultProps = {\n apolloState: {},\n apolloClient: null,\n processedBlazeEntities: undefined\n };\n\n static async getInitialProps(context) {\n const { Component: _Component, router, AppTree, ctx } = context;\n let appProps = {};\n let errorProps = {};\n\n let requestApp = ctx.blazeApp;\n requestApp = getRequestApp(requestApp);\n\n requestApp.ctx.router = router;\n requestApp.ctx.req = ctx.req;\n requestApp.ctx.res = ctx.res;\n\n await blazeApp.init();\n await requestApp.init();\n\n const apolloClient = getApolloClient(ctx, requestApp);\n\n ctx.apolloClient = apolloClient;\n ctx.blazeApp = requestApp;\n\n requestApp.events.emit('page-load:get-initial-props:before', { ctx });\n\n if (App.getInitialProps) {\n appProps = await App.getInitialProps(context);\n }\n\n const { pageProps = {} } = appProps;\n const mainProps = {\n ...appProps,\n pageProps: { ...pageProps, ...errorProps }\n };\n\n if (!isSsr) return mainProps;\n\n try {\n const renderAndCheckPromises = [\n getDataFromTree(\n <AppTree\n {...appProps}\n Component={_Component}\n router={router}\n apolloClient={apolloClient}\n />\n ),\n requestApp.openQueryChecker.checkOpenQueries()\n ];\n // race is so that if getDataFromTree gets stuck the checkOpenQueries will resolve when outstanding queries are done\n await Promise.race(renderAndCheckPromises);\n } catch (error) {\n errorProps = getErrorMessage(error);\n if (errorProps.errorCode) ctx.res.statusCode = errorProps.errorCode;\n ctx.blazeApp.events.emit('monitor:log', { error });\n requestApp.log.error('Error while running `getDataFromTree`', error);\n }\n\n const apolloState = apolloClient.cache.extract();\n const sortedState = Object.keys(apolloState)\n .sort()\n .reduce((acc, key) => {\n acc[key] = apolloState[key];\n return acc;\n }, {});\n\n return {\n ...mainProps,\n pageProps: { ...mainProps.pageProps, ...errorProps },\n apolloState: sortedState,\n processedBlazeEntities: blazeApp.getProcessedEntities()\n };\n }\n\n constructor(props) {\n super(props);\n this.apolloClient = props.apolloClient;\n this.state = {\n appLoaded: isSsr || blazeApp.initComplete()\n };\n this.blazeApp = blazeApp;\n }\n\n async componentDidMount() {\n if (blazeApp.initComplete()) return;\n\n await blazeApp.init();\n\n this.setState({\n appLoaded: blazeApp.initComplete()\n });\n }\n\n setApolloClient() {\n if (!this.apolloClient) {\n const { apolloState, processedBlazeEntities } = this.props;\n this.apolloClient = blazeApp.createClient(apolloState, processedBlazeEntities);\n setupCheckAccessToken(this.apolloClient);\n }\n }\n\n render() {\n const { appLoaded } = this.state;\n\n if (!appLoaded && !isSsr) return '...loading';\n\n this.setApolloClient();\n\n return (\n <ErrorBoundary app={this.blazeApp}>\n <HashObserver />\n <AppContext.Provider value={{ blazeApp: this.blazeApp }}>\n <App {...this.props} apolloClient={this.apolloClient} blazeApp={this.blazeApp} />\n </AppContext.Provider>\n </ErrorBoundary>\n );\n }\n };\n}\n\nconst withBlaze = (App, buildConfig, { forceSsr = false } = {}) => {\n const isSsr = forceSsr || typeof window === 'undefined';\n const config = buildConfig ? buildConfig(blazeConfig) : blazeConfig;\n const blazeApp = getBlazeUi({ config, logNameSpace: APP_LOG_NAMESPACE_MAIN });\n blazeApp.init();\n\n return getWrappedApp(isSsr, config, blazeApp, App);\n};\n\nexport default withBlaze;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
require("core-js/modules/es.object.define-property.js");
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = void 0;
|
|
9
|
+
require("core-js/modules/es.array.index-of.js");
|
|
10
|
+
require("core-js/modules/es.array.slice.js");
|
|
11
|
+
require("core-js/modules/es.string.starts-with.js");
|
|
12
|
+
require("core-js/modules/web.timers.js");
|
|
13
|
+
var _react = require("react");
|
|
14
|
+
var _router = _interopRequireDefault(require("next/router"));
|
|
15
|
+
var DEFAULT_TIMEOUT = 3000;
|
|
16
|
+
function useHashObserver() {
|
|
17
|
+
var timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_TIMEOUT;
|
|
18
|
+
(0, _react.useEffect)(function () {
|
|
19
|
+
if (typeof window === 'undefined') return undefined;
|
|
20
|
+
var observer = null;
|
|
21
|
+
var timeoutId = null;
|
|
22
|
+
var currentHash = null;
|
|
23
|
+
var isObserving = false;
|
|
24
|
+
var scrollToElement = function scrollToElement(hash) {
|
|
25
|
+
if (!hash) return false;
|
|
26
|
+
var id = hash.startsWith('#') ? hash.slice(1) : hash;
|
|
27
|
+
var element = document.getElementById(id);
|
|
28
|
+
if (element) {
|
|
29
|
+
element.scrollIntoView();
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
return false;
|
|
33
|
+
};
|
|
34
|
+
var stopObserving = function stopObserving() {
|
|
35
|
+
if (observer) {
|
|
36
|
+
observer.disconnect();
|
|
37
|
+
observer = null;
|
|
38
|
+
}
|
|
39
|
+
if (timeoutId) {
|
|
40
|
+
clearTimeout(timeoutId);
|
|
41
|
+
timeoutId = null;
|
|
42
|
+
}
|
|
43
|
+
isObserving = false;
|
|
44
|
+
currentHash = null;
|
|
45
|
+
};
|
|
46
|
+
var startObserving = function startObserving(hash) {
|
|
47
|
+
if (isObserving) {
|
|
48
|
+
stopObserving();
|
|
49
|
+
}
|
|
50
|
+
currentHash = hash;
|
|
51
|
+
isObserving = true;
|
|
52
|
+
if (scrollToElement(hash)) {
|
|
53
|
+
stopObserving();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
observer = new MutationObserver(function () {
|
|
57
|
+
if (scrollToElement(currentHash)) {
|
|
58
|
+
stopObserving();
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
var targetNode = document.getElementById('__next') || document.getElementById('root') || document.body;
|
|
62
|
+
observer.observe(targetNode, {
|
|
63
|
+
childList: true,
|
|
64
|
+
subtree: true
|
|
65
|
+
});
|
|
66
|
+
timeoutId = setTimeout(function () {
|
|
67
|
+
stopObserving();
|
|
68
|
+
}, timeout);
|
|
69
|
+
};
|
|
70
|
+
var handleRouteChange = function handleRouteChange(url) {
|
|
71
|
+
var hashIndex = url.indexOf('#');
|
|
72
|
+
if (hashIndex === -1) {
|
|
73
|
+
stopObserving();
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
var hash = url.slice(hashIndex);
|
|
77
|
+
if (hash) {
|
|
78
|
+
startObserving(hash);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
var handleHashChange = function handleHashChange(url) {
|
|
82
|
+
var hashIndex = url.indexOf('#');
|
|
83
|
+
if (hashIndex === -1) {
|
|
84
|
+
stopObserving();
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
var hash = url.slice(hashIndex);
|
|
88
|
+
if (hash) {
|
|
89
|
+
startObserving(hash);
|
|
90
|
+
} else {
|
|
91
|
+
stopObserving();
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
_router["default"].events.on('routeChangeComplete', handleRouteChange);
|
|
95
|
+
_router["default"].events.on('hashChangeComplete', handleHashChange);
|
|
96
|
+
if (window.location.hash) {
|
|
97
|
+
startObserving(window.location.hash);
|
|
98
|
+
}
|
|
99
|
+
return function () {
|
|
100
|
+
stopObserving();
|
|
101
|
+
_router["default"].events.off('routeChangeComplete', handleRouteChange);
|
|
102
|
+
_router["default"].events.off('hashChangeComplete', handleHashChange);
|
|
103
|
+
};
|
|
104
|
+
}, [timeout]);
|
|
105
|
+
}
|
|
106
|
+
var _default = exports["default"] = useHashObserver;
|
|
107
|
+
//# sourceMappingURL=use-hash-observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-hash-observer.js","names":["_react","require","_router","_interopRequireDefault","DEFAULT_TIMEOUT","useHashObserver","timeout","arguments","length","undefined","useEffect","window","observer","timeoutId","currentHash","isObserving","scrollToElement","hash","id","startsWith","slice","element","document","getElementById","scrollIntoView","stopObserving","disconnect","clearTimeout","startObserving","MutationObserver","targetNode","body","observe","childList","subtree","setTimeout","handleRouteChange","url","hashIndex","indexOf","handleHashChange","Router","events","on","location","off","_default","exports"],"sources":["../../src/hooks/use-hash-observer.js"],"sourcesContent":["import { useEffect } from 'react';\nimport Router from 'next/router';\n\nconst DEFAULT_TIMEOUT = 3000;\n\nfunction useHashObserver(timeout = DEFAULT_TIMEOUT) {\n useEffect(\n () => {\n if (typeof window === 'undefined') return undefined;\n\n let observer = null;\n let timeoutId = null;\n let currentHash = null;\n let isObserving = false;\n\n const scrollToElement = hash => {\n if (!hash) return false;\n\n const id = hash.startsWith('#') ? hash.slice(1) : hash;\n const element = document.getElementById(id);\n\n if (element) {\n element.scrollIntoView();\n return true;\n }\n\n return false;\n };\n\n const stopObserving = () => {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n isObserving = false;\n currentHash = null;\n };\n\n const startObserving = hash => {\n if (isObserving) {\n stopObserving();\n }\n\n currentHash = hash;\n isObserving = true;\n\n if (scrollToElement(hash)) {\n stopObserving();\n return;\n }\n\n observer = new MutationObserver(() => {\n if (scrollToElement(currentHash)) {\n stopObserving();\n }\n });\n\n const targetNode =\n document.getElementById('__next') || document.getElementById('root') || document.body;\n observer.observe(targetNode, {\n childList: true,\n subtree: true\n });\n\n timeoutId = setTimeout(() => {\n stopObserving();\n }, timeout);\n };\n\n const handleRouteChange = url => {\n const hashIndex = url.indexOf('#');\n if (hashIndex === -1) {\n stopObserving();\n return;\n }\n\n const hash = url.slice(hashIndex);\n if (hash) {\n startObserving(hash);\n }\n };\n\n const handleHashChange = url => {\n const hashIndex = url.indexOf('#');\n if (hashIndex === -1) {\n stopObserving();\n return;\n }\n\n const hash = url.slice(hashIndex);\n if (hash) {\n startObserving(hash);\n } else {\n stopObserving();\n }\n };\n\n Router.events.on('routeChangeComplete', handleRouteChange);\n Router.events.on('hashChangeComplete', handleHashChange);\n\n if (window.location.hash) {\n startObserving(window.location.hash);\n }\n\n return () => {\n stopObserving();\n Router.events.off('routeChangeComplete', handleRouteChange);\n Router.events.off('hashChangeComplete', handleHashChange);\n };\n },\n [timeout]\n );\n}\n\nexport default useHashObserver;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HashObserver.js","names":["useHashObserver","HashObserver"],"sources":["../../src/components/HashObserver.js"],"sourcesContent":["import useHashObserver from '../hooks/use-hash-observer';\n\nfunction HashObserver() {\n useHashObserver();\n return null;\n}\n\nexport default HashObserver;\n"],"mappings":"AAAA,OAAOA,eAAe,MAAM,4BAA4B;AAExD,SAASC,YAAYA,CAAA,EAAG;EACtBD,eAAe,CAAC,CAAC;EACjB,OAAO,IAAI;AACb;AAEA,eAAeC,YAAY","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["DebugSidebar"],"sources":["../../src/components/index.js"],"sourcesContent":["import DebugSidebar from './DebugSidebar';\n\nexport { DebugSidebar };\n"],"mappings":"AAAA,OAAOA,YAAY,MAAM,gBAAgB;AAEzC,
|
|
1
|
+
{"version":3,"file":"index.js","names":["DebugSidebar","HashObserver"],"sources":["../../src/components/index.js"],"sourcesContent":["import DebugSidebar from './DebugSidebar';\nimport HashObserver from './HashObserver';\n\nexport { DebugSidebar, HashObserver };\n"],"mappings":"AAAA,OAAOA,YAAY,MAAM,gBAAgB;AACzC,OAAOC,YAAY,MAAM,gBAAgB;AAEzC,SAASD,YAAY,EAAEC,YAAY","ignoreList":[]}
|
package/lib-es/hoc/withBlaze.js
CHANGED
|
@@ -12,6 +12,7 @@ import dynamic from 'next/dynamic'; // Next.js dynamic
|
|
|
12
12
|
import { AppContext } from '@blaze-cms/nextjs-components';
|
|
13
13
|
import blazeConfig from '../blaze.config';
|
|
14
14
|
import { getErrorMessage } from '../helpers';
|
|
15
|
+
import HashObserver from '../components/HashObserver';
|
|
15
16
|
const ErrorBoundary = dynamic(() => import('@blaze-cms/core-errors-ui'));
|
|
16
17
|
const APP_LOG_NAMESPACE_MAIN = 'main';
|
|
17
18
|
function getWrappedApp(isSsr, config, blazeApp, App) {
|
|
@@ -117,7 +118,7 @@ function getWrappedApp(isSsr, config, blazeApp, App) {
|
|
|
117
118
|
this.setApolloClient();
|
|
118
119
|
return /*#__PURE__*/React.createElement(ErrorBoundary, {
|
|
119
120
|
app: this.blazeApp
|
|
120
|
-
}, /*#__PURE__*/React.createElement(AppContext.Provider, {
|
|
121
|
+
}, /*#__PURE__*/React.createElement(HashObserver, null), /*#__PURE__*/React.createElement(AppContext.Provider, {
|
|
121
122
|
value: {
|
|
122
123
|
blazeApp: this.blazeApp
|
|
123
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withBlaze.js","names":["React","Component","getDataFromTree","getBlazeUi","setupCheckAccessToken","PropTypes","dynamic","AppContext","blazeConfig","getErrorMessage","ErrorBoundary","APP_LOG_NAMESPACE_MAIN","getWrappedApp","isSsr","config","blazeApp","App","_Class","getApolloClient","ctx","requestApp","apolloClient","getClient","createClient","getRequestApp","getInitialProps","context","_Component","router","AppTree","appProps","errorProps","req","res","init","events","emit","pageProps","mainProps","_objectSpread","renderAndCheckPromises","createElement","_extends","openQueryChecker","checkOpenQueries","Promise","race","error","errorCode","statusCode","log","apolloState","cache","extract","sortedState","Object","keys","sort","reduce","acc","key","processedBlazeEntities","getProcessedEntities","constructor","props","state","appLoaded","initComplete","componentDidMount","setState","setApolloClient","render","app","Provider","value","_defineProperty","object","undefined","withBlaze","buildConfig","forceSsr","window","logNameSpace"],"sources":["../../src/hoc/withBlaze.js"],"sourcesContent":["// see: https://github.com/zeit/next.js/blob/canary/examples/with-apollo-auth/lib/withApollo.js\nimport React, { Component } from 'react';\nimport { getDataFromTree } from '@apollo/client/react/ssr';\nimport getBlazeUi from '@blaze-cms/core-ui';\nimport { setupCheckAccessToken } from '@blaze-cms/core-auth-ui';\nimport PropTypes from 'prop-types';\nimport dynamic from 'next/dynamic'; // Next.js dynamic\nimport { AppContext } from '@blaze-cms/nextjs-components';\nimport blazeConfig from '../blaze.config';\nimport { getErrorMessage } from '../helpers';\n\nconst ErrorBoundary = dynamic(() => import('@blaze-cms/core-errors-ui'));\n\nconst APP_LOG_NAMESPACE_MAIN = 'main';\n\nfunction getWrappedApp(isSsr, config, blazeApp, App) {\n function getApolloClient(ctx, requestApp) {\n return ctx.apolloClient || requestApp.getClient() || requestApp.createClient();\n }\n\n function getRequestApp(requestApp) {\n return !requestApp && isSsr ? getBlazeUi({ config }) : blazeApp;\n }\n return class extends Component {\n static displayName = 'withBlaze(App)';\n\n static propTypes = {\n apolloState: PropTypes.object,\n apolloClient: PropTypes.object,\n processedBlazeEntities: PropTypes.object\n };\n\n static defaultProps = {\n apolloState: {},\n apolloClient: null,\n processedBlazeEntities: undefined\n };\n\n static async getInitialProps(context) {\n const { Component: _Component, router, AppTree, ctx } = context;\n let appProps = {};\n let errorProps = {};\n\n let requestApp = ctx.blazeApp;\n requestApp = getRequestApp(requestApp);\n\n requestApp.ctx.router = router;\n requestApp.ctx.req = ctx.req;\n requestApp.ctx.res = ctx.res;\n\n await blazeApp.init();\n await requestApp.init();\n\n const apolloClient = getApolloClient(ctx, requestApp);\n\n ctx.apolloClient = apolloClient;\n ctx.blazeApp = requestApp;\n\n requestApp.events.emit('page-load:get-initial-props:before', { ctx });\n\n if (App.getInitialProps) {\n appProps = await App.getInitialProps(context);\n }\n\n const { pageProps = {} } = appProps;\n const mainProps = {\n ...appProps,\n pageProps: { ...pageProps, ...errorProps }\n };\n\n if (!isSsr) return mainProps;\n\n try {\n const renderAndCheckPromises = [\n getDataFromTree(\n <AppTree\n {...appProps}\n Component={_Component}\n router={router}\n apolloClient={apolloClient}\n />\n ),\n requestApp.openQueryChecker.checkOpenQueries()\n ];\n // race is so that if getDataFromTree gets stuck the checkOpenQueries will resolve when outstanding queries are done\n await Promise.race(renderAndCheckPromises);\n } catch (error) {\n errorProps = getErrorMessage(error);\n if (errorProps.errorCode) ctx.res.statusCode = errorProps.errorCode;\n ctx.blazeApp.events.emit('monitor:log', { error });\n requestApp.log.error('Error while running `getDataFromTree`', error);\n }\n\n const apolloState = apolloClient.cache.extract();\n const sortedState = Object.keys(apolloState)\n .sort()\n .reduce((acc, key) => {\n acc[key] = apolloState[key];\n return acc;\n }, {});\n\n return {\n ...mainProps,\n pageProps: { ...mainProps.pageProps, ...errorProps },\n apolloState: sortedState,\n processedBlazeEntities: blazeApp.getProcessedEntities()\n };\n }\n\n constructor(props) {\n super(props);\n this.apolloClient = props.apolloClient;\n this.state = {\n appLoaded: isSsr || blazeApp.initComplete()\n };\n this.blazeApp = blazeApp;\n }\n\n async componentDidMount() {\n if (blazeApp.initComplete()) return;\n\n await blazeApp.init();\n\n this.setState({\n appLoaded: blazeApp.initComplete()\n });\n }\n\n setApolloClient() {\n if (!this.apolloClient) {\n const { apolloState, processedBlazeEntities } = this.props;\n this.apolloClient = blazeApp.createClient(apolloState, processedBlazeEntities);\n setupCheckAccessToken(this.apolloClient);\n }\n }\n\n render() {\n const { appLoaded } = this.state;\n\n if (!appLoaded && !isSsr) return '...loading';\n\n this.setApolloClient();\n\n return (\n <ErrorBoundary app={this.blazeApp}>\n <AppContext.Provider value={{ blazeApp: this.blazeApp }}>\n <App {...this.props} apolloClient={this.apolloClient} blazeApp={this.blazeApp} />\n </AppContext.Provider>\n </ErrorBoundary>\n );\n }\n };\n}\n\nconst withBlaze = (App, buildConfig, { forceSsr = false } = {}) => {\n const isSsr = forceSsr || typeof window === 'undefined';\n const config = buildConfig ? buildConfig(blazeConfig) : blazeConfig;\n const blazeApp = getBlazeUi({ config, logNameSpace: APP_LOG_NAMESPACE_MAIN });\n blazeApp.init();\n\n return getWrappedApp(isSsr, config, blazeApp, App);\n};\n\nexport default withBlaze;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"withBlaze.js","names":["React","Component","getDataFromTree","getBlazeUi","setupCheckAccessToken","PropTypes","dynamic","AppContext","blazeConfig","getErrorMessage","HashObserver","ErrorBoundary","APP_LOG_NAMESPACE_MAIN","getWrappedApp","isSsr","config","blazeApp","App","_Class","getApolloClient","ctx","requestApp","apolloClient","getClient","createClient","getRequestApp","getInitialProps","context","_Component","router","AppTree","appProps","errorProps","req","res","init","events","emit","pageProps","mainProps","_objectSpread","renderAndCheckPromises","createElement","_extends","openQueryChecker","checkOpenQueries","Promise","race","error","errorCode","statusCode","log","apolloState","cache","extract","sortedState","Object","keys","sort","reduce","acc","key","processedBlazeEntities","getProcessedEntities","constructor","props","state","appLoaded","initComplete","componentDidMount","setState","setApolloClient","render","app","Provider","value","_defineProperty","object","undefined","withBlaze","buildConfig","forceSsr","window","logNameSpace"],"sources":["../../src/hoc/withBlaze.js"],"sourcesContent":["// see: https://github.com/zeit/next.js/blob/canary/examples/with-apollo-auth/lib/withApollo.js\nimport React, { Component } from 'react';\nimport { getDataFromTree } from '@apollo/client/react/ssr';\nimport getBlazeUi from '@blaze-cms/core-ui';\nimport { setupCheckAccessToken } from '@blaze-cms/core-auth-ui';\nimport PropTypes from 'prop-types';\nimport dynamic from 'next/dynamic'; // Next.js dynamic\nimport { AppContext } from '@blaze-cms/nextjs-components';\nimport blazeConfig from '../blaze.config';\nimport { getErrorMessage } from '../helpers';\nimport HashObserver from '../components/HashObserver';\n\nconst ErrorBoundary = dynamic(() => import('@blaze-cms/core-errors-ui'));\n\nconst APP_LOG_NAMESPACE_MAIN = 'main';\n\nfunction getWrappedApp(isSsr, config, blazeApp, App) {\n function getApolloClient(ctx, requestApp) {\n return ctx.apolloClient || requestApp.getClient() || requestApp.createClient();\n }\n\n function getRequestApp(requestApp) {\n return !requestApp && isSsr ? getBlazeUi({ config }) : blazeApp;\n }\n return class extends Component {\n static displayName = 'withBlaze(App)';\n\n static propTypes = {\n apolloState: PropTypes.object,\n apolloClient: PropTypes.object,\n processedBlazeEntities: PropTypes.object\n };\n\n static defaultProps = {\n apolloState: {},\n apolloClient: null,\n processedBlazeEntities: undefined\n };\n\n static async getInitialProps(context) {\n const { Component: _Component, router, AppTree, ctx } = context;\n let appProps = {};\n let errorProps = {};\n\n let requestApp = ctx.blazeApp;\n requestApp = getRequestApp(requestApp);\n\n requestApp.ctx.router = router;\n requestApp.ctx.req = ctx.req;\n requestApp.ctx.res = ctx.res;\n\n await blazeApp.init();\n await requestApp.init();\n\n const apolloClient = getApolloClient(ctx, requestApp);\n\n ctx.apolloClient = apolloClient;\n ctx.blazeApp = requestApp;\n\n requestApp.events.emit('page-load:get-initial-props:before', { ctx });\n\n if (App.getInitialProps) {\n appProps = await App.getInitialProps(context);\n }\n\n const { pageProps = {} } = appProps;\n const mainProps = {\n ...appProps,\n pageProps: { ...pageProps, ...errorProps }\n };\n\n if (!isSsr) return mainProps;\n\n try {\n const renderAndCheckPromises = [\n getDataFromTree(\n <AppTree\n {...appProps}\n Component={_Component}\n router={router}\n apolloClient={apolloClient}\n />\n ),\n requestApp.openQueryChecker.checkOpenQueries()\n ];\n // race is so that if getDataFromTree gets stuck the checkOpenQueries will resolve when outstanding queries are done\n await Promise.race(renderAndCheckPromises);\n } catch (error) {\n errorProps = getErrorMessage(error);\n if (errorProps.errorCode) ctx.res.statusCode = errorProps.errorCode;\n ctx.blazeApp.events.emit('monitor:log', { error });\n requestApp.log.error('Error while running `getDataFromTree`', error);\n }\n\n const apolloState = apolloClient.cache.extract();\n const sortedState = Object.keys(apolloState)\n .sort()\n .reduce((acc, key) => {\n acc[key] = apolloState[key];\n return acc;\n }, {});\n\n return {\n ...mainProps,\n pageProps: { ...mainProps.pageProps, ...errorProps },\n apolloState: sortedState,\n processedBlazeEntities: blazeApp.getProcessedEntities()\n };\n }\n\n constructor(props) {\n super(props);\n this.apolloClient = props.apolloClient;\n this.state = {\n appLoaded: isSsr || blazeApp.initComplete()\n };\n this.blazeApp = blazeApp;\n }\n\n async componentDidMount() {\n if (blazeApp.initComplete()) return;\n\n await blazeApp.init();\n\n this.setState({\n appLoaded: blazeApp.initComplete()\n });\n }\n\n setApolloClient() {\n if (!this.apolloClient) {\n const { apolloState, processedBlazeEntities } = this.props;\n this.apolloClient = blazeApp.createClient(apolloState, processedBlazeEntities);\n setupCheckAccessToken(this.apolloClient);\n }\n }\n\n render() {\n const { appLoaded } = this.state;\n\n if (!appLoaded && !isSsr) return '...loading';\n\n this.setApolloClient();\n\n return (\n <ErrorBoundary app={this.blazeApp}>\n <HashObserver />\n <AppContext.Provider value={{ blazeApp: this.blazeApp }}>\n <App {...this.props} apolloClient={this.apolloClient} blazeApp={this.blazeApp} />\n </AppContext.Provider>\n </ErrorBoundary>\n );\n }\n };\n}\n\nconst withBlaze = (App, buildConfig, { forceSsr = false } = {}) => {\n const isSsr = forceSsr || typeof window === 'undefined';\n const config = buildConfig ? buildConfig(blazeConfig) : blazeConfig;\n const blazeApp = getBlazeUi({ config, logNameSpace: APP_LOG_NAMESPACE_MAIN });\n blazeApp.init();\n\n return getWrappedApp(isSsr, config, blazeApp, App);\n};\n\nexport default withBlaze;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import Router from 'next/router';
|
|
3
|
+
const DEFAULT_TIMEOUT = 3000;
|
|
4
|
+
function useHashObserver(timeout = DEFAULT_TIMEOUT) {
|
|
5
|
+
useEffect(() => {
|
|
6
|
+
if (typeof window === 'undefined') return undefined;
|
|
7
|
+
let observer = null;
|
|
8
|
+
let timeoutId = null;
|
|
9
|
+
let currentHash = null;
|
|
10
|
+
let isObserving = false;
|
|
11
|
+
const scrollToElement = hash => {
|
|
12
|
+
if (!hash) return false;
|
|
13
|
+
const id = hash.startsWith('#') ? hash.slice(1) : hash;
|
|
14
|
+
const element = document.getElementById(id);
|
|
15
|
+
if (element) {
|
|
16
|
+
element.scrollIntoView();
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
};
|
|
21
|
+
const stopObserving = () => {
|
|
22
|
+
if (observer) {
|
|
23
|
+
observer.disconnect();
|
|
24
|
+
observer = null;
|
|
25
|
+
}
|
|
26
|
+
if (timeoutId) {
|
|
27
|
+
clearTimeout(timeoutId);
|
|
28
|
+
timeoutId = null;
|
|
29
|
+
}
|
|
30
|
+
isObserving = false;
|
|
31
|
+
currentHash = null;
|
|
32
|
+
};
|
|
33
|
+
const startObserving = hash => {
|
|
34
|
+
if (isObserving) {
|
|
35
|
+
stopObserving();
|
|
36
|
+
}
|
|
37
|
+
currentHash = hash;
|
|
38
|
+
isObserving = true;
|
|
39
|
+
if (scrollToElement(hash)) {
|
|
40
|
+
stopObserving();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
observer = new MutationObserver(() => {
|
|
44
|
+
if (scrollToElement(currentHash)) {
|
|
45
|
+
stopObserving();
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
const targetNode = document.getElementById('__next') || document.getElementById('root') || document.body;
|
|
49
|
+
observer.observe(targetNode, {
|
|
50
|
+
childList: true,
|
|
51
|
+
subtree: true
|
|
52
|
+
});
|
|
53
|
+
timeoutId = setTimeout(() => {
|
|
54
|
+
stopObserving();
|
|
55
|
+
}, timeout);
|
|
56
|
+
};
|
|
57
|
+
const handleRouteChange = url => {
|
|
58
|
+
const hashIndex = url.indexOf('#');
|
|
59
|
+
if (hashIndex === -1) {
|
|
60
|
+
stopObserving();
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const hash = url.slice(hashIndex);
|
|
64
|
+
if (hash) {
|
|
65
|
+
startObserving(hash);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const handleHashChange = url => {
|
|
69
|
+
const hashIndex = url.indexOf('#');
|
|
70
|
+
if (hashIndex === -1) {
|
|
71
|
+
stopObserving();
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const hash = url.slice(hashIndex);
|
|
75
|
+
if (hash) {
|
|
76
|
+
startObserving(hash);
|
|
77
|
+
} else {
|
|
78
|
+
stopObserving();
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
Router.events.on('routeChangeComplete', handleRouteChange);
|
|
82
|
+
Router.events.on('hashChangeComplete', handleHashChange);
|
|
83
|
+
if (window.location.hash) {
|
|
84
|
+
startObserving(window.location.hash);
|
|
85
|
+
}
|
|
86
|
+
return () => {
|
|
87
|
+
stopObserving();
|
|
88
|
+
Router.events.off('routeChangeComplete', handleRouteChange);
|
|
89
|
+
Router.events.off('hashChangeComplete', handleHashChange);
|
|
90
|
+
};
|
|
91
|
+
}, [timeout]);
|
|
92
|
+
}
|
|
93
|
+
export default useHashObserver;
|
|
94
|
+
//# sourceMappingURL=use-hash-observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-hash-observer.js","names":["useEffect","Router","DEFAULT_TIMEOUT","useHashObserver","timeout","window","undefined","observer","timeoutId","currentHash","isObserving","scrollToElement","hash","id","startsWith","slice","element","document","getElementById","scrollIntoView","stopObserving","disconnect","clearTimeout","startObserving","MutationObserver","targetNode","body","observe","childList","subtree","setTimeout","handleRouteChange","url","hashIndex","indexOf","handleHashChange","events","on","location","off"],"sources":["../../src/hooks/use-hash-observer.js"],"sourcesContent":["import { useEffect } from 'react';\nimport Router from 'next/router';\n\nconst DEFAULT_TIMEOUT = 3000;\n\nfunction useHashObserver(timeout = DEFAULT_TIMEOUT) {\n useEffect(\n () => {\n if (typeof window === 'undefined') return undefined;\n\n let observer = null;\n let timeoutId = null;\n let currentHash = null;\n let isObserving = false;\n\n const scrollToElement = hash => {\n if (!hash) return false;\n\n const id = hash.startsWith('#') ? hash.slice(1) : hash;\n const element = document.getElementById(id);\n\n if (element) {\n element.scrollIntoView();\n return true;\n }\n\n return false;\n };\n\n const stopObserving = () => {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n isObserving = false;\n currentHash = null;\n };\n\n const startObserving = hash => {\n if (isObserving) {\n stopObserving();\n }\n\n currentHash = hash;\n isObserving = true;\n\n if (scrollToElement(hash)) {\n stopObserving();\n return;\n }\n\n observer = new MutationObserver(() => {\n if (scrollToElement(currentHash)) {\n stopObserving();\n }\n });\n\n const targetNode =\n document.getElementById('__next') || document.getElementById('root') || document.body;\n observer.observe(targetNode, {\n childList: true,\n subtree: true\n });\n\n timeoutId = setTimeout(() => {\n stopObserving();\n }, timeout);\n };\n\n const handleRouteChange = url => {\n const hashIndex = url.indexOf('#');\n if (hashIndex === -1) {\n stopObserving();\n return;\n }\n\n const hash = url.slice(hashIndex);\n if (hash) {\n startObserving(hash);\n }\n };\n\n const handleHashChange = url => {\n const hashIndex = url.indexOf('#');\n if (hashIndex === -1) {\n stopObserving();\n return;\n }\n\n const hash = url.slice(hashIndex);\n if (hash) {\n startObserving(hash);\n } else {\n stopObserving();\n }\n };\n\n Router.events.on('routeChangeComplete', handleRouteChange);\n Router.events.on('hashChangeComplete', handleHashChange);\n\n if (window.location.hash) {\n startObserving(window.location.hash);\n }\n\n return () => {\n stopObserving();\n Router.events.off('routeChangeComplete', handleRouteChange);\n Router.events.off('hashChangeComplete', handleHashChange);\n };\n },\n [timeout]\n );\n}\n\nexport default useHashObserver;\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blaze-cms/nextjs-tools",
|
|
3
|
-
"version": "0.146.0-node18-tooltips.
|
|
3
|
+
"version": "0.146.0-node18-tooltips.33",
|
|
4
4
|
"description": "Blaze nextjs tools",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "lib-es/index.js",
|
|
@@ -36,13 +36,13 @@
|
|
|
36
36
|
"@blaze-cms/plugin-auth-fe": "0.146.0-node18-tooltips.32",
|
|
37
37
|
"@blaze-cms/plugin-auth-local-fe": "0.146.0-node18-tooltips.32",
|
|
38
38
|
"@blaze-cms/plugin-chart": "0.146.0-node18-tooltips.19",
|
|
39
|
-
"@blaze-cms/plugin-google-maps-fe": "0.146.0-node18-tooltips.
|
|
40
|
-
"@blaze-cms/plugin-gtm-fe": "0.146.0-node18-tooltips.
|
|
41
|
-
"@blaze-cms/plugin-page-builder-fe": "0.146.0-node18-tooltips.
|
|
39
|
+
"@blaze-cms/plugin-google-maps-fe": "0.146.0-node18-tooltips.33",
|
|
40
|
+
"@blaze-cms/plugin-gtm-fe": "0.146.0-node18-tooltips.33",
|
|
41
|
+
"@blaze-cms/plugin-page-builder-fe": "0.146.0-node18-tooltips.33",
|
|
42
42
|
"@blaze-cms/plugin-preview-fe": "0.146.0-node18-tooltips.32",
|
|
43
|
-
"@blaze-cms/plugin-search-ui": "0.146.0-node18-tooltips.
|
|
43
|
+
"@blaze-cms/plugin-search-ui": "0.146.0-node18-tooltips.33",
|
|
44
44
|
"@blaze-cms/plugin-structured-data-fe": "0.146.0-node18-tooltips.25",
|
|
45
|
-
"@blaze-cms/react-page-builder": "0.146.0-node18-tooltips.
|
|
45
|
+
"@blaze-cms/react-page-builder": "0.146.0-node18-tooltips.33",
|
|
46
46
|
"@blaze-cms/setup-ui": "0.146.0-node18-tooltips.0",
|
|
47
47
|
"@blaze-react/switches": "0.8.0-alpha.112",
|
|
48
48
|
"autoprefixer": "^10.2.3",
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"lib/*",
|
|
72
72
|
"lib-es/*"
|
|
73
73
|
],
|
|
74
|
-
"gitHead": "
|
|
74
|
+
"gitHead": "716b7ae2c9ac96e4515eaf2d64f9c85f6d0458d1"
|
|
75
75
|
}
|
package/src/components/index.js
CHANGED
package/src/hoc/withBlaze.js
CHANGED
|
@@ -8,6 +8,7 @@ import dynamic from 'next/dynamic'; // Next.js dynamic
|
|
|
8
8
|
import { AppContext } from '@blaze-cms/nextjs-components';
|
|
9
9
|
import blazeConfig from '../blaze.config';
|
|
10
10
|
import { getErrorMessage } from '../helpers';
|
|
11
|
+
import HashObserver from '../components/HashObserver';
|
|
11
12
|
|
|
12
13
|
const ErrorBoundary = dynamic(() => import('@blaze-cms/core-errors-ui'));
|
|
13
14
|
|
|
@@ -143,6 +144,7 @@ function getWrappedApp(isSsr, config, blazeApp, App) {
|
|
|
143
144
|
|
|
144
145
|
return (
|
|
145
146
|
<ErrorBoundary app={this.blazeApp}>
|
|
147
|
+
<HashObserver />
|
|
146
148
|
<AppContext.Provider value={{ blazeApp: this.blazeApp }}>
|
|
147
149
|
<App {...this.props} apolloClient={this.apolloClient} blazeApp={this.blazeApp} />
|
|
148
150
|
</AppContext.Provider>
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import Router from 'next/router';
|
|
3
|
+
|
|
4
|
+
const DEFAULT_TIMEOUT = 3000;
|
|
5
|
+
|
|
6
|
+
function useHashObserver(timeout = DEFAULT_TIMEOUT) {
|
|
7
|
+
useEffect(
|
|
8
|
+
() => {
|
|
9
|
+
if (typeof window === 'undefined') return undefined;
|
|
10
|
+
|
|
11
|
+
let observer = null;
|
|
12
|
+
let timeoutId = null;
|
|
13
|
+
let currentHash = null;
|
|
14
|
+
let isObserving = false;
|
|
15
|
+
|
|
16
|
+
const scrollToElement = hash => {
|
|
17
|
+
if (!hash) return false;
|
|
18
|
+
|
|
19
|
+
const id = hash.startsWith('#') ? hash.slice(1) : hash;
|
|
20
|
+
const element = document.getElementById(id);
|
|
21
|
+
|
|
22
|
+
if (element) {
|
|
23
|
+
element.scrollIntoView();
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return false;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const stopObserving = () => {
|
|
31
|
+
if (observer) {
|
|
32
|
+
observer.disconnect();
|
|
33
|
+
observer = null;
|
|
34
|
+
}
|
|
35
|
+
if (timeoutId) {
|
|
36
|
+
clearTimeout(timeoutId);
|
|
37
|
+
timeoutId = null;
|
|
38
|
+
}
|
|
39
|
+
isObserving = false;
|
|
40
|
+
currentHash = null;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const startObserving = hash => {
|
|
44
|
+
if (isObserving) {
|
|
45
|
+
stopObserving();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
currentHash = hash;
|
|
49
|
+
isObserving = true;
|
|
50
|
+
|
|
51
|
+
if (scrollToElement(hash)) {
|
|
52
|
+
stopObserving();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
observer = new MutationObserver(() => {
|
|
57
|
+
if (scrollToElement(currentHash)) {
|
|
58
|
+
stopObserving();
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const targetNode =
|
|
63
|
+
document.getElementById('__next') || document.getElementById('root') || document.body;
|
|
64
|
+
observer.observe(targetNode, {
|
|
65
|
+
childList: true,
|
|
66
|
+
subtree: true
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
timeoutId = setTimeout(() => {
|
|
70
|
+
stopObserving();
|
|
71
|
+
}, timeout);
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const handleRouteChange = url => {
|
|
75
|
+
const hashIndex = url.indexOf('#');
|
|
76
|
+
if (hashIndex === -1) {
|
|
77
|
+
stopObserving();
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const hash = url.slice(hashIndex);
|
|
82
|
+
if (hash) {
|
|
83
|
+
startObserving(hash);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const handleHashChange = url => {
|
|
88
|
+
const hashIndex = url.indexOf('#');
|
|
89
|
+
if (hashIndex === -1) {
|
|
90
|
+
stopObserving();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const hash = url.slice(hashIndex);
|
|
95
|
+
if (hash) {
|
|
96
|
+
startObserving(hash);
|
|
97
|
+
} else {
|
|
98
|
+
stopObserving();
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
Router.events.on('routeChangeComplete', handleRouteChange);
|
|
103
|
+
Router.events.on('hashChangeComplete', handleHashChange);
|
|
104
|
+
|
|
105
|
+
if (window.location.hash) {
|
|
106
|
+
startObserving(window.location.hash);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return () => {
|
|
110
|
+
stopObserving();
|
|
111
|
+
Router.events.off('routeChangeComplete', handleRouteChange);
|
|
112
|
+
Router.events.off('hashChangeComplete', handleHashChange);
|
|
113
|
+
};
|
|
114
|
+
},
|
|
115
|
+
[timeout]
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export default useHashObserver;
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @jest-environment jsdom
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import '@testing-library/jest-dom/extend-expect';
|
|
6
|
+
import { render, act } from '@testing-library/react';
|
|
7
|
+
import Router from 'next/router';
|
|
8
|
+
import useHashObserver from '../../../../src/hooks/use-hash-observer';
|
|
9
|
+
|
|
10
|
+
jest.mock('next/router', () => ({
|
|
11
|
+
events: {
|
|
12
|
+
on: jest.fn(),
|
|
13
|
+
off: jest.fn()
|
|
14
|
+
}
|
|
15
|
+
}));
|
|
16
|
+
|
|
17
|
+
function TestComponent({ timeout }) {
|
|
18
|
+
useHashObserver(timeout);
|
|
19
|
+
return <div data-testid="test-component">Test</div>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
describe('useHashObserver', () => {
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
document.body.innerHTML = '';
|
|
25
|
+
jest.clearAllMocks();
|
|
26
|
+
|
|
27
|
+
delete window.location;
|
|
28
|
+
window.location = { hash: '' };
|
|
29
|
+
|
|
30
|
+
Element.prototype.scrollIntoView = jest.fn();
|
|
31
|
+
|
|
32
|
+
Router.events = {
|
|
33
|
+
on: jest.fn(),
|
|
34
|
+
off: jest.fn()
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
afterEach(() => {
|
|
39
|
+
jest.clearAllTimers();
|
|
40
|
+
jest.useRealTimers();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('should register router event listeners on mount', () => {
|
|
44
|
+
const { unmount } = render(<TestComponent />);
|
|
45
|
+
|
|
46
|
+
expect(Router.events.on).toHaveBeenCalledWith('routeChangeComplete', expect.any(Function));
|
|
47
|
+
expect(Router.events.on).toHaveBeenCalledWith('hashChangeComplete', expect.any(Function));
|
|
48
|
+
|
|
49
|
+
unmount();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('should cleanup event listeners on unmount', () => {
|
|
53
|
+
const { unmount } = render(<TestComponent />);
|
|
54
|
+
|
|
55
|
+
unmount();
|
|
56
|
+
|
|
57
|
+
expect(Router.events.off).toHaveBeenCalledWith('routeChangeComplete', expect.any(Function));
|
|
58
|
+
expect(Router.events.off).toHaveBeenCalledWith('hashChangeComplete', expect.any(Function));
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('should scroll to element if it exists immediately', async () => {
|
|
62
|
+
jest.useFakeTimers();
|
|
63
|
+
|
|
64
|
+
const testElement = document.createElement('div');
|
|
65
|
+
testElement.id = 'test-section';
|
|
66
|
+
document.body.appendChild(testElement);
|
|
67
|
+
|
|
68
|
+
window.location.hash = '#test-section';
|
|
69
|
+
|
|
70
|
+
act(() => {
|
|
71
|
+
render(<TestComponent />);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
act(() => {
|
|
75
|
+
jest.runAllTimers();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
expect(testElement.scrollIntoView).toHaveBeenCalledWith();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it('should handle route change with hash', () => {
|
|
82
|
+
const testElement = document.createElement('div');
|
|
83
|
+
testElement.id = 'route-section';
|
|
84
|
+
document.body.appendChild(testElement);
|
|
85
|
+
|
|
86
|
+
render(<TestComponent />);
|
|
87
|
+
|
|
88
|
+
const routeChangeHandler = Router.events.on.mock.calls.find(
|
|
89
|
+
call => call[0] === 'routeChangeComplete'
|
|
90
|
+
)[1];
|
|
91
|
+
|
|
92
|
+
act(() => {
|
|
93
|
+
routeChangeHandler('/page#route-section');
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
expect(testElement.scrollIntoView).toHaveBeenCalled();
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('should handle route change without hash', () => {
|
|
100
|
+
render(<TestComponent />);
|
|
101
|
+
|
|
102
|
+
const routeChangeHandler = Router.events.on.mock.calls.find(
|
|
103
|
+
call => call[0] === 'routeChangeComplete'
|
|
104
|
+
)[1];
|
|
105
|
+
|
|
106
|
+
expect(() => {
|
|
107
|
+
act(() => {
|
|
108
|
+
routeChangeHandler('/page');
|
|
109
|
+
});
|
|
110
|
+
}).not.toThrow();
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('should handle hash change', () => {
|
|
114
|
+
const testElement = document.createElement('div');
|
|
115
|
+
testElement.id = 'hash-section';
|
|
116
|
+
document.body.appendChild(testElement);
|
|
117
|
+
|
|
118
|
+
render(<TestComponent />);
|
|
119
|
+
|
|
120
|
+
const hashChangeHandler = Router.events.on.mock.calls.find(
|
|
121
|
+
call => call[0] === 'hashChangeComplete'
|
|
122
|
+
)[1];
|
|
123
|
+
|
|
124
|
+
act(() => {
|
|
125
|
+
hashChangeHandler('/page#hash-section');
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
expect(testElement.scrollIntoView).toHaveBeenCalled();
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('should stop observing after timeout', () => {
|
|
132
|
+
jest.useFakeTimers();
|
|
133
|
+
|
|
134
|
+
render(<TestComponent timeout={1000} />);
|
|
135
|
+
|
|
136
|
+
const hashChangeHandler = Router.events.on.mock.calls.find(
|
|
137
|
+
call => call[0] === 'hashChangeComplete'
|
|
138
|
+
)[1];
|
|
139
|
+
|
|
140
|
+
act(() => {
|
|
141
|
+
hashChangeHandler('/page#nonexistent');
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
act(() => {
|
|
145
|
+
jest.advanceTimersByTime(1100);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
const lateElement = document.createElement('div');
|
|
149
|
+
lateElement.id = 'nonexistent';
|
|
150
|
+
document.body.appendChild(lateElement);
|
|
151
|
+
|
|
152
|
+
expect(lateElement.scrollIntoView).not.toHaveBeenCalled();
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it('should handle rapid hash changes', () => {
|
|
156
|
+
jest.useFakeTimers();
|
|
157
|
+
|
|
158
|
+
const element2 = document.createElement('div');
|
|
159
|
+
element2.id = 'section-2';
|
|
160
|
+
document.body.appendChild(element2);
|
|
161
|
+
|
|
162
|
+
render(<TestComponent />);
|
|
163
|
+
|
|
164
|
+
const hashChangeHandler = Router.events.on.mock.calls.find(
|
|
165
|
+
call => call[0] === 'hashChangeComplete'
|
|
166
|
+
)[1];
|
|
167
|
+
|
|
168
|
+
act(() => {
|
|
169
|
+
hashChangeHandler('/page#section-1');
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
act(() => {
|
|
173
|
+
hashChangeHandler('/page#section-2');
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
expect(element2.scrollIntoView).toHaveBeenCalled();
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it('should handle empty hash gracefully', () => {
|
|
180
|
+
render(<TestComponent />);
|
|
181
|
+
|
|
182
|
+
const hashChangeHandler = Router.events.on.mock.calls.find(
|
|
183
|
+
call => call[0] === 'hashChangeComplete'
|
|
184
|
+
)[1];
|
|
185
|
+
|
|
186
|
+
expect(() => {
|
|
187
|
+
act(() => {
|
|
188
|
+
hashChangeHandler('/page');
|
|
189
|
+
});
|
|
190
|
+
}).not.toThrow();
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('should use custom timeout value', () => {
|
|
194
|
+
jest.useFakeTimers();
|
|
195
|
+
|
|
196
|
+
const customTimeout = 5000;
|
|
197
|
+
render(<TestComponent timeout={customTimeout} />);
|
|
198
|
+
|
|
199
|
+
const hashChangeHandler = Router.events.on.mock.calls.find(
|
|
200
|
+
call => call[0] === 'hashChangeComplete'
|
|
201
|
+
)[1];
|
|
202
|
+
|
|
203
|
+
act(() => {
|
|
204
|
+
hashChangeHandler('/page#nonexistent');
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
act(() => {
|
|
208
|
+
jest.advanceTimersByTime(4999);
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
const element = document.createElement('div');
|
|
212
|
+
element.id = 'nonexistent';
|
|
213
|
+
document.body.appendChild(element);
|
|
214
|
+
|
|
215
|
+
act(() => {
|
|
216
|
+
jest.advanceTimersByTime(1);
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
expect(element.scrollIntoView).not.toHaveBeenCalled();
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it('should verify observer stops after timeout', () => {
|
|
223
|
+
jest.useFakeTimers();
|
|
224
|
+
|
|
225
|
+
render(<TestComponent timeout={1000} />);
|
|
226
|
+
|
|
227
|
+
const hashChangeHandler = Router.events.on.mock.calls.find(
|
|
228
|
+
call => call[0] === 'hashChangeComplete'
|
|
229
|
+
)[1];
|
|
230
|
+
|
|
231
|
+
act(() => {
|
|
232
|
+
hashChangeHandler('/page#delayed-element');
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
act(() => {
|
|
236
|
+
jest.advanceTimersByTime(1000);
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
const element = document.createElement('div');
|
|
240
|
+
element.id = 'delayed-element';
|
|
241
|
+
document.body.appendChild(element);
|
|
242
|
+
|
|
243
|
+
act(() => {
|
|
244
|
+
jest.advanceTimersByTime(100);
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
expect(element.scrollIntoView).not.toHaveBeenCalled();
|
|
248
|
+
|
|
249
|
+
const anotherElement = document.createElement('div');
|
|
250
|
+
anotherElement.id = 'another-element';
|
|
251
|
+
document.body.appendChild(anotherElement);
|
|
252
|
+
|
|
253
|
+
act(() => {
|
|
254
|
+
jest.advanceTimersByTime(100);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
expect(element.scrollIntoView).not.toHaveBeenCalled();
|
|
258
|
+
expect(anotherElement.scrollIntoView).not.toHaveBeenCalled();
|
|
259
|
+
});
|
|
260
|
+
});
|