From b5b52df06fe0939520862c1f8d320ac852561341 Mon Sep 17 00:00:00 2001 From: Shreerang Kale Date: Fri, 7 Feb 2025 15:05:55 +0530 Subject: [PATCH] Auto sign in using laconic wallet --- packages/frontend/src/App.tsx | 6 +- .../src/components/shared/Sidebar/Sidebar.tsx | 8 +- .../shared/auth/AutoSignInIFrameModal.tsx | 164 ++++++++++++++++++ packages/frontend/src/index.tsx | 6 +- packages/frontend/src/pages/AuthPage.tsx | 5 +- 5 files changed, 177 insertions(+), 12 deletions(-) create mode 100644 packages/frontend/src/components/shared/auth/AutoSignInIFrameModal.tsx diff --git a/packages/frontend/src/App.tsx b/packages/frontend/src/App.tsx index 05c254f8..37007fdb 100644 --- a/packages/frontend/src/App.tsx +++ b/packages/frontend/src/App.tsx @@ -11,7 +11,7 @@ import ProjectSearchLayout from './layouts/ProjectSearch'; import Index from './pages'; import AuthPage from './pages/AuthPage'; import { DashboardLayout } from './pages/org-slug/layout'; -import Web3Provider from 'context/Web3Provider'; +// import Web3Provider from 'context/Web3Provider'; import { BASE_URL } from 'utils/constants'; const router = createBrowserRouter([ @@ -75,9 +75,9 @@ function App() { }, []); return ( - + // - + // ); } diff --git a/packages/frontend/src/components/shared/Sidebar/Sidebar.tsx b/packages/frontend/src/components/shared/Sidebar/Sidebar.tsx index 4aaffe7f..cf68c2f2 100644 --- a/packages/frontend/src/components/shared/Sidebar/Sidebar.tsx +++ b/packages/frontend/src/components/shared/Sidebar/Sidebar.tsx @@ -2,7 +2,7 @@ import { useCallback, useEffect, useState } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import { User } from 'gql-client'; import { motion } from 'framer-motion'; -import { useDisconnect } from 'wagmi'; +// import { useDisconnect } from 'wagmi'; import { useGQLClient } from 'context/GQLClientContext'; import { @@ -32,7 +32,7 @@ export const Sidebar = ({ mobileOpen }: SidebarProps) => { const isDesktop = useMediaQuery('(min-width: 960px)'); const [user, setUser] = useState(); - const { disconnect } = useDisconnect(); + // const { disconnect } = useDisconnect(); const fetchUser = useCallback(async () => { const { user } = await client.getUser(); @@ -49,9 +49,9 @@ export const Sidebar = ({ mobileOpen }: SidebarProps) => { credentials: 'include', }); localStorage.clear(); - disconnect(); + // disconnect(); navigate('/login'); - }, [disconnect, navigate]); + }, [navigate]); return ( 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; diff --git a/packages/frontend/src/index.tsx b/packages/frontend/src/index.tsx index 862eaf67..f8a18bb0 100644 --- a/packages/frontend/src/index.tsx +++ b/packages/frontend/src/index.tsx @@ -14,7 +14,7 @@ import { SERVER_GQL_PATH } from './constants'; import { Toaster } from 'components/shared/Toast'; import { LogErrorBoundary } from 'utils/log-error'; import { BASE_URL } from 'utils/constants'; -import Web3ModalProvider from './context/Web3Provider'; +// import Web3ModalProvider from './context/Web3Provider'; import './index.css'; console.log(`v-0.0.9`); @@ -32,12 +32,12 @@ root.render( - + {/* */} - + {/* */} , diff --git a/packages/frontend/src/pages/AuthPage.tsx b/packages/frontend/src/pages/AuthPage.tsx index 39b3ed89..2d9cc6d5 100644 --- a/packages/frontend/src/pages/AuthPage.tsx +++ b/packages/frontend/src/pages/AuthPage.tsx @@ -1,4 +1,5 @@ -import { Login } from './auth/Login'; +import AutoSignInIFrameModal from 'components/shared/auth/AutoSignInIFrameModal'; +// import { Login } from './auth/Login'; const AuthPage = () => { return ( @@ -14,7 +15,7 @@ const AuthPage = () => {
- +