@web3auth/modal
Version:
Multi chain wallet aggregator for web3Auth
136 lines (132 loc) • 4.95 kB
JavaScript
;
var noModal = require('@web3auth/no-modal');
var react = require('react');
var modalManager = require('../../modalManager.js');
const Web3AuthInnerContext = /*#__PURE__*/react.createContext(null);
function Web3AuthInnerProvider(params) {
const {
children,
config,
initialState
} = params;
const {
web3AuthOptions
} = config;
const [isInitializing, setIsInitializing] = react.useState(false);
const [initError, setInitError] = react.useState(null);
const [provider, setProvider] = react.useState(null);
const [isInitialized, setIsInitialized] = react.useState(false);
const [isMFAEnabled, setIsMFAEnabled] = react.useState(false);
const web3Auth = react.useMemo(() => {
setProvider(null);
return new modalManager.Web3Auth(web3AuthOptions, initialState);
}, [web3AuthOptions, initialState]);
const [isConnected, setIsConnected] = react.useState(web3Auth.status === noModal.CONNECTOR_STATUS.CONNECTED);
const [status, setStatus] = react.useState(web3Auth.status);
const getPlugin = react.useCallback(name => {
if (!web3Auth) throw noModal.WalletInitializationError.notReady();
return web3Auth.getPlugin(name);
}, [web3Auth]);
react.useEffect(() => {
const controller = new AbortController();
async function init() {
try {
setInitError(null);
setIsInitializing(true);
web3Auth.setAnalyticsProperties({
integration_type: noModal.ANALYTICS_INTEGRATION_TYPE.REACT_HOOKS
});
await web3Auth.init({
signal: controller.signal
});
} catch (error) {
setInitError(error);
} finally {
setIsInitializing(false);
}
}
if (web3Auth) init();
return () => {
controller.abort();
};
}, [web3Auth, config]);
react.useEffect(() => {
const notReadyListener = () => setStatus(web3Auth.status);
const readyListener = () => {
setStatus(web3Auth.status);
setIsInitialized(true);
};
const connectedListener = data => {
setStatus(web3Auth.status);
// we do this because of rehydration issues. status connected is fired first but web3auth sdk is not ready yet.
if (web3Auth.status === noModal.CONNECTOR_STATUS.CONNECTED) {
setIsInitialized(true);
setIsConnected(true);
setProvider(data.provider);
}
};
const disconnectedListener = () => {
setStatus(web3Auth.status);
setIsConnected(false);
setProvider(null);
};
const connectingListener = () => {
setStatus(web3Auth.status);
};
const errorListener = () => {
setStatus(web3Auth.status);
};
const rehydrationErrorListener = () => {
setStatus(web3Auth.status);
setIsConnected(false);
setProvider(null);
};
const mfaEnabledListener = isMFAEnabled => {
if (typeof isMFAEnabled === "boolean") setIsMFAEnabled(isMFAEnabled);
};
if (web3Auth) {
// web3Auth is initialized here.
setStatus(web3Auth.status);
web3Auth.on(noModal.CONNECTOR_EVENTS.NOT_READY, notReadyListener);
web3Auth.on(noModal.CONNECTOR_EVENTS.READY, readyListener);
web3Auth.on(noModal.CONNECTOR_EVENTS.CONNECTED, connectedListener);
web3Auth.on(noModal.CONNECTOR_EVENTS.DISCONNECTED, disconnectedListener);
web3Auth.on(noModal.CONNECTOR_EVENTS.CONNECTING, connectingListener);
web3Auth.on(noModal.CONNECTOR_EVENTS.ERRORED, errorListener);
web3Auth.on(noModal.CONNECTOR_EVENTS.REHYDRATION_ERROR, rehydrationErrorListener);
web3Auth.on(noModal.CONNECTOR_EVENTS.MFA_ENABLED, mfaEnabledListener);
}
return () => {
if (web3Auth) {
web3Auth.off(noModal.CONNECTOR_EVENTS.NOT_READY, notReadyListener);
web3Auth.off(noModal.CONNECTOR_EVENTS.READY, readyListener);
web3Auth.off(noModal.CONNECTOR_EVENTS.CONNECTED, connectedListener);
web3Auth.off(noModal.CONNECTOR_EVENTS.DISCONNECTED, disconnectedListener);
web3Auth.off(noModal.CONNECTOR_EVENTS.CONNECTING, connectingListener);
web3Auth.off(noModal.CONNECTOR_EVENTS.ERRORED, errorListener);
web3Auth.off(noModal.CONNECTOR_EVENTS.REHYDRATION_ERROR, rehydrationErrorListener);
web3Auth.off(noModal.CONNECTOR_EVENTS.MFA_ENABLED, mfaEnabledListener);
web3Auth.cleanup();
}
};
}, [web3Auth]);
const value = react.useMemo(() => {
return {
web3Auth,
isConnected,
isInitialized,
provider,
status,
isInitializing,
initError,
isMFAEnabled,
getPlugin,
setIsMFAEnabled
};
}, [web3Auth, isConnected, isMFAEnabled, setIsMFAEnabled, isInitialized, provider, status, getPlugin, isInitializing, initError]);
return /*#__PURE__*/react.createElement(Web3AuthInnerContext.Provider, {
value
}, children);
}
exports.Web3AuthInnerContext = Web3AuthInnerContext;
exports.Web3AuthInnerProvider = Web3AuthInnerProvider;