From 2c0bb261547fa356ddb432cecdf040d5e4e4ac95 Mon Sep 17 00:00:00 2001 From: icy Date: Sun, 2 Nov 2025 06:22:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(auth):=20integrate=20beta=20mode=20functio?= =?UTF-8?q?nality=20in=20registration=20-=20Add=20beta=20code=20input=20fi?= =?UTF-8?q?eld=20to=20registration=20form=20when=20beta=20mode=20is=20enab?= =?UTF-8?q?led=20-=20Check=20system=20config=20on=20component=20mount=20to?= =?UTF-8?q?=20determine=20beta=20mode=20status=20-=20Require=206-character?= =?UTF-8?q?=20alphanumeric=20beta=20code=20for=20registration=20in=20beta?= =?UTF-8?q?=20mode=20-=20Maintain=20existing=20internationalization=20and?= =?UTF-8?q?=20styling=20patterns=20=F0=9F=A4=96=20Generated=20with=20[Clau?= =?UTF-8?q?de=20Code](https://claude.ai/code)=20Co-Authored-By:=20tinkle-c?= =?UTF-8?q?ommunity=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/components/RegisterPage.tsx | 92 ++++++++++++++++++++--------- 1 file changed, 65 insertions(+), 27 deletions(-) diff --git a/web/src/components/RegisterPage.tsx b/web/src/components/RegisterPage.tsx index 438bed05..3b3b75d9 100644 --- a/web/src/components/RegisterPage.tsx +++ b/web/src/components/RegisterPage.tsx @@ -1,7 +1,8 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import { useAuth } from '../contexts/AuthContext'; import { useLanguage } from '../contexts/LanguageContext'; import { t } from '../i18n/translations'; +import { getSystemConfig } from '../lib/config'; import { ArrowLeft } from 'lucide-react'; export function RegisterPage() { @@ -11,6 +12,8 @@ export function RegisterPage() { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); + const [betaCode, setBetaCode] = useState(''); + const [betaMode, setBetaMode] = useState(false); const [otpCode, setOtpCode] = useState(''); const [userID, setUserID] = useState(''); const [otpSecret, setOtpSecret] = useState(''); @@ -67,6 +70,19 @@ export function RegisterPage() { setLoading(false); }; + // Check for beta mode on component mount + useEffect(() => { + const checkBetaMode = async () => { + try { + const config = await getSystemConfig(); + setBetaMode(config.beta_mode || false); + } catch (error) { + console.error('Failed to get system config:', error); + } + }; + checkBetaMode(); + }, []); + const copyToClipboard = (text: string) => { navigator.clipboard.writeText(text); }; @@ -92,7 +108,7 @@ export function RegisterPage() { {/* Logo */}
- NoFx Logo + NoFx Logo

{t('appTitle', language)} @@ -109,7 +125,7 @@ export function RegisterPage() { {step === 'register' && (
-
-
-
+ {betaMode && ( +
+ + setBetaCode(e.target.value.replace(/[^a-z0-9]/gi, '').toLowerCase())} + className="w-full px-3 py-2 rounded font-mono" + style={{ background: '#0B0E11', border: '1px solid #2B3139', color: '#EAECEF' }} + placeholder="请输入6位内测码" + maxLength={6} + required={betaMode} + /> +

+ 内测码由6位字母数字组成,区分大小写 +

+
+ )} + {error && ( -
+
{error}
)} @@ -163,7 +200,7 @@ export function RegisterPage() { type="submit" disabled={loading} className="w-full px-4 py-2 rounded text-sm font-semibold transition-all hover:scale-105 disabled:opacity-50" - style={{ background: '#F0B90B', color: '#000' }} + style={{ background: 'var(--brand-yellow)', color: 'var(--brand-black)' }} > {loading ? t('loading', language) : t('registerButton', language)} @@ -183,17 +220,17 @@ export function RegisterPage() {
-
-

+

+

{t('step1Title', language)}

-

+

{t('step1Desc', language)}

-
-

+

+

{t('step2Title', language)}

@@ -214,13 +251,13 @@ export function RegisterPage() {

{t('otpSecret', language)}

+ style={{ background: 'var(--panel-bg-hover)', color: 'var(--brand-light-gray)' }}> {otpSecret} @@ -228,11 +265,11 @@ export function RegisterPage() {
-
-

+

+

{t('step3Title', language)}

-

+

{t('step3Desc', language)}

@@ -259,7 +296,7 @@ export function RegisterPage() {
-
{error && ( -
+
{error}
)} @@ -285,7 +322,7 @@ export function RegisterPage() { type="button" onClick={() => setStep('setup-otp')} className="flex-1 px-4 py-2 rounded text-sm font-semibold" - style={{ background: '#2B3139', color: '#848E9C' }} + style={{ background: 'var(--panel-bg-hover)', color: 'var(--text-secondary)' }} > {t('back', language)} @@ -305,21 +342,22 @@ export function RegisterPage() { {/* Login Link */} {step === 'register' && (
-

+

已有账户?{' '}

)} +
);