@redocly/theme
Version:
Shared UI components lib
59 lines • 2.99 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.dynamic = dynamic;
const react_1 = __importDefault(require("react"));
function dynamic(factory, { ssr = true, loading } = {}) {
const Component = react_1.default.lazy(() => factory().then((mod) => {
// Case 1: factory() => import('./SomeModule') - direct import
// Case 2: factory() => import('./SomeModule').then(mod => mod.default) - extract default
if (typeof mod === 'function') {
return { default: mod };
}
// Case 3: factory() => import('./SomeModule').then(mod => ({ default: mod.default })) - manual wrap
// Case 4: factory() => import('./SomeModule').then(mod => ({ default: mod.Named })) - manual wrap named
if (mod && typeof mod === 'object' && 'default' in mod) {
const defaultExport = mod.default;
// Handle both function components and React component objects (e.g., memo/forwardRef)
if (typeof defaultExport === 'function') {
return { default: defaultExport };
}
if (defaultExport && typeof defaultExport === 'object' && '$$typeof' in defaultExport) {
return { default: defaultExport };
}
}
// Case 5: factory() => import('./SomeModule').then(mod => mod.Named) - find named export
if (mod && typeof mod === 'object') {
const modObj = mod;
for (const key in modObj) {
const value = modObj[key];
if (typeof value === 'function') {
return { default: value };
}
if (value && typeof value === 'object' && '$$typeof' in value) {
return { default: value };
}
}
}
throw new Error('Dynamic import did not return a valid React component');
}));
const LoadingComponent = loading || (() => null);
return (props) => {
const [hasMounted, setHasMounted] = react_1.default.useState(false);
react_1.default.useEffect(() => {
setHasMounted(true);
}, []);
if (ssr) {
return (react_1.default.createElement(react_1.default.Suspense, { fallback: react_1.default.createElement(LoadingComponent, Object.assign({}, props)) },
react_1.default.createElement(Component, Object.assign({}, props))));
}
if (!hasMounted) {
return react_1.default.createElement(LoadingComponent, Object.assign({}, props));
}
return (react_1.default.createElement(react_1.default.Suspense, { fallback: react_1.default.createElement(LoadingComponent, Object.assign({}, props)) },
react_1.default.createElement(Component, Object.assign({}, props))));
};
}
//# sourceMappingURL=Dynamic.js.map