mirror of
https://github.com/songquanpeng/one-api.git
synced 2025-09-17 01:06:37 +08:00
* chore: add theme air with new-api main branch v0.2.0.3-alpha.1(first step) * feat: 完成渠道界面 * chore: 优化渠道界面样式问题 * feat: 完成兑换码界面 * feat: 完成充值(钱包)界面 * chore: 初代air主题将使用default主题的运营设置界面、系统设置界面、其他设置界面 * feat: 完成日志界面 * feat: 完成用户管理界面 * feat: 完成个人设置界面 * feat: 完成令牌界面 * chore: 优化令牌界面逻辑 * feat: 修改版权信息 * chore: make necessary changes --------- Co-authored-by: Calon <1808837298@qq.com> Co-authored-by: Apple\Apple <zeraturing@foxmail.com> Co-authored-by: JustSong <songquanpeng@foxmail.com>
103 lines
3.0 KiB
JavaScript
103 lines
3.0 KiB
JavaScript
import React, { useEffect, useState } from 'react';
|
||
import { Button, Form, Grid, Header, Image, Segment } from 'semantic-ui-react';
|
||
import { API, showError, showInfo, showSuccess } from '../helpers';
|
||
import Turnstile from 'react-turnstile';
|
||
|
||
const PasswordResetForm = () => {
|
||
const [inputs, setInputs] = useState({
|
||
email: ''
|
||
});
|
||
const { email } = inputs;
|
||
|
||
const [loading, setLoading] = useState(false);
|
||
const [turnstileEnabled, setTurnstileEnabled] = useState(false);
|
||
const [turnstileSiteKey, setTurnstileSiteKey] = useState('');
|
||
const [turnstileToken, setTurnstileToken] = useState('');
|
||
const [disableButton, setDisableButton] = useState(false);
|
||
const [countdown, setCountdown] = useState(30);
|
||
|
||
useEffect(() => {
|
||
let countdownInterval = null;
|
||
if (disableButton && countdown > 0) {
|
||
countdownInterval = setInterval(() => {
|
||
setCountdown(countdown - 1);
|
||
}, 1000);
|
||
} else if (countdown === 0) {
|
||
setDisableButton(false);
|
||
setCountdown(30);
|
||
}
|
||
return () => clearInterval(countdownInterval);
|
||
}, [disableButton, countdown]);
|
||
|
||
function handleChange(e) {
|
||
const { name, value } = e.target;
|
||
setInputs(inputs => ({ ...inputs, [name]: value }));
|
||
}
|
||
|
||
async function handleSubmit(e) {
|
||
setDisableButton(true);
|
||
if (!email) return;
|
||
if (turnstileEnabled && turnstileToken === '') {
|
||
showInfo('请稍后几秒重试,Turnstile 正在检查用户环境!');
|
||
return;
|
||
}
|
||
setLoading(true);
|
||
const res = await API.get(
|
||
`/api/reset_password?email=${email}&turnstile=${turnstileToken}`
|
||
);
|
||
const { success, message } = res.data;
|
||
if (success) {
|
||
showSuccess('重置邮件发送成功,请检查邮箱!');
|
||
setInputs({ ...inputs, email: '' });
|
||
} else {
|
||
showError(message);
|
||
}
|
||
setLoading(false);
|
||
}
|
||
|
||
return (
|
||
<Grid textAlign="center" style={{ marginTop: '48px' }}>
|
||
<Grid.Column style={{ maxWidth: 450 }}>
|
||
<Header as="h2" color="" textAlign="center">
|
||
<Image src="/logo.png" /> 密码重置
|
||
</Header>
|
||
<Form size="large">
|
||
<Segment>
|
||
<Form.Input
|
||
fluid
|
||
icon="mail"
|
||
iconPosition="left"
|
||
placeholder="邮箱地址"
|
||
name="email"
|
||
value={email}
|
||
onChange={handleChange}
|
||
/>
|
||
{turnstileEnabled ? (
|
||
<Turnstile
|
||
sitekey={turnstileSiteKey}
|
||
onVerify={(token) => {
|
||
setTurnstileToken(token);
|
||
}}
|
||
/>
|
||
) : (
|
||
<></>
|
||
)}
|
||
<Button
|
||
color="green"
|
||
fluid
|
||
size="large"
|
||
onClick={handleSubmit}
|
||
loading={loading}
|
||
disabled={disableButton}
|
||
>
|
||
{disableButton ? `重试 (${countdown})` : '提交'}
|
||
</Button>
|
||
</Segment>
|
||
</Form>
|
||
</Grid.Column>
|
||
</Grid>
|
||
);
|
||
};
|
||
|
||
export default PasswordResetForm;
|