47 lines
1.2 KiB
TypeScript
47 lines
1.2 KiB
TypeScript
import UiLocation from "@contentstack/app-sdk/dist/src/uiLocation";
|
|
import { useEffect, useState } from "react";
|
|
|
|
export class SDKLoadingError extends Error {}
|
|
|
|
export default function useApp() {
|
|
const [, setError] = useState();
|
|
const [sdk, setSdk] = useState<UiLocation>();
|
|
const [config, setConfig] = useState<Record<string, string>>();
|
|
|
|
useEffect(() => {
|
|
async function init() {
|
|
try {
|
|
const ContentstackAppSDK = (await import("@contentstack/app-sdk"))
|
|
.default;
|
|
const initSdk = await ContentstackAppSDK.init();
|
|
setSdk(initSdk);
|
|
|
|
const config = await initSdk.getConfig();
|
|
setConfig(config);
|
|
|
|
const iframeWrapperRef = document.getElementById("field");
|
|
window.iframeRef = iframeWrapperRef;
|
|
window.postRobot = initSdk.postRobot;
|
|
} catch (e) {
|
|
let err: Error;
|
|
if (e instanceof Error) {
|
|
err = new SDKLoadingError(e.message);
|
|
}
|
|
|
|
// Error boundaries do not support async functions. Workaround:
|
|
// https://github.com/vercel/next.js/discussions/50564#discussioncomment-6063866
|
|
setError(() => {
|
|
throw err;
|
|
});
|
|
}
|
|
}
|
|
|
|
init();
|
|
}, [setSdk, setConfig]);
|
|
|
|
return {
|
|
sdk,
|
|
config,
|
|
};
|
|
}
|