UNPKG

@0xsequence/connect

Version:
102 lines 3.81 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useEmailConflict = void 0; const waas_1 = require("@0xsequence/waas"); const react_1 = require("react"); const wagmi_1 = require("wagmi"); /** * Helper function to convert raw account type information into user-friendly text. * * @param info - The raw email conflict information from WaaS * @returns A user-friendly string describing the account type */ const accountTypeText = (info) => { if (!info) { return 'Unknown account type'; } if (info.type === waas_1.IdentityType.PlayFab) { return 'PlayFab login'; } if (info.type === waas_1.IdentityType.Email) { return 'Email login'; } if (info.type === waas_1.IdentityType.OIDC) { switch (info.issuer) { case 'https://accounts.google.com': return 'Google login'; case 'https://appleid.apple.com': return 'Apple login'; default: return 'Unknown account type'; } } return info.type; }; /** * Hook to handle email conflict detection and resolution for WaaS (Wallet-as-a-Service) authentication. * * This hook monitors all WaaS connectors for email conflicts that occur during sign-in attempts. * A conflict happens when a user tries to sign up with an email that's already associated with * a different authentication method (e.g., trying to use Google sign-in when the email was * previously used with Apple sign-in). * * @returns An object containing: * - `toggleEmailConflictModal` - Function to manually show/hide the conflict modal * - `isEmailConflictOpen` - Whether the conflict modal is currently open * - `emailConflictInfo` - Formatted information about the conflict (email and account type) * - `forceCreate` - Function to force create a new account despite the conflict * * @example * ```tsx * const { * isEmailConflictOpen, * emailConflictInfo, * toggleEmailConflictModal * } = useEmailConflict() * * // When a conflict is detected * if (isEmailConflictOpen && emailConflictInfo) { * console.log( * `Email ${emailConflictInfo.email} is already used with ${emailConflictInfo.type}` * ) * } * * // Close the conflict modal * toggleEmailConflictModal(false) * ``` */ const useEmailConflict = () => { const { connectors } = (0, wagmi_1.useConnect)(); const forceCreateFuncRef = (0, react_1.useRef)(null); const [isOpen, toggleModal] = (0, react_1.useState)(false); const [emailConflictInfo, setEmailConflictInfo] = (0, react_1.useState)(null); const waasConnectors = connectors.filter(connector => !!connector.sequenceWaas); const waasInstances = waasConnectors.map(connector => connector.sequenceWaas); (0, react_1.useEffect)(() => { if (waasInstances.length > 0) { // Set up listeners for all waas instances const disposers = waasInstances.map(waas => waas.onEmailConflict(async (info, forceCreate) => { forceCreateFuncRef.current = forceCreate; setEmailConflictInfo(info); toggleModal(true); })); // Return cleanup function that disposes all listeners return () => { disposers.forEach(disposer => disposer()); }; } }, []); return { toggleEmailConflictModal: toggleModal, isEmailConflictOpen: isOpen, emailConflictInfo: { email: emailConflictInfo?.email ?? 'Unknown', type: accountTypeText(emailConflictInfo) }, forceCreate: async () => { return forceCreateFuncRef.current?.(true); } }; }; exports.useEmailConflict = useEmailConflict; //# sourceMappingURL=useWaasEmailConflict.js.map