import React, { useState } from 'react'; import { StepIndicator } from '../components/ui/index'; interface Props { onComplete: (pk: string) => void; } type Step = 'welcome' | 'choose' | 'import' | 'pin' | 'done'; const LABELS = ['Welcome', 'Wallet', 'Secure', 'Done']; const idx = (s: Step) => s === 'welcome' ? 0 : s === 'choose' || s === 'import' ? 1 : s === 'pin' ? 2 : 3; export default function OnboardingScreen({ onComplete }: Props) { const [step, setStep] = useState('welcome'); const [mnemonic, setMnemonic] = useState(''); const [pin, setPin] = useState(''); const [pinC, setPinC] = useState(''); const [pk, setPk] = useState(''); const [err, setErr] = useState(''); const [busy, setBusy] = useState(false); const create = async () => { setBusy(true); setErr(''); try { if (window.solvox) { const r = await window.solvox.wallet.create(); if (r.success && r.publicKey) { setPk(r.publicKey); setStep('pin'); } else setErr(r.error || 'Failed'); } else { setPk('Dev' + Date.now()); setStep('pin'); } } catch (e: any) { setErr(e.message); } setBusy(false); }; const imp = async () => { if (!mnemonic.trim()) return setErr('Enter recovery phrase'); const w = mnemonic.trim().split(/\s+/); if (w.length !== 12 && w.length !== 24) return setErr('Must be 12 or 24 words'); setBusy(true); setErr(''); try { if (window.solvox) { const r = await window.solvox.wallet.import(mnemonic.trim()); if (r.success && r.publicKey) { setPk(r.publicKey); setStep('pin'); } else setErr(r.error || 'Invalid'); } else { setPk('DevImp' + Date.now()); setStep('pin'); } } catch (e: any) { setErr(e.message); } setBusy(false); }; const setP = async () => { if (pin.length < 6) return setErr('Min 6 digits'); if (pin !== pinC) return setErr('PINs don\'t match'); setBusy(true); setErr(''); try { if (window.solvox) { const r = await window.solvox.auth.setPin(pin); if (!r.success) { setErr(r.error || 'Failed'); setBusy(false); return; } } setStep('done'); } catch (e: any) { setErr(e.message); } setBusy(false); }; return (
{step !== 'welcome' && } {step === 'welcome' && (
SV

SolVox

Voice-First Private AI Wallet

Powered by QVAC SDK · 100% Local AI · Zero Cloud

{[{ t: 'Voice Control', d: 'Talk to your wallet' }, { t: 'Local AI', d: '6 QVAC modules' }, { t: 'Self-Custody', d: 'Your keys only' }].map(f => (
{f.t}
{f.d}
))}
)} {step === 'choose' && (

Set up your wallet

{err &&
{err}
}
)} {step === 'import' && (

Import recovery phrase

Stays on your device — never sent anywhere.