Merge pull request !10 from 骚/myf-dev
This commit is contained in:
gary 2022-04-28 08:17:20 +00:00 committed by Gitee
commit 5b915e6413
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
10 changed files with 251 additions and 83 deletions

13
public/images/nft/23.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 80 KiB

13
public/images/nft/24.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 94 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 993 KiB

View File

@ -8,7 +8,7 @@ export const queryUserInfo = () => {
} }
export const uccnDetail = () => { export const uccnDetail = () => {
return request.request({ return request.request({
url: '/high_city/app/api/user/uccn/detail', url: '/high_city/app/api/index/uccn/detail',
method: 'get', method: 'get',
}) })
} }

View File

@ -1,14 +1,15 @@
import BigNumber from 'bignumber.js' import BigNumber from 'bignumber.js'
import erc20ABI from 'config/abi/erc20.json' import erc20ABI from 'config/abi/erc20.json'
import boardABI from 'config/abi/board.json'
import multicall from 'utils/multicall' import multicall from 'utils/multicall'
import boardsConfig from 'config/constants/boards' import boardsConfig from 'config/constants/boards'
import { getAddress } from 'utils/addressHelpers' import { getAddress, getBoardAddress } from 'utils/addressHelpers'
export const fetchBoardUserAllowances = async (account: string) => { export const fetchBoardUserAllowances = async (account: string) => {
const calls = boardsConfig.map((board) => { const calls = boardsConfig.map((board) => {
const tokenAddresses = getAddress(board.tokenAddresses) const tokenAddresses = getAddress(board.tokenAddresses)
const boardChefAddress = getAddress(board.contractAddress) const boardChefAdress = getAddress(board.contractAddress)
return { address: tokenAddresses, name: 'allowance', params: [account, boardChefAddress] } return { address: tokenAddresses, name: 'allowance', params: [account, boardChefAdress] }
}) })
const rawLpAllowances = await multicall(erc20ABI, calls) const rawLpAllowances = await multicall(erc20ABI, calls)
@ -38,15 +39,15 @@ export const fetchBoardUserTokenBalances = async (account: string) => {
export const fetchBoardUserInfo = async (account: string) => { export const fetchBoardUserInfo = async (account: string) => {
const data = await Promise.all( const data = await Promise.all(
boardsConfig.map(async (board) => { boardsConfig.map(async (board) => {
const boardChefAddress = getAddress(board.contractAddress) const boardChefAdress = getAddress(board.contractAddress)
const calls = [ const calls = [
{ {
address: boardChefAddress, address: boardChefAdress,
name: 'userInfo', name: 'userInfo',
params: [account], params: [account],
}, },
{ {
address: boardChefAddress, address: boardChefAdress,
name: 'pendingHCC', name: 'pendingHCC',
params: [account], params: [account],
}, },

View File

@ -1,6 +1,7 @@
import React, { useState, useEffect, useMemo, useRef } from 'react' import React, { useState, useEffect, useMemo, useRef } from 'react'
import styled from 'styled-components' import styled from 'styled-components'
import { useTranslation } from 'contexts/Localization' import { useTranslation } from 'contexts/Localization'
import Container from 'components/Layout/Container'
import { getAnnouncementPage, getAnnouncementDetail } from 'services/announcement' import { getAnnouncementPage, getAnnouncementDetail } from 'services/announcement'
import { Text, Flex, Image, Input, Heading } from '@pancakeswap/uikit' import { Text, Flex, Image, Input, Heading } from '@pancakeswap/uikit'
import ListItem from './components/ListItem' import ListItem from './components/ListItem'
@ -11,13 +12,15 @@ interface DetailProps {
content?: string content?: string
publishTime?: number publishTime?: number
} }
const ContainerMain = styled(Container)`
background: ${({ theme }) => theme.colors.gradients.bubblegum};
padding: 30px 0;
`
const MainDiv = styled.div` const MainDiv = styled.div`
width: 100%; width: 100%;
min-height: calc(100vh - 64px); min-height: calc(100vh - 64px);
background: ${({ theme }) => theme.colors.gradients.bubblegum}; /* background: ${({ theme }) => theme.colors.gradients.bubblegum}; */
box-sizing: border-box; box-sizing: border-box;
padding: 30px 0;
` `
const TableDiv = styled.div` const TableDiv = styled.div`
width: 80%; width: 80%;
@ -186,38 +189,40 @@ const Announcement: React.FC = () => {
console.log(searchTitle) console.log(searchTitle)
} }
return ( return (
<MainDiv ref={loadMoreRef as any} onScrollCapture={onScrollCapture}> <ContainerMain>
{detailVisible ? ( <MainDiv ref={loadMoreRef as any} onScrollCapture={onScrollCapture}>
<Detail {detailVisible ? (
title={detailData.title} <Detail
publishTime={detailData.publishTime} title={detailData.title}
content={detailData.content} publishTime={detailData.publishTime}
close={close} content={detailData.content}
/> close={close}
) : ( />
<TableDiv> ) : (
<SearchDiv> <TableDiv>
<InputMain> <SearchDiv>
<SearchInput placeholder={t('Enter a keyword search')} value={searchTitle} onChange={handleChange} /> <InputMain>
<SearchBtn onClick={searchList}> <SearchInput placeholder={t('Enter a keyword search')} value={searchTitle} onChange={handleChange} />
<Image src="/images/announcement/search-icon.svg" alt="" width={16} height={16} /> <SearchBtn onClick={searchList}>
</SearchBtn> <Image src="/images/announcement/search-icon.svg" alt="" width={16} height={16} />
</InputMain> </SearchBtn>
</SearchDiv> </InputMain>
<ListMain> </SearchDiv>
{renderContent()} <ListMain>
{totalVisible ? <TextAll>{t('Loaded all')}</TextAll> : ''} {renderContent()}
{totalVisible ? <TextAll>{t('Loaded all')}</TextAll> : ''}
{/* <div ref={loadMoreRef} /> */} {/* <div ref={loadMoreRef} /> */}
{/* {list.map((item) => ( {/* {list.map((item) => (
<Text key={item.id} onClick={() => lookDetail(item.id)}> <Text key={item.id} onClick={() => lookDetail(item.id)}>
<ListItem title={item.title} publishTime={item.publishTime} content={item.content} /> <ListItem title={item.title} publishTime={item.publishTime} content={item.content} />
</Text> </Text>
))} */} ))} */}
</ListMain> </ListMain>
</TableDiv> </TableDiv>
)} )}
</MainDiv> </MainDiv>
</ContainerMain>
) )
} }
export default Announcement export default Announcement

View File

@ -1,5 +1,6 @@
import React from 'react' import React from 'react'
import { Text } from '@pancakeswap/uikit' import { Text } from '@pancakeswap/uikit'
import Balance from 'components/Balance'
import styled from 'styled-components' import styled from 'styled-components'
interface InfoProps { interface InfoProps {
@ -22,9 +23,10 @@ const HeaderItem: React.FC<InfoProps> = ({ title, price }) => {
return ( return (
<> <>
<HeaderMain> <HeaderMain>
<Text color="text" fontSize="24px"> {/* <Text color="text" fontSize="24px">
{price} {price}
</Text> </Text> */}
<Balance lineHeight="1" fontSize="24px" decimals={0} value={Number(price)} />
<Text color="textSubtle" fontSize="14px"> <Text color="textSubtle" fontSize="14px">
{title} {title}
</Text> </Text>

View File

@ -1,8 +1,16 @@
import BigNumber from 'bignumber.js'
import React, { useEffect, useCallback, useMemo, useState, useRef } from 'react' import React, { useEffect, useCallback, useMemo, useState, useRef } from 'react'
import { Route, useRouteMatch, useLocation } from 'react-router-dom' import { Route, useRouteMatch, useLocation } from 'react-router-dom'
import { useDispatch } from 'react-redux' import { useDispatch } from 'react-redux'
import BigNumber from 'bignumber.js' import boardsConfig from 'config/constants/boards'
import tokens from 'config/constants/tokens'
import { getAddress, getBoardAddress } from 'utils/addressHelpers'
import { getDecimalAmountNumber } from 'utils/formatBalance'
import boardABI from 'config/abi/board.json'
import erc20ABI from 'config/abi/erc20.json'
import multicall from 'utils/multicall'
import { useWeb3React } from '@web3-react/core' import { useWeb3React } from '@web3-react/core'
import Balance from 'components/Balance'
import { Image, Heading, RowType, Toggle, Text } from '@pancakeswap/uikit' import { Image, Heading, RowType, Toggle, Text } from '@pancakeswap/uikit'
import styled from 'styled-components' import styled from 'styled-components'
import FlexLayout from 'components/Layout/Flex' import FlexLayout from 'components/Layout/Flex'
@ -39,10 +47,51 @@ const Boards: React.FC = () => {
const dispatch = useDispatch() const dispatch = useDispatch()
const { fastRefresh } = useRefresh() const { fastRefresh } = useRefresh()
// 资金池总额
const [totalAmount, setTotalAmount] = useState(0)
// 分红总额
const [shareOutBonus, setShareOutBonus] = useState(0)
// 获取资金池总额
const getCapital = async () => {
console.log(boardsConfig)
const calls = boardsConfig.map((board) => {
const contractAddress = getAddress(board.contractAddress)
return {
address: contractAddress,
name: '_poolInfo',
}
})
let total = 0
const boardsPoolInfo = await multicall(boardABI, calls)
boardsPoolInfo.forEach((item) => {
total += new BigNumber(item.totalAmount._hex).toNumber()
})
setTotalAmount(total)
}
// 获取分红总额
const fetchBoardShares = async () => {
const calls = boardsConfig.map((board) => {
const contractAddress = getAddress(board.tokenAddresses)
return {
address: contractAddress,
name: 'balanceOf',
params: ['0x2937a050705009270c9b5bc096d57d519ab7c39b'],
}
})
let total = 0
const sharesRed = await multicall(erc20ABI, calls)
sharesRed.forEach((item) => {
total += new BigNumber(item.balance._hex).div(new BigNumber(10).pow(18)).toNumber()
})
setShareOutBonus(total)
}
useEffect(() => { useEffect(() => {
dispatch(fetchBoardsPublicDataAsync()) dispatch(fetchBoardsPublicDataAsync())
if (account) { if (account) {
dispatch(fetchBoardUserDataAsync(account)) dispatch(fetchBoardUserDataAsync(account))
getCapital()
fetchBoardShares()
} }
}, [account, dispatch, fastRefresh]) }, [account, dispatch, fastRefresh])
@ -59,28 +108,21 @@ const Boards: React.FC = () => {
} }
return ( return (
<> <Page>
<Header> <Header>
<Heading as="h1" size="xl" color="text" mb="10px" mt="10px"> <Heading as="h1" size="xl" color="text" mb="10px" mt="10px">
{t('Total capital pool')} {t('Total capital pool')}
</Heading> </Heading>
{/* <SecondText fontSize="28px" color="text"> <Balance lineHeight="1" fontSize="32px" decimals={0} value={Number(totalAmount)} />
{t(
'Joining the board of directors will obtain the governance token xcandy \n participate in the governance of the project, vote, obtain additional pledge income, \n and have a higher invitation airdrop reward',
)}
</SecondText> */}
<Text fontSize="32px" color="text">
1.000.000.000.000
</Text>
<FlexLayoutMain> <FlexLayoutMain>
<HeaderItem title={t('The total amount of dividends')} price={1.0} /> <HeaderItem title={t('The total amount of dividends')} price={shareOutBonus} />
<HeaderItem title={t('Pending dividend')} price={1.0} /> {/* <HeaderItem title={t('Pending dividend')} price={1.0} /> */}
<HeaderItem title={t('Number of boards')} price={1.0} /> <HeaderItem title={t('Number of boards')} price={1.0} />
<HeaderItem title={t('Number of holders')} price={1.0} /> <HeaderItem title={t('Number of holders')} price={1.0} />
</FlexLayoutMain> </FlexLayoutMain>
</Header> </Header>
<Page>{renderContent()}</Page> {renderContent()}
</> </Page>
) )
} }

View File

@ -1,6 +1,29 @@
import React, { useState } from 'react' import React, { useState } from 'react'
import styled from 'styled-components' import styled from 'styled-components'
import { Text, Flex, Image } from '@pancakeswap/uikit' import { Text, Flex, Image, Button } from '@pancakeswap/uikit'
const SubButton = styled(Button)`
width: 25px;
height: 25px;
background: rgba(239, 232, 247, 0.39);
border: 1px solid rgba(255, 255, 255, 0.0588235294117647);
box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.25);
font-size: 18px;
color: #ada5ba;
border-radius: 5px;
padding: 0;
`
const AddButton = styled(Button)`
width: 25px;
height: 25px;
background: linear-gradient(180deg, #6eddfa 0%, #ac74f1 100%);
box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.25);
font-size: 18px;
color: #fff;
border-radius: 5px;
padding: 0;
`
export default function StepCom() { export default function StepCom() {
const [valNumber, setInputState] = useState(1) const [valNumber, setInputState] = useState(1)
@ -16,11 +39,13 @@ export default function StepCom() {
return ( return (
<Flex justifyContent="space-between" alignItems="center" width={120}> <Flex justifyContent="space-between" alignItems="center" width={120}>
<Image src="/images/nft/sub-icon.png" alt="" onClick={() => onAdd('sub')} width={25} height={25} /> {/* <Image src="/images/nft/sub-icon.png" alt="" onClick={() => onAdd('sub')} width={25} height={25} /> */}
<SubButton onClick={() => onAdd('sub')}>-</SubButton>
<Text width={60} textAlign="center" color="#2F3748" fontSize="16px"> <Text width={60} textAlign="center" color="#2F3748" fontSize="16px">
{valNumber} {valNumber}
</Text> </Text>
<Image src="/images/nft/add-icon.png" alt="1" onClick={() => onAdd('add')} width={25} height={25} /> <AddButton onClick={() => onAdd('add')}>+</AddButton>
{/* <Image src="/images/nft/add-icon.png" alt="1" onClick={() => onAdd('add')} width={25} height={25} /> */}
</Flex> </Flex>
) )
} }

View File

@ -46,12 +46,29 @@ const StyledPage = styled.div`
` `
const BodyWrapper = styled(Card)` const BodyWrapper = styled(Card)`
padding-bottom: 20px;
border-radius: 24px; border-radius: 24px;
max-width: 500px; /* width: 60%; */
width: 100%; width: 500px;
overflow: visible; overflow: visible;
position: relative; position: relative;
` `
const TextKey = styled(Text)`
font-size: 26px;
color: #999999;
`
const TextVal = styled(Text)`
font-size: 26px;
color: #1fc7d4;
margin-left: 10px;
`
const FlexTime = styled(Flex)`
position: absolute;
width: 100%;
top: 20px;
justify-content: center;
`
const HindDiv = styled.div` const HindDiv = styled.div`
width: 32px; width: 32px;
@ -77,10 +94,12 @@ const Divs = styled.div`
min-height: calc(100vh - 104px); min-height: calc(100vh - 104px);
background: ${({ theme }) => theme.colors.gradients.bubblegum}; background: ${({ theme }) => theme.colors.gradients.bubblegum};
` `
const DetailDiv = styled.div`
margin-top: -100px;
`
const DetailInfo = styled(Flex)` const DetailInfo = styled(Flex)`
padding: 0 21px; padding: 0 21px;
margin-top: 24px; margin-top: 15px;
` `
const SwiperDiv = styled(Swiper)` const SwiperDiv = styled(Swiper)`
@ -105,7 +124,31 @@ const SwiperDiv = styled(Swiper)`
const Nft: React.FC = () => { const Nft: React.FC = () => {
const [blindboxList] = useState([{ id: 1 }, { id: 2 }, { id: 3 }]) const [blindboxList] = useState([{ id: 1 }, { id: 2 }, { id: 3 }])
const [hour, setHour] = useState('0')
const [minute, setMinute] = useState('0')
const [second, setSecond] = useState('0')
const countFun = (time) => {
// const timer: any = null
// let sys_second = new Date(time).getTime() - new Date().getTime()
// timer = setInterval(() => {
// // 防止倒计时出现负数
// if (sys_second > 1000) {
// sys_second -= 1000
// // let day = Math.floor(sys_second / 1000 / 3600 / 24)
// setHour(Math.floor((sys_second / 1000 / 3600) % 24))
// setMinute(Math.floor((sys_second / 1000 / 60) % 60))
// setSecond(Math.floor((sys_second / 1000) % 60))
// // this.setState({
// // day: day,
// // hour: hour < 10 ? '0' + hour : hour,
// // minute: minute < 10 ? '0' + minute : minute,
// // second: second < 10 ? '0' + second : second,
// // })
// } else {
// clearInterval(timer)
// }
// }, 1000)
}
return ( return (
<MainDiv> <MainDiv>
<SwiperDiv <SwiperDiv
@ -121,29 +164,34 @@ const Nft: React.FC = () => {
<StyledPage> <StyledPage>
<Divs> <Divs>
<BodyWrapper> <BodyWrapper>
<HindDiv> {/* <Flex justifyContent="center" marginTop="-40px">
<Image src="/images/nft/hint.png" alt="" width={32} height={32} />
</HindDiv>
<Flex justifyContent="center" marginTop="-40px">
<BlindboxImage src="/images/nft/blindbox.png" alt="" width={377} height={367} /> <BlindboxImage src="/images/nft/blindbox.png" alt="" width={377} height={367} />
</Flex> </Flex> */}
<DetailInfo justifyContent="space-between" alignItems="center"> <FlexTime>
<Text color="textSubtle"></Text> <TextKey></TextKey>
<Text color="text"></Text> <TextVal>7</TextVal>
</DetailInfo> </FlexTime>
<DetailInfo justifyContent="space-between" alignItems="center"> <Image src="/images/nft/blindbox.svg" width={500} height={460} />
<Text color="textSubtle"></Text> <DetailDiv>
<Flex alignItems="center" justifyContent="flex-end"> <DetailInfo justifyContent="space-between" alignItems="center">
<Text color="#1FC7D4" fontSize="24px"> <Text color="textSubtle"></Text>
500 <Text color="text"></Text>
</Text> </DetailInfo>
<Text color="text"></Text> <DetailInfo justifyContent="space-between" alignItems="center">
</Flex> <Text color="textSubtle"></Text>
</DetailInfo> <Flex alignItems="center" justifyContent="flex-end">
<DetailInfo justifyContent="space-between" alignItems="center"> <Text color="#1FC7D4" fontSize="24px">
<Text color="textSubtle"></Text> 500
<StepCom /> </Text>
</DetailInfo> <Text color="text"></Text>
</Flex>
</DetailInfo>
<DetailInfo justifyContent="space-between" alignItems="center">
<Text color="textSubtle"></Text>
<StepCom />
</DetailInfo>
</DetailDiv>
<FlexText name="钱包中的 BUTTER" value="0" /> <FlexText name="钱包中的 BUTTER" value="0" />
<FlexText name="回收点数抵扣" value="0" /> <FlexText name="回收点数抵扣" value="0" />
<FlexText name="实际黄油成本" value="0" /> <FlexText name="实际黄油成本" value="0" />