UNPKG

@interopio/react-hooks

Version:

React Hooks Wrapper for IO Connect Desktop and Browser

82 lines (75 loc) 4.08 kB
(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