@0xsequence/connect
Version:
Connect package for Sequence Web SDK
98 lines • 3.6 kB
JavaScript
import { IdentityType } from '@0xsequence/waas';
import { useEffect, useRef, useState } from 'react';
import { useConnect } from '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 === IdentityType.PlayFab) {
return 'PlayFab login';
}
if (info.type === IdentityType.Email) {
return 'Email login';
}
if (info.type === 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)
* ```
*/
export const useEmailConflict = () => {
const { connectors } = useConnect();
const forceCreateFuncRef = useRef(null);
const [isOpen, toggleModal] = useState(false);
const [emailConflictInfo, setEmailConflictInfo] = useState(null);
const waasConnectors = connectors.filter(connector => !!connector.sequenceWaas);
const waasInstances = waasConnectors.map(connector => connector.sequenceWaas);
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);
}
};
};
//# sourceMappingURL=useWaasEmailConflict.js.map