diff --git a/examples/react/src/config.ts b/examples/react/src/config.ts index 6ea37e618..f7b9be30a 100644 --- a/examples/react/src/config.ts +++ b/examples/react/src/config.ts @@ -27,7 +27,8 @@ export const connectConfig: ConnectConfig = { defaultTheme: 'dark', signIn: { projectName: 'Sequence Web SDK Demo', - useMock: isDebugMode + useMock: isDebugMode, + showWalletAuthOptionsFirst: false }, // Custom css injected into shadow dom // customCSS: ` diff --git a/packages/connect/src/components/Connect/Connect.tsx b/packages/connect/src/components/Connect/Connect.tsx index e11448c1e..91a63cbd8 100644 --- a/packages/connect/src/components/Connect/Connect.tsx +++ b/packages/connect/src/components/Connect/Connect.tsx @@ -59,6 +59,7 @@ export const Connect = (props: ConnectProps) => { const descriptiveSocials = !!config?.signIn?.descriptiveSocials const [isLoading, setIsLoading] = useState(false) const projectName = config?.signIn?.projectName + const showWalletAuthOptionsFirst = config?.signIn?.showWalletAuthOptionsFirst ?? false const [email, setEmail] = useState('') const [showEmailWaasPinInput, setShowEmailWaasPinInput] = useState(false) @@ -70,8 +71,6 @@ export const Connect = (props: ConnectProps) => { const { wallets, linkedWallets, disconnectWallet, refetchLinkedWallets } = useWallets() const { data: waasStatusData } = useGetWaasStatus() - const hasInjectedSequenceConnector = connectors.some(c => c.id === 'app.sequence') - const hasConnectedSequenceUniversal = connections.some(c => c.connector.name === SEQUENCE_UNIVERSAL_CONNECTOR_NAME) const hasConnectedSocialOrSequenceUniversal = connections.some(c => (c.connector as ExtendedConnector)?._wallet?.type === 'social') || hasConnectedSequenceUniversal @@ -184,33 +183,59 @@ export const Connect = (props: ConnectProps) => { .filter(c => { return c._wallet && (c._wallet.type === 'wallet' || c._wallet.type === undefined) }) - // Remove sequence if wallet extension detected + // Remove metamask if metamask is detected + .filter(c => { + const isMetamaskInjected = window.ethereum?.isMetaMask + + if (c._wallet?.id === 'metamask-wallet' && isMetamaskInjected) { + return false + } + + return true + }) + // Remove coinbase if coinbase is detected .filter(c => { - if (c._wallet?.id === 'sequence' && hasInjectedSequenceConnector) { + const isCoinbaseInjected = window.ethereum?.isCoinbaseWallet + + if (c._wallet?.id === 'coinbase-wallet' && isCoinbaseInjected) { return false } return true }) + const mockConnector = baseWalletConnectors.find(connector => { return connector._wallet.id === 'mock' }) // EIP-6963 connectors will not have the _wallet property const injectedConnectors: ExtendedConnector[] = connectors - .filter(c => c.type === 'injected') - // Remove the injected connectors when another connector is already in the base connectors .filter(connector => { - if (connector.id === 'com.coinbase.wallet') { - return !connectors.find(connector => (connector as ExtendedConnector)?._wallet?.id === 'coinbase-wallet') + // Keep the connector when it is an EIP-6963 connector + if (connector.type === 'injected') { + return true } - if (connector.id === 'io.metamask') { - return !connectors.find(connector => (connector as ExtendedConnector)?._wallet?.id === 'metamask-wallet') + + // We check if SDK-generated connectors is actually an injected connector + const isMetamaskInjected = window.ethereum?.isMetaMask + + if ((connector as ExtendedConnector)._wallet?.id === 'metamask-wallet' && isMetamaskInjected) { + return true } - return true + const isCoinbaseInjected = window.ethereum?.isCoinbaseWallet + + if ((connector as ExtendedConnector)._wallet?.id === 'coinbase-wallet' && isCoinbaseInjected) { + return true + } + + return false }) .map(connector => { + if (connector?._wallet) { + return connector as ExtendedConnector + } + const Logo = (props: LogoProps) => { return {connector.name} } @@ -230,9 +255,10 @@ export const Connect = (props: ConnectProps) => { const socialAuthConnectors = (connectors as ExtendedConnector[]) .filter(c => c._wallet?.type === 'social') .filter(c => !c._wallet.id.includes('email')) - const walletConnectors = [...baseWalletConnectors, ...injectedConnectors].filter(c => + const walletConnectors = [...injectedConnectors, ...baseWalletConnectors].filter(c => hasConnectedSequenceUniversal ? c.name !== SEQUENCE_UNIVERSAL_CONNECTOR_NAME : true ) + const emailConnector = (connectors as ExtendedConnector[]).find(c => c._wallet?.id.includes('email')) const onChangeEmail: ChangeEventHandler = ev => { @@ -359,6 +385,17 @@ export const Connect = (props: ConnectProps) => { const socialConnectorsPerRow = showMoreSocialOptions && !descriptiveSocials ? MAX_ITEM_PER_ROW - 1 : socialAuthConnectors.length const walletConnectorsPerRow = showMoreWalletOptions ? MAX_ITEM_PER_ROW - 1 : walletConnectors.length + const WalletConnectorsSection = () => { + return ( +
+ {walletConnectors.slice(0, walletConnectorsPerRow).map(connector => { + return + })} + {showMoreWalletOptions && setShowExtendedList('wallet')} />} +
+ ) + } + if (showExtendedList) { const SEARCHABLE_TRESHOLD = 8 const connectors = showExtendedList === 'social' ? socialAuthConnectors : walletConnectors @@ -482,6 +519,9 @@ export const Connect = (props: ConnectProps) => { <> + {showWalletAuthOptionsFirst && !hideExternalConnectOptions && walletConnectors.length > 0 && ( + + )}
<> {!hideSocialConnectOptions && showSocialConnectorSection && ( @@ -574,20 +614,8 @@ export const Connect = (props: ConnectProps) => {
)} - {!hideExternalConnectOptions && walletConnectors.length > 0 && ( - <> -
- {walletConnectors.slice(0, walletConnectorsPerRow).map(connector => { - return - })} - {showMoreWalletOptions && setShowExtendedList('wallet')} />} -
- + {!showWalletAuthOptionsFirst && !hideExternalConnectOptions && walletConnectors.length > 0 && ( + )}
diff --git a/packages/connect/src/types.ts b/packages/connect/src/types.ts index 0c39cd171..a70b7c6cb 100644 --- a/packages/connect/src/types.ts +++ b/packages/connect/src/types.ts @@ -71,6 +71,7 @@ export interface ConnectConfig { position?: ModalPosition signIn?: { logoUrl?: string + showWalletAuthOptionsFirst?: boolean descriptiveSocials?: boolean disableTooltipForDescriptiveSocials?: boolean projectName?: string