import { Button } from 'components/shared/Button'; import { ArrowRightCircleFilledIcon, GithubIcon, LoaderIcon, } from 'components/shared/CustomIcon'; import { GoogleIcon } from 'components/shared/CustomIcon/GoogleIcon'; import { DotBorder } from 'components/shared/DotBorder'; import { WavyBorder } from 'components/shared/WavyBorder'; import { useEffect, useState } from 'react'; import { useSnowball } from 'utils/use-snowball'; import { Input } from 'components/shared/Input'; import { AppleIcon } from 'components/shared/CustomIcon/AppleIcon'; import { Link } from 'react-router-dom'; import { useToast } from 'components/shared/Toast'; import { PKPEthersWallet } from '@lit-protocol/pkp-ethers'; import { signInWithEthereum } from 'utils/siwe'; import { logError } from 'utils/log-error'; import { subOrganizationIdForEmail, turnkeySignin, turnkeySignup, } from 'utils/turnkey-frontend'; import { verifyAccessCode } from 'utils/accessCode'; type Provider = 'google' | 'github' | 'apple' | 'email'; type Err = { type: 'email' | 'provider'; message: string }; type Props = { onDone: () => void; }; export const SignUp = ({ onDone }: Props) => { const [email, setEmail] = useState(''); const [error, setError] = useState(); const [provider, setProvider] = useState(false); const { toast } = useToast(); const snowball = useSnowball(); async function handleSignupRedirect() { let wallet: PKPEthersWallet | undefined; const { google } = snowball.auth; if (google.canHandleOAuthRedirectBack()) { setProvider('google'); try { await google.handleOAuthRedirectBack(); // @ts-ignore wallet = await google.getEthersWallet(); // @ts-ignore const result = await signInWithEthereum(1, 'signup', wallet); if (result.error) { setError({ type: 'provider', message: result.error }); setProvider(false); wallet = undefined; logError(new Error(result.error)); return; } } catch (err: any) { setError({ type: 'provider', message: err.message }); setProvider(false); logError(err); return; } } // if (apple.canHandleOAuthRedirectBack()) { // setProvider('apple'); // try { // await apple.handleOAuthRedirectBack(); // wallet = await apple.getEthersWallet(); // const result = await signInWithEthereum(1, 'signup', wallet); // if (result.error) { // setError({ type: 'provider', message: result.error }); // setProvider(false); // wallet = undefined; // return; // } // } catch (err: any) { // setError({ type: 'provider', message: err.message }); // setProvider(false); // return; // } // } if (wallet) { onDone(); } } async function authEmail() { setProvider('email'); try { const orgId = await subOrganizationIdForEmail(email); console.log('orgId', orgId); if (orgId) { await turnkeySignin(orgId); window.location.href = '/dashboard'; } else { await turnkeySignup(email); onDone(); } } catch (err: any) { setError({ type: 'email', message: err.message }); } } useEffect(() => { handleSignupRedirect(); }, []); const loading = provider; const emailValid = /.@./.test(email); useEffect(() => { const validateAccessCode = async () => { const accessCode = localStorage.getItem('accessCode'); if (!accessCode) { redirectToSignup(); return; } try { await verifyAccessCode(accessCode); } catch (err: any) { redirectToSignup(); } }; const redirectToSignup = () => { localStorage.removeItem('accessCode'); window.location.href = '/signup'; }; validateAccessCode(); }, []); return (
Sign up to Snowball
{error && error.type === 'provider' && (
Error: {error.message}
)}
OR
Email
setEmail(e.target.value)} disabled={!!loading} />
{error && error.type === 'email' && (
Error: {error.message}
)}
Already an user?
Sign in now
); };