@interopio/react-hooks
Version:
React Hooks Wrapper for IO Connect Desktop and Browser
82 lines (75 loc) • 4.08 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('prop-types')) :
typeof define === 'function' && define.amd ? define(['exports', 'react', 'prop-types'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["io-connect-hooks"] = {}, global.React, global.PropTypes));
})(this, (function (exports, React, propTypes) { 'use strict';
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] = React.useState(null);
React.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 = React.createContext(null);
const IOConnectProvider = React.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: propTypes.node,
settings: propTypes.object,
fallback: propTypes.node,
};
IOConnectProvider.displayName = 'IOConnectProvider';
const useIOConnect = (cb, dependencies = []) => {
const [result, setResult] = React.useState();
const io = React.useContext(IOConnectContext);
React.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;
};
exports.IOConnectContext = IOConnectContext;
exports.IOConnectProvider = IOConnectProvider;
exports.useIOConnect = useIOConnect;
exports.useIOConnectInit = useIOConnectInit;
}));
//# sourceMappingURL=index.js.map