/*
Copyright (c) 2025 Tethys Plex
This file is part of Veloera.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
import React, { useEffect, useState } from 'react';
import { Link } from 'react-router-dom';
import { API, showError, showInfo, showSuccess } from '../helpers';
import { Button, Form } from '@douyinfe/semi-ui';
import Text from '@douyinfe/semi-ui/lib/es/typography/text';
import { useTranslation } from 'react-i18next';
import { VALIDATION_MESSAGES } from '../utils/authConstants';
// Shared components and hooks
import { useAuthForm } from '../hooks/useAuthForm';
import { useTurnstile } from '../hooks/useTurnstile';
import AuthFormLayout from './shared/AuthFormLayout';
import ThirdPartyAuth from './shared/ThirdPartyAuth';
import WeChatLoginModal from './shared/WeChatLoginModal';
import TurnstileWrapper from './shared/TurnstileWrapper';
const RegisterForm = () => {
const { t } = useTranslation();
const [showEmailVerification, setShowEmailVerification] = useState(false);
const [loading, setLoading] = useState(false);
// Use shared hooks
const {
inputs,
setInputs,
handleChange,
status,
setStatus,
showWeChatLoginModal,
setShowWeChatLoginModal,
navigate,
processAffCode,
onWeChatLoginClicked,
onSubmitWeChatVerificationCode,
onTelegramLoginClicked,
} = useAuthForm({
username: '',
password: '',
password2: '',
email: '',
verification_code: '',
wechat_verification_code: '',
});
const {
turnstileEnabled,
turnstileSiteKey,
turnstileToken,
setTurnstileToken,
validateTurnstile,
} = useTurnstile();
const { username, password, password2 } = inputs;
// Update email verification when status changes
useEffect(() => {
setShowEmailVerification(status.email_verification);
}, [status]);
const handleSubmit = async (e) => {
if (password.length < 8) {
showInfo(VALIDATION_MESSAGES.PASSWORD_TOO_SHORT);
return;
}
if (password !== password2) {
showInfo(VALIDATION_MESSAGES.PASSWORD_MISMATCH);
return;
}
if (username && password) {
if (!validateTurnstile()) {
showInfo(VALIDATION_MESSAGES.TURNSTILE_WAIT);
return;
}
setLoading(true);
// Handle AFF code if enabled - 直接构建请求数据
let requestData = { ...inputs };
let statusFromStorage = localStorage.getItem('status');
if (statusFromStorage) {
statusFromStorage = JSON.parse(statusFromStorage);
if (statusFromStorage.aff_enabled === true) {
let affCode = localStorage.getItem('aff');
if (affCode) {
requestData.aff_code = affCode;
}
}
}
const res = await API.post(
`/api/user/register?turnstile=${turnstileToken}`,
requestData,
);
const { success, message } = res.data;
if (success) {
navigate('/login');
showSuccess(VALIDATION_MESSAGES.REGISTER_SUCCESS);
} else {
showError(message);
}
setLoading(false);
}
};
const sendVerificationCode = async () => {
if (inputs.email === '') return;
if (!validateTurnstile()) {
showInfo(VALIDATION_MESSAGES.TURNSTILE_WAIT);
return;
}
setLoading(true);
const res = await API.get(
`/api/verification?email=${inputs.email}&turnstile=${turnstileToken}`,
);
const { success, message } = res.data;
if (success) {
showSuccess(VALIDATION_MESSAGES.VERIFICATION_CODE_SENT);
} else {
showError(message);
}
setLoading(false);
};
const handleWeChatSubmit = () => {
onSubmitWeChatVerificationCode(turnstileToken);
};
return (
handleChange('username', value)}
/>
handleChange('password', value)}
/>
handleChange('password2', value)}
/>
{showEmailVerification && (
<>
handleChange('email', value)}
name='email'
type='email'
suffix={
}
/>
handleChange('verification_code', value)
}
name='verification_code'
/>
>
)}