@zerodev/wallet-react-ui 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -10
- package/dist/_types/auth/authStoreSlice.d.ts +3 -4
- package/dist/_types/auth/authStoreSlice.d.ts.map +1 -1
- package/dist/_types/auth/hooks/useAuth.d.ts +0 -2
- package/dist/_types/auth/hooks/useAuth.d.ts.map +1 -1
- package/dist/_types/auth/index.d.ts +9 -1
- package/dist/_types/auth/index.d.ts.map +1 -1
- package/dist/_types/auth/pages/OtpInput.d.ts.map +1 -1
- package/dist/_types/auth/pages/SignUp/Email.d.ts +4 -0
- package/dist/_types/auth/pages/SignUp/Email.d.ts.map +1 -0
- package/dist/_types/auth/pages/SignUp/Google.d.ts +3 -0
- package/dist/_types/auth/pages/SignUp/Google.d.ts.map +1 -0
- package/dist/_types/auth/pages/SignUp/Passkey.d.ts +3 -0
- package/dist/_types/auth/pages/SignUp/Passkey.d.ts.map +1 -0
- package/dist/_types/auth/pages/SignUp/context.d.ts +25 -0
- package/dist/_types/auth/pages/SignUp/context.d.ts.map +1 -0
- package/dist/_types/auth/pages/SignUp/index.d.ts +31 -0
- package/dist/_types/auth/pages/SignUp/index.d.ts.map +1 -0
- package/dist/_types/auth/pages/Verifying.d.ts.map +1 -1
- package/dist/_types/auth/types.d.ts +0 -8
- package/dist/_types/auth/types.d.ts.map +1 -1
- package/dist/_types/auth/utils/isCancellationError.d.ts +2 -0
- package/dist/_types/auth/utils/isCancellationError.d.ts.map +1 -0
- package/dist/_types/connector.d.ts +3 -13
- package/dist/_types/connector.d.ts.map +1 -1
- package/dist/_types/index.d.ts +4 -3
- package/dist/_types/index.d.ts.map +1 -1
- package/dist/_types/store.d.ts +1 -6
- package/dist/_types/store.d.ts.map +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +555 -562
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +3 -3
- package/src/auth/authStoreSlice.ts +7 -13
- package/src/auth/hooks/useAuth.ts +0 -5
- package/src/auth/index.tsx +19 -7
- package/src/auth/pages/OtpInput.tsx +1 -4
- package/src/auth/pages/SignUp/Email.tsx +86 -0
- package/src/auth/pages/SignUp/Google.tsx +43 -0
- package/src/auth/pages/SignUp/Passkey.tsx +56 -0
- package/src/auth/pages/SignUp/context.tsx +41 -0
- package/src/auth/pages/SignUp/index.tsx +138 -0
- package/src/auth/pages/Verifying.tsx +3 -10
- package/src/auth/types.ts +0 -9
- package/src/auth/utils/isCancellationError.ts +8 -0
- package/src/connector.ts +12 -28
- package/src/index.ts +3 -3
- package/src/store.ts +1 -8
- package/dist/_types/auth/pages/SignUp.d.ts +0 -2
- package/dist/_types/auth/pages/SignUp.d.ts.map +0 -1
- package/src/auth/pages/SignUp.tsx +0 -311
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../assets/states/error.webp?no-inline","../assets/states/loading.webp?no-inline","../assets/states/send.webp?no-inline","../assets/states/success.webp?no-inline","../src/shared/components/StatusScreen/index.tsx","../src/shared/hooks/useKitStore.ts","../src/auth/hooks/useAuth.ts","../src/auth/pages/EmailVerification.tsx","../src/auth/utils/url.ts","../src/auth/pages/ErrorScreen.tsx","../src/auth/components/CodeInput/index.tsx","../src/auth/pages/OtpInput.tsx","../src/shared/components/SignUpFooter/index.tsx","../src/shared/utils/common.ts","../src/auth/assets/blob.webm?no-inline","../src/auth/components/BlobAnimation/index.tsx","../src/auth/pages/SignUp.tsx","../src/auth/pages/Verifying.tsx","../src/auth/pages/WalletSelection.tsx","../src/auth/index.tsx","../src/auth/authStoreSlice.ts","../src/store.ts","../src/connector.ts"],"sourcesContent":["export default \"__VITE_ASSET__J56$5yRt__\"","export default \"__VITE_ASSET__DC8GJ24R__\"","export default \"__VITE_ASSET__DrgAA58A__\"","export default \"__VITE_ASSET___eUV$EDU__\"","import { cn, Text } from '@zerodev/react-ui'\nimport type { ReactNode } from 'react'\nimport errorImg from '../../../../assets/states/error.webp?no-inline'\nimport loadingImg from '../../../../assets/states/loading.webp?no-inline'\nimport sendImg from '../../../../assets/states/send.webp?no-inline'\nimport successImg from '../../../../assets/states/success.webp?no-inline'\n\nexport type StateImageName = 'error' | 'loading' | 'send' | 'success'\n\nconst STATE_IMAGES: Record<StateImageName, string> = {\n error: errorImg,\n loading: loadingImg,\n send: sendImg,\n success: successImg,\n}\n\nexport interface StatusScreenProps {\n imageName: StateImageName\n title: string\n children: ReactNode\n className?: string\n}\n\nexport function StatusScreen({\n imageName,\n title,\n children,\n className,\n}: StatusScreenProps) {\n return (\n <div\n className={cn('zd:flex zd:flex-col zd:gap-8 zd:items-center', className)}\n >\n <img\n src={STATE_IMAGES[imageName]}\n alt={imageName}\n className=\"zd:w-[118px] zd:h-[118px] zd:bg-transparent\"\n />\n <div className=\"zd:flex zd:flex-col zd:gap-4 zd:items-center\">\n <Text className=\"zd:text-h2 zd:text-center zd:whitespace-pre-wrap\">\n {title}\n </Text>\n <Text className=\"zd:text-center zd:whitespace-pre-wrap\">\n {children}\n </Text>\n </div>\n </div>\n )\n}\n","import { useConfig } from 'wagmi'\nimport type { createStore } from '../../store'\n\ntype KitStore = ReturnType<typeof createStore>\n\n/**\n * Returns the zustand store attached to the `zeroDevWallet` connector.\n * Throws when the kit connector isn't present on the wagmi config.\n *\n * Read individual fields with `useStore(useKitStore(), (s) => s.field)`.\n */\nexport function useKitStore(): KitStore {\n const config = useConfig()\n const connector = config.connectors.find((c) => c.id === 'zerodev-wallet')\n if (!connector || !('getKitStore' in connector)) {\n throw new Error('useKitStore must be used with the zeroDevWallet connector')\n }\n // @ts-expect-error - getKitStore is a custom method on the kit connector\n return connector.getKitStore()\n}\n","import { useStore } from 'zustand'\nimport { useKitStore } from '../../shared/hooks/useKitStore'\n\nexport function useAuth() {\n const store = useKitStore()\n\n const step = useStore(store, (state) => state.auth.step)\n const stepHistory = useStore(store, (state) => state.auth.stepHistory)\n const email = useStore(store, (state) => state.auth.email)\n const otpId = useStore(store, (state) => state.auth.otpId)\n const otpEncryptionTargetBundle = useStore(\n store,\n (state) => state.auth.otpEncryptionTargetBundle,\n )\n const enabledMethods = useStore(store, (state) => state.auth.enabledMethods)\n const authConfig = useStore(store, (state) => state.auth.config)\n\n return {\n step,\n email,\n otpId,\n otpEncryptionTargetBundle,\n enabledMethods,\n config: authConfig,\n goToStep: store.getState().auth.goToStep,\n goBack: stepHistory.length > 0 ? store.getState().auth.goBack : null,\n reset: store.getState().auth.reset,\n setEmail: store.getState().auth.setEmail,\n setOtpSession: store.getState().auth.setOtpSession,\n clearOtpSession: store.getState().auth.clearOtpSession,\n }\n}\n","import { PoweredBy, Text } from '@zerodev/react-ui'\nimport { useSendMagicLink } from '@zerodev/wallet-react'\nimport { useEffect, useState } from 'react'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\n\nexport function EmailVerification() {\n const { email, setOtpSession } = useAuth()\n const { mutateAsync: sendMagicLink, isPending: isSendPending } =\n useSendMagicLink()\n\n const [secondsLeftUntilResend, setSecondsLeftUntilResend] = useState(60)\n const canResend = secondsLeftUntilResend <= 0 && !isSendPending\n\n useEffect(() => {\n if (secondsLeftUntilResend <= 0) return\n\n const timer = setInterval(() => {\n setSecondsLeftUntilResend((prev) => Math.max(0, prev - 1))\n }, 1000)\n\n return () => {\n clearInterval(timer)\n }\n }, [secondsLeftUntilResend])\n\n const handleResend = async () => {\n if (!email || !canResend) return\n\n try {\n const { otpId, otpEncryptionTargetBundle } = await sendMagicLink({\n email,\n })\n setOtpSession({ otpId, otpEncryptionTargetBundle })\n setSecondsLeftUntilResend(60)\n } catch {\n // Error resending magic link\n }\n }\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:justify-center\">\n <StatusScreen\n imageName=\"send\"\n title={'Check your email!\\n An Email is On Its Way'}\n >\n We've sent a magic link to{' '}\n <Text as=\"span\" className=\"zd:text-solarOrange\">\n {email}\n </Text>\n {'\\n'}Please open the email and click the link to log in.\n </StatusScreen>\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n <Text className=\"zd:text-center\">\n Did not get an email?{' '}\n <button\n type=\"button\"\n disabled={!canResend}\n onClick={handleResend}\n className=\"zd:cursor-pointer zd:underline zd:disabled:opacity-50 zd:disabled:cursor-not-allowed\"\n >\n {canResend\n ? 'Resend'\n : `Resend in ${secondsLeftUntilResend} ${secondsLeftUntilResend === 1 ? 'second' : 'seconds'}`}\n </button>\n </Text>\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","export function hasMagicLinkCodeInUrl(): boolean {\n if (typeof window === 'undefined') return false\n return new URLSearchParams(window.location.search).has('code')\n}\n\nexport function stripMagicLinkCodeFromUrl(): void {\n if (typeof window === 'undefined') return\n const url = new URL(window.location.href)\n if (!url.searchParams.has('code')) return\n url.searchParams.delete('code')\n window.history.replaceState(null, '', url.toString())\n}\n","import { Button, PoweredBy } from '@zerodev/react-ui'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\nimport { stripMagicLinkCodeFromUrl } from '../utils/url'\n\ninterface ErrorScreenProps {\n title?: string\n message?: string\n showRetry?: boolean\n showChooseAnother?: boolean\n}\n\nexport function ErrorScreen({\n title = 'Oops, something went wrong',\n message = \"We couldn't complete the sign-in process. This could be due to timeout, an expired link, or a cancelled request.\",\n showRetry = false,\n showChooseAnother = true,\n}: ErrorScreenProps) {\n const { goToStep, goBack, reset } = useAuth()\n const handleRetry = goBack ?? (() => goToStep('sign-up'))\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"error\" title={title}>\n {message}\n </StatusScreen>\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n {showRetry && (\n <Button action=\"primary\" text=\"Try again\" onClick={handleRetry} />\n )}\n {showChooseAnother && (\n <Button\n action={showRetry ? 'secondary' : 'primary'}\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n )}\n {!showRetry && !showChooseAnother && (\n <Button action=\"primary\" text=\"Start over\" onClick={reset} />\n )}\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { cn, Text, Wrapper } from '@zerodev/react-ui'\nimport { useEffect, useMemo, useRef, useState } from 'react'\n\nconst MIN_LENGTH = 4\nconst MAX_LENGTH = 8\nconst DEFAULT_LENGTH = 6\n\nfunction clampLength(length: number): number {\n return Math.max(MIN_LENGTH, Math.min(MAX_LENGTH, length))\n}\n\ninterface CharBoxProps {\n char: string\n isFocused: boolean\n}\n\nfunction CharBox({ char, isFocused }: CharBoxProps) {\n return (\n <Wrapper\n data-testid=\"code-input-box\"\n data-active={isFocused || undefined}\n className={cn(\n 'zd:h-16 zd:w-14 zd:rounded-lg zd:flex zd:items-center zd:justify-center',\n isFocused && 'zd:border-[1.5px] zd:border-greyScale',\n )}\n >\n <Text className=\"zd:text-h2\">{char}</Text>\n </Wrapper>\n )\n}\n\nexport interface CodeInputProps {\n onChange?: (code: string) => void\n onComplete?: (code: string) => void\n disabled?: boolean\n error?: boolean\n autoFocus?: boolean\n length?: number\n 'data-testid'?: string\n}\n\nexport function CodeInput({\n onChange,\n onComplete,\n disabled = false,\n error = false,\n autoFocus = false,\n length = DEFAULT_LENGTH,\n 'data-testid': testId,\n}: CodeInputProps) {\n const codeLength = clampLength(length)\n const charBoxes = useMemo(\n () =>\n Array.from({ length: codeLength }, (_, i) => ({\n id: `char-${i}`,\n index: i,\n })),\n [codeLength],\n )\n\n const [code, setCode] = useState('')\n const [isFocused, setIsFocused] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (autoFocus && !disabled) {\n inputRef.current?.focus()\n }\n }, [autoFocus, disabled])\n\n useEffect(() => {\n setCode((prev) => prev.slice(0, codeLength))\n }, [codeLength])\n\n const handleChange = (text: string) => {\n const sanitized = text.slice(0, codeLength).toUpperCase()\n setCode(sanitized)\n onChange?.(sanitized)\n\n if (sanitized.length === codeLength) {\n // Makes sure onComplete is run on the next render cycle after the last char is rendered\n setTimeout(() => {\n onComplete?.(sanitized)\n inputRef.current?.blur()\n }, 0)\n }\n }\n\n return (\n <button\n type=\"button\"\n className=\"zd:flex zd:flex-row zd:items-center zd:justify-between zd:gap-2 zd:w-full zd:cursor-text\"\n onClick={() => inputRef.current?.focus()}\n disabled={disabled}\n data-testid={testId}\n >\n <input\n ref={inputRef}\n value={code}\n onChange={(e) => handleChange(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n maxLength={codeLength}\n disabled={disabled}\n className=\"zd:absolute zd:opacity-0 zd:pointer-events-none\"\n style={{ position: 'absolute', opacity: 0 }}\n aria-label=\"Verification code\"\n />\n {charBoxes.map((box) => (\n <CharBox\n key={box.id}\n char={code[box.index] ?? ''}\n isFocused={!error && isFocused && box.index === code.length}\n />\n ))}\n </button>\n )\n}\n","import { Button, PoweredBy, Text } from '@zerodev/react-ui'\nimport { useSendOTP, useVerifyOTP } from '@zerodev/wallet-react'\nimport { useEffect, useState } from 'react'\nimport { CodeInput } from '../components/CodeInput'\nimport { useAuth } from '../hooks/useAuth'\n\nexport function OtpInput() {\n const {\n email,\n otpId,\n otpEncryptionTargetBundle,\n setOtpSession,\n clearOtpSession,\n goToStep,\n config,\n } = useAuth()\n const { mutateAsync: sendOtp, isPending: isSendOtpPending } = useSendOTP()\n const { mutateAsync: verifyOtp, isPending } = useVerifyOTP()\n\n const [otp, setOtp] = useState('')\n const [error, setError] = useState(false)\n const [secondsUntilResend, setSecondsUntilResend] = useState(60)\n\n // Countdown timer for resend\n useEffect(() => {\n if (secondsUntilResend <= 0) return\n\n const interval = setInterval(() => {\n setSecondsUntilResend((prev) => Math.max(0, prev - 1))\n }, 1000)\n return () => clearInterval(interval)\n }, [secondsUntilResend])\n\n const handleVerify = async () => {\n if (!otp.trim() || !otpId || !otpEncryptionTargetBundle) return\n\n setError(false)\n try {\n await verifyOtp({\n otpId,\n code: otp.trim(),\n otpEncryptionTargetBundle,\n })\n clearOtpSession()\n goToStep('authenticated')\n config?.onSuccess?.()\n } catch (err) {\n setError(true)\n config?.onError?.(err)\n }\n }\n\n const handleComplete = (code: string) => {\n setOtp(code)\n }\n\n const handleResend = async () => {\n if (!email || secondsUntilResend > 0 || isSendOtpPending) return\n\n try {\n const { otpId: newOtpId, otpEncryptionTargetBundle: newBundle } =\n await sendOtp({ email })\n setOtpSession({\n otpId: newOtpId,\n otpEncryptionTargetBundle: newBundle,\n })\n setSecondsUntilResend(60)\n setError(false)\n } catch {\n setError(true)\n }\n }\n\n const canResend = secondsUntilResend <= 0 && !isSendOtpPending\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:justify-center zd:items-center\">\n <div className=\"zd:flex zd:flex-col zd:gap-4\">\n <Text className=\"zd:text-h2 zd:text-center\">\n Enter verification code\n </Text>\n <Text className=\"zd:text-center\">\n Enter the code from the email we sent to{' '}\n <Text className=\"zd:text-solarOrange\">{email}</Text>\n </Text>\n </div>\n\n <CodeInput\n onComplete={handleComplete}\n onChange={() => setError(false)}\n disabled={isPending}\n error={error}\n autoFocus\n />\n\n <Button\n text=\"Confirm code\"\n onClick={handleVerify}\n disabled={!otp.trim() || isPending}\n />\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n <Text className=\"zd:text-center\">\n Did not get an email?{' '}\n <button\n type=\"button\"\n disabled={!canResend}\n onClick={handleResend}\n className=\"zd:cursor-pointer zd:underline zd:disabled:opacity-50 zd:disabled:cursor-not-allowed\"\n >\n {canResend\n ? 'Resend'\n : `Resend in ${secondsUntilResend} ${secondsUntilResend === 1 ? 'second' : 'seconds'}`}\n </button>\n </Text>\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { PoweredBy, Text } from '@zerodev/react-ui'\n\nexport function SignUpFooter({\n termsAndConditionsUrl,\n privacyPolicyUrl,\n agreedToTerms,\n setAgreedToTerms,\n highlight = false,\n}: {\n termsAndConditionsUrl?: string | undefined\n privacyPolicyUrl?: string | undefined\n agreedToTerms: boolean\n setAgreedToTerms: (agreed: boolean) => void\n highlight?: boolean\n}) {\n const showAgreement = !!(termsAndConditionsUrl || privacyPolicyUrl)\n\n return (\n <div className=\"zd:flex zd:flex-col zd:items-center zd:gap-5\">\n {showAgreement && (\n <div\n className={`zd:flex zd:flex-row zd:items-center zd:gap-2 zd:rounded-md zd:p-2 zd:transition-colors ${\n highlight\n ? 'zd:border zd:border-negative'\n : 'zd:border zd:border-transparent'\n }`}\n >\n <input\n type=\"checkbox\"\n checked={agreedToTerms}\n onChange={(e) => setAgreedToTerms(e.target.checked)}\n className=\"zd:cursor-pointer zd:[color-scheme:light]\"\n />\n <Text className=\"zd:flex-1\">\n I agree to the{' '}\n {termsAndConditionsUrl && (\n <Text\n as=\"a\"\n href={termsAndConditionsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"zd:underline\"\n >\n Terms & Conditions\n </Text>\n )}\n {termsAndConditionsUrl && privacyPolicyUrl && ' and '}\n {privacyPolicyUrl && (\n <Text\n as=\"a\"\n href={privacyPolicyUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"zd:underline\"\n >\n Privacy Policy\n </Text>\n )}\n </Text>\n </div>\n )}\n <PoweredBy />\n </div>\n )\n}\n","export function capitalizeFirst(str?: string | null): string {\n if (!str) return ''\n const first = str.at(0) ?? ''\n return first.toUpperCase() + str.slice(1)\n}\n\nexport function shortenHex(hex: string, length = 4) {\n return `${hex.slice(0, length + 2)}...${hex.slice(-length)}`\n}\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\nexport function isValidEmailAddress(email: string): boolean {\n return EMAIL_REGEX.test(email.trim())\n}\n","export default \"__VITE_ASSET__DthArV0k__\"","// ?no-inline forces Vite to emit blob.webm as a separate file (dist/blob.webm)\n// instead of base64-inlining ~700KB into the JS bundle. Requires base:'./' in\n// vite.config.ts so the emitted URL is package-relative, not root-absolute.\nimport blobWebm from '../../assets/blob.webm?no-inline'\n\n// VP9-alpha WebM. Renders the animated blob on browsers that support WebM with\n// an alpha channel (Chrome, Firefox, Edge). Safari plays the WebM container but\n// not VP9 alpha, so the blob is simply not shown there — an acceptable\n// degradation for a decorative element.\nexport function BlobAnimation({ className }: { className?: string }) {\n return (\n <video\n className={className}\n style={{ aspectRatio: '1 / 1' }}\n src={blobWebm}\n autoPlay\n loop\n muted\n playsInline\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n )\n}\n","import {\n Button,\n Icon,\n Input,\n ListItem,\n ListItemChevron,\n ListItemIcon,\n Text,\n} from '@zerodev/react-ui'\nimport {\n useAuthenticateOAuth,\n useLoginPasskey,\n useRegisterPasskey,\n useSendMagicLink,\n useSendOTP,\n} from '@zerodev/wallet-react'\nimport { useState } from 'react'\nimport { SignUpFooter } from '../../shared/components/SignUpFooter'\nimport { isValidEmailAddress } from '../../shared/utils/common'\nimport { BlobAnimation } from '../components/BlobAnimation'\nimport { useAuth } from '../hooks/useAuth'\n\nfunction isCancellationError(err: unknown): boolean {\n if (!(err instanceof Error)) return false\n // WebAuthn / passkey\n if (err.name === 'AbortError' || err.name === 'NotAllowedError') return true\n // OAuth (existing logic, message-based)\n const msg = err.message.toLowerCase()\n return msg.includes('oauth popup was closed')\n}\n\nexport function SignUp() {\n const { goToStep, setEmail, setOtpSession, config, enabledMethods } =\n useAuth()\n const [agreedToTerms, setAgreedToTerms] = useState(false)\n const [highlightAgreement, setHighlightAgreement] = useState(false)\n const [emailInput, setEmailInput] = useState('')\n const shouldUseOtp = config?.emailAuthMethod === 'otp'\n const { mutateAsync: sendOtp, isPending: isSendOtpPending } = useSendOTP()\n const { mutateAsync: sendMagicLink, isPending: isSendMagicLinkPending } =\n useSendMagicLink()\n const isEmailLoading = isSendOtpPending || isSendMagicLinkPending\n\n const [error, setError] = useState<string | null>(null)\n\n const { mutateAsync: authenticateOAuth, isPending: isGoogleLoading } =\n useAuthenticateOAuth({\n mutation: {\n onSuccess: async () => {\n goToStep('authenticated')\n config?.onSuccess?.()\n },\n onError: (err) => {\n config?.onError?.(err)\n },\n },\n })\n\n const { mutate: registerPasskey, isPending: isRegisterPasskeyPending } =\n useRegisterPasskey({\n mutation: {\n onSuccess: () => {\n goToStep('authenticated')\n config?.onSuccess?.()\n },\n onError: (err) => {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n config?.onError?.(err)\n },\n },\n })\n\n const { mutate: loginPasskey, isPending: isLoginPasskeyPending } =\n useLoginPasskey({\n mutation: {\n onSuccess: () => {\n goToStep('authenticated')\n config?.onSuccess?.()\n },\n onError: (err) => {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n config?.onError?.(err)\n },\n },\n })\n\n const anyPending =\n isGoogleLoading ||\n isEmailLoading ||\n isRegisterPasskeyPending ||\n isLoginPasskeyPending\n const requiresAgreement = !!(\n config?.termsAndConditionsUrl || config?.privacyPolicyUrl\n )\n const needsToAcceptAgreement = requiresAgreement && !agreedToTerms\n\n const handleRegisterPasskey = () => {\n if (anyPending) return\n if (needsToAcceptAgreement) {\n setHighlightAgreement(true)\n return\n }\n setError(null)\n registerPasskey()\n }\n\n const handleLoginPasskey = () => {\n if (anyPending) return\n if (needsToAcceptAgreement) {\n setHighlightAgreement(true)\n return\n }\n setError(null)\n loginPasskey()\n }\n\n const handleGoogleAuth = async () => {\n if (needsToAcceptAgreement) {\n setHighlightAgreement(true)\n return\n }\n setError(null)\n try {\n await authenticateOAuth({ provider: 'google' })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n if (!isCancellationError(err)) {\n setError(message)\n }\n }\n }\n\n const handleEmailOtp = async () => {\n if (!emailInput || anyPending) return\n if (!isValidEmailAddress(emailInput)) return\n if (needsToAcceptAgreement) {\n setHighlightAgreement(true)\n return\n }\n\n setError(null)\n try {\n const { otpId, otpEncryptionTargetBundle } = await sendOtp({\n email: emailInput,\n })\n setEmail(emailInput)\n setOtpSession({ otpId, otpEncryptionTargetBundle })\n goToStep('otp-input')\n } catch (err) {\n setError(\n err instanceof Error ? err.message : 'Failed to send verification code',\n )\n }\n }\n\n const handleEmailMagicLink = async () => {\n if (!emailInput || anyPending) return\n if (!isValidEmailAddress(emailInput)) return\n if (needsToAcceptAgreement) {\n setHighlightAgreement(true)\n return\n }\n\n setError(null)\n try {\n const { otpId, otpEncryptionTargetBundle } = await sendMagicLink({\n email: emailInput,\n })\n setEmail(emailInput)\n setOtpSession({ otpId, otpEncryptionTargetBundle })\n goToStep('email-verification')\n } catch (err) {\n setError(\n err instanceof Error ? err.message : 'Failed to send verification code',\n )\n }\n }\n\n const handleEmailSubmit = shouldUseOtp ? handleEmailOtp : handleEmailMagicLink\n\n if (error) {\n return (\n <div className=\"zd:flex zd:items-center zd:justify-center zd:h-full\">\n <div className=\"zd:flex zd:flex-col zd:gap-4 zd:max-w-md\">\n <Text className=\"zd:text-h2 zd:text-center\">Error occurred</Text>\n <Text className=\"zd:text-center zd:text-red-500\">{error}</Text>\n <Button\n action=\"primary\"\n text=\"Try again\"\n onClick={() => setError(null)}\n />\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:justify-between zd:pb-4 zd:overflow-y-auto zd:overflow-x-hidden\">\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:justify-center\">\n <div className=\"zd:px-4 zd:flex zd:flex-col zd:items-center\">\n <div className=\"zd:w-full zd:px-16 zd:py-4\">\n <BlobAnimation className=\"zd:w-full zd:pointer-events-none zd:select-none\" />\n </div>\n <Text className=\"zd:text-h2 zd:text-center\">\n Continue to your wallet\n </Text>\n <Text className=\"zd:mt-2 zd:text-center zd:text-greyScale/50\">\n Choose a sign-in method to proceed\n </Text>\n </div>\n <div className=\"zd:mt-6 zd:flex zd:flex-col zd:gap-4 zd:mb-4\">\n {enabledMethods.includes('passkey') && (\n <>\n <div className=\"zd:px-4 zd:flex zd:flex-col zd:gap-2\">\n <Button\n action=\"secondary\"\n text=\"Create a passkey\"\n iconName=\"key\"\n trailIcon\n disabled={anyPending}\n onClick={handleRegisterPasskey}\n />\n <Button\n action=\"secondary\"\n text=\"Log in with passkey\"\n iconName=\"key\"\n trailIcon\n disabled={anyPending}\n onClick={handleLoginPasskey}\n />\n </div>\n <div className=\"zd:flex zd:items-center zd:gap-3\">\n <div className=\"zd:h-px zd:flex-1 zd:bg-greyScale/30\" />\n <Text className=\"zd:text-body3\">or</Text>\n <div className=\"zd:h-px zd:flex-1 zd:bg-greyScale/30\" />\n </div>\n </>\n )}\n <div className=\"zd:px-4 zd:flex zd:flex-col zd:gap-2\">\n {enabledMethods.includes('google') && (\n <ListItem\n icon={<ListItemIcon name=\"google\" />}\n title=\"Google\"\n trailing={<ListItemChevron />}\n className=\"zd:rounded-3xl\"\n disabled={anyPending}\n onClick={handleGoogleAuth}\n />\n )}\n {enabledMethods.includes('email') && (\n <Input\n iconName=\"email\"\n placeholder=\"Enter your email\"\n value={emailInput}\n onChange={(e) => setEmailInput(e.target.value)}\n type=\"email\"\n autoCapitalize=\"none\"\n autoComplete=\"email\"\n disabled={anyPending}\n variant=\"listItemStyle\"\n containerClassName=\"zd:rounded-3xl\"\n onKeyDown={(e) => {\n if (e.key === 'Enter' && emailInput && !anyPending) {\n handleEmailSubmit()\n }\n }}\n >\n {isEmailLoading ? (\n <div className=\"zd:w-13 zd:h-13 zd:flex zd:items-center zd:justify-center\">\n <div className=\"zd:w-5 zd:h-5 zd:border-2 zd:border-solarOrange zd:border-t-transparent zd:rounded-full zd:animate-spin\" />\n </div>\n ) : (\n <button\n type=\"button\"\n disabled={\n !isValidEmailAddress(emailInput) || needsToAcceptAgreement\n }\n className={`zd:w-13 zd:h-13 zd:rounded-2xl zd:flex zd:items-center zd:justify-center zd:transition-colors ${\n isValidEmailAddress(emailInput) && !needsToAcceptAgreement\n ? 'zd:cursor-pointer'\n : 'zd:cursor-not-allowed zd:opacity-50'\n }`}\n onClick={() => handleEmailSubmit()}\n >\n <Icon name=\"chevronRight\" className=\"zd:text-greyScale\" />\n </button>\n )}\n </Input>\n )}\n </div>\n </div>\n </div>\n <div className=\"zd:px-4\">\n <SignUpFooter\n termsAndConditionsUrl={config?.termsAndConditionsUrl}\n privacyPolicyUrl={config?.privacyPolicyUrl}\n agreedToTerms={agreedToTerms}\n setAgreedToTerms={(agreed) => {\n setAgreedToTerms(agreed)\n if (agreed) setHighlightAgreement(false)\n }}\n highlight={highlightAgreement}\n />\n </div>\n </div>\n )\n}\n","import { Button, PoweredBy } from '@zerodev/react-ui'\nimport { useVerifyMagicLink } from '@zerodev/wallet-react'\nimport { useEffect, useRef, useState } from 'react'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\nimport { stripMagicLinkCodeFromUrl } from '../utils/url'\n\nfunction getCodeFromUrl(): string | null {\n if (typeof window === 'undefined') return null\n return new URLSearchParams(window.location.search).get('code')\n}\n\nexport function Verifying() {\n const {\n otpId,\n otpEncryptionTargetBundle,\n goToStep,\n clearOtpSession,\n config,\n } = useAuth()\n const [code] = useState<string | null>(getCodeFromUrl)\n const [error, setError] = useState<Error | null>(null)\n\n // ref to prevent useEffect firing twice in dev's StrictMode\n const hasVerifiedRef = useRef(false)\n const { mutate: verifyMagicLink, isPending: isVerificationLoading } =\n useVerifyMagicLink({\n mutation: {\n onSuccess: async () => {\n clearOtpSession()\n goToStep('authenticated')\n config?.onSuccess?.()\n },\n onError: (err) => {\n setError(err)\n config?.onError?.(err)\n },\n },\n })\n\n useEffect(() => {\n if (hasVerifiedRef.current || !code) return\n hasVerifiedRef.current = true\n\n // No active OTP session — most commonly the user tapped the same\n // magic link again after a successful verify, which cleared the\n // session. Skip the (doomed) mutation, clean the URL, and drop\n // back to step=null so the host app's own routing handles the\n // already-authenticated user without flashing an error.\n if (!otpId || !otpEncryptionTargetBundle) {\n stripMagicLinkCodeFromUrl()\n goToStep(null)\n return\n }\n\n verifyMagicLink({ otpId, code, otpEncryptionTargetBundle })\n }, [otpId, otpEncryptionTargetBundle, code, verifyMagicLink, goToStep])\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:items-center zd:justify-center\">\n {!error && isVerificationLoading && (\n <StatusScreen imageName=\"loading\" title=\"Verifying Your Email\">\n Please wait while we securely connect your wallet.\n </StatusScreen>\n )}\n\n {!error && !code && !isVerificationLoading && (\n <>\n <StatusScreen imageName=\"error\" title=\"Invalid Link\">\n This verification link is invalid or incomplete.\n <br />\n Please check your email and try again with the correct link.\n </StatusScreen>\n <Button\n action=\"primary\"\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n </>\n )}\n\n {error != null && (\n <>\n <StatusScreen imageName=\"error\" title=\"Oops, something went wrong\">\n We couldn't complete the sign-in process. This could be due to\n timeout, an expired link, or a cancelled request.\n </StatusScreen>\n <Button\n action=\"primary\"\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n </>\n )}\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { ListItem, ListItemIcon, PoweredBy, Text } from '@zerodev/react-ui'\nimport { useConnect } from 'wagmi'\nimport { useAuth } from '../hooks/useAuth'\n\nexport function WalletSelection() {\n const { goToStep } = useAuth()\n const { connect, connectors, isPending } = useConnect()\n\n const externalConnectors = connectors.filter((c) => c.id !== 'zerodev-wallet')\n\n const handleSelect = (connector: (typeof connectors)[number]) => {\n connect(\n { connector },\n {\n onSuccess: () => {\n goToStep(null)\n },\n },\n )\n }\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:justify-center\">\n <Text className=\"zd:text-h2 zd:text-center\">Select your wallet</Text>\n\n <div className=\"zd:flex zd:flex-col zd:gap-2\">\n {externalConnectors.length === 0 ? (\n <Text className=\"zd:text-center\">\n No wallets detected. Install a browser wallet extension to\n continue.\n </Text>\n ) : (\n externalConnectors.map((connector) => (\n <ListItem\n key={connector.uid}\n title={connector.name}\n icon={\n connector.icon ? (\n <img\n src={connector.icon}\n alt=\"\"\n className=\"zd:w-6 zd:h-6\"\n />\n ) : (\n <ListItemIcon name=\"walletOutline\" />\n )\n }\n disabled={isPending}\n onClick={() => handleSelect(connector)}\n className=\"zd:rounded-3xl\"\n />\n ))\n )}\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { Screen, TopNav } from '@zerodev/react-ui'\nimport { type ReactNode, useEffect } from 'react'\nimport { useStore } from 'zustand'\nimport { StatusScreen } from '../shared/components/StatusScreen'\nimport { useKitStore } from '../shared/hooks/useKitStore'\nimport { useAuth } from './hooks/useAuth'\nimport { EmailVerification } from './pages/EmailVerification'\nimport { ErrorScreen } from './pages/ErrorScreen'\nimport { OtpInput } from './pages/OtpInput'\nimport { SignUp } from './pages/SignUp'\nimport { Verifying } from './pages/Verifying'\nimport { WalletSelection } from './pages/WalletSelection'\nimport type { AuthStep } from './types'\nimport { hasMagicLinkCodeInUrl, stripMagicLinkCodeFromUrl } from './utils/url'\n\nconst TITLE_BY_STEP: Partial<Record<AuthStep, string>> = {\n 'wallet-selection': 'Choose your wallet',\n}\n\nfunction OAuthCallback() {\n return (\n <div className=\"zd:flex zd:flex-1 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"loading\" title=\"Authenticating...\">\n Please wait while we complete the OAuth authentication.\n </StatusScreen>\n </div>\n )\n}\n\nfunction PasskeyPrompt() {\n return (\n <div className=\"zd:flex zd:flex-1 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"loading\" title=\"Passkey authentication\">\n Please authenticate with your passkey.\n </StatusScreen>\n </div>\n )\n}\n\nfunction renderStep(step: AuthStep | null): ReactNode {\n switch (step) {\n case 'sign-up':\n return <SignUp />\n case 'email-verification':\n return <EmailVerification />\n case 'otp-input':\n return <OtpInput />\n case 'verifying-otp':\n return <Verifying />\n case 'oauth-in-progress':\n return <OAuthCallback />\n case 'passkey-prompt':\n return <PasskeyPrompt />\n case 'wallet-selection':\n return <WalletSelection />\n case 'error':\n return <ErrorScreen />\n default:\n return null\n }\n}\n\nexport function AuthFlow({\n onClose: userOnClose,\n size,\n}: {\n onClose?: (() => void) | undefined\n size?: 'sm' | 'md' | 'lg' | undefined\n} = {}) {\n const { step, goToStep, goBack, reset } = useAuth()\n const logo = useStore(useKitStore(), (s) => s.logo)\n\n useEffect(() => {\n if (step === null && hasMagicLinkCodeInUrl()) {\n goToStep('verifying-otp')\n }\n }, [step, goToStep])\n\n const content = renderStep(step)\n if (!content) return null\n\n const handleClose = () => {\n stripMagicLinkCodeFromUrl()\n reset()\n userOnClose?.()\n }\n const title = step ? TITLE_BY_STEP[step] : undefined\n\n return (\n <Screen\n {...(size && { size })}\n // Some elements in SignUp need to go from edge to edge.\n // No vertical padding; we set px-0 so we can fully control this padding.\n contentClassName={step === 'sign-up' ? 'zd:px-0' : undefined}\n topNav={\n <TopNav\n {...(goBack !== null && { onLeftButtonClick: goBack })}\n onRightButtonClick={handleClose}\n {...(title && { title })}\n {...(step === 'sign-up' && {\n ...(logo && { logo }),\n className: 'zd:px-4',\n })}\n />\n }\n >\n {content}\n </Screen>\n )\n}\n","import type { StateCreator } from 'zustand'\nimport type { AuthConfig, AuthMethod, AuthStep } from './types'\n\nconst OTP_SESSION_STORAGE_KEY = 'zerodev:auth:otpSession'\n\ntype StoredOtpSession = {\n otpId: string\n otpEncryptionTargetBundle: string\n}\n\nfunction readStoredOtpSession(): StoredOtpSession | null {\n if (typeof window === 'undefined') return null\n try {\n const raw = window.localStorage.getItem(OTP_SESSION_STORAGE_KEY)\n if (!raw) return null\n const parsed = JSON.parse(raw) as StoredOtpSession\n if (!parsed?.otpId || !parsed?.otpEncryptionTargetBundle) return null\n return parsed\n } catch {\n return null\n }\n}\n\nfunction writeStoredOtpSession(session: StoredOtpSession): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.setItem(\n OTP_SESSION_STORAGE_KEY,\n JSON.stringify(session),\n )\n } catch {\n // ignore\n }\n}\n\nfunction clearStoredOtpSession(): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.removeItem(OTP_SESSION_STORAGE_KEY)\n } catch {\n // ignore\n }\n}\n\nexport interface AuthStoreSlice {\n auth: {\n // State\n step: AuthStep | null\n stepHistory: AuthStep[]\n enabledMethods: AuthMethod[]\n email: string | null\n setEmail: (email: string) => void\n otpId: string | null\n /**\n * HPKE encryption target bundle returned by the latest `sendOTP` call.\n * Required by `verifyOTP` so the OTP attempt can be sealed to the enclave.\n */\n otpEncryptionTargetBundle: string | null\n /** Set both fields produced by `sendOTP` together. */\n setOtpSession: (input: {\n otpId: string\n otpEncryptionTargetBundle: string\n }) => void\n /** Clear the persisted OTP session after a successful verify. */\n clearOtpSession: () => void\n config: AuthConfig | null\n\n // Actions\n initialize: (config: AuthConfig) => void\n goToStep: (step: AuthStep | null) => void\n goBack: () => void\n reset: () => void\n }\n}\n\nexport const createAuthStoreSlice: StateCreator<\n AuthStoreSlice,\n [],\n [],\n AuthStoreSlice\n> = (set, get, _store) => ({\n auth: {\n // Initial state\n step: null,\n stepHistory: [],\n enabledMethods: [],\n email: null,\n otpId: null,\n otpEncryptionTargetBundle: null,\n config: null,\n\n // Actions\n initialize: (config: AuthConfig) => {\n const stored = readStoredOtpSession()\n set((state) => ({\n auth: {\n ...state.auth,\n config,\n enabledMethods: config.enabledMethods,\n ...(stored && {\n otpId: stored.otpId,\n otpEncryptionTargetBundle: stored.otpEncryptionTargetBundle,\n }),\n },\n }))\n },\n\n goToStep: (step: AuthStep | null) => {\n set((state) => ({\n auth: {\n ...state.auth,\n step,\n stepHistory:\n state.auth.step === null\n ? state.auth.stepHistory\n : [...state.auth.stepHistory, state.auth.step],\n },\n }))\n },\n\n goBack: () => {\n const { auth } = get()\n if (auth.stepHistory.length === 0) return\n const newHistory = [...auth.stepHistory]\n const previousStep = newHistory.pop()!\n set((state) => ({\n auth: {\n ...state.auth,\n step: previousStep,\n stepHistory: newHistory,\n },\n }))\n },\n\n reset: () => {\n clearStoredOtpSession()\n set((state) => ({\n auth: {\n ...state.auth,\n step: null,\n stepHistory: [],\n email: null,\n otpId: null,\n otpEncryptionTargetBundle: null,\n },\n }))\n },\n\n setEmail: (email) => {\n set((state) => ({\n auth: {\n ...state.auth,\n email,\n },\n }))\n },\n\n setOtpSession: ({ otpId, otpEncryptionTargetBundle }) => {\n writeStoredOtpSession({ otpId, otpEncryptionTargetBundle })\n set((state) => ({\n auth: {\n ...state.auth,\n otpId,\n otpEncryptionTargetBundle,\n },\n }))\n },\n\n clearOtpSession: () => {\n clearStoredOtpSession()\n set((state) => ({\n auth: {\n ...state.auth,\n otpId: null,\n otpEncryptionTargetBundle: null,\n },\n }))\n },\n },\n})\n","import type { ReactNode } from 'react'\nimport { create } from 'zustand'\nimport { subscribeWithSelector } from 'zustand/middleware'\nimport {\n type AuthStoreSlice,\n createAuthStoreSlice,\n} from './auth/authStoreSlice'\nimport type { PendingRequest } from './types.js'\n\nexport type State = {\n pendingRequests: PendingRequest[]\n userConfirmationListenerActive: boolean\n logo: ReactNode | null\n addPendingRequest: (request: PendingRequest) => void\n removePendingRequest: (id: string) => void\n clearPendingRequests: () => void\n setUserConfirmationListenerActive: (active: boolean) => void\n} & AuthStoreSlice\n\nexport type CreateStoreOptions = {\n logo?: ReactNode\n}\n\nexport const createStore = (options: CreateStoreOptions = {}) =>\n create<State>()(\n subscribeWithSelector((set, get, store) => ({\n pendingRequests: [],\n userConfirmationListenerActive: false,\n logo: options.logo ?? null,\n addPendingRequest: (request) =>\n set((state) => ({\n pendingRequests: [...state.pendingRequests, request],\n })),\n removePendingRequest: (id) =>\n set((state) => ({\n pendingRequests: state.pendingRequests.filter((r) => r.id !== id),\n })),\n clearPendingRequests: () => set({ pendingRequests: [] }),\n setUserConfirmationListenerActive: (active) =>\n set({ userConfirmationListenerActive: active }),\n\n ...createAuthStoreSlice(set, get, store),\n })),\n )\n","import type { CreateConnectorFn } from '@wagmi/core'\nimport type {\n ZeroDevProvider,\n ZeroDevWalletConnectorParams,\n} from '@zerodev/wallet-react'\nimport {\n zeroDevWallet as baseZeroDevWallet,\n NotAuthenticatedError,\n} from '@zerodev/wallet-react'\nimport type { ReactNode } from 'react'\nimport type { AuthConfig } from './auth/types'\nimport { createStore } from './store.js'\nimport type { Request, RequestMethod } from './types.js'\n\nconst DEFAULT_SIGNING_PROMPT_METHODS: RequestMethod[] = [\n 'eth_sendTransaction',\n 'wallet_sendTransaction',\n 'wallet_sendCalls',\n 'personal_sign',\n 'eth_signTypedData_v4',\n]\n\nexport type ZeroDevKitConfig = {\n auth?: AuthConfig\n /**\n * Optional brand logo rendered in the auth flow's top nav. When omitted,\n * no logo is shown. `PoweredBy` always shows the ZeroDev mark independently.\n */\n logo?: ReactNode\n}\n\nexport type ZeroDevKitConnectorParams = ZeroDevWalletConnectorParams & {\n config?: ZeroDevKitConfig\n}\n\nfunction requireUserConfirmation(\n store: ReturnType<typeof createStore>,\n request: Request,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n store.getState().addPendingRequest({\n id: crypto.randomUUID(),\n ...request,\n resolve,\n reject,\n })\n })\n}\n\n/**\n * Resolves when the user completes the auth flow (`step === 'authenticated'`),\n * rejects when they dismiss it (`step === null`).\n */\nfunction waitForAuthFlow(store: ReturnType<typeof createStore>): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const unsub = store.subscribe(\n (state) => state.auth.step,\n (step) => {\n if (step === 'authenticated') {\n unsub()\n resolve()\n } else if (step === null) {\n // User dismissed the auth flow (e.g. clicked the TopNav close\n // button) — abort the pending wagmi connect.\n unsub()\n reject(new Error('Auth flow dismissed'))\n }\n },\n )\n })\n}\n\nexport function zeroDevWallet(\n params: ZeroDevKitConnectorParams,\n): CreateConnectorFn {\n const baseFactory = baseZeroDevWallet(params)\n const store = createStore({ logo: params.config?.logo })\n\n // Initialize auth config if provided\n if (params.config?.auth) {\n store.getState().auth.initialize(params.config.auth)\n }\n\n return (wagmiConfig) => {\n const connector = baseFactory(wagmiConfig)\n\n return {\n ...connector,\n\n async connect(connectParams) {\n // Try to connect first. If a session is persisted, base will load it\n // and resolve — no auth UI needed. If not, it throws\n // `NotAuthenticatedError` and we surface SignUp.\n //\n // This avoids forcing every connect to await the base store's init\n // (which `isAuthorized()` deliberately skips for perf — see\n // packages/react/src/core/connector.ts), and avoids flashing the auth\n // UI on first paint when the session hasn't loaded yet.\n try {\n return await connector.connect(connectParams)\n } catch (error) {\n if (\n connectParams?.isReconnecting ||\n !params.config?.auth ||\n !(error instanceof NotAuthenticatedError)\n ) {\n throw error\n }\n\n if (store.getState().auth.step !== null) {\n throw new Error('Auth flow already in progress')\n }\n\n store.getState().auth.goToStep('sign-up')\n await waitForAuthFlow(store)\n return connector.connect(connectParams)\n }\n },\n\n async disconnect() {\n await connector.disconnect?.()\n if (params.config?.auth) {\n store.getState().auth.reset()\n }\n },\n\n async setup() {\n await connector.setup?.()\n\n // Request-wrapping is only meaningful in the browser (it gates calls\n // on UI confirmation). Skip during SSR — getProvider() touches\n // `window` for EIP-6963 discovery and would crash on the server.\n if (typeof window === 'undefined') return\n\n // Signing is pinned to background mode: the prompt-mode confirmation UI\n // is not part of this package's public surface, so requests always pass\n // through without gating. The wrapping logic below is retained but\n // unreachable.\n // const signing = params.config?.signing\n const signing = { mode: 'background' } as const\n if (signing.mode === 'background') return\n\n const methods =\n // (signing?.mode === 'prompt' && signing.methods) ||\n DEFAULT_SIGNING_PROMPT_METHODS\n\n const provider = (await connector.getProvider()) as ZeroDevProvider\n const baseRequest = provider.request.bind(provider)\n\n // todo: move Request type to core package and use as the method and params type here\n // then we can remove as RequestMethod and spread in return baseRequest\n provider.request = async ({\n method,\n params: reqParams,\n }: {\n method: string\n params?: unknown[]\n }) => {\n const { userConfirmationListenerActive } = store.getState()\n if (\n userConfirmationListenerActive &&\n methods.includes(method as RequestMethod)\n ) {\n await requireUserConfirmation(store, {\n method: method as RequestMethod,\n params: reqParams,\n } as Request)\n }\n\n return baseRequest({\n method,\n ...(reqParams && { params: reqParams }),\n })\n }\n },\n\n getKitStore() {\n return store\n },\n }\n }\n}\n"],"names":["errorImg","loadingImg","sendImg","successImg","STATE_IMAGES","StatusScreen","imageName","title","children","className","jsxs","cn","jsx","Text","useKitStore","connector","useConfig","c","useAuth","store","step","useStore","state","stepHistory","email","otpId","otpEncryptionTargetBundle","enabledMethods","authConfig","EmailVerification","setOtpSession","sendMagicLink","isSendPending","useSendMagicLink","secondsLeftUntilResend","setSecondsLeftUntilResend","useState","canResend","useEffect","timer","prev","handleResend","Fragment","PoweredBy","hasMagicLinkCodeInUrl","stripMagicLinkCodeFromUrl","url","ErrorScreen","message","showRetry","showChooseAnother","goToStep","goBack","reset","handleRetry","Button","MIN_LENGTH","MAX_LENGTH","DEFAULT_LENGTH","clampLength","length","CharBox","char","isFocused","Wrapper","CodeInput","onChange","onComplete","disabled","error","autoFocus","testId","codeLength","charBoxes","useMemo","_","i","code","setCode","setIsFocused","inputRef","useRef","_a","handleChange","text","sanitized","e","box","OtpInput","clearOtpSession","config","sendOtp","isSendOtpPending","useSendOTP","verifyOtp","isPending","useVerifyOTP","otp","setOtp","setError","secondsUntilResend","setSecondsUntilResend","interval","handleVerify","err","_b","handleComplete","newOtpId","newBundle","SignUpFooter","termsAndConditionsUrl","privacyPolicyUrl","agreedToTerms","setAgreedToTerms","highlight","showAgreement","EMAIL_REGEX","isValidEmailAddress","blobWebm","BlobAnimation","isCancellationError","SignUp","setEmail","highlightAgreement","setHighlightAgreement","emailInput","setEmailInput","shouldUseOtp","isSendMagicLinkPending","isEmailLoading","authenticateOAuth","isGoogleLoading","useAuthenticateOAuth","registerPasskey","isRegisterPasskeyPending","useRegisterPasskey","loginPasskey","isLoginPasskeyPending","useLoginPasskey","anyPending","needsToAcceptAgreement","handleRegisterPasskey","handleLoginPasskey","handleGoogleAuth","handleEmailSubmit","ListItem","ListItemIcon","ListItemChevron","Input","Icon","agreed","getCodeFromUrl","Verifying","hasVerifiedRef","verifyMagicLink","isVerificationLoading","useVerifyMagicLink","WalletSelection","connect","connectors","useConnect","externalConnectors","handleSelect","TITLE_BY_STEP","OAuthCallback","PasskeyPrompt","renderStep","AuthFlow","userOnClose","size","logo","s","content","handleClose","Screen","TopNav","OTP_SESSION_STORAGE_KEY","readStoredOtpSession","raw","parsed","writeStoredOtpSession","session","clearStoredOtpSession","createAuthStoreSlice","set","get","_store","stored","auth","newHistory","previousStep","createStore","options","create","subscribeWithSelector","request","id","r","active","waitForAuthFlow","resolve","reject","unsub","zeroDevWallet","params","baseFactory","baseZeroDevWallet","wagmiConfig","connectParams","NotAuthenticatedError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../assets/states/error.webp?no-inline","../assets/states/loading.webp?no-inline","../assets/states/send.webp?no-inline","../assets/states/success.webp?no-inline","../src/shared/components/StatusScreen/index.tsx","../src/shared/hooks/useKitStore.ts","../src/auth/hooks/useAuth.ts","../src/auth/pages/EmailVerification.tsx","../src/auth/utils/url.ts","../src/auth/pages/ErrorScreen.tsx","../src/auth/components/CodeInput/index.tsx","../src/auth/pages/OtpInput.tsx","../src/shared/components/SignUpFooter/index.tsx","../src/auth/assets/blob.webm?no-inline","../src/auth/components/BlobAnimation/index.tsx","../src/auth/pages/SignUp/context.tsx","../src/shared/utils/common.ts","../src/auth/pages/SignUp/Email.tsx","../src/auth/utils/isCancellationError.ts","../src/auth/pages/SignUp/Google.tsx","../src/auth/pages/SignUp/Passkey.tsx","../src/auth/pages/SignUp/index.tsx","../src/auth/pages/Verifying.tsx","../src/auth/pages/WalletSelection.tsx","../src/auth/index.tsx","../src/auth/authStoreSlice.ts","../src/store.ts","../src/connector.ts"],"sourcesContent":["export default \"__VITE_ASSET__J56$5yRt__\"","export default \"__VITE_ASSET__DC8GJ24R__\"","export default \"__VITE_ASSET__DrgAA58A__\"","export default \"__VITE_ASSET___eUV$EDU__\"","import { cn, Text } from '@zerodev/react-ui'\nimport type { ReactNode } from 'react'\nimport errorImg from '../../../../assets/states/error.webp?no-inline'\nimport loadingImg from '../../../../assets/states/loading.webp?no-inline'\nimport sendImg from '../../../../assets/states/send.webp?no-inline'\nimport successImg from '../../../../assets/states/success.webp?no-inline'\n\nexport type StateImageName = 'error' | 'loading' | 'send' | 'success'\n\nconst STATE_IMAGES: Record<StateImageName, string> = {\n error: errorImg,\n loading: loadingImg,\n send: sendImg,\n success: successImg,\n}\n\nexport interface StatusScreenProps {\n imageName: StateImageName\n title: string\n children: ReactNode\n className?: string\n}\n\nexport function StatusScreen({\n imageName,\n title,\n children,\n className,\n}: StatusScreenProps) {\n return (\n <div\n className={cn('zd:flex zd:flex-col zd:gap-8 zd:items-center', className)}\n >\n <img\n src={STATE_IMAGES[imageName]}\n alt={imageName}\n className=\"zd:w-[118px] zd:h-[118px] zd:bg-transparent\"\n />\n <div className=\"zd:flex zd:flex-col zd:gap-4 zd:items-center\">\n <Text className=\"zd:text-h2 zd:text-center zd:whitespace-pre-wrap\">\n {title}\n </Text>\n <Text className=\"zd:text-center zd:whitespace-pre-wrap\">\n {children}\n </Text>\n </div>\n </div>\n )\n}\n","import { useConfig } from 'wagmi'\nimport type { createStore } from '../../store'\n\ntype KitStore = ReturnType<typeof createStore>\n\n/**\n * Returns the zustand store attached to the `zeroDevWallet` connector.\n * Throws when the kit connector isn't present on the wagmi config.\n *\n * Read individual fields with `useStore(useKitStore(), (s) => s.field)`.\n */\nexport function useKitStore(): KitStore {\n const config = useConfig()\n const connector = config.connectors.find((c) => c.id === 'zerodev-wallet')\n if (!connector || !('getKitStore' in connector)) {\n throw new Error('useKitStore must be used with the zeroDevWallet connector')\n }\n // @ts-expect-error - getKitStore is a custom method on the kit connector\n return connector.getKitStore()\n}\n","import { useStore } from 'zustand'\nimport { useKitStore } from '../../shared/hooks/useKitStore'\n\nexport function useAuth() {\n const store = useKitStore()\n\n const step = useStore(store, (state) => state.auth.step)\n const stepHistory = useStore(store, (state) => state.auth.stepHistory)\n const email = useStore(store, (state) => state.auth.email)\n const otpId = useStore(store, (state) => state.auth.otpId)\n const otpEncryptionTargetBundle = useStore(\n store,\n (state) => state.auth.otpEncryptionTargetBundle,\n )\n return {\n step,\n email,\n otpId,\n otpEncryptionTargetBundle,\n goToStep: store.getState().auth.goToStep,\n goBack: stepHistory.length > 0 ? store.getState().auth.goBack : null,\n reset: store.getState().auth.reset,\n setEmail: store.getState().auth.setEmail,\n setOtpSession: store.getState().auth.setOtpSession,\n clearOtpSession: store.getState().auth.clearOtpSession,\n }\n}\n","import { PoweredBy, Text } from '@zerodev/react-ui'\nimport { useSendMagicLink } from '@zerodev/wallet-react'\nimport { useEffect, useState } from 'react'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\n\nexport function EmailVerification() {\n const { email, setOtpSession } = useAuth()\n const { mutateAsync: sendMagicLink, isPending: isSendPending } =\n useSendMagicLink()\n\n const [secondsLeftUntilResend, setSecondsLeftUntilResend] = useState(60)\n const canResend = secondsLeftUntilResend <= 0 && !isSendPending\n\n useEffect(() => {\n if (secondsLeftUntilResend <= 0) return\n\n const timer = setInterval(() => {\n setSecondsLeftUntilResend((prev) => Math.max(0, prev - 1))\n }, 1000)\n\n return () => {\n clearInterval(timer)\n }\n }, [secondsLeftUntilResend])\n\n const handleResend = async () => {\n if (!email || !canResend) return\n\n try {\n const { otpId, otpEncryptionTargetBundle } = await sendMagicLink({\n email,\n })\n setOtpSession({ otpId, otpEncryptionTargetBundle })\n setSecondsLeftUntilResend(60)\n } catch {\n // Error resending magic link\n }\n }\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:justify-center\">\n <StatusScreen\n imageName=\"send\"\n title={'Check your email!\\n An Email is On Its Way'}\n >\n We've sent a magic link to{' '}\n <Text as=\"span\" className=\"zd:text-solarOrange\">\n {email}\n </Text>\n {'\\n'}Please open the email and click the link to log in.\n </StatusScreen>\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n <Text className=\"zd:text-center\">\n Did not get an email?{' '}\n <button\n type=\"button\"\n disabled={!canResend}\n onClick={handleResend}\n className=\"zd:cursor-pointer zd:underline zd:disabled:opacity-50 zd:disabled:cursor-not-allowed\"\n >\n {canResend\n ? 'Resend'\n : `Resend in ${secondsLeftUntilResend} ${secondsLeftUntilResend === 1 ? 'second' : 'seconds'}`}\n </button>\n </Text>\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","export function hasMagicLinkCodeInUrl(): boolean {\n if (typeof window === 'undefined') return false\n return new URLSearchParams(window.location.search).has('code')\n}\n\nexport function stripMagicLinkCodeFromUrl(): void {\n if (typeof window === 'undefined') return\n const url = new URL(window.location.href)\n if (!url.searchParams.has('code')) return\n url.searchParams.delete('code')\n window.history.replaceState(null, '', url.toString())\n}\n","import { Button, PoweredBy } from '@zerodev/react-ui'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\nimport { stripMagicLinkCodeFromUrl } from '../utils/url'\n\ninterface ErrorScreenProps {\n title?: string\n message?: string\n showRetry?: boolean\n showChooseAnother?: boolean\n}\n\nexport function ErrorScreen({\n title = 'Oops, something went wrong',\n message = \"We couldn't complete the sign-in process. This could be due to timeout, an expired link, or a cancelled request.\",\n showRetry = false,\n showChooseAnother = true,\n}: ErrorScreenProps) {\n const { goToStep, goBack, reset } = useAuth()\n const handleRetry = goBack ?? (() => goToStep('sign-up'))\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"error\" title={title}>\n {message}\n </StatusScreen>\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n {showRetry && (\n <Button action=\"primary\" text=\"Try again\" onClick={handleRetry} />\n )}\n {showChooseAnother && (\n <Button\n action={showRetry ? 'secondary' : 'primary'}\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n )}\n {!showRetry && !showChooseAnother && (\n <Button action=\"primary\" text=\"Start over\" onClick={reset} />\n )}\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { cn, Text, Wrapper } from '@zerodev/react-ui'\nimport { useEffect, useMemo, useRef, useState } from 'react'\n\nconst MIN_LENGTH = 4\nconst MAX_LENGTH = 8\nconst DEFAULT_LENGTH = 6\n\nfunction clampLength(length: number): number {\n return Math.max(MIN_LENGTH, Math.min(MAX_LENGTH, length))\n}\n\ninterface CharBoxProps {\n char: string\n isFocused: boolean\n}\n\nfunction CharBox({ char, isFocused }: CharBoxProps) {\n return (\n <Wrapper\n data-testid=\"code-input-box\"\n data-active={isFocused || undefined}\n className={cn(\n 'zd:h-16 zd:w-14 zd:rounded-lg zd:flex zd:items-center zd:justify-center',\n isFocused && 'zd:border-[1.5px] zd:border-greyScale',\n )}\n >\n <Text className=\"zd:text-h2\">{char}</Text>\n </Wrapper>\n )\n}\n\nexport interface CodeInputProps {\n onChange?: (code: string) => void\n onComplete?: (code: string) => void\n disabled?: boolean\n error?: boolean\n autoFocus?: boolean\n length?: number\n 'data-testid'?: string\n}\n\nexport function CodeInput({\n onChange,\n onComplete,\n disabled = false,\n error = false,\n autoFocus = false,\n length = DEFAULT_LENGTH,\n 'data-testid': testId,\n}: CodeInputProps) {\n const codeLength = clampLength(length)\n const charBoxes = useMemo(\n () =>\n Array.from({ length: codeLength }, (_, i) => ({\n id: `char-${i}`,\n index: i,\n })),\n [codeLength],\n )\n\n const [code, setCode] = useState('')\n const [isFocused, setIsFocused] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (autoFocus && !disabled) {\n inputRef.current?.focus()\n }\n }, [autoFocus, disabled])\n\n useEffect(() => {\n setCode((prev) => prev.slice(0, codeLength))\n }, [codeLength])\n\n const handleChange = (text: string) => {\n const sanitized = text.slice(0, codeLength).toUpperCase()\n setCode(sanitized)\n onChange?.(sanitized)\n\n if (sanitized.length === codeLength) {\n // Makes sure onComplete is run on the next render cycle after the last char is rendered\n setTimeout(() => {\n onComplete?.(sanitized)\n inputRef.current?.blur()\n }, 0)\n }\n }\n\n return (\n <button\n type=\"button\"\n className=\"zd:flex zd:flex-row zd:items-center zd:justify-between zd:gap-2 zd:w-full zd:cursor-text\"\n onClick={() => inputRef.current?.focus()}\n disabled={disabled}\n data-testid={testId}\n >\n <input\n ref={inputRef}\n value={code}\n onChange={(e) => handleChange(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n maxLength={codeLength}\n disabled={disabled}\n className=\"zd:absolute zd:opacity-0 zd:pointer-events-none\"\n style={{ position: 'absolute', opacity: 0 }}\n aria-label=\"Verification code\"\n />\n {charBoxes.map((box) => (\n <CharBox\n key={box.id}\n char={code[box.index] ?? ''}\n isFocused={!error && isFocused && box.index === code.length}\n />\n ))}\n </button>\n )\n}\n","import { Button, PoweredBy, Text } from '@zerodev/react-ui'\nimport { useSendOTP, useVerifyOTP } from '@zerodev/wallet-react'\nimport { useEffect, useState } from 'react'\nimport { CodeInput } from '../components/CodeInput'\nimport { useAuth } from '../hooks/useAuth'\n\nexport function OtpInput() {\n const {\n email,\n otpId,\n otpEncryptionTargetBundle,\n setOtpSession,\n clearOtpSession,\n goToStep,\n } = useAuth()\n const { mutateAsync: sendOtp, isPending: isSendOtpPending } = useSendOTP()\n const { mutateAsync: verifyOtp, isPending } = useVerifyOTP()\n\n const [otp, setOtp] = useState('')\n const [error, setError] = useState(false)\n const [secondsUntilResend, setSecondsUntilResend] = useState(60)\n\n // Countdown timer for resend\n useEffect(() => {\n if (secondsUntilResend <= 0) return\n\n const interval = setInterval(() => {\n setSecondsUntilResend((prev) => Math.max(0, prev - 1))\n }, 1000)\n return () => clearInterval(interval)\n }, [secondsUntilResend])\n\n const handleVerify = async () => {\n if (!otp.trim() || !otpId || !otpEncryptionTargetBundle) return\n\n setError(false)\n try {\n await verifyOtp({\n otpId,\n code: otp.trim(),\n otpEncryptionTargetBundle,\n })\n clearOtpSession()\n goToStep('authenticated')\n } catch {\n setError(true)\n }\n }\n\n const handleComplete = (code: string) => {\n setOtp(code)\n }\n\n const handleResend = async () => {\n if (!email || secondsUntilResend > 0 || isSendOtpPending) return\n\n try {\n const { otpId: newOtpId, otpEncryptionTargetBundle: newBundle } =\n await sendOtp({ email })\n setOtpSession({\n otpId: newOtpId,\n otpEncryptionTargetBundle: newBundle,\n })\n setSecondsUntilResend(60)\n setError(false)\n } catch {\n setError(true)\n }\n }\n\n const canResend = secondsUntilResend <= 0 && !isSendOtpPending\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:justify-center zd:items-center\">\n <div className=\"zd:flex zd:flex-col zd:gap-4\">\n <Text className=\"zd:text-h2 zd:text-center\">\n Enter verification code\n </Text>\n <Text className=\"zd:text-center\">\n Enter the code from the email we sent to{' '}\n <Text className=\"zd:text-solarOrange\">{email}</Text>\n </Text>\n </div>\n\n <CodeInput\n onComplete={handleComplete}\n onChange={() => setError(false)}\n disabled={isPending}\n error={error}\n autoFocus\n />\n\n <Button\n text=\"Confirm code\"\n onClick={handleVerify}\n disabled={!otp.trim() || isPending}\n />\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n <Text className=\"zd:text-center\">\n Did not get an email?{' '}\n <button\n type=\"button\"\n disabled={!canResend}\n onClick={handleResend}\n className=\"zd:cursor-pointer zd:underline zd:disabled:opacity-50 zd:disabled:cursor-not-allowed\"\n >\n {canResend\n ? 'Resend'\n : `Resend in ${secondsUntilResend} ${secondsUntilResend === 1 ? 'second' : 'seconds'}`}\n </button>\n </Text>\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { PoweredBy, Text } from '@zerodev/react-ui'\n\nexport function SignUpFooter({\n termsAndConditionsUrl,\n privacyPolicyUrl,\n agreedToTerms,\n setAgreedToTerms,\n highlight = false,\n}: {\n termsAndConditionsUrl?: string | undefined\n privacyPolicyUrl?: string | undefined\n agreedToTerms: boolean\n setAgreedToTerms: (agreed: boolean) => void\n highlight?: boolean\n}) {\n const showAgreement = !!(termsAndConditionsUrl || privacyPolicyUrl)\n\n return (\n <div className=\"zd:flex zd:flex-col zd:items-center zd:gap-5\">\n {showAgreement && (\n <div\n className={`zd:flex zd:flex-row zd:items-center zd:gap-2 zd:rounded-md zd:p-2 zd:transition-colors ${\n highlight\n ? 'zd:border zd:border-negative'\n : 'zd:border zd:border-transparent'\n }`}\n >\n <input\n type=\"checkbox\"\n checked={agreedToTerms}\n onChange={(e) => setAgreedToTerms(e.target.checked)}\n className=\"zd:cursor-pointer zd:[color-scheme:light]\"\n />\n <Text className=\"zd:flex-1\">\n I agree to the{' '}\n {termsAndConditionsUrl && (\n <Text\n as=\"a\"\n href={termsAndConditionsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"zd:underline\"\n >\n Terms & Conditions\n </Text>\n )}\n {termsAndConditionsUrl && privacyPolicyUrl && ' and '}\n {privacyPolicyUrl && (\n <Text\n as=\"a\"\n href={privacyPolicyUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"zd:underline\"\n >\n Privacy Policy\n </Text>\n )}\n </Text>\n </div>\n )}\n <PoweredBy />\n </div>\n )\n}\n","export default \"__VITE_ASSET__DthArV0k__\"","// ?no-inline forces Vite to emit blob.webm as a separate file (dist/blob.webm)\n// instead of base64-inlining ~700KB into the JS bundle. Requires base:'./' in\n// vite.config.ts so the emitted URL is package-relative, not root-absolute.\nimport blobWebm from '../../assets/blob.webm?no-inline'\n\n// VP9-alpha WebM. Renders the animated blob on browsers that support WebM with\n// an alpha channel (Chrome, Firefox, Edge). Safari plays the WebM container but\n// not VP9 alpha, so the blob is simply not shown there — an acceptable\n// degradation for a decorative element.\nexport function BlobAnimation({ className }: { className?: string }) {\n return (\n <video\n className={className}\n style={{ aspectRatio: '1 / 1' }}\n src={blobWebm}\n autoPlay\n loop\n muted\n playsInline\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n )\n}\n","import { createContext, useContext, useEffect } from 'react'\nimport type { EmailAuthMethod } from '../../types'\n\nexport type SignUpContextValue = {\n /** True while any method's auth attempt is in flight — used to disable\n * sibling methods so two flows can't run at once. */\n authPending: boolean\n setAuthPending: (pending: boolean) => void\n /** Which email verification flow the Email unit runs. Set on the root\n * (`<SignUp emailAuthMethod=…>`); already resolved to its default here. */\n emailAuthMethod: EmailAuthMethod\n /** True when the terms checkbox is required but unchecked. For passive\n * disabled styling; use `guardAgreement` before starting an attempt. */\n needsAgreement: boolean\n /** Call before starting an auth attempt: highlights the terms checkbox and\n * returns false when agreement is required but missing. */\n guardAgreement: () => boolean\n setError: (message: string | null) => void\n}\n\nexport const SignUpContext = createContext<SignUpContextValue | null>(null)\n\nexport function useSignUpContext(): SignUpContextValue {\n const ctx = useContext(SignUpContext)\n if (!ctx) {\n throw new Error('SignUp.* components must be rendered inside <SignUp>')\n }\n return ctx\n}\n\n/** Mirror a method's in-flight state into the shared pending flag.\n * Clears on unmount so a removed unit can't leave the page locked.\n * One flag, not per-unit: methods are mutually exclusive, so at most one\n * unit reports `true` at a time. */\nexport function useReportPending(pending: boolean) {\n const { setAuthPending } = useSignUpContext()\n useEffect(() => {\n setAuthPending(pending)\n return () => setAuthPending(false)\n }, [pending, setAuthPending])\n}\n","export function capitalizeFirst(str?: string | null): string {\n if (!str) return ''\n const first = str.at(0) ?? ''\n return first.toUpperCase() + str.slice(1)\n}\n\nexport function shortenHex(hex: string, length = 4) {\n return `${hex.slice(0, length + 2)}...${hex.slice(-length)}`\n}\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\nexport function isValidEmailAddress(email: string): boolean {\n return EMAIL_REGEX.test(email.trim())\n}\n","import { Icon, Input } from '@zerodev/react-ui'\nimport { useSendMagicLink, useSendOTP } from '@zerodev/wallet-react'\nimport { useState } from 'react'\nimport { isValidEmailAddress } from '../../../shared/utils/common'\nimport { useAuth } from '../../hooks/useAuth'\nimport { useReportPending, useSignUpContext } from './context'\n\n/** Email input row: sends an OTP or magic link depending on the root's\n * `emailAuthMethod`, then advances to the matching verification step. */\nexport function SignUpEmail() {\n const { goToStep, setEmail, setOtpSession } = useAuth()\n const {\n authPending,\n emailAuthMethod,\n needsAgreement,\n guardAgreement,\n setError,\n } = useSignUpContext()\n const [emailInput, setEmailInput] = useState('')\n\n const shouldUseOtp = emailAuthMethod === 'otp'\n const { mutateAsync: sendOtp, isPending: isSendOtpPending } = useSendOTP()\n const { mutateAsync: sendMagicLink, isPending: isSendMagicLinkPending } =\n useSendMagicLink()\n const isEmailLoading = isSendOtpPending || isSendMagicLinkPending\n useReportPending(isEmailLoading)\n\n const handleSubmit = async () => {\n if (!emailInput || authPending) return\n if (!isValidEmailAddress(emailInput)) return\n if (!guardAgreement()) return\n\n setError(null)\n try {\n const send = shouldUseOtp ? sendOtp : sendMagicLink\n const { otpId, otpEncryptionTargetBundle } = await send({\n email: emailInput,\n })\n setEmail(emailInput)\n setOtpSession({ otpId, otpEncryptionTargetBundle })\n goToStep(shouldUseOtp ? 'otp-input' : 'email-verification')\n } catch (err) {\n setError(\n err instanceof Error ? err.message : 'Failed to send verification code',\n )\n }\n }\n\n return (\n <Input\n iconName=\"email\"\n placeholder=\"Enter your email\"\n value={emailInput}\n onChange={(e) => setEmailInput(e.target.value)}\n type=\"email\"\n autoCapitalize=\"none\"\n autoComplete=\"email\"\n disabled={authPending}\n variant=\"listItemStyle\"\n onKeyDown={(e) => {\n if (e.key === 'Enter' && emailInput && !authPending) {\n handleSubmit()\n }\n }}\n >\n {isEmailLoading ? (\n <div className=\"zd:w-13 zd:h-13 zd:flex zd:items-center zd:justify-center\">\n <div className=\"zd:w-5 zd:h-5 zd:border-2 zd:border-solarOrange zd:border-t-transparent zd:rounded-full zd:animate-spin\" />\n </div>\n ) : (\n <button\n type=\"button\"\n disabled={!isValidEmailAddress(emailInput) || needsAgreement}\n className={`zd:w-13 zd:h-13 zd:rounded-2xl zd:flex zd:items-center zd:justify-center zd:transition-colors ${\n isValidEmailAddress(emailInput) && !needsAgreement\n ? 'zd:cursor-pointer'\n : 'zd:cursor-not-allowed zd:opacity-50'\n }`}\n onClick={() => handleSubmit()}\n >\n <Icon name=\"chevronRight\" className=\"zd:text-greyScale\" />\n </button>\n )}\n </Input>\n )\n}\n","export function isCancellationError(err: unknown): boolean {\n if (!(err instanceof Error)) return false\n // WebAuthn / passkey\n if (err.name === 'AbortError' || err.name === 'NotAllowedError') return true\n // OAuth (existing logic, message-based)\n const msg = err.message.toLowerCase()\n return msg.includes('oauth popup was closed')\n}\n","import { ListItem, ListItemChevron, ListItemIcon } from '@zerodev/react-ui'\nimport { useAuthenticateOAuth } from '@zerodev/wallet-react'\nimport { useAuth } from '../../hooks/useAuth'\nimport { isCancellationError } from '../../utils/isCancellationError'\nimport { useReportPending, useSignUpContext } from './context'\n\n/** \"Google\" OAuth row. */\nexport function SignUpGoogle() {\n const { goToStep } = useAuth()\n const { authPending, guardAgreement, setError } = useSignUpContext()\n\n const { mutateAsync: authenticateOAuth, isPending } = useAuthenticateOAuth({\n mutation: {\n onSuccess: () => {\n goToStep('authenticated')\n },\n },\n })\n useReportPending(isPending)\n\n const handleClick = async () => {\n if (authPending) return\n if (!guardAgreement()) return\n setError(null)\n try {\n await authenticateOAuth({ provider: 'google' })\n } catch (err) {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n }\n\n return (\n <ListItem\n icon={<ListItemIcon name=\"google\" />}\n title=\"Google\"\n trailing={<ListItemChevron />}\n disabled={authPending}\n onClick={handleClick}\n />\n )\n}\n","import { Button } from '@zerodev/react-ui'\nimport { useLoginPasskey, useRegisterPasskey } from '@zerodev/wallet-react'\nimport { useAuth } from '../../hooks/useAuth'\nimport { isCancellationError } from '../../utils/isCancellationError'\nimport { useReportPending, useSignUpContext } from './context'\n\n/** \"Create a passkey\" + \"Log in with passkey\" buttons. */\nexport function SignUpPasskey() {\n const { goToStep } = useAuth()\n const { authPending, guardAgreement, setError } = useSignUpContext()\n\n const mutation = {\n onSuccess: () => {\n goToStep('authenticated')\n },\n onError: (err: unknown) => {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n },\n }\n const { mutate: registerPasskey, isPending: isRegisterPending } =\n useRegisterPasskey({ mutation })\n const { mutate: loginPasskey, isPending: isLoginPending } = useLoginPasskey({\n mutation,\n })\n useReportPending(isRegisterPending || isLoginPending)\n\n const guarded = (run: () => void) => () => {\n if (authPending) return\n if (!guardAgreement()) return\n setError(null)\n run()\n }\n\n return (\n <>\n <Button\n action=\"secondary\"\n text=\"Create a passkey\"\n iconName=\"key\"\n trailIcon\n disabled={authPending}\n onClick={guarded(() => registerPasskey())}\n />\n <Button\n action=\"secondary\"\n text=\"Log in with passkey\"\n iconName=\"key\"\n trailIcon\n disabled={authPending}\n onClick={guarded(() => loginPasskey())}\n />\n </>\n )\n}\n","import { Button, Text } from '@zerodev/react-ui'\nimport { type ReactNode, useState } from 'react'\nimport { SignUpFooter } from '../../../shared/components/SignUpFooter'\nimport { BlobAnimation } from '../../components/BlobAnimation'\nimport type { EmailAuthMethod } from '../../types'\nimport { SignUpContext } from './context'\nimport { SignUpEmail } from './Email'\nimport { SignUpGoogle } from './Google'\nimport { SignUpPasskey } from './Passkey'\n\ntype SignUpRootProps = {\n children: ReactNode\n /** Enable the consent gate: linked from the footer checkbox, and every\n * method is blocked until the user agrees when either URL is set. */\n termsAndConditionsUrl?: string | undefined\n privacyPolicyUrl?: string | undefined\n /** Which email verification flow the Email unit runs. */\n emailAuthMethod?: EmailAuthMethod | undefined\n}\n\nfunction SignUpRoot({\n children,\n termsAndConditionsUrl,\n privacyPolicyUrl,\n emailAuthMethod = 'magicLink',\n}: SignUpRootProps) {\n const [agreedToTerms, setAgreedToTerms] = useState(false)\n const [highlightAgreement, setHighlightAgreement] = useState(false)\n const [error, setError] = useState<string | null>(null)\n // One flag for the whole page: methods are mutually exclusive, so at most\n // one unit is in flight at a time. Known accepted edge: a unit unmounting\n // mid-flight (conditional composition) clears a sibling's lock.\n const [authPending, setAuthPending] = useState(false)\n\n const requiresAgreement = !!(termsAndConditionsUrl || privacyPolicyUrl)\n const needsAgreement = requiresAgreement && !agreedToTerms\n\n const guardAgreement = () => {\n if (!needsAgreement) return true\n setHighlightAgreement(true)\n return false\n }\n\n return (\n <SignUpContext.Provider\n value={{\n authPending,\n emailAuthMethod,\n setAuthPending,\n needsAgreement,\n guardAgreement,\n setError,\n }}\n >\n {error !== null && (\n <div className=\"zd:flex zd:items-center zd:justify-center zd:h-full\">\n <div className=\"zd:flex zd:flex-col zd:gap-4 zd:max-w-md\">\n <Text className=\"zd:text-h2 zd:text-center\">Error occurred</Text>\n <Text className=\"zd:text-center zd:text-red-500\">{error}</Text>\n <Button\n action=\"primary\"\n text=\"Try again\"\n onClick={() => setError(null)}\n />\n </div>\n </div>\n )}\n {/* Kept mounted (hidden) during the error takeover so unit state — the\n typed email, pending flags — survives \"Try again\". */}\n <div\n className={`zd:flex-1 zd:flex zd:flex-col zd:justify-between zd:pb-4 zd:overflow-y-auto zd:overflow-x-hidden${\n error !== null ? ' zd:hidden' : ''\n }`}\n >\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:justify-center\">\n <div className=\"zd:px-4 zd:flex zd:flex-col zd:items-center\">\n <div className=\"zd:w-full zd:px-16 zd:py-4\">\n <BlobAnimation className=\"zd:w-full zd:pointer-events-none zd:select-none\" />\n </div>\n <Text className=\"zd:text-h2 zd:text-center\">\n Continue to your wallet\n </Text>\n <Text className=\"zd:mt-2 zd:text-center zd:text-greyScale/50\">\n Choose a sign-in method to proceed\n </Text>\n </div>\n <div className=\"zd:mt-6 zd:mb-4 zd:px-4 zd:flex zd:flex-col zd:gap-2\">\n {children}\n </div>\n </div>\n <div className=\"zd:px-4\">\n <SignUpFooter\n termsAndConditionsUrl={termsAndConditionsUrl}\n privacyPolicyUrl={privacyPolicyUrl}\n agreedToTerms={agreedToTerms}\n setAgreedToTerms={(agreed) => {\n setAgreedToTerms(agreed)\n if (agreed) setHighlightAgreement(false)\n }}\n highlight={highlightAgreement}\n />\n </div>\n </div>\n </SignUpContext.Provider>\n )\n}\n\nfunction SignUpDivider({ label = 'or' }: { label?: string }) {\n return (\n <div className=\"zd:-mx-4 zd:my-2 zd:flex zd:items-center zd:gap-3\">\n <div className=\"zd:h-px zd:flex-1 zd:bg-greyScale/30\" />\n <Text className=\"zd:text-body3\">{label}</Text>\n <div className=\"zd:h-px zd:flex-1 zd:bg-greyScale/30\" />\n </div>\n )\n}\n\n/** The canonical sign-up page. Takes the root's own props (the consent-gate\n * URLs) and forwards them — per-unit config (e.g. the email method) still\n * means composing the units yourself. */\nfunction SignUpDefault(props: Omit<SignUpRootProps, 'children'>) {\n return (\n <SignUpRoot {...props}>\n <SignUpPasskey />\n <SignUpDivider />\n <SignUpGoogle />\n <SignUpEmail />\n </SignUpRoot>\n )\n}\n\nexport const SignUp = Object.assign(SignUpRoot, {\n Default: SignUpDefault,\n Passkey: SignUpPasskey,\n Google: SignUpGoogle,\n Email: SignUpEmail,\n Divider: SignUpDivider,\n})\n","import { Button, PoweredBy } from '@zerodev/react-ui'\nimport { useVerifyMagicLink } from '@zerodev/wallet-react'\nimport { useEffect, useRef, useState } from 'react'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\nimport { stripMagicLinkCodeFromUrl } from '../utils/url'\n\nfunction getCodeFromUrl(): string | null {\n if (typeof window === 'undefined') return null\n return new URLSearchParams(window.location.search).get('code')\n}\n\nexport function Verifying() {\n const { otpId, otpEncryptionTargetBundle, goToStep, clearOtpSession } =\n useAuth()\n const [code] = useState<string | null>(getCodeFromUrl)\n const [error, setError] = useState<Error | null>(null)\n\n // ref to prevent useEffect firing twice in dev's StrictMode\n const hasVerifiedRef = useRef(false)\n const { mutate: verifyMagicLink, isPending: isVerificationLoading } =\n useVerifyMagicLink({\n mutation: {\n onSuccess: () => {\n clearOtpSession()\n goToStep('authenticated')\n },\n onError: (err) => {\n setError(err)\n },\n },\n })\n\n useEffect(() => {\n if (hasVerifiedRef.current || !code) return\n hasVerifiedRef.current = true\n\n // No active OTP session — most commonly the user tapped the same\n // magic link again after a successful verify, which cleared the\n // session. Skip the (doomed) mutation, clean the URL, and drop\n // back to step=null so the host app's own routing handles the\n // already-authenticated user without flashing an error.\n if (!otpId || !otpEncryptionTargetBundle) {\n stripMagicLinkCodeFromUrl()\n goToStep(null)\n return\n }\n\n verifyMagicLink({ otpId, code, otpEncryptionTargetBundle })\n }, [otpId, otpEncryptionTargetBundle, code, verifyMagicLink, goToStep])\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:items-center zd:justify-center\">\n {!error && isVerificationLoading && (\n <StatusScreen imageName=\"loading\" title=\"Verifying Your Email\">\n Please wait while we securely connect your wallet.\n </StatusScreen>\n )}\n\n {!error && !code && !isVerificationLoading && (\n <>\n <StatusScreen imageName=\"error\" title=\"Invalid Link\">\n This verification link is invalid or incomplete.\n <br />\n Please check your email and try again with the correct link.\n </StatusScreen>\n <Button\n action=\"primary\"\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n </>\n )}\n\n {error != null && (\n <>\n <StatusScreen imageName=\"error\" title=\"Oops, something went wrong\">\n We couldn't complete the sign-in process. This could be due to\n timeout, an expired link, or a cancelled request.\n </StatusScreen>\n <Button\n action=\"primary\"\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n </>\n )}\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { ListItem, ListItemIcon, PoweredBy, Text } from '@zerodev/react-ui'\nimport { useConnect } from 'wagmi'\nimport { useAuth } from '../hooks/useAuth'\n\nexport function WalletSelection() {\n const { goToStep } = useAuth()\n const { connect, connectors, isPending } = useConnect()\n\n const externalConnectors = connectors.filter((c) => c.id !== 'zerodev-wallet')\n\n const handleSelect = (connector: (typeof connectors)[number]) => {\n connect(\n { connector },\n {\n onSuccess: () => {\n goToStep(null)\n },\n },\n )\n }\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:justify-center\">\n <Text className=\"zd:text-h2 zd:text-center\">Select your wallet</Text>\n\n <div className=\"zd:flex zd:flex-col zd:gap-2\">\n {externalConnectors.length === 0 ? (\n <Text className=\"zd:text-center\">\n No wallets detected. Install a browser wallet extension to\n continue.\n </Text>\n ) : (\n externalConnectors.map((connector) => (\n <ListItem\n key={connector.uid}\n title={connector.name}\n icon={\n connector.icon ? (\n <img\n src={connector.icon}\n alt=\"\"\n className=\"zd:w-6 zd:h-6\"\n />\n ) : (\n <ListItemIcon name=\"walletOutline\" />\n )\n }\n disabled={isPending}\n onClick={() => handleSelect(connector)}\n className=\"zd:rounded-3xl\"\n />\n ))\n )}\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { Screen, TopNav } from '@zerodev/react-ui'\nimport { type ReactNode, useEffect } from 'react'\nimport { StatusScreen } from '../shared/components/StatusScreen'\nimport { useAuth } from './hooks/useAuth'\nimport { EmailVerification } from './pages/EmailVerification'\nimport { ErrorScreen } from './pages/ErrorScreen'\nimport { OtpInput } from './pages/OtpInput'\nimport { SignUp } from './pages/SignUp'\nimport { Verifying } from './pages/Verifying'\nimport { WalletSelection } from './pages/WalletSelection'\nimport type { AuthStep } from './types'\nimport { hasMagicLinkCodeInUrl, stripMagicLinkCodeFromUrl } from './utils/url'\n\nconst TITLE_BY_STEP: Partial<Record<AuthStep, string>> = {\n 'wallet-selection': 'Choose your wallet',\n}\n\nfunction OAuthCallback() {\n return (\n <div className=\"zd:flex zd:flex-1 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"loading\" title=\"Authenticating...\">\n Please wait while we complete the OAuth authentication.\n </StatusScreen>\n </div>\n )\n}\n\nfunction PasskeyPrompt() {\n return (\n <div className=\"zd:flex zd:flex-1 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"loading\" title=\"Passkey authentication\">\n Please authenticate with your passkey.\n </StatusScreen>\n </div>\n )\n}\n\nfunction renderStep(\n step: AuthStep | null,\n renderSignUp?: (() => ReactNode) | undefined,\n): ReactNode {\n switch (step) {\n case 'sign-up':\n return renderSignUp ? renderSignUp() : <SignUp.Default />\n case 'email-verification':\n return <EmailVerification />\n case 'otp-input':\n return <OtpInput />\n case 'verifying-otp':\n return <Verifying />\n case 'oauth-in-progress':\n return <OAuthCallback />\n case 'passkey-prompt':\n return <PasskeyPrompt />\n case 'wallet-selection':\n return <WalletSelection />\n case 'error':\n return <ErrorScreen />\n default:\n return null\n }\n}\n\nexport function ConnectWallet({\n onClose: userOnClose,\n size,\n renderSignUp,\n logo,\n}: {\n onClose?: (() => void) | undefined\n size?: 'sm' | 'md' | 'lg' | undefined\n /** Replace the default sign-up page: compose `SignUp.*` units inside\n * `<SignUp>`. Omit to render the canonical page (`SignUp.Default`). */\n renderSignUp?: (() => ReactNode) | undefined\n /** Optional brand logo for the top nav on the sign-up page. When omitted,\n * no logo is shown. `PoweredBy` always shows the ZeroDev mark\n * independently. */\n logo?: ReactNode | undefined\n} = {}) {\n const { step, goToStep, goBack, reset } = useAuth()\n\n useEffect(() => {\n if (step === null && hasMagicLinkCodeInUrl()) {\n goToStep('verifying-otp')\n }\n }, [step, goToStep])\n\n const content = renderStep(step, renderSignUp)\n if (!content) return null\n\n const handleClose = () => {\n stripMagicLinkCodeFromUrl()\n reset()\n userOnClose?.()\n }\n const title = step ? TITLE_BY_STEP[step] : undefined\n\n return (\n <Screen\n {...(size && { size })}\n // Sign-up shrinks to its content (few methods → shorter card) but never\n // grows past the standard height; other steps keep the fixed size.\n className={step === 'sign-up' ? 'zd:h-auto zd:max-h-202.5' : undefined}\n // Some elements in SignUp need to go from edge to edge.\n // No vertical padding; we set px-0 so we can fully control this padding.\n contentClassName={step === 'sign-up' ? 'zd:px-0' : undefined}\n topNav={\n <TopNav\n {...(goBack !== null && { onLeftButtonClick: goBack })}\n onRightButtonClick={handleClose}\n {...(title && { title })}\n {...(step === 'sign-up' && {\n ...(logo && { logo }),\n className: 'zd:px-4',\n })}\n />\n }\n >\n {content}\n </Screen>\n )\n}\n","import type { StateCreator } from 'zustand'\nimport type { AuthStep } from './types'\n\nconst OTP_SESSION_STORAGE_KEY = 'zerodev:auth:otpSession'\n\ntype StoredOtpSession = {\n otpId: string\n otpEncryptionTargetBundle: string\n}\n\nfunction readStoredOtpSession(): StoredOtpSession | null {\n if (typeof window === 'undefined') return null\n try {\n const raw = window.localStorage.getItem(OTP_SESSION_STORAGE_KEY)\n if (!raw) return null\n const parsed = JSON.parse(raw) as StoredOtpSession\n if (!parsed?.otpId || !parsed?.otpEncryptionTargetBundle) return null\n return parsed\n } catch {\n return null\n }\n}\n\nfunction writeStoredOtpSession(session: StoredOtpSession): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.setItem(\n OTP_SESSION_STORAGE_KEY,\n JSON.stringify(session),\n )\n } catch {\n // ignore\n }\n}\n\nfunction clearStoredOtpSession(): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.removeItem(OTP_SESSION_STORAGE_KEY)\n } catch {\n // ignore\n }\n}\n\nexport interface AuthStoreSlice {\n auth: {\n // State\n step: AuthStep | null\n stepHistory: AuthStep[]\n email: string | null\n setEmail: (email: string) => void\n otpId: string | null\n /**\n * HPKE encryption target bundle returned by the latest `sendOTP` call.\n * Required by `verifyOTP` so the OTP attempt can be sealed to the enclave.\n */\n otpEncryptionTargetBundle: string | null\n /** Set both fields produced by `sendOTP` together. */\n setOtpSession: (input: {\n otpId: string\n otpEncryptionTargetBundle: string\n }) => void\n /** Clear the persisted OTP session after a successful verify. */\n clearOtpSession: () => void\n\n // Actions\n /** Restore a persisted OTP session (survives reloads mid-email-flow). */\n initialize: () => void\n goToStep: (step: AuthStep | null) => void\n goBack: () => void\n reset: () => void\n }\n}\n\nexport const createAuthStoreSlice: StateCreator<\n AuthStoreSlice,\n [],\n [],\n AuthStoreSlice\n> = (set, get, _store) => ({\n auth: {\n // Initial state\n step: null,\n stepHistory: [],\n email: null,\n otpId: null,\n otpEncryptionTargetBundle: null,\n\n // Actions\n initialize: () => {\n const stored = readStoredOtpSession()\n if (!stored) return\n set((state) => ({\n auth: {\n ...state.auth,\n otpId: stored.otpId,\n otpEncryptionTargetBundle: stored.otpEncryptionTargetBundle,\n },\n }))\n },\n\n goToStep: (step: AuthStep | null) => {\n set((state) => ({\n auth: {\n ...state.auth,\n step,\n stepHistory:\n state.auth.step === null\n ? state.auth.stepHistory\n : [...state.auth.stepHistory, state.auth.step],\n },\n }))\n },\n\n goBack: () => {\n const { auth } = get()\n if (auth.stepHistory.length === 0) return\n const newHistory = [...auth.stepHistory]\n const previousStep = newHistory.pop()!\n set((state) => ({\n auth: {\n ...state.auth,\n step: previousStep,\n stepHistory: newHistory,\n },\n }))\n },\n\n reset: () => {\n clearStoredOtpSession()\n set((state) => ({\n auth: {\n ...state.auth,\n step: null,\n stepHistory: [],\n email: null,\n otpId: null,\n otpEncryptionTargetBundle: null,\n },\n }))\n },\n\n setEmail: (email) => {\n set((state) => ({\n auth: {\n ...state.auth,\n email,\n },\n }))\n },\n\n setOtpSession: ({ otpId, otpEncryptionTargetBundle }) => {\n writeStoredOtpSession({ otpId, otpEncryptionTargetBundle })\n set((state) => ({\n auth: {\n ...state.auth,\n otpId,\n otpEncryptionTargetBundle,\n },\n }))\n },\n\n clearOtpSession: () => {\n clearStoredOtpSession()\n set((state) => ({\n auth: {\n ...state.auth,\n otpId: null,\n otpEncryptionTargetBundle: null,\n },\n }))\n },\n },\n})\n","import { create } from 'zustand'\nimport { subscribeWithSelector } from 'zustand/middleware'\nimport {\n type AuthStoreSlice,\n createAuthStoreSlice,\n} from './auth/authStoreSlice'\nimport type { PendingRequest } from './types.js'\n\nexport type State = {\n pendingRequests: PendingRequest[]\n userConfirmationListenerActive: boolean\n addPendingRequest: (request: PendingRequest) => void\n removePendingRequest: (id: string) => void\n clearPendingRequests: () => void\n setUserConfirmationListenerActive: (active: boolean) => void\n} & AuthStoreSlice\n\nexport const createStore = () =>\n create<State>()(\n subscribeWithSelector((set, get, store) => ({\n pendingRequests: [],\n userConfirmationListenerActive: false,\n addPendingRequest: (request) =>\n set((state) => ({\n pendingRequests: [...state.pendingRequests, request],\n })),\n removePendingRequest: (id) =>\n set((state) => ({\n pendingRequests: state.pendingRequests.filter((r) => r.id !== id),\n })),\n clearPendingRequests: () => set({ pendingRequests: [] }),\n setUserConfirmationListenerActive: (active) =>\n set({ userConfirmationListenerActive: active }),\n\n ...createAuthStoreSlice(set, get, store),\n })),\n )\n","import type { CreateConnectorFn } from '@wagmi/core'\nimport type {\n ZeroDevProvider,\n ZeroDevWalletConnectorParams,\n} from '@zerodev/wallet-react'\nimport {\n zeroDevWallet as baseZeroDevWallet,\n NotAuthenticatedError,\n} from '@zerodev/wallet-react'\nimport { createStore } from './store.js'\nimport type { Request, RequestMethod } from './types.js'\n\nconst DEFAULT_SIGNING_PROMPT_METHODS: RequestMethod[] = [\n 'eth_sendTransaction',\n 'wallet_sendTransaction',\n 'wallet_sendCalls',\n 'personal_sign',\n 'eth_signTypedData_v4',\n]\n\n/** The kit connector takes exactly the base connector's param\n We alias it to leave room for expansion */\nexport type ZeroDevKitConnectorParams = ZeroDevWalletConnectorParams\n\nfunction requireUserConfirmation(\n store: ReturnType<typeof createStore>,\n request: Request,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n store.getState().addPendingRequest({\n id: crypto.randomUUID(),\n ...request,\n resolve,\n reject,\n })\n })\n}\n\n/**\n * Resolves when the user completes the auth flow (`step === 'authenticated'`),\n * rejects when they dismiss it (`step === null`).\n */\nfunction waitForAuthFlow(store: ReturnType<typeof createStore>): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const unsub = store.subscribe(\n (state) => state.auth.step,\n (step) => {\n if (step === 'authenticated') {\n unsub()\n resolve()\n } else if (step === null) {\n // User dismissed the auth flow (e.g. clicked the TopNav close\n // button) — abort the pending wagmi connect.\n unsub()\n reject(new Error('Auth flow dismissed'))\n }\n },\n )\n })\n}\n\nexport function zeroDevWallet(\n params: ZeroDevKitConnectorParams,\n): CreateConnectorFn {\n const baseFactory = baseZeroDevWallet(params)\n const store = createStore()\n\n return (wagmiConfig) => {\n const connector = baseFactory(wagmiConfig)\n\n return {\n ...connector,\n\n async connect(connectParams) {\n // Try to connect first. If a session is persisted, base will load it\n // and resolve — no auth UI needed. If not, it throws\n // `NotAuthenticatedError` and we surface SignUp.\n //\n // This avoids forcing every connect to await the base store's init\n // (which `isAuthorized()` deliberately skips for perf — see\n // packages/react/src/core/connector.ts), and avoids flashing the auth\n // UI on first paint when the session hasn't loaded yet.\n try {\n return await connector.connect(connectParams)\n } catch (error) {\n if (\n connectParams?.isReconnecting ||\n !(error instanceof NotAuthenticatedError)\n ) {\n throw error\n }\n\n if (store.getState().auth.step !== null) {\n throw new Error('Auth flow already in progress')\n }\n\n store.getState().auth.goToStep('sign-up')\n await waitForAuthFlow(store)\n return connector.connect(connectParams)\n }\n },\n\n async disconnect() {\n await connector.disconnect?.()\n store.getState().auth.reset()\n },\n\n async setup() {\n await connector.setup?.()\n\n // Everything below is browser-only. Skip during SSR — getProvider()\n // touches `window` for EIP-6963 discovery and would crash on the\n // server, and the session restore reads localStorage.\n if (typeof window === 'undefined') return\n\n // Restore a persisted OTP session so an email flow survives a reload.\n store.getState().auth.initialize()\n\n // Signing is pinned to background mode: the prompt-mode confirmation UI\n // is not part of this package's public surface, so requests always pass\n // through without gating. The wrapping logic below is retained but\n // unreachable.\n // const signing = params.signing\n const signing = { mode: 'background' } as const\n if (signing.mode === 'background') return\n\n const methods =\n // (signing?.mode === 'prompt' && signing.methods) ||\n DEFAULT_SIGNING_PROMPT_METHODS\n\n const provider = (await connector.getProvider()) as ZeroDevProvider\n const baseRequest = provider.request.bind(provider)\n\n // todo: move Request type to core package and use as the method and params type here\n // then we can remove as RequestMethod and spread in return baseRequest\n provider.request = async ({\n method,\n params: reqParams,\n }: {\n method: string\n params?: unknown[]\n }) => {\n const { userConfirmationListenerActive } = store.getState()\n if (\n userConfirmationListenerActive &&\n methods.includes(method as RequestMethod)\n ) {\n await requireUserConfirmation(store, {\n method: method as RequestMethod,\n params: reqParams,\n } as Request)\n }\n\n return baseRequest({\n method,\n ...(reqParams && { params: reqParams }),\n })\n }\n },\n\n getKitStore() {\n return store\n },\n }\n }\n}\n"],"names":["errorImg","loadingImg","sendImg","successImg","STATE_IMAGES","StatusScreen","imageName","title","children","className","jsxs","cn","jsx","Text","useKitStore","connector","useConfig","c","useAuth","store","step","useStore","state","stepHistory","email","otpId","otpEncryptionTargetBundle","EmailVerification","setOtpSession","sendMagicLink","isSendPending","useSendMagicLink","secondsLeftUntilResend","setSecondsLeftUntilResend","useState","canResend","useEffect","timer","prev","handleResend","Fragment","PoweredBy","hasMagicLinkCodeInUrl","stripMagicLinkCodeFromUrl","url","ErrorScreen","message","showRetry","showChooseAnother","goToStep","goBack","reset","handleRetry","Button","MIN_LENGTH","MAX_LENGTH","DEFAULT_LENGTH","clampLength","length","CharBox","char","isFocused","Wrapper","CodeInput","onChange","onComplete","disabled","error","autoFocus","testId","codeLength","charBoxes","useMemo","_","i","code","setCode","setIsFocused","inputRef","useRef","_a","handleChange","text","sanitized","e","box","OtpInput","clearOtpSession","sendOtp","isSendOtpPending","useSendOTP","verifyOtp","isPending","useVerifyOTP","otp","setOtp","setError","secondsUntilResend","setSecondsUntilResend","interval","handleVerify","handleComplete","newOtpId","newBundle","SignUpFooter","termsAndConditionsUrl","privacyPolicyUrl","agreedToTerms","setAgreedToTerms","highlight","showAgreement","blobWebm","BlobAnimation","SignUpContext","createContext","useSignUpContext","ctx","useContext","useReportPending","pending","setAuthPending","EMAIL_REGEX","isValidEmailAddress","SignUpEmail","setEmail","authPending","emailAuthMethod","needsAgreement","guardAgreement","emailInput","setEmailInput","shouldUseOtp","isSendMagicLinkPending","isEmailLoading","handleSubmit","send","err","Input","Icon","isCancellationError","SignUpGoogle","authenticateOAuth","useAuthenticateOAuth","handleClick","ListItem","ListItemIcon","ListItemChevron","SignUpPasskey","mutation","registerPasskey","isRegisterPending","useRegisterPasskey","loginPasskey","isLoginPending","useLoginPasskey","guarded","run","SignUpRoot","highlightAgreement","setHighlightAgreement","agreed","SignUpDivider","label","SignUpDefault","props","SignUp","getCodeFromUrl","Verifying","hasVerifiedRef","verifyMagicLink","isVerificationLoading","useVerifyMagicLink","WalletSelection","connect","connectors","useConnect","externalConnectors","handleSelect","TITLE_BY_STEP","OAuthCallback","PasskeyPrompt","renderStep","renderSignUp","ConnectWallet","userOnClose","size","logo","content","handleClose","Screen","TopNav","OTP_SESSION_STORAGE_KEY","readStoredOtpSession","raw","parsed","writeStoredOtpSession","session","clearStoredOtpSession","createAuthStoreSlice","set","get","_store","stored","auth","newHistory","previousStep","createStore","create","subscribeWithSelector","request","id","r","active","waitForAuthFlow","resolve","reject","unsub","zeroDevWallet","params","baseFactory","baseZeroDevWallet","wagmiConfig","connectParams","NotAuthenticatedError"],"mappings":"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"}
|