import { createElement, useEffect, useState } from 'rax';
import { isWeb } from 'universal-env';
export default (api) => {
const { appConfig, wrapperPageComponent, addProvider } = api;
if (appConfig.app && appConfig.app.addProvider) {
addProvider(appConfig.app.addProvider);
}
wrapperPageComponent((isWeb && !process.env.__IS_SERVER__) ? wrapperPageWithWeb(api) : wrapperPageWithOtherPlatform(api));
};
function wrapperPageWithOtherPlatform({ appConfig, context }) {
const WrapperPageFn = (PageComponent) => {
const { __pageConfig: pageConfig } = PageComponent;
const PageWrapper = (props) => {
const history = appConfig?.router?.history;
const pageProps = {
...props,
...context.pageInitialProps,
history,
location: history?.location,
pageConfig,
};
return ;
};
return PageWrapper;
};
return WrapperPageFn;
}
function wrapperPageWithWeb({ staticConfig, appConfig, applyRuntimeAPI }) {
let rendered = false;
const wrapperPage = (PageComponent) => {
const { __pageConfig: pageConfig } = PageComponent;
const PageWrapper = (props) => {
const history = appConfig?.router?.history;
const location = history?.location || window.location;
const [data, setData] = useState((window as any).__INITIAL_DATA__?.pageInitialProps);
useEffect(() => {
const title = pageConfig.window?.title || staticConfig.window?.title;
// Avoid override developer custom title
// SPA toggle route should change title
if (title && (rendered || !document.title)) {
document.title = title;
}
rendered = true;
// When enter the page for the first time, need to use window.__INITIAL_DATA__.pageInitialProps as props
// And don't need to re-request to switch routes
// Set the data to null after use, otherwise other pages will use
if ((window as any).__INITIAL_DATA__?.pageInitialProps) {
if ((window as any).__INITIAL_DATA__) {
(window as any).__INITIAL_DATA__.pageInitialProps = null;
}
} else if (PageComponent.getInitialProps) {
// When the server does not return data, the client calls getinitialprops
(async () => {
const initialContext = {
pathname: location.pathname,
query: applyRuntimeAPI('getSearchParams'),
location,
};
const result = await PageComponent.getInitialProps(initialContext);
setData(result);
})();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return ;
};
return PageWrapper;
};
return wrapperPage;
}