@interopio/react-hooks
Version:
React Hooks Wrapper for IO Connect Desktop and Browser
74 lines (68 loc) • 3.28 kB
JavaScript
import React, { useState, useEffect, createContext, memo, useContext } from 'react';
import { node, object } from 'prop-types';
const extractErrorMsg = (error) => {
const errorMessage = error.message ? JSON.stringify(error.message) : JSON.stringify(error);
const stringError = typeof error === "string" ? error : errorMessage;
return stringError;
};
const useIOConnectInit = (settings, onInitError) => {
const [io, setIOConnect] = useState(null);
useEffect(() => {
const initialize = async () => {
try {
if (settings.browser && settings.browserPlatform) {
throw new Error("Cannot initialize, because the settings are over-specified: defined are both browser and browserPlatform. Please set one or the other");
}
const isDesktop = (typeof window.glue42gd !== "undefined") || (typeof window.iodesktop !== "undefined");
if (isDesktop) {
const factory = settings.desktop?.factory || settings.browser?.factory || settings.browserPlatform?.factory || window.Glue;
const config = settings.desktop?.config || settings.browser?.config || settings.browserPlatform?.config;
const factoryResult = await factory(config);
setIOConnect(factoryResult.io || factoryResult.glue || factoryResult);
return;
}
const config = settings.browser?.config || settings.browserPlatform?.config;
const factory = settings.browser?.factory || settings.browserPlatform?.factory || window.IOBrowser || window.IOBrowserPlatform;
const factoryResult = await factory(config);
setIOConnect(factoryResult.io || factoryResult.glue || factoryResult);
}
catch (error) {
console.error(error);
onInitError?.(error instanceof Error ? error : new Error(extractErrorMsg(error)));
}
};
initialize();
}, []);
return io;
};
const IOConnectContext = createContext(null);
const IOConnectProvider = memo(({ children, fallback = null, settings = {}, onInitError }) => {
const glue = useIOConnectInit(settings, onInitError);
return glue ? (React.createElement(IOConnectContext.Provider, { value: glue }, children)) : (React.createElement(React.Fragment, null, fallback));
});
IOConnectProvider.propTypes = {
children: node,
settings: object,
fallback: node,
};
IOConnectProvider.displayName = 'IOConnectProvider';
const useIOConnect = (cb, dependencies = []) => {
const [result, setResult] = useState();
const io = useContext(IOConnectContext);
useEffect(() => {
const callback = async () => {
try {
const result = await cb(io, ...dependencies);
typeof result !== "undefined" &&
setResult(typeof result === "function" ? () => result : result);
}
catch (e) {
console.error(e);
}
};
io && callback();
}, [io, ...dependencies]);
return result;
};
export { IOConnectContext, IOConnectProvider, useIOConnect, useIOConnectInit };
//# sourceMappingURL=index.js.map