mirror of
				https://github.com/songquanpeng/one-api.git
				synced 2025-10-31 13:53:41 +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;
 |