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' && (
-

+

已有账户?{' '}

)} +
);