@turnkey/react-wallet-kit
Version:
The easiest and most powerful way to integrate Turnkey's Embedded Wallets into your React applications.
164 lines (160 loc) • 6.72 kB
JavaScript
;
var jsxRuntime = require('react/jsx-runtime');
var react = require('react');
var Hook = require('../../../providers/modal/Hook.js');
var Hook$1 = require('../../../providers/client/Hook.js');
var ExternalWalletChainSelector = require('./ExternalWalletChainSelector.js');
var DesktopWalletConnectScreen = require('./DesktopWalletConnectScreen.js');
var DisconnectWalletScreen = require('./DisconnectWalletScreen.js');
var MobileWalletConnectScreen = require('./MobileWalletConnectScreen.js');
var ShowAllWalletsScreen = require('./ShowAllWalletsScreen.js');
var base = require('../../../types/base.js');
/**
* Orchestrates the WalletConnect connection flow.
*
* Desktop flow: Chain selector → QR code screen
* Mobile flow: App selector → Deep link screen (with QR fallback)
*/
function WalletConnectFlow(props) {
const {
providers,
mode,
sessionKey,
onDisconnect
} = props;
const {
pushPage,
popPage,
isMobile
} = Hook.useModal();
const {
connectWalletAccount,
disconnectWalletAccount,
loginOrSignupWithWallet
} = Hook$1.useTurnkey();
const isConnectMode = mode === base.WalletSelectorMode.Connect;
// Check if any provider in the group is already connected
const isConnected = isConnectMode && providers.some(p => p.connectedAddresses?.length > 0);
// ─────────────────────────────────────────────────────────────────────────────
// WalletConnect action handlers
// ─────────────────────────────────────────────────────────────────────────────
const handleAction = async provider => {
if (mode === base.WalletSelectorMode.Auth) {
// Auth flow: loginOrSignupWithWallet handles connect + sign
await loginOrSignupWithWallet({
walletProvider: provider,
...(sessionKey && {
sessionKey
})
});
} else {
// Connect-only flow
await connectWalletAccount(provider);
}
};
const handleDisconnect = async provider => {
await disconnectWalletAccount(provider);
};
/** Push the DisconnectWalletScreen for a connected provider */
const pushDisconnectScreen = async provider => {
if (onDisconnect) {
await onDisconnect(provider);
return;
}
pushPage({
key: `Disconnect ${provider.info.name}`,
content: jsxRuntime.jsx(DisconnectWalletScreen.DisconnectWalletScreen, {
provider: provider,
onDisconnect: async p => {
await handleDisconnect(p);
popPage();
}
}),
showTitle: false
});
};
// ─────────────────────────────────────────────────────────────────────────────
// Screen navigation helpers
// ─────────────────────────────────────────────────────────────────────────────
const pushDesktopQRCodeScreen = (provider, onSelectAllWallets) => {
pushPage({
key: "Connect WalletConnect",
content: jsxRuntime.jsx(DesktopWalletConnectScreen.DesktopWalletConnectScreen, {
provider: provider,
onAction: handleAction,
onDisconnect: handleDisconnect,
onSelectAllWallets: onSelectAllWallets
})
});
};
const pushDesktopChainSelector = onSelectAllWallets => {
pushPage({
key: `Select chain`,
content: jsxRuntime.jsx(ExternalWalletChainSelector.ExternalWalletChainSelector, {
providers: providers,
onDisconnect: isConnectMode ? pushDisconnectScreen : undefined,
onSelect: async provider => pushDesktopQRCodeScreen(provider, onSelectAllWallets)
})
});
};
/** Mobile: Deep link screen to open wallet app */
const pushMobileDeepLinkScreen = provider => {
pushPage({
key: `Open app`,
content: jsxRuntime.jsx(MobileWalletConnectScreen.MobileWalletConnectScreen, {
provider: provider,
onConnect: async p => {
await connectWalletAccount(p);
},
onSign: mode === base.WalletSelectorMode.Auth ? async p => {
await loginOrSignupWithWallet({
walletProvider: p,
...(sessionKey && {
sessionKey
})
});
} : undefined,
onSelectQRCode: async chain => {
// Fallback to QR code if deep link doesn't work
const chainProvider = providers.find(p => p.chainInfo.namespace === chain);
pushDesktopQRCodeScreen(chainProvider);
}
})
});
};
/** Mobile: Show all WalletConnect-compatible apps */
const pushMobileAppSelector = () => {
pushPage({
key: "Connect WalletConnect",
content: jsxRuntime.jsx(ShowAllWalletsScreen.ShowAllWalletsScreen, {
onSelect: async provider => pushMobileDeepLinkScreen(provider),
onSelectQRCode: async () => pushDesktopChainSelector()
})
});
};
// ─────────────────────────────────────────────────────────────────────────────
// Flow selection
// ─────────────────────────────────────────────────────────────────────────────
react.useEffect(() => {
// Mobile flow: App list -> deep link to wallet app
// Desktop flow: Chain selector -> QR code
//
// Exception: For "Connect Wallet" screen (disconnect possible),
// always use desktop flow since it shows connection status.
const useDesktopFlow = !isMobile || isConnected;
// Pop the WalletConnectFlow page itself so the back button on the next
// screen returns to the wallet list, not this empty orchestrator page.
popPage();
if (useDesktopFlow) {
pushDesktopChainSelector(async () => {
pushMobileAppSelector();
});
} else {
pushMobileAppSelector();
}
}, []);
// This component doesn't render anything - it just orchestrates navigation
return null;
}
exports.WalletConnectFlow = WalletConnectFlow;
//# sourceMappingURL=WalletConnectFlow.js.map