123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = void 0;
- var _extends = require("@swc/helpers/lib/_extends.js").default;
- var _interop_require_default = require("@swc/helpers/lib/_interop_require_default.js").default;
- var _react = _interop_require_default(require("react"));
- var _loadableContext = require("./loadable-context");
- const { useSyncExternalStore } = process.env.__NEXT_REACT_ROOT ? require('react') : require('use-sync-external-store/shim');
- const ALL_INITIALIZERS = [];
- const READY_INITIALIZERS = [];
- let initialized = false;
- function load(loader) {
- let promise = loader();
- let state = {
- loading: true,
- loaded: null,
- error: null
- };
- state.promise = promise.then((loaded)=>{
- state.loading = false;
- state.loaded = loaded;
- return loaded;
- }).catch((err)=>{
- state.loading = false;
- state.error = err;
- throw err;
- });
- return state;
- }
- function resolve(obj) {
- return obj && obj.__esModule ? obj.default : obj;
- }
- function createLoadableComponent(loadFn, options) {
- let opts = Object.assign({
- loader: null,
- loading: null,
- delay: 200,
- timeout: null,
- webpack: null,
- modules: null,
- suspense: false
- }, options);
- if (opts.suspense) {
- opts.lazy = _react.default.lazy(opts.loader);
- }
- /** @type LoadableSubscription */ let subscription = null;
- function init() {
- if (!subscription) {
- const sub = new LoadableSubscription(loadFn, opts);
- subscription = {
- getCurrentValue: sub.getCurrentValue.bind(sub),
- subscribe: sub.subscribe.bind(sub),
- retry: sub.retry.bind(sub),
- promise: sub.promise.bind(sub)
- };
- }
- return subscription.promise();
- }
- // Server only
- if (typeof window === 'undefined') {
- ALL_INITIALIZERS.push(init);
- }
- // Client only
- if (!initialized && typeof window !== 'undefined') {
- // require.resolveWeak check is needed for environments that don't have it available like Jest
- const moduleIds = opts.webpack && typeof require.resolveWeak === 'function' ? opts.webpack() : opts.modules;
- if (moduleIds) {
- READY_INITIALIZERS.push((ids)=>{
- for (const moduleId of moduleIds){
- if (ids.indexOf(moduleId) !== -1) {
- return init();
- }
- }
- });
- }
- }
- function useLoadableModule() {
- init();
- const context = _react.default.useContext(_loadableContext.LoadableContext);
- if (context && Array.isArray(opts.modules)) {
- opts.modules.forEach((moduleName)=>{
- context(moduleName);
- });
- }
- }
- function LoadableImpl(props, ref) {
- useLoadableModule();
- const state = useSyncExternalStore(subscription.subscribe, subscription.getCurrentValue, subscription.getCurrentValue);
- _react.default.useImperativeHandle(ref, ()=>({
- retry: subscription.retry
- }), []);
- return _react.default.useMemo(()=>{
- if (state.loading || state.error) {
- return _react.default.createElement(opts.loading, {
- isLoading: state.loading,
- pastDelay: state.pastDelay,
- timedOut: state.timedOut,
- error: state.error,
- retry: subscription.retry
- });
- } else if (state.loaded) {
- return _react.default.createElement(resolve(state.loaded), props);
- } else {
- return null;
- }
- }, [
- props,
- state
- ]);
- }
- function LazyImpl(props, ref) {
- useLoadableModule();
- return _react.default.createElement(opts.lazy, _extends({}, props, {
- ref
- }));
- }
- const LoadableComponent = opts.suspense ? LazyImpl : LoadableImpl;
- LoadableComponent.preload = ()=>init();
- LoadableComponent.displayName = 'LoadableComponent';
- return _react.default.forwardRef(LoadableComponent);
- }
- class LoadableSubscription {
- promise() {
- return this._res.promise;
- }
- retry() {
- this._clearTimeouts();
- this._res = this._loadFn(this._opts.loader);
- this._state = {
- pastDelay: false,
- timedOut: false
- };
- const { _res: res , _opts: opts } = this;
- if (res.loading) {
- if (typeof opts.delay === 'number') {
- if (opts.delay === 0) {
- this._state.pastDelay = true;
- } else {
- this._delay = setTimeout(()=>{
- this._update({
- pastDelay: true
- });
- }, opts.delay);
- }
- }
- if (typeof opts.timeout === 'number') {
- this._timeout = setTimeout(()=>{
- this._update({
- timedOut: true
- });
- }, opts.timeout);
- }
- }
- this._res.promise.then(()=>{
- this._update({});
- this._clearTimeouts();
- }).catch((_err)=>{
- this._update({});
- this._clearTimeouts();
- });
- this._update({});
- }
- _update(partial) {
- this._state = _extends({}, this._state, {
- error: this._res.error,
- loaded: this._res.loaded,
- loading: this._res.loading
- }, partial);
- this._callbacks.forEach((callback)=>callback());
- }
- _clearTimeouts() {
- clearTimeout(this._delay);
- clearTimeout(this._timeout);
- }
- getCurrentValue() {
- return this._state;
- }
- subscribe(callback) {
- this._callbacks.add(callback);
- return ()=>{
- this._callbacks.delete(callback);
- };
- }
- constructor(loadFn, opts){
- this._loadFn = loadFn;
- this._opts = opts;
- this._callbacks = new Set();
- this._delay = null;
- this._timeout = null;
- this.retry();
- }
- }
- function Loadable(opts) {
- return createLoadableComponent(load, opts);
- }
- function flushInitializers(initializers, ids) {
- let promises = [];
- while(initializers.length){
- let init = initializers.pop();
- promises.push(init(ids));
- }
- return Promise.all(promises).then(()=>{
- if (initializers.length) {
- return flushInitializers(initializers, ids);
- }
- });
- }
- Loadable.preloadAll = ()=>{
- return new Promise((resolveInitializers, reject)=>{
- flushInitializers(ALL_INITIALIZERS).then(resolveInitializers, reject);
- });
- };
- Loadable.preloadReady = (ids = [])=>{
- return new Promise((resolvePreload)=>{
- const res = ()=>{
- initialized = true;
- return resolvePreload();
- };
- // We always will resolve, errors should be handled within loading UIs.
- flushInitializers(READY_INITIALIZERS, ids).then(res, res);
- });
- };
- if (typeof window !== 'undefined') {
- window.__NEXT_PRELOADREADY = Loadable.preloadReady;
- }
- var _default = Loadable;
- exports.default = _default;
- //# sourceMappingURL=loadable.js.map
|