diff --git a/src/App.tsx b/src/App.tsx index f259898..56fa646 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -8,6 +8,8 @@ import { usePollCoreFarmData, useFetchProfile, usePollBlockNumber } from 'state/ import { DatePickerPortal } from 'components/DatePicker' import { initAxios } from 'utils/request' import useToast from 'hooks/useToast' +import { fetchUserInfo } from 'state/actions' +import { useAccount } from 'state/userInfo/hooks' import GlobalStyle from './style/Global' import Menu from './components/Menu' import SuspenseWithChunkError from './components/SuspenseWithChunkError' @@ -64,10 +66,14 @@ const App: React.FC = () => { usePollCoreFarmData() const dispatch = useDispatch() const toast = useToast() + const account = useAccount() useEffect(() => { initAxios(dispatch, toast) - }) + }, []) + useEffect(() => { + account && dispatch(fetchUserInfo()) + }, [account]) return ( diff --git a/src/components/Menu/index.tsx b/src/components/Menu/index.tsx index 8a04874..c6507e2 100644 --- a/src/components/Menu/index.tsx +++ b/src/components/Menu/index.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react' +import React, { useEffect, useState, useMemo } from 'react' import { Menu as UikitMenu, ConnectorNames } from '@pancakeswap/uikit' import { useWeb3React } from '@web3-react/core' import { languageList } from 'config/localization/languages' @@ -7,7 +7,7 @@ import useTheme from 'hooks/useTheme' import useAuth from 'hooks/useAuth' import { useDispatch } from 'react-redux' import { usePriceCakeBusd, useProfile } from 'state/hooks' -import { useUnactiveAccount, useSignLogin, useAccount } from 'state/userInfo/hooks' +import { useUnactiveAccount, useSignLogin, useAccount, useUserInfo } from 'state/userInfo/hooks' import useWeb3Provider from 'hooks/useActiveWeb3React' import { clearUserInfo } from 'state/actions' import config from './config' @@ -22,7 +22,11 @@ const Menu = (props) => { const unActiveAccount = useUnactiveAccount() const dispatch = useDispatch() const { profile } = useProfile() + const userInfo = useUserInfo() const { currentLanguage, setLanguage, t } = useTranslation() + const inviteUrl = useMemo(() => { + return userInfo?.inviteCode ? `${window.location.origin}?inviteCode=${userInfo.inviteCode}` : window.location.origin + }, [userInfo]) const sign = useSignLogin() const handleLogin = async (connectorID: ConnectorNames) => { await login(connectorID) @@ -43,6 +47,7 @@ const Menu = (props) => { { // eslint-disable-next-line prefer-const let [tokenBalance, tokenDecimals] = await multicall(erc20, calls) tokenBalance = new BigNumber(tokenBalance).div(new BigNumber(10).pow(tokenDecimals)) - // eslint-disable-next-line prefer-const - let [minStakeAmount, lockTime] = await multicall(boardConfig.abi, [ - // 最低质押额度 - { - address: BoardChefAddress, - name: 'minStakeAmount', - }, - // 最低质押额度 - { - address: BoardChefAddress, - name: 'lockTime', - }, - ]) - lockTime = new BigNumber(lockTime).toJSON() - console.log(lockTime) - minStakeAmount = new BigNumber(minStakeAmount).div(new BigNumber(10).pow(tokenDecimals)).toJSON() + let minStakeAmount = 0 + let lockTime = 0 + if (boardConfig.pid === 1) { + // prettier-ignore + [minStakeAmount, lockTime] = await multicall(boardConfig.abi, [ + // 最低质押额度 + { + address: BoardChefAddress, + name: 'minStakeAmount', + }, + // 最低质押额度 + { + address: BoardChefAddress, + name: 'lockTime', + }, + ]) + } else { + // prettier-ignore + [minStakeAmount] = await multicall(boardConfig.abi, [ + // 最低质押额度 + { + address: BoardChefAddress, + name: 'minStakeAmount', + }, + ]) + lockTime = 0 + } + + lockTime = new BigNumber(lockTime).toNumber() + minStakeAmount = new BigNumber(minStakeAmount).div(new BigNumber(10).pow(tokenDecimals)).toNumber() return { ...boardConfig, tokenBalance: tokenBalance.toJSON(), diff --git a/src/state/boards/fetchBoardsUser.ts b/src/state/boards/fetchBoardsUser.ts index 932251c..d7a039b 100644 --- a/src/state/boards/fetchBoardsUser.ts +++ b/src/state/boards/fetchBoardsUser.ts @@ -52,10 +52,11 @@ export const fetchBoardUserInfo = async (account: string) => { params: [account], }, ] - const [userInfo, estimatedProfit] = await multicall(boardABI, calls) + const [userInfo, estimatedProfit] = await multicall(board.abi, calls) + console.log(estimatedProfit) return { stakedBalance: new BigNumber(userInfo.amount._hex).toJSON(), - unLockTime: new BigNumber(userInfo.unLockTime._hex).toNumber(), + unLockTime: userInfo.unLockTime ? new BigNumber(userInfo.unLockTime._hex).toNumber() : 0, estimatedProfit: new BigNumber(estimatedProfit).toJSON(), } }), diff --git a/src/state/types.ts b/src/state/types.ts index 5127c32..b1c4ecb 100644 --- a/src/state/types.ts +++ b/src/state/types.ts @@ -477,19 +477,9 @@ export type UserTicketsResponse = [ethers.BigNumber[], number[], boolean[]] export interface UserInfo { id?: number - avatar?: string + inviteCode?: string name?: string address?: string - description?: string - invite_num?: string - invite_link?: string - email?: string - twitter?: string - facebook?: string - invite_code?: string - scoring_account?: number - invite_reward?: number - inviter_address?: string } export interface UserInfoState { userInfo: UserInfo @@ -509,12 +499,12 @@ export interface ReferralState { data: Referral } export interface Boards extends BoardConfig { - tokenAmount?: BigNumber + tokenAmount?: number minStakeAmount?: number userData?: { - allowance: BigNumber - tokenBalance: BigNumber - stakedBalance: BigNumber + allowance: number + tokenBalance: number + stakedBalance: number unlockTime: number estimatedProfit: number } diff --git a/src/state/userInfo/hooks.ts b/src/state/userInfo/hooks.ts index 8cd7fbb..6c9b8e3 100644 --- a/src/state/userInfo/hooks.ts +++ b/src/state/userInfo/hooks.ts @@ -30,10 +30,6 @@ export const useUserInfo = () => { return useSelector((state: State) => state.userInfo.userInfo) } -export const useUserPortrait = () => { - const userInfo = useSelector((state: State) => state.userInfo.userInfo) - return userInfo?.avatar || '/images/common/portrait.png' -} // 签名登录 export const useSignLogin = () => { const unActiveAccount = useUnactiveAccount() diff --git a/src/utils/calls/boards.ts b/src/utils/calls/boards.ts index 6f67bdc..db16f3b 100644 --- a/src/utils/calls/boards.ts +++ b/src/utils/calls/boards.ts @@ -7,15 +7,13 @@ const options = { export const stakeBoard = async (masterChefContract, pid, amount) => { const value = new BigNumber(amount).times(DEFAULT_TOKEN_DECIMAL).toString() - - const tx = await masterChefContract.deposit(pid, value, options) + const tx = await masterChefContract.deposit(value, options) const receipt = await tx.wait() return receipt.status } -export const unstakeBoard = async (masterChefContract, pid, amount) => { - const value = new BigNumber(amount).times(DEFAULT_TOKEN_DECIMAL).toString() - const tx = await masterChefContract.withdrawHCC(pid, value, options) +export const unstakeBoard = async (masterChefContract) => { + const tx = await masterChefContract.withdrawHCC(options) const receipt = await tx.wait() return receipt.status } diff --git a/src/utils/formatBalance.ts b/src/utils/formatBalance.ts index b716356..9b8f5d3 100644 --- a/src/utils/formatBalance.ts +++ b/src/utils/formatBalance.ts @@ -10,14 +10,14 @@ export const getDecimalAmount = (amount: BigNumber, decimals = 18) => { return new BigNumber(amount).times(BIG_TEN.pow(decimals)) } -export const getBalanceAmount = (amount: BigNumber, decimals = 18) => { +export const getBalanceAmount = (amount: BigNumber | number, decimals = 18) => { return new BigNumber(amount).dividedBy(BIG_TEN.pow(decimals)) } /** * This function is not really necessary but is used throughout the site. */ -export const getBalanceNumber = (balance: BigNumber, decimals = 18, decimalPlaces?: number) => { +export const getBalanceNumber = (balance: BigNumber | number, decimals = 18, decimalPlaces?: number) => { const displayBalance = getBalanceAmount(balance, decimals) return decimalPlaces ? displayBalance.decimalPlaces(decimalPlaces).toNumber() : displayBalance.toNumber() } diff --git a/src/utils/request.ts b/src/utils/request.ts index de73336..5e2c0fd 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -14,7 +14,7 @@ export const initAxios = (dispatch: Dispatch, toast) => { hasInit = true request.interceptors.request.use( (memo: any) => { - memo.headers.token = localStorage.getItem(CACHE_TOKEN) + memo.headers.Authorization = `Bearer ${localStorage.getItem(CACHE_TOKEN)} ` return memo }, (error) => { diff --git a/src/views/Board/components/BoardCard/CardActionsContainer.tsx b/src/views/Board/components/BoardCard/CardActionsContainer.tsx index f81bc7d..8a9de5f 100644 --- a/src/views/Board/components/BoardCard/CardActionsContainer.tsx +++ b/src/views/Board/components/BoardCard/CardActionsContainer.tsx @@ -47,6 +47,14 @@ const CardActions: React.FC = ({ board, account }) => { const renderApprovalOrStakeButton = () => { return isApproved ? ( <> + + + {board.tokenSymbol} + + + {t('Staked')} + + @@ -66,19 +74,7 @@ const CardActions: React.FC = ({ board, account }) => { ) } - return ( - - - - {board.tokenSymbol} - - - {t('Staked')} - - - {!account ? : renderApprovalOrStakeButton()} - - ) + return {!account ? : renderApprovalOrStakeButton()} } export default CardActions diff --git a/src/views/Board/components/BoardCard/StakeAction.tsx b/src/views/Board/components/BoardCard/StakeAction.tsx index 82f1e6a..ecd15a5 100644 --- a/src/views/Board/components/BoardCard/StakeAction.tsx +++ b/src/views/Board/components/BoardCard/StakeAction.tsx @@ -53,21 +53,24 @@ const StakeAction: React.FC = ({ stakedBalance, tokenBalan const unlockTime = userData.unlockTime * 1000 if (unlockTime > new Date().getTime()) { toastWarning(t('Unlock time %unlockTime%', { unlockTime: dayjs(unlockTime).format('YYYY-MM-DD HH:mm') })) - // return + return } - // onUnstake() + onUnstake() } const renderStakingButtons = () => { return rawStakedBalance === 0 ? ( ) : ( - - - - - - + {userData.stakedBalance > 0 ? ( + + + + ) : ( + + + + )} ) } diff --git a/src/views/Board/hooks/useUnstakeBoard.ts b/src/views/Board/hooks/useUnstakeBoard.ts index bdcd099..dcb211a 100644 --- a/src/views/Board/hooks/useUnstakeBoard.ts +++ b/src/views/Board/hooks/useUnstakeBoard.ts @@ -5,12 +5,9 @@ import { useBoardchef } from 'hooks/useContract' const useUnstakeBoard = (pid: number) => { const boardChefContract = useBoardchef(pid) - const handleUnstake = useCallback( - async (amount: string) => { - await unstakeBoard(boardChefContract, pid, amount) - }, - [boardChefContract, pid], - ) + const handleUnstake = useCallback(async () => { + await unstakeBoard(boardChefContract) + }, [boardChefContract, pid]) return { onUnstake: handleUnstake } } diff --git a/src/views/Board/index.tsx b/src/views/Board/index.tsx index 126e07b..aa45de6 100644 --- a/src/views/Board/index.tsx +++ b/src/views/Board/index.tsx @@ -27,7 +27,7 @@ const Header = styled.div` const SecondText = styled(Text)` white-space: break-spaces; ` -const Farms: React.FC = () => { +const Boards: React.FC = () => { const { t } = useTranslation() const boardsList = useBoards() const [query, setQuery] = useState('') @@ -42,16 +42,11 @@ const Farms: React.FC = () => { } }, [account, dispatch, fastRefresh]) - const farmsList = useMemo(() => { - return boardsList.map((board) => { - return board - }) - }, [boardsList]) const renderContent = (): JSX.Element => { return (
- {farmsList.map((board) => ( + {boardsList.map((board) => ( ))} @@ -76,4 +71,4 @@ const Farms: React.FC = () => { ) } -export default Farms +export default Boards diff --git a/src/views/Home/HomeIndex.tsx b/src/views/Home/HomeIndex.tsx index 1b276d5..a49a164 100644 --- a/src/views/Home/HomeIndex.tsx +++ b/src/views/Home/HomeIndex.tsx @@ -1,11 +1,19 @@ -import React from 'react' +import React, { useEffect } from 'react' import { useTranslation } from 'contexts/Localization' +import { CACHE_INVITE_CODE } from 'config/constants/cacheKey' +import useParsedQueryString from 'hooks/useParsedQueryString' import FristCom from './components/FristCom' import IntroduceCom from './components/IntroduceCom' import CourseCom from './components/CourseCom' const Home: React.FC = () => { const { t } = useTranslation() + const { inviteCode } = useParsedQueryString() + useEffect(() => { + if (inviteCode) { + sessionStorage.setItem(CACHE_INVITE_CODE, inviteCode as string) + } + }, []) return ( <>