laconic-wallet-web/src/hooks/useGetOrCreateAccounts.ts
2025-04-04 17:11:45 +05:30

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;