import { useEffect } from "react"; import { createWallet } from "../utils/accounts"; import { sendMessage } from "../utils/misc"; import useAccountsData from "./useAccountsData"; import { useNetworks } from "../context/NetworksContext"; declare global { interface Window { Android?: { onSignatureComplete?: (signature: string) => void; onSignatureError?: (error: string) => void; onSignatureCancelled?: () => void; }; } } const useGetOrCreateAccounts = (onWalletCreated?: () => void) => { const { networksData } = useNetworks(); const { getAccountsData } = useAccountsData(); useEffect(() => { const handleCreateAccounts = async (event: MessageEvent) => { if (event.data.type !== 'REQUEST_CREATE_OR_GET_ACCOUNTS') return; let accountsData = await getAccountsData(event.data.chainId); if (accountsData.length === 0) { console.log("Accounts not found, creating wallet..."); await createWallet(networksData); // Re-fetch newly created accounts accountsData = await getAccountsData(event.data.chainId); onWalletCreated?.(); } sendMessage( event.source as Window, 'WALLET_ACCOUNTS_DATA', accountsData.map(account => account.address), event.origin ); }; const autoCreateAccounts = async () => { const defaultChainId = networksData[0]?.chainId; if (!defaultChainId) return; let accountsData = await getAccountsData(defaultChainId); if (accountsData.length === 0) { console.log("Auto-creating wallet..."); await createWallet(networksData); accountsData = await getAccountsData(defaultChainId); onWalletCreated?.(); } }; window.addEventListener('message', handleCreateAccounts); const isAndroidWebView = !!(window.Android); if (isAndroidWebView) { autoCreateAccounts(); } return () => { window.removeEventListener('message', handleCreateAccounts); }; }, [networksData, getAccountsData, onWalletCreated]); }; export default useGetOrCreateAccounts;