钱包页面完善

This commit is contained in:
CaIon 2023-11-08 00:40:12 +08:00
parent 83050646f9
commit 4c7384411d
4 changed files with 132 additions and 172 deletions

View File

@ -1,4 +1,4 @@
import React, {useContext, useState} from 'react'; import React, {useContext, useEffect, useState} from 'react';
import {Link, useNavigate} from 'react-router-dom'; import {Link, useNavigate} from 'react-router-dom';
import {UserContext} from '../context/User'; import {UserContext} from '../context/User';
@ -45,8 +45,10 @@ const HeaderBar = () => {
let navigate = useNavigate(); let navigate = useNavigate();
const [showSidebar, setShowSidebar] = useState(false); const [showSidebar, setShowSidebar] = useState(false);
const [dark, setDark] = useState(false);
const systemName = getSystemName(); const systemName = getSystemName();
const logo = getLogo(); const logo = getLogo();
var themeMode = localStorage.getItem('theme-mode');
async function logout() { async function logout() {
setShowSidebar(false); setShowSidebar(false);
@ -57,37 +59,22 @@ const HeaderBar = () => {
navigate('/login'); navigate('/login');
} }
useEffect(() => {
if (themeMode === 'dark') {
switchMode(true);
}
}, []);
const renderButtons = (isMobile) => {
return headerButtons.map((button) => {
if (button.admin && !isAdmin()) return <></>;
if (isMobile) {
return (
<Menu.Item
onClick={() => {
navigate(button.to);
setShowSidebar(false);
}}
>
{button.name}
</Menu.Item>
);
}
return (
<Menu.Item key={button.name} as={Link} to={button.to}>
<Icon name={button.icon}/>
{button.name}
</Menu.Item>
);
});
};
const switchMode = (model) => { const switchMode = (model) => {
const body = document.body; const body = document.body;
if (!model) { if (!model) {
body.removeAttribute('theme-mode'); body.removeAttribute('theme-mode');
localStorage.setItem('theme-mode', 'light');
} else { } else {
body.setAttribute('theme-mode', 'dark'); body.setAttribute('theme-mode', 'dark');
localStorage.setItem('theme-mode', 'dark');
} }
setDark(model);
}; };
return ( return (
<> <>
@ -119,7 +106,7 @@ const HeaderBar = () => {
footer={ footer={
<> <>
<Nav.Item itemKey={'about'} icon={<IconHelpCircle />} /> <Nav.Item itemKey={'about'} icon={<IconHelpCircle />} />
<Switch checkedText="🌞" size={'large'} uncheckedText="🌙" onChange={switchMode} /> <Switch checkedText="🌞" size={'large'} checked={dark} uncheckedText="🌙" onChange={switchMode} />
{userState.user ? {userState.user ?
<> <>
<Dropdown <Dropdown

View File

@ -163,55 +163,55 @@ const LoginForm = () => {
) : ( ) : (
<></> <></>
)} )}
{status.wechat_login ? ( {/*{status.wechat_login ? (*/}
<Button {/* <Button*/}
circular {/* circular*/}
color='green' {/* color='green'*/}
icon='wechat' {/* icon='wechat'*/}
onClick={onWeChatLoginClicked} {/* onClick={onWeChatLoginClicked}*/}
/> {/* />*/}
) : ( {/*) : (*/}
<></> {/* <></>*/}
)} {/*)}*/}
</div> </div>
</> </>
) : ( ) : (
<></> <></>
)} )}
<Modal {/*<Modal*/}
onClose={() => setShowWeChatLoginModal(false)} {/* onClose={() => setShowWeChatLoginModal(false)}*/}
onOpen={() => setShowWeChatLoginModal(true)} {/* onOpen={() => setShowWeChatLoginModal(true)}*/}
open={showWeChatLoginModal} {/* open={showWeChatLoginModal}*/}
size={'mini'} {/* size={'mini'}*/}
> {/*>*/}
<Modal.Content> {/* <Modal.Content>*/}
<Modal.Description> {/* <Modal.Description>*/}
<Image src={status.wechat_qrcode} fluid/> {/* <Image src={status.wechat_qrcode} fluid/>*/}
<div style={{textAlign: 'center'}}> {/* <div style={{textAlign: 'center'}}>*/}
<p> {/* <p>*/}
微信扫码关注公众号输入验证码获取验证码三分钟内有效 {/* 微信扫码关注公众号,输入「验证码」获取验证码(三分钟内有效)*/}
</p> {/* </p>*/}
</div> {/* </div>*/}
<Form size='large'> {/* <Form size='large'>*/}
<Form.Input {/* <Form.Input*/}
field={'wechat_verification_code'} {/* field={'wechat_verification_code'}*/}
placeholder='验证码' {/* placeholder='验证码'*/}
name='wechat_verification_code' {/* name='wechat_verification_code'*/}
value={inputs.wechat_verification_code} {/* value={inputs.wechat_verification_code}*/}
onChange={handleChange} {/* onChange={handleChange}*/}
/> {/* />*/}
<Button {/* <Button*/}
color='' {/* color=''*/}
fluid {/* fluid*/}
size='large' {/* size='large'*/}
onClick={onSubmitWeChatVerificationCode} {/* onClick={onSubmitWeChatVerificationCode}*/}
> {/* >*/}
登录 {/* 登录*/}
</Button> {/* </Button>*/}
</Form> {/* </Form>*/}
</Modal.Description> {/* </Modal.Description>*/}
</Modal.Content> {/* </Modal.Content>*/}
</Modal> {/*</Modal>*/}
</Card> </Card>
{turnstileEnabled ? ( {turnstileEnabled ? (
<div style={{display: 'flex', justifyContent: 'center', marginTop: 20}}> <div style={{display: 'flex', justifyContent: 'center', marginTop: 20}}>

View File

@ -114,34 +114,6 @@ const HeaderBar = () => {
navigate('/login'); navigate('/login');
} }
const toggleSidebar = () => {
setShowSidebar(!showSidebar);
};
const renderButtons = (isMobile) => {
return headerButtons.map((button) => {
if (button.admin && !isAdmin()) return <></>;
if (isMobile) {
return (
<Menu.Item
onClick={() => {
navigate(button.to);
setShowSidebar(false);
}}
>
{button.name}
</Menu.Item>
);
}
return (
<Menu.Item key={button.name} as={Link} to={button.to}>
<Icon name={button.icon}/>
{button.name}
</Menu.Item>
);
});
};
return ( return (
<> <>
<Layout> <Layout>

View File

@ -1,14 +1,15 @@
import React, {useEffect, useState} from 'react'; import React, {useEffect, useState} from 'react';
import {Button, Card, Confirm, Form, Grid, Header, Segment, Statistic} from 'semantic-ui-react'; import {Confirm} from 'semantic-ui-react';
import {API, isMobile, showError, showInfo, showSuccess} from '../../helpers'; import {API, isMobile, showError, showInfo, showSuccess} from '../../helpers';
import {renderNumber, renderQuota} from '../../helpers/render'; import {renderNumber, renderQuota} from '../../helpers/render';
import {Col, Layout, Row, Typography} from "@douyinfe/semi-ui"; import {Col, Layout, Row, Typography, Card, Button, Form, Divider, Space, Modal} from "@douyinfe/semi-ui";
import Title from "@douyinfe/semi-ui/lib/es/typography/title";
const TopUp = () => { const TopUp = () => {
const [redemptionCode, setRedemptionCode] = useState(''); const [redemptionCode, setRedemptionCode] = useState('');
const [topUpCode, setTopUpCode] = useState(''); const [topUpCode, setTopUpCode] = useState('');
const [topUpCount, setTopUpCount] = useState(10); const [topUpCount, setTopUpCount] = useState(10);
const [amount, setAmount] = useState(0); const [amount, setAmount] = useState(0.0);
const [topUpLink, setTopUpLink] = useState(''); const [topUpLink, setTopUpLink] = useState('');
const [userQuota, setUserQuota] = useState(0); const [userQuota, setUserQuota] = useState(0);
const [isSubmitting, setIsSubmitting] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false);
@ -17,7 +18,7 @@ const TopUp = () => {
const topUp = async () => { const topUp = async () => {
if (redemptionCode === '') { if (redemptionCode === '') {
showInfo('请输入充值码!') showInfo('请输入兑换码!')
return; return;
} }
setIsSubmitting(true); setIsSubmitting(true);
@ -27,7 +28,8 @@ const TopUp = () => {
}); });
const {success, message, data} = res.data; const {success, message, data} = res.data;
if (success) { if (success) {
showSuccess('充值成功!'); showSuccess('兑换成功!');
Modal.success({title: '兑换成功!', content: '成功兑换额度:' + renderQuota(data), centered: true});
setUserQuota((quota) => { setUserQuota((quota) => {
return quota + data; return quota + data;
}); });
@ -142,7 +144,7 @@ const TopUp = () => {
const {message, data} = res.data; const {message, data} = res.data;
// showInfo(message); // showInfo(message);
if (message === 'success') { if (message === 'success') {
setAmount(parseInt(data)); setAmount(parseFloat(data));
} else { } else {
showError(data); showError(data);
// setTopUpCount(parseInt(res.data.count)); // setTopUpCount(parseInt(res.data.count));
@ -168,91 +170,90 @@ const TopUp = () => {
<h3>我的钱包</h3> <h3>我的钱包</h3>
</Layout.Header> </Layout.Header>
<Layout.Content> <Layout.Content>
<div style={{marginTop: 20, paddingLeft: isMobile()?0:200, paddingRight: isMobile()?0:200}}> <Modal
title="确定要充值吗"
visible={open}
onOk={onlineTopUp}
onCancel={handleCancel}
maskClosable={false}
size={'small'}
centered={true}
>
<p>充值数量{topUpCount}</p>
<p>充值金额{renderAmount()}</p>
<p>是否确认充值</p>
</Modal>
<div style={{marginTop: 20, display: 'flex', justifyContent: 'center'}}>
<Card <Card
style={{width: '100%', padding: '20px'}} style={{width: '500px', padding: '20px'}}
> >
<Confirm <Title level={3} style={{textAlign: 'center'}}>余额 {renderQuota(userQuota)}</Title>
open={open} <div style={{marginTop: 20}}>
content={'充值数量:' + topUpCount + ',充值金额:' + renderAmount() + ',是否确认充值?'} <Divider>
cancelButton='取消充值' 兑换余额
confirmButton="确定" </Divider>
onCancel={handleCancel} <Form>
onConfirm={onlineTopUp} <Form.Input
/> field={'redemptionCode'}
<h3>兑换</h3> label={'兑换码'}
<Grid columns={2} stackable> placeholder='兑换码'
<Grid.Column> name='redemptionCode'
<Form> value={redemptionCode}
<Form.Input onChange={(value) => {
placeholder='兑换码' setRedemptionCode(value);
name='redemptionCode' }}
value={redemptionCode} />
onChange={(e) => { <Space>
setRedemptionCode(e.target.value); {
}} topUpLink ?
/> <Button type={'primary'} theme={'solid'} onClick={openTopUpLink}>
<Button color='green' onClick={openTopUpLink}> 获取兑换码
获取兑换码 </Button> : null
</Button> }
<Button color='yellow' onClick={topUp} disabled={isSubmitting}> <Button type={"warning"} theme={'solid'} onClick={topUp}
disabled={isSubmitting}>
{isSubmitting ? '兑换中...' : '兑换'} {isSubmitting ? '兑换中...' : '兑换'}
</Button> </Button>
</Form> </Space>
</Grid.Column> </Form>
<Grid.Column> </div>
<Statistic.Group widths='one'> <div style={{marginTop: 20}}>
<Statistic> <Divider>
<Statistic.Value>{renderQuota(userQuota)}</Statistic.Value> 在线充值
<Statistic.Label>剩余额度</Statistic.Label> </Divider>
</Statistic> <Form>
</Statistic.Group> <Form.Input
</Grid.Column> field={'redemptionCount'}
</Grid> label={'充值金额:' + renderAmount()}
</Card> placeholder='充值数量'
<Card name='redemptionCount'
style={{width: '100%', padding: '20px'}} type={'number'}
> value={topUpCount}
<Header as='h3'>在线充值最低1</Header> onChange={async (value) => {
<Grid columns={2} stackable> setTopUpCount(value);
<Grid.Column> await getAmount(value);
<Form> }}
<Form.Input />
placeholder='充值金额最低1' <Space>
name='redemptionCount' <Button type={'primary'} theme={'solid'} onClick={
type={'number'}
value={topUpCount}
autoComplete={'off'}
onChange={async (e) => {
setTopUpCount(e.target.value);
await getAmount(e.target.value);
}}
/>
<Button color='blue' onClick={
async () => { async () => {
preTopUp('zfb') preTopUp('zfb')
} }
}> }>
支付宝 支付宝
</Button> </Button>
<Button color='green' onClick={ <Button style={{backgroundColor: 'rgba(var(--semi-green-5), 1)'}}
type={'primary'}
theme={'solid'} onClick={
async () => { async () => {
preTopUp('wx') preTopUp('wx')
} }
}> }>
微信 微信
</Button> </Button>
</Form> </Space>
</Grid.Column> </Form>
<Grid.Column> </div>
<Statistic.Group widths='one'>
<Statistic>
<Statistic.Value>{renderAmount()}</Statistic.Value>
<Statistic.Label>支付金额</Statistic.Label>
</Statistic>
</Statistic.Group>
</Grid.Column>
</Grid>
</Card> </Card>
</div> </div>