// dudu 移动端 · 主 App 四屏:启用引导 / 登录 / 购买时长 / 我的 function MAppHeader({ title }) { return (
{title}
); } /* ---------- ① 启用引导 ---------- */ function OnboardingScreen() { const { Button } = window.DuduDesignSystem_2e0172; const [step, setStep] = React.useState(0); const steps = [ { title: '添加键盘', desc: '设置 → 通用 → 键盘 → 添加新键盘,选择 dudu', icon: }, { title: '开启完全访问', desc: '语音识别需要联网,请允许完全访问', icon: }, { title: '试一试', desc: '在下面的输入框按住麦克风说一句话', icon: }, ]; return (
三步开启 dudu
按住说话,松开上屏
{steps.map((s, i) => { const state = i < step ? 'done' : i === step ? 'active' : 'todo'; return (
{state === 'done' ? : s.icon} {i + 1}. {s.title} {s.desc}
); })}
); } /* ---------- ② 登录 ---------- */ function LoginScreen() { return (
dudu
大模型语音输入 · 说话即上屏
登录即同意《用户协议》与《隐私政策》
); } /* ---------- ③ 购买时长 ---------- */ function PaywallScreen() { const { Button } = window.DuduDesignSystem_2e0172; const [pack, setPack] = React.useState('m'); const PACKS = [ ['s', '100 分钟', 9, '约 ¥0.09 / 分钟', ''], ['m', '500 分钟', 39, '约 ¥0.078 / 分钟', '省 13%'], ['l', '2000 分钟', 129, '约 ¥0.065 / 分钟', '省 28%'], ]; const price = PACKS.find((p) => p[0] === pack)[2]; return (
{/* 余额卡 */}
时长余额 472 分钟 时长不过期
每天另有 3 分钟免费试用
{/* 时长包 */}
{PACKS.map(([key, lab, p, desc, tag]) => { const active = pack === key; return ( ); })}
支付后立即到账 · 时长不过期
); } /* ---------- ④ 我的 ---------- */ function ProfileScreen() { const { Badge, ProgressBar } = window.DuduDesignSystem_2e0172; const perms = [ { label: '麦克风权限', ok: true }, { label: '键盘已添加', ok: true }, { label: '完全访问', ok: false, hint: '去开启' }, ]; return (
wang*** 时长余额 472 分钟 · 不过期 余额充足
今日免费试用1 / 3 分钟
{perms.map((p, i) => (
{p.label} {p.ok ? ( ) : ( {p.hint} )}
))}
); } Object.assign(window, { OnboardingScreen, LoginScreen, PaywallScreen, ProfileScreen });