Full cleanup pass
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
import React from "react";
|
||||
|
||||
const importCache = new Map();
|
||||
|
||||
/**
|
||||
* Vitest mock for `next/dynamic` — resolves imports on layout effect without
|
||||
* suspending sibling sections (matches production loading behavior).
|
||||
*/
|
||||
export default function syncDynamic(importFn, options) {
|
||||
if (!importCache.has(importFn)) {
|
||||
const entry = {
|
||||
Component: null,
|
||||
promise: importFn().then((mod) => {
|
||||
entry.Component = mod.default ?? mod;
|
||||
return entry.Component;
|
||||
}),
|
||||
};
|
||||
importCache.set(importFn, entry);
|
||||
}
|
||||
|
||||
const entry = importCache.get(importFn);
|
||||
|
||||
function DynamicComponent(props) {
|
||||
const [Component, setComponent] = React.useState(entry.Component);
|
||||
|
||||
React.useLayoutEffect(() => {
|
||||
if (entry.Component) {
|
||||
setComponent(() => entry.Component);
|
||||
return;
|
||||
}
|
||||
let cancelled = false;
|
||||
entry.promise.then((Resolved) => {
|
||||
if (!cancelled) {
|
||||
setComponent(() => Resolved);
|
||||
}
|
||||
});
|
||||
return () => {
|
||||
cancelled = true;
|
||||
};
|
||||
}, []);
|
||||
|
||||
if (!Component) {
|
||||
return options?.loading ? options.loading() : null;
|
||||
}
|
||||
|
||||
return React.createElement(Component, props);
|
||||
}
|
||||
|
||||
DynamicComponent.displayName = "DynamicMock";
|
||||
return DynamicComponent;
|
||||
}
|
||||
Reference in New Issue
Block a user