From 7555f1ad5adf525c53aa3655ec7c2e3cf42fd0cd Mon Sep 17 00:00:00 2001 From: hailin Date: Mon, 9 Mar 2026 06:18:16 -0700 Subject: [PATCH] feat(register): move app download banner to top with QR code Co-Authored-By: Claude Sonnet 4.6 --- .../src/app/(auth)/register/page.tsx | 90 ++++++------------- 1 file changed, 28 insertions(+), 62 deletions(-) diff --git a/it0-web-admin/src/app/(auth)/register/page.tsx b/it0-web-admin/src/app/(auth)/register/page.tsx index c64f569..8ec78b6 100644 --- a/it0-web-admin/src/app/(auth)/register/page.tsx +++ b/it0-web-admin/src/app/(auth)/register/page.tsx @@ -3,6 +3,7 @@ import { useState, useEffect, useRef } from 'react'; import { useRouter } from 'next/navigation'; import Link from 'next/link'; +import QRCode from 'react-qr-code'; import { useTranslation } from 'react-i18next'; import { apiClient } from '@/infrastructure/api/api-client'; @@ -32,15 +33,12 @@ export default function RegisterPage() { const [confirmPassword, setConfirmPassword] = useState(''); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); - const [appDownloadUrl, setAppDownloadUrl] = useState<{ android?: string; ios?: string }>({}); + const [androidDownloadUrl, setAndroidDownloadUrl] = useState(null); useEffect(() => { - // Try to fetch latest app version for download links fetch('/api/app/version/check?platform=android¤t_version_code=0') .then((r) => r.json()) - .then((d) => { - if (d?.downloadUrl) setAppDownloadUrl((prev) => ({ ...prev, android: d.downloadUrl })); - }) + .then((d) => { if (d?.downloadUrl) setAndroidDownloadUrl(d.downloadUrl); }) .catch(() => {}); }, []); @@ -67,28 +65,15 @@ export default function RegisterPage() { const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); - if (password !== confirmPassword) { - setError(tc('passwordsNoMatch')); - return; - } - if (password.length < 6) { - setError('密码至少 6 位'); - return; - } - if (!companyName.trim()) { - setError('请填写企业名称'); - return; - } + if (password !== confirmPassword) { setError(tc('passwordsNoMatch')); return; } + if (password.length < 6) { setError('密码至少 6 位'); return; } + if (!companyName.trim()) { setError('请填写企业名称'); return; } setIsLoading(true); setError(null); try { - const body: Record = { - password, - name, - companyName, - }; + const body: Record = { password, name, companyName }; if (loginMethod === 'email') { body.email = email; } else { @@ -97,10 +82,7 @@ export default function RegisterPage() { body.smsCode = smsCode; } - const data = await apiClient('/api/v1/auth/register', { - method: 'POST', - body, - }); + const data = await apiClient('/api/v1/auth/register', { method: 'POST', body }); localStorage.setItem('access_token', data.accessToken); localStorage.setItem('refresh_token', data.refreshToken); @@ -108,9 +90,7 @@ export default function RegisterPage() { try { const payload = JSON.parse(atob(data.accessToken.split('.')[1])); - if (payload.tenantId) { - localStorage.setItem('current_tenant', JSON.stringify({ id: payload.tenantId })); - } + if (payload.tenantId) localStorage.setItem('current_tenant', JSON.stringify({ id: payload.tenantId })); } catch { /* ignore */ } router.push('/dashboard'); @@ -123,6 +103,25 @@ export default function RegisterPage() { return (
+ {/* App download banner — top of page */} + {androidDownloadUrl && ( +
+
+ +
+
+

下载 IT0 App

+

注册后扫码下载 Android 客户端,将平台能力带到手机

+ + 直接下载 APK + +
+
+ )} + {/* Header */}
iAgent @@ -162,7 +161,6 @@ export default function RegisterPage() {
- {/* Identifier field */} {loginMethod === 'email' ? (
@@ -213,7 +211,6 @@ export default function RegisterPage() { )} - {/* Full name */}
- {/* Company name — required for enterprise */}
{t('organizationHint')}

- {/* Password */}

- - {/* App download section */} -
-
- 📱 -

{t('downloadApp')}

-
-

{t('downloadAppDesc')}

-
- {appDownloadUrl.android ? ( - - {t('downloadAndroid')} - - ) : ( - - {t('downloadAndroid')} - - )} - - {t('downloadIOS')} (即将上线) - -
-
); }