73 lines
2.1 KiB
TypeScript
73 lines
2.1 KiB
TypeScript
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; |