import { useCallback, useEffect } from 'react'; import { Box, Modal } from '@mui/material'; import { BASE_URL, VITE_WALLET_IFRAME_URL, } from 'utils/constants'; import { generateNonce, SiweMessage } from 'siwe'; import axios from 'axios'; import { useNavigate } from 'react-router-dom'; const axiosInstance = axios.create({ baseURL: BASE_URL, headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*', }, withCredentials: true, }); const AutoSignInIFrameModal = ( // { // setAccounts, // setIsDataReceived, // isVisible, // }: { // setAccounts: (accounts: string[]) => void; // setIsDataReceived: (isReceived: boolean) => void; // isVisible: boolean; // } ) => { const navigate = useNavigate(); useEffect(() => { const handleMessage = async (event: MessageEvent) => { if (event.origin !== VITE_WALLET_IFRAME_URL) return; // setIsDataReceived(true); if (event.data.type === 'SIGN_IN_RESPONSE') { try { const { success } = ( await axiosInstance.post('/auth/validate', { message: event.data.data.message, signature: event.data.data.signature, }) ).data; if(success) { navigate("/") } return success; } catch (error) { return false; } // setAccounts(event.data.data); } else if (event.data.type === 'ERROR') { console.error('Error from wallet:', event.data.message); } }; window.addEventListener('message', handleMessage); return () => { window.removeEventListener('message', handleMessage); }; }, []); useEffect(() => { const handleInitiateAutoSignIn = async (event: MessageEvent) => { if (event.origin !== VITE_WALLET_IFRAME_URL) return; if (event.data.type === 'ACCOUNT_ADDRESS_RESPONSE') { const iframe = document.getElementById('autoSignInFrame') as HTMLIFrameElement; if (!iframe.contentWindow) { console.error('Iframe not found or not loaded'); return; } const message = new SiweMessage({ version: '1', domain: window.location.host, uri: window.location.origin, chainId: 1, address: event.data.data, nonce: generateNonce(), // Human-readable ASCII assertion that the user will sign, and it must not contain `\n`. statement: 'Sign in With Ethereum.', }).prepareMessage() iframe.contentWindow.postMessage( { type: 'AUTO_SIGN_IN', chainId: '1', message, }, VITE_WALLET_IFRAME_URL, ); // setAccounts(event.data.data); } else if (event.data.type === 'ERROR') { console.error('Error from wallet:', event.data.message); } }; window.addEventListener('message', handleInitiateAutoSignIn); return () => { window.removeEventListener('message', handleInitiateAutoSignIn); }; }, []); // ///////////////////////////////////////////////// const getAddressFromWallet = useCallback(() => { const iframe = document.getElementById('autoSignInFrame') as HTMLIFrameElement; if (!iframe.contentWindow) { console.error('Iframe not found or not loaded'); return; } iframe.contentWindow.postMessage( { type: 'GET_ACCOUNT_ADDRESS', chainId: '1', }, VITE_WALLET_IFRAME_URL, ); }, []); return ( ); }; export default AutoSignInIFrameModal;