UNPKG

@interopio/react-hooks

Version:

React Hooks Wrapper for IO Connect Desktop and Browser

74 lines (68 loc) 3.28 kB
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