From a6e798ba6f96cbf0188acf9920c32865dc31ff4e Mon Sep 17 00:00:00 2001 From: leo Date: Fri, 19 Jul 2024 21:36:43 +0800 Subject: [PATCH 01/11] add roulette spin --- public/img/s2/icon-spin-gradient.svg | 10 ++++++++++ src/components/DashboardS2/Tabs/EcoDApps.tsx | 14 ++++++++++++++ vite.config.ts | 4 ++-- 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 public/img/s2/icon-spin-gradient.svg diff --git a/public/img/s2/icon-spin-gradient.svg b/public/img/s2/icon-spin-gradient.svg new file mode 100644 index 00000000..e2530f35 --- /dev/null +++ b/public/img/s2/icon-spin-gradient.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/components/DashboardS2/Tabs/EcoDApps.tsx b/src/components/DashboardS2/Tabs/EcoDApps.tsx index 721f10bd..831c5d58 100644 --- a/src/components/DashboardS2/Tabs/EcoDApps.tsx +++ b/src/components/DashboardS2/Tabs/EcoDApps.tsx @@ -965,7 +965,20 @@ export default function EcoDApps({
+
+
+ + Spin +
+
+
{/* Action: */}
@@ -1057,6 +1070,7 @@ export default function EcoDApps({
Points Booster
Rewards
Allocated Points
+
Roulette
diff --git a/vite.config.ts b/vite.config.ts index 80419bc0..9bc30499 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -47,8 +47,8 @@ export default defineConfig({ port: 3001, proxy: { "/app-api": { - // target: "https://goerli.app.zklink.io", - target: "https://app-api.zklink.io", + target: "https://goerli.app.zklink.io", + // target: "https://app-api.zklink.io", changeOrigin: true, rewrite: (path) => path.replace(/^\/app-api/, ""), }, From c1e468271b6402725b73bbd26505fe2ad4f15e6d Mon Sep 17 00:00:00 2001 From: leo Date: Wed, 31 Jul 2024 14:48:40 +0800 Subject: [PATCH 02/11] add protocol spin --- src/api/index.ts | 136 +++--- .../DailyRoulette/DailyDrawModal.tsx | 2 +- src/components/DashboardS2/Tabs/EcoDApps.tsx | 420 +++++++++++------- 3 files changed, 337 insertions(+), 221 deletions(-) diff --git a/src/api/index.ts b/src/api/index.ts index c83f4aef..d29ed840 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -3,15 +3,6 @@ import { user } from "@nextui-org/react"; import axios, { AxiosResponse } from "axios"; import qs from "qs"; -type Response = { - status: string; - message: string; - result?: any; - error?: any; - data?: any; - statusCode?: number; -}; - const isProd = import.meta.env.PROD; const apiBaseURL = import.meta.env.VITE_API_BASE_URL; @@ -23,6 +14,15 @@ export const BASE_URL_TWITTER = `${BASE_URL}/twitter`; export const BASE_URL_LRT_POINTS = `${BASE_URL}/lrt-points`; export const BASE_URL_QUEST = `${BASE_URL}/quest-api`; +export interface APIResponse { + status: string; + message: string; + result?: T; + error?: any; + data?: T; + statusCode?: number; +} + export type BindInviteCodeWithAddressParams = { address: string; code?: string | null; @@ -31,7 +31,7 @@ export type BindInviteCodeWithAddressParams = { }; export const bindInviteCodeWithAddress = ( data: BindInviteCodeWithAddressParams -): Promise => { +): Promise => { console.log(data); if (!data.code) { delete data.code; @@ -41,7 +41,7 @@ export const bindInviteCodeWithAddress = ( }); }; -export const checkInviteCode = (code: string): Promise => { +export const checkInviteCode = (code: string): Promise => { return http.get(`${BASE_URL_API}/invite/validCode`, { params: { code, @@ -49,13 +49,13 @@ export const checkInviteCode = (code: string): Promise => { }); }; -export const getRemainDrawCount = (address: string): Promise => { +export const getRemainDrawCount = (address: string): Promise => { return http.get(`${BASE_URL_API}/invite/draw/nft/remain`, { params: { address }, }); }; -export const drawTrademarkNFT = (address: string): Promise => { +export const drawTrademarkNFT = (address: string): Promise => { return http.post(`${BASE_URL_API}/invite/draw/nft`, { address, }); @@ -63,7 +63,7 @@ export const drawTrademarkNFT = (address: string): Promise => { export const getRemainMysteryboxDrawCount = ( address: string -): Promise => { +): Promise => { return http.get(`${BASE_URL_API}/invite/draw/mysterybox/remain`, { params: { address }, }); @@ -71,32 +71,32 @@ export const getRemainMysteryboxDrawCount = ( export const getRemainMysteryboxDrawCountV2 = ( address: string -): Promise => { +): Promise => { return http.get(`${BASE_URL_API}/invite/draw/mysterybox/v2/remain`, { params: { address }, }); }; // for mint box params -export const mintMysteryboxNFT = (address: string): Promise => { +export const mintMysteryboxNFT = (address: string): Promise => { return http.post(`${BASE_URL_API}/invite/mint/mysterybox`, { address, }); }; -export const mintMysteryboxNFTV2 = (address: string): Promise => { +export const mintMysteryboxNFTV2 = (address: string): Promise => { return http.post(`${BASE_URL_API}/invite/mint/mysterybox/v2`, { address, }); }; -export const openMysteryboxNFT = (address: string): Promise => { +export const openMysteryboxNFT = (address: string): Promise => { return http.post(`${BASE_URL_API}/invite/open/mysterybox`, { address, }); }; -export const openMysteryboxNFTV2 = (address: string): Promise => { +export const openMysteryboxNFTV2 = (address: string): Promise => { return http.post(`${BASE_URL_API}/invite/open/mysterybox/v2`, { address, }); @@ -104,7 +104,7 @@ export const openMysteryboxNFTV2 = (address: string): Promise => { export const getRemainMysteryboxOpenableCount = ( address: string -): Promise => { +): Promise => { return http.get(`${BASE_URL_API}/invite/open/mysterybox/remain`, { params: { address }, }); @@ -112,64 +112,64 @@ export const getRemainMysteryboxOpenableCount = ( export const getRemainMysteryboxOpenableCountV2 = ( address: string -): Promise => { +): Promise => { return http.get(`${BASE_URL_API}/invite/open/mysterybox/v2/remain`, { params: { address }, }); }; -export const getMintSignature = (address: string): Promise => { +export const getMintSignature = (address: string): Promise => { return http.get(`${BASE_URL_API}/invite/validate/nft`, { params: { address, projectId: "NOVA-SBT-1" }, }); }; -export const getInvite = (address: string): Promise => +export const getInvite = (address: string): Promise => http.get(`${BASE_URL_API}/invite/${address}`); -export const getReferrer = (address: string): Promise => +export const getReferrer = (address: string): Promise => http.get(`${BASE_URL_API}/referrer/${address}`); export const getDepositETHThreshold = (): Promise<{ ethAmount: number }> => http.get(`${BASE_URL_POINTS}/addressTokenTvl/getDepositEthThreshold`); -export const getAccounTvl = (address: string): Promise => +export const getAccounTvl = (address: string): Promise => http.get(`${BASE_URL_POINTS}/addressTokenTvl/getAccounTvl`, { params: { address }, }); -export const getAccountPoint = (address: string): Promise => +export const getAccountPoint = (address: string): Promise => http.get(`${BASE_URL_POINTS}/addressTokenTvl/getAccountPoint`, { params: { address }, }); -export const getTotalTvl = (): Promise => +export const getTotalTvl = (): Promise => http.get(`${BASE_URL_POINTS}/addressTokenTvl/getTotalTvl`); -export const getActiveAccounts = (): Promise => +export const getActiveAccounts = (): Promise => http.get(`${BASE_URL_API}/invite/getActiveAccounts`); -export const getAccountTvl = (address: string): Promise => +export const getAccountTvl = (address: string): Promise => http.get(`${BASE_URL_POINTS}/addressTokenTvl/getAccounTvl`, { params: { address, }, }); -export const getGroupTvl = (address: string): Promise => +export const getGroupTvl = (address: string): Promise => http.get(`${BASE_URL_POINTS}/addressTokenTvl/getGroupTvl`, { params: { address, }, }); -export const getTotalTvlByToken = (): Promise => +export const getTotalTvlByToken = (): Promise => http.get(`${BASE_URL_POINTS}/addressTokenTvl/getTotalTvlByToken`); -export const getReferralTvl = (address: string): Promise => +export const getReferralTvl = (address: string): Promise => http.get(`${BASE_URL_POINTS}/addressTokenTvl/getReferralTvl`, { params: { address }, }); -export const getAccountTwitter = (params: any): Promise => +export const getAccountTwitter = (params: any): Promise => http.post(`${BASE_URL_API}/invite/account/twitter`, params); export type SupportToken = { @@ -202,7 +202,7 @@ export const getAccountRefferalsTVL = ( address: string, page = 1, limit = 100 -): Promise => +): Promise => http.get(`${BASE_URL_POINTS}/addressTokenTvl/getAccountRefferalsTVL`, { params: { address, page, limit }, }); @@ -219,12 +219,12 @@ export type PageParams = { limit: number; }; -export const getAccountsRank = (params?: PageParams): Promise => +export const getAccountsRank = (params?: PageParams): Promise => http.get(`${BASE_URL_POINTS}/addressTokenTvl/getAccountsRank`, { params, }); -export const getAccountRank = (address: string): Promise => +export const getAccountRank = (address: string): Promise => http.get(`${BASE_URL_POINTS}/addressTokenTvl/getAccountRank`, { params: { address }, }); @@ -258,7 +258,7 @@ export const getExplorerTokenTvl = ( export const validTwitter = ( twitterHandler: string, address?: string -): Promise => { +): Promise => { return http.get(`${BASE_URL_API}/invite/validTwitter2`, { params: { twitterHandler, @@ -292,7 +292,7 @@ export type RegisterAccountParams = { export const registerAccount = ( data: RegisterAccountParams -): Promise => { +): Promise => { console.log(data); if (!data.code) { delete data.code; @@ -306,7 +306,7 @@ export const registerAccountByBridge = (data: { address: string; code: string; siganture: string; -}): Promise => +}): Promise => http.post(`${BASE_URL_API}/invite/register/account/byBridge`, { ...data }); export type AccessTokenParams = { @@ -346,17 +346,17 @@ export const getTwitterUser = ( }, }); -export const checkOkx = (address: string): Promise => +export const checkOkx = (address: string): Promise => http.get(`${BASE_URL_API}/invite/check/okx`, { params: { addressList: [address] }, }); -export const visitReward = (address: string): Promise => +export const visitReward = (address: string): Promise => http.get(`${BASE_URL_API}/invite/visit/reward`, { params: { address }, }); -export const okxVisitTask = (address: string): Promise => +export const okxVisitTask = (address: string): Promise => http.get(`${BASE_URL_API}/task/okx/visit/task`, { params: { address } }); export const getEigenlayerPoints = (address: string) => @@ -411,12 +411,12 @@ export const getRenzoPoints = (address: string): Promise => params: { address }, }); -export const getTradeMarkRank = (address: string): Promise => +export const getTradeMarkRank = (address: string): Promise => http.get(`${BASE_URL_API}/referrer/tradeMark/balance/rank`, { params: { address }, }); -export const getTopInviteAndRandom = (date?: string): Promise => +export const getTopInviteAndRandom = (date?: string): Promise => http.get(`${BASE_URL_API}/referrer/daily/topInviteAndRandom`, { params: { date }, }); @@ -469,15 +469,15 @@ export const getLinkswapNovaPoints = ( params: { address }, }); -export const getRoyaltyBooster = (address: string): Promise => +export const getRoyaltyBooster = (address: string): Promise => http.get(`${BASE_URL_POINTS}/addressTokenTvl/getAccountLoyaltyBooster`, { params: { address }, }); -export const getNFTLashin = (address: string): Promise => +export const getNFTLashin = (address: string): Promise => http.get(`${BASE_URL_API}/nft/user/recruitment`, { params: { address } }); -export const postNFTLashin = (address: string): Promise => +export const postNFTLashin = (address: string): Promise => http.post(`${BASE_URL_API}/nft/user/recruitment?address=${address}`); export interface RsethPointsResponse { @@ -504,7 +504,7 @@ export const getRsethPoints = (address: string): Promise => params: { address }, }); -export const getUserTvl = (address: string): Promise => +export const getUserTvl = (address: string): Promise => http.get(`${BASE_URL_API}/invite/user/tvl`, { params: { address }, }); @@ -512,7 +512,7 @@ export const getUserTvl = (address: string): Promise => export const bindTwitter = ( address: string, accessToken: string -): Promise => { +): Promise => { return http.post(`${BASE_URL_API}/invite/bind/twitter`, { address, accessToken, @@ -535,7 +535,7 @@ export const getNovaProjectPoints = ( params: { address, project }, }); -export const checkBridge = async (address: string): Promise => +export const checkBridge = async (address: string): Promise => http.get(`${BASE_URL_API}/invite/check/bridge`, { params: { address } }); export interface BridgePoints { @@ -548,23 +548,25 @@ export const getBridgePoints = (name: string): Promise => params: { name }, }); -export const checkWinnerAddress = (address: string): Promise => +export const checkWinnerAddress = (address: string): Promise => http.get(`${BASE_URL_API}/referrer/checkWinnerAddress`, { params: { address }, }); -export const getEcoRamain = (address: string): Promise => +export const getEcoRamain = (address: string): Promise => http.get(`${BASE_URL_API}/nft/ecology/nft/remain`, { params: { address }, }); -export const getEcoRank = (): Promise => +export const getEcoRank = (): Promise => http.get(`${BASE_URL_API}/nft/ecology/rank`); -export const postEcoDraw = (address: string): Promise => +export const postEcoDraw = (address: string): Promise => http.post(`${BASE_URL_API}/nft/ecology/nft/draw?address=${address}`); -export const getMemeMysteryboxReward = (address: string): Promise => +export const getMemeMysteryboxReward = ( + address: string +): Promise => http.get(`${BASE_URL_API}/meme/meme/mysterybox/reward`, { params: { address }, }); @@ -572,18 +574,18 @@ export const getMemeMysteryboxReward = (address: string): Promise => export const authLogin = (data: { address: string; signature: string; -}): Promise => +}): Promise => http.post(`${BASE_URL_API}/auth/login`, { ...data, }); -export const getPointsDetail = (): Promise => +export const getPointsDetail = (): Promise => http.get(`${BASE_URL_API}/referrer/points/detail`); -export const getMystery3Reamin = (address: string): Promise => +export const getMystery3Reamin = (address: string): Promise => http.get(`${BASE_URL_API}/nft/mystery3/remain`, { params: { address } }); -export const drawMystery3 = (address: string): Promise => +export const drawMystery3 = (address: string): Promise => http.post(`${BASE_URL_API}/nft/mystery3/draw?address=${address}`); export interface NovaCategoryUserPoints { @@ -698,7 +700,7 @@ export const getTvlCategoryMilestone = (): Promise => http.get(`${BASE_URL_LRT_POINTS}/tvl/category/milestone`); -export const modifyUsername = (userName: string): Promise => +export const modifyUsername = (userName: string): Promise => http.post(`${BASE_URL_API}/invite/modify/username`, { userName }); export interface CategoryListItem { @@ -735,7 +737,7 @@ export const getCategoryList = ( } ); -export const dailyOpen = (): Promise => +export const dailyOpen = (): Promise => http.post(`${BASE_URL_API}/invite/checkin/open`); export interface DailyCheckinHistoryData { @@ -819,3 +821,15 @@ interface CategoryZKLResponse { export const getCategoryZKL = (): Promise => { return http.get(`${BASE_URL_LRT_POINTS}/tvl/category/milestone/s2-1`); }; + +export interface PortocolSpinItem { + project: string; + pairAddress: string; + remainSpinNum: number; +} + +export const getProtocolSpin = (): Promise> => + http.get(`${BASE_URL_API}/invite/protocol/spin`); + +export const openProtocolSpin = (): Promise => + http.post(`${BASE_URL_API}/invite/protocol/open`); diff --git a/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx b/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx index 87ff8c1c..5e1d418b 100644 --- a/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx +++ b/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx @@ -130,7 +130,7 @@ const DailyDrawModal: React.FC = (props: IProps) => { setMintStatus(MintStatus.Success); mintResultModal.onOpen(); onDrawed(); // update remain times after mint tx - } catch (e) { + } catch (e: any) { console.log(e); setMintStatus(MintStatus.Failed); if (e.message) { diff --git a/src/components/DashboardS2/Tabs/EcoDApps.tsx b/src/components/DashboardS2/Tabs/EcoDApps.tsx index c6b0eb9c..44547a36 100644 --- a/src/components/DashboardS2/Tabs/EcoDApps.tsx +++ b/src/components/DashboardS2/Tabs/EcoDApps.tsx @@ -2,8 +2,10 @@ import { NovaCategoryPoints, NovaCategoryUserPoints, NovaProjectTotalPoints, + PortocolSpinItem, TvlCategoryMilestone, getNovaProjectTotalPoints, + getProtocolSpin, } from "@/api"; import useNovaPoints from "@/hooks/useNovaPoints"; import { formatNumberWithUnit } from "@/utils"; @@ -20,6 +22,7 @@ import { ReactNode, useCallback, useEffect, useMemo, useState } from "react"; import styled from "styled-components"; import { NovaPointsListItem } from "@/pages/DashboardS2/index2"; import SectorHeader from "./SectorHeader"; +import DailyDrawModal from "../DailyRoulette/DailyDrawModal"; const Container = styled.div` .holding-title { @@ -241,6 +244,8 @@ interface EcoDAppItem { iconURL: string; }[]; holdingPoints: NovaProjectTotalPoints; + remainSpinNum: number; + pairAddress: string; totalPoints?: NovaProjectTotalPoints; details: { booster: string | ReactNode; @@ -255,9 +260,11 @@ interface EcoDAppItem { const EcoDApp = (props: { data: EcoDAppItem; handleLink: (link: string) => void; + onDrawed: () => void; }) => { - const { data, handleLink } = props; + const { data, handleLink, onDrawed } = props; const [isOpen, setIsOpen] = useState(false); + const modal = useDisclosure(); const allocatedTooltips = useMemo(() => { const protocolPoints = [ @@ -288,113 +295,134 @@ const EcoDApp = (props: { }; }, [data]); - return ( -
-
-
- -
-
{ - handleLink(data.link); - }} - > - {data.name} - -
-
{data.handler}
-
-
-
setIsOpen(!isOpen)} - > -
-
- - {data.rewards} - -
-
+ const handleSpinModal = (e: React.MouseEvent) => { + if (data.remainSpinNum < 1) { + return; + } + e.stopPropagation(); + modal.onOpen(); + }; -
- {data?.rewardsIcon?.map((item, index) => ( - + return ( + <> +
+
+
+ +
+
{ + handleLink(data.link); + }} + > + {data.name} - - ))} +
+
{data.handler}
+
-
+
setIsOpen(!isOpen)} + > +
+
+ + {data.rewards} + +
+
-
- -
- Your Allocated Points -
- {allocatedTooltips.yourPoints.map((item, index) => ( -
- {item.label} - {item.value} -
- ))} +
+ {data?.rewardsIcon?.map((item, index) => ( + + + + ))} +
+
-
- Protocol Allocated Points -
+
+ +
+ Your Allocated Points +
+ {allocatedTooltips.yourPoints.map((item, index) => ( +
+ {item.label} + {item.value} +
+ ))} - {allocatedTooltips.protocolPoints.map((item, index) => ( -
- {item.label} - {item.value} +
+ Protocol Allocated Points
- ))} -
- } - > -
- {formatNumberWithUnit( - data.holdingPoints.ecoPoints + - data.holdingPoints.referralPoints - )} - / - + + {allocatedTooltips.protocolPoints.map((item, index) => ( +
+ {item.label} + {item.value} +
+ ))} +
+ } + > +
{formatNumberWithUnit( - (data.totalPoints?.ecoPoints || 0) + - (data.totalPoints?.referralPoints || 0) + data.holdingPoints.ecoPoints + + data.holdingPoints.referralPoints )} - -
-
-
-
+ / + + {formatNumberWithUnit( + (data.totalPoints?.ecoPoints || 0) + + (data.totalPoints?.referralPoints || 0) + )} + +
+ +
+
- {/*
-
+
+
Spin
-
*/} +
-
- {/* Action: */} -
- How to earn - +
+ {/* Action: */} +
+ How to earn + +
-
- {/*
*/} - {isOpen && ( - - {data.details.map((detail, index) => ( -
-
-
Booster
-
{detail.booster}
-
-
-
Description
-
- {detail.description} + {/*
*/} + {isOpen && ( + + {data.details.map((detail, index) => ( +
+
+
Booster
+
{detail.booster}
+
+
+
Description
+
+ {detail.description} - {detail?.descriptionTooltip && ( - - - - )} + {detail?.descriptionTooltip && ( + + + + )} +
-
-
-
Action
-
-
handleLink(detail.actionLink || data.link)} - > - {detail.action} +
+
Action
+
+
+ handleLink(detail.actionLink || data.link) + } + > + {detail.action} +
+
-
-
- ))} - - )} -
+ ))} +
+ )} +
+ + ); }; @@ -535,6 +577,26 @@ export default function EcoDApps({ referralPoints: data?.refPoints || 0, }; }; + + const [spinList, setSpinList] = useState([]); + + const getSpin = async () => { + const { result } = await getProtocolSpin(); + console.log("getProtocolSpin", result); + if (result) { + setSpinList(result); + } + }; + + const getSpinByProject = (project: string) => { + const data = spinList.find((item) => item.project === project); + return { + project, + remainSpinNum: data?.remainSpinNum || 0, + pairAddress: data?.pairAddress || "", + }; + }; + const ecoDAppsList = useMemo(() => { // const novaswap = geNovaCategoryUserPointsByProject("novaswap"); const izumi = geNovaCategoryUserPointsByProject("izumi"); @@ -567,6 +629,8 @@ export default function EcoDApps({ ], holdingPoints: getHoldingPointsByProject("nowaswap"), totalPoints: getTotalPointsByProject("novaswap"), + remainSpinNum: getSpinByProject("novaswap").remainSpinNum, + pairAddress: getSpinByProject("novaswap").pairAddress, details: [ { booster: ( @@ -595,6 +659,8 @@ export default function EcoDApps({ ], holdingPoints: getHoldingPointsByProject("nowaswap"), totalPoints: getTotalPointsByProject("novaswap"), + remainSpinNum: getSpinByProject("novaswap").remainSpinNum, + pairAddress: getSpinByProject("novaswap").pairAddress, details: [ { booster: ( @@ -631,9 +697,10 @@ export default function EcoDApps({ iconURL: "/img/icon-rewards-layerbank.svg", }, ], - holdingPoints: getHoldingPointsByProject("layerbank"), totalPoints: getTotalPointsByProject("layerbank"), + remainSpinNum: getSpinByProject("layerbank").remainSpinNum, + pairAddress: getSpinByProject("layerbank").pairAddress, details: [ { booster: ( @@ -664,6 +731,8 @@ export default function EcoDApps({ ], holdingPoints: getHoldingPointsByProject("logx"), totalPoints: getTotalPointsByProject("logx"), + remainSpinNum: getSpinByProject("logx").remainSpinNum, + pairAddress: getSpinByProject("logx").pairAddress, details: [ { booster: ( @@ -700,6 +769,8 @@ export default function EcoDApps({ rewards: "Up to 10x", holdingPoints: getHoldingPointsByProject("shoebill"), totalPoints: getTotalPointsByProject("shoebill"), + remainSpinNum: getSpinByProject("shoebill").remainSpinNum, + pairAddress: getSpinByProject("shoebill").pairAddress, details: [ { booster: ( @@ -726,6 +797,8 @@ export default function EcoDApps({ rewards: "Up to 10x", holdingPoints: getHoldingPointsByProject("aqua"), totalPoints: getTotalPointsByProject("aqua"), + remainSpinNum: getSpinByProject("aqua").remainSpinNum, + pairAddress: getSpinByProject("aqua").pairAddress, details: [ { booster: ( @@ -755,6 +828,8 @@ export default function EcoDApps({ rewards: "Up to 10x", holdingPoints: getHoldingPointsByProject("izumi"), totalPoints: getTotalPointsByProject("izumi"), + remainSpinNum: getSpinByProject("izumi").remainSpinNum, + pairAddress: getSpinByProject("izumi").pairAddress, details: [ { booster: ( @@ -787,6 +862,8 @@ export default function EcoDApps({ rewards: "Up to 10x / Trading", holdingPoints: getHoldingPointsByProject("wagmi"), totalPoints: getTotalPointsByProject("wagmi"), + remainSpinNum: getSpinByProject("wagmi").remainSpinNum, + pairAddress: getSpinByProject("wagmi").pairAddress, details: [ { booster: ( @@ -823,6 +900,8 @@ export default function EcoDApps({ rewards: "Up to 10x / Trading", holdingPoints: getHoldingPointsByProject("zkdx"), totalPoints: getTotalPointsByProject("zkdx"), + remainSpinNum: getSpinByProject("zkdx").remainSpinNum, + pairAddress: getSpinByProject("zkdx").pairAddress, details: [ { booster: ( @@ -863,6 +942,8 @@ export default function EcoDApps({ rewards: "Interaction", holdingPoints: getHoldingPointsByProject("allspark"), totalPoints: getTotalPointsByProject("allspark"), + remainSpinNum: getSpinByProject("allspark").remainSpinNum, + pairAddress: getSpinByProject("allspark").pairAddress, details: [ { booster: ( @@ -889,6 +970,8 @@ export default function EcoDApps({ rewards: "Bridge", holdingPoints: getHoldingPointsByProject("rubic"), totalPoints: getTotalPointsByProject("rubic"), + remainSpinNum: getSpinByProject("rubic").remainSpinNum, + pairAddress: getSpinByProject("rubic").pairAddress, details: [ { booster: ( @@ -915,6 +998,8 @@ export default function EcoDApps({ rewards: "Up to 10x", holdingPoints: getHoldingPointsByProject("interport"), totalPoints: getTotalPointsByProject("interport"), + remainSpinNum: getSpinByProject("interport").remainSpinNum, + pairAddress: getSpinByProject("interport").pairAddress, details: [ { booster: ( @@ -941,6 +1026,8 @@ export default function EcoDApps({ rewards: "Bridge", holdingPoints: getHoldingPointsByProject("orbiter"), totalPoints: getTotalPointsByProject("orbiter"), + remainSpinNum: getSpinByProject("orbiter").remainSpinNum, + pairAddress: getSpinByProject("orbiter").pairAddress, details: [ { booster: `${orbiterBridgeNovaPoints} Nova Points`, @@ -965,6 +1052,8 @@ export default function EcoDApps({ rewards: "Bridge", holdingPoints: getHoldingPointsByProject("symbiosis"), totalPoints: getTotalPointsByProject("symbiosis"), + remainSpinNum: getSpinByProject("symbiosis").remainSpinNum, + pairAddress: getSpinByProject("symbiosis").pairAddress, details: [ { booster: `${symbiosisBridgeNovaPoints} Nova Points`, @@ -988,6 +1077,8 @@ export default function EcoDApps({ rewards: "Bridge", holdingPoints: getHoldingPointsByProject("meson"), totalPoints: getTotalPointsByProject("meson"), + remainSpinNum: getSpinByProject("meson").remainSpinNum, + pairAddress: getSpinByProject("meson").pairAddress, details: [ { booster: `${mesonBridgeNovaPoints} Nova Points`, @@ -1010,6 +1101,8 @@ export default function EcoDApps({ rewards: "Trading", holdingPoints: getHoldingPointsByProject("eddy"), totalPoints: getTotalPointsByProject("eddy"), + remainSpinNum: getSpinByProject("eddy").remainSpinNum, + pairAddress: getSpinByProject("eddy").pairAddress, details: [ { booster: ( @@ -1046,6 +1139,10 @@ export default function EcoDApps({ warningModal.onOpen(); }; + useEffect(() => { + getSpin(); + }, []); + return (
{ecoDAppsList.map((item, index) => ( - + ))}
From a7d657e9fce9bf232f487af6044ff403a51c12eb Mon Sep 17 00:00:00 2001 From: leo Date: Wed, 31 Jul 2024 17:01:37 +0800 Subject: [PATCH 03/11] update protocol spin --- src/api/index.ts | 3 +- src/components/DashboardS2/Tabs/EcoDApps.tsx | 41 ++++++++++---------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/api/index.ts b/src/api/index.ts index d29ed840..712c3723 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -823,8 +823,7 @@ export const getCategoryZKL = (): Promise => { }; export interface PortocolSpinItem { - project: string; - pairAddress: string; + projectName: string; remainSpinNum: number; } diff --git a/src/components/DashboardS2/Tabs/EcoDApps.tsx b/src/components/DashboardS2/Tabs/EcoDApps.tsx index 44547a36..05860652 100644 --- a/src/components/DashboardS2/Tabs/EcoDApps.tsx +++ b/src/components/DashboardS2/Tabs/EcoDApps.tsx @@ -245,7 +245,7 @@ interface EcoDAppItem { }[]; holdingPoints: NovaProjectTotalPoints; remainSpinNum: number; - pairAddress: string; + projectName: string; totalPoints?: NovaProjectTotalPoints; details: { booster: string | ReactNode; @@ -589,11 +589,10 @@ export default function EcoDApps({ }; const getSpinByProject = (project: string) => { - const data = spinList.find((item) => item.project === project); + const data = spinList.find((item) => item.projectName === project); return { project, remainSpinNum: data?.remainSpinNum || 0, - pairAddress: data?.pairAddress || "", }; }; @@ -630,7 +629,7 @@ export default function EcoDApps({ holdingPoints: getHoldingPointsByProject("nowaswap"), totalPoints: getTotalPointsByProject("novaswap"), remainSpinNum: getSpinByProject("novaswap").remainSpinNum, - pairAddress: getSpinByProject("novaswap").pairAddress, + projectName: "novaswap", details: [ { booster: ( @@ -660,7 +659,7 @@ export default function EcoDApps({ holdingPoints: getHoldingPointsByProject("nowaswap"), totalPoints: getTotalPointsByProject("novaswap"), remainSpinNum: getSpinByProject("novaswap").remainSpinNum, - pairAddress: getSpinByProject("novaswap").pairAddress, + projectName: "novaswap", details: [ { booster: ( @@ -700,7 +699,7 @@ export default function EcoDApps({ holdingPoints: getHoldingPointsByProject("layerbank"), totalPoints: getTotalPointsByProject("layerbank"), remainSpinNum: getSpinByProject("layerbank").remainSpinNum, - pairAddress: getSpinByProject("layerbank").pairAddress, + projectName: "layerbank", details: [ { booster: ( @@ -732,7 +731,7 @@ export default function EcoDApps({ holdingPoints: getHoldingPointsByProject("logx"), totalPoints: getTotalPointsByProject("logx"), remainSpinNum: getSpinByProject("logx").remainSpinNum, - pairAddress: getSpinByProject("logx").pairAddress, + projectName: "logx", details: [ { booster: ( @@ -770,7 +769,7 @@ export default function EcoDApps({ holdingPoints: getHoldingPointsByProject("shoebill"), totalPoints: getTotalPointsByProject("shoebill"), remainSpinNum: getSpinByProject("shoebill").remainSpinNum, - pairAddress: getSpinByProject("shoebill").pairAddress, + projectName: "shoebill", details: [ { booster: ( @@ -798,7 +797,7 @@ export default function EcoDApps({ holdingPoints: getHoldingPointsByProject("aqua"), totalPoints: getTotalPointsByProject("aqua"), remainSpinNum: getSpinByProject("aqua").remainSpinNum, - pairAddress: getSpinByProject("aqua").pairAddress, + projectName: "aqua", details: [ { booster: ( @@ -829,7 +828,7 @@ export default function EcoDApps({ holdingPoints: getHoldingPointsByProject("izumi"), totalPoints: getTotalPointsByProject("izumi"), remainSpinNum: getSpinByProject("izumi").remainSpinNum, - pairAddress: getSpinByProject("izumi").pairAddress, + projectName: "izumi", details: [ { booster: ( @@ -863,7 +862,7 @@ export default function EcoDApps({ holdingPoints: getHoldingPointsByProject("wagmi"), totalPoints: getTotalPointsByProject("wagmi"), remainSpinNum: getSpinByProject("wagmi").remainSpinNum, - pairAddress: getSpinByProject("wagmi").pairAddress, + projectName: "wagmi", details: [ { booster: ( @@ -888,8 +887,8 @@ export default function EcoDApps({ }, { - category: zkdx?.category, - iconURL: "/img/icon-zkdx.svg" || "perpdex", + category: zkdx?.category || "perpdex", + iconURL: "/img/icon-zkdx.svg", name: "zkDX", link: "https://app.zkdx.io/stakingliquidity", handler: "@zkDXio", @@ -901,7 +900,7 @@ export default function EcoDApps({ holdingPoints: getHoldingPointsByProject("zkdx"), totalPoints: getTotalPointsByProject("zkdx"), remainSpinNum: getSpinByProject("zkdx").remainSpinNum, - pairAddress: getSpinByProject("zkdx").pairAddress, + projectName: "zkdx", details: [ { booster: ( @@ -943,7 +942,7 @@ export default function EcoDApps({ holdingPoints: getHoldingPointsByProject("allspark"), totalPoints: getTotalPointsByProject("allspark"), remainSpinNum: getSpinByProject("allspark").remainSpinNum, - pairAddress: getSpinByProject("allspark").pairAddress, + projectName: "allspark", details: [ { booster: ( @@ -971,7 +970,7 @@ export default function EcoDApps({ holdingPoints: getHoldingPointsByProject("rubic"), totalPoints: getTotalPointsByProject("rubic"), remainSpinNum: getSpinByProject("rubic").remainSpinNum, - pairAddress: getSpinByProject("rubic").pairAddress, + projectName: "rubic", details: [ { booster: ( @@ -999,7 +998,7 @@ export default function EcoDApps({ holdingPoints: getHoldingPointsByProject("interport"), totalPoints: getTotalPointsByProject("interport"), remainSpinNum: getSpinByProject("interport").remainSpinNum, - pairAddress: getSpinByProject("interport").pairAddress, + projectName: "interport", details: [ { booster: ( @@ -1027,7 +1026,7 @@ export default function EcoDApps({ holdingPoints: getHoldingPointsByProject("orbiter"), totalPoints: getTotalPointsByProject("orbiter"), remainSpinNum: getSpinByProject("orbiter").remainSpinNum, - pairAddress: getSpinByProject("orbiter").pairAddress, + projectName: "orbiter", details: [ { booster: `${orbiterBridgeNovaPoints} Nova Points`, @@ -1053,7 +1052,7 @@ export default function EcoDApps({ holdingPoints: getHoldingPointsByProject("symbiosis"), totalPoints: getTotalPointsByProject("symbiosis"), remainSpinNum: getSpinByProject("symbiosis").remainSpinNum, - pairAddress: getSpinByProject("symbiosis").pairAddress, + projectName: "symbiosis", details: [ { booster: `${symbiosisBridgeNovaPoints} Nova Points`, @@ -1078,7 +1077,7 @@ export default function EcoDApps({ holdingPoints: getHoldingPointsByProject("meson"), totalPoints: getTotalPointsByProject("meson"), remainSpinNum: getSpinByProject("meson").remainSpinNum, - pairAddress: getSpinByProject("meson").pairAddress, + projectName: "meson", details: [ { booster: `${mesonBridgeNovaPoints} Nova Points`, @@ -1102,7 +1101,7 @@ export default function EcoDApps({ holdingPoints: getHoldingPointsByProject("eddy"), totalPoints: getTotalPointsByProject("eddy"), remainSpinNum: getSpinByProject("eddy").remainSpinNum, - pairAddress: getSpinByProject("eddy").pairAddress, + projectName: "eddy", details: [ { booster: ( From fe2fd85f389fea50d50d0c55beabb8dbe38ff5e9 Mon Sep 17 00:00:00 2001 From: leo Date: Wed, 31 Jul 2024 17:44:33 +0800 Subject: [PATCH 04/11] update protocol spin --- src/api/index.ts | 4 ++-- .../DashboardS2/DailyRoulette/DailyDrawModal.tsx | 11 ++++++++--- src/components/DashboardS2/Tabs/EcoDApps.tsx | 2 ++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/api/index.ts b/src/api/index.ts index 712c3723..a7f49e02 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -830,5 +830,5 @@ export interface PortocolSpinItem { export const getProtocolSpin = (): Promise> => http.get(`${BASE_URL_API}/invite/protocol/spin`); -export const openProtocolSpin = (): Promise => - http.post(`${BASE_URL_API}/invite/protocol/open`); +export const openProtocolSpin = (projectName: string): Promise => + http.post(`${BASE_URL_API}/invite/protocol/open?projectName=${projectName}`); diff --git a/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx b/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx index 5e1d418b..fe71e8a0 100644 --- a/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx +++ b/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx @@ -12,7 +12,7 @@ import { import { UseDisclosureReturn } from "@nextui-org/use-disclosure"; import Marquee from "@/components/Marquee"; import { useRef, useState, useEffect, useCallback, useMemo } from "react"; -import { dailyOpen } from "@/api"; +import { dailyOpen, openProtocolSpin } from "@/api"; import { sleep } from "@/utils"; import useNovaNFT, { MysteryboxMintParams } from "@/hooks/useNovaNFT"; import { @@ -26,6 +26,8 @@ interface IProps { modalInstance: UseDisclosureReturn; onDrawed: () => void; remain?: number; + type?: "daily" | "protocol"; + projectName?: string; } export const PrizeItems = [ { @@ -71,7 +73,7 @@ const DailyDrawModal: React.FC = (props: IProps) => { const { switchChain } = useSwitchChain(); const { sendTrademarkMintTx } = useNovaNFT(); - const { modalInstance, onDrawed, remain } = props; + const { modalInstance, onDrawed, remain, type, projectName } = props; const drawRef = useRef<{ start: (target: number) => void }>(); const [mintResult, setMintResult] = useState<{ name: string; @@ -103,7 +105,10 @@ const DailyDrawModal: React.FC = (props: IProps) => { modalInstance.onOpen(); } setSpinging(true); - const res = await dailyOpen(); + const res = + type === "protocol" && projectName + ? await openProtocolSpin(projectName) + : await dailyOpen(); const tokenId = res.result.tokenId as number; const prizeId = PRIZE_MAP[tokenId]; onDrawed(); // update remain times diff --git a/src/components/DashboardS2/Tabs/EcoDApps.tsx b/src/components/DashboardS2/Tabs/EcoDApps.tsx index 05860652..c9f5fdd6 100644 --- a/src/components/DashboardS2/Tabs/EcoDApps.tsx +++ b/src/components/DashboardS2/Tabs/EcoDApps.tsx @@ -513,6 +513,8 @@ const EcoDApp = (props: { modalInstance={modal} onDrawed={onDrawed} remain={data.remainSpinNum} + type="protocol" + projectName={data.projectName} /> ); From 55d8be26dd73efe2061edf2a6d745b25f22503e7 Mon Sep 17 00:00:00 2001 From: leo Date: Thu, 1 Aug 2024 11:21:44 +0800 Subject: [PATCH 05/11] fix merge --- src/components/DashboardS2/Tabs/EcoDApps.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/DashboardS2/Tabs/EcoDApps.tsx b/src/components/DashboardS2/Tabs/EcoDApps.tsx index 98f61009..0b22f9a4 100644 --- a/src/components/DashboardS2/Tabs/EcoDApps.tsx +++ b/src/components/DashboardS2/Tabs/EcoDApps.tsx @@ -325,7 +325,7 @@ const EcoDApp = (props: { handleLink(data.link); }} > - {data.name} + {data.name}
setIsOpen(!isOpen)} >
From 10b5824c5539c718d5681d86ac0aaf14e11e8006 Mon Sep 17 00:00:00 2001 From: leo Date: Fri, 2 Aug 2024 09:59:02 +0800 Subject: [PATCH 06/11] update protocol spin --- .../DashboardS2/DailyRoulette/DailyDrawModal.tsx | 15 ++++++++------- vite.config.ts | 4 ++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx b/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx index e4e21564..6ef50e3b 100644 --- a/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx +++ b/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx @@ -213,9 +213,11 @@ const DailyDrawModal: React.FC = (props: IProps) => { } else if (minting) { return "Start Minting"; } else { - return `Spin Your Daily Roulette (${remain})`; + return `Spin Your ${ + type === "protocol" ? "Protocol" : "Daily" + } Roulette (${remain})`; } - }, [isInvaidChain, minting, remain]); + }, [isInvaidChain, minting, remain, type]); return ( <> @@ -230,16 +232,15 @@ const DailyDrawModal: React.FC = (props: IProps) => { {() => ( <> - Daily Roulette + {type === "protocol" ? "Protocol Roulette" : "Daily Roulette"}

- On a daily basis, each user has x times of opportunity to - participate in a Roulette game on the campaign page. Users - have the probability to win trademarks and Lynks. The - minimum reward will be 1 Nova Points. + {type === "protocol" + ? "Congratulations! You now have the chance to spin the roulette and win rewards!" + : "On a daily basis, each user has x times of opportunity to participate in a Roulette game on the campaign page. Users have the probability to win trademarks and Lynks. The minimum reward will be 1 Nova Points."}

path.replace(/^\/app-api/, ""), }, From 2cde666786e27ce57d071705b43ee3ea2ad536d6 Mon Sep 17 00:00:00 2001 From: leo Date: Fri, 2 Aug 2024 10:26:21 +0800 Subject: [PATCH 07/11] fix spin --- src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx b/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx index 6ef50e3b..cfd8ccc7 100644 --- a/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx +++ b/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx @@ -145,7 +145,7 @@ const DailyDrawModal: React.FC = (props: IProps) => { mintResultModal.onOpen(); } setSpinging(false); - if (!remain || remain <= 1) { + if (!remain && !mintParams) { modalInstance.onClose(); } }, [ From 2c4640fdf20c5db05197bf2440e360db3d10f447 Mon Sep 17 00:00:00 2001 From: leo Date: Fri, 2 Aug 2024 16:17:24 +0800 Subject: [PATCH 08/11] fix spin ui issue --- src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx b/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx index cfd8ccc7..0e479693 100644 --- a/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx +++ b/src/components/DashboardS2/DailyRoulette/DailyDrawModal.tsx @@ -452,11 +452,11 @@ const SpinButton = styled(Button)` box-shadow: 0px 2.306px 18.446px 0px rgba(0, 0, 0, 0.15), 0px 0px 13.835px 0px rgba(255, 255, 255, 0.75) inset; height: 54px; - gap: 8px; + gap: 4px; color: #fff; text-align: center; font-family: Satoshi; - font-size: 18.446px; + font-size: 16px; font-style: normal; font-weight: 900; line-height: normal; @@ -476,7 +476,7 @@ const SpinPointer = styled.div` const ModalContainer = styled(Modal)` background: url("img/s2/bg-spin-container.svg") no-repeat; background-size: cover; - width: 400px; + width: 428px; .prize-text { color: var(--Neutral-2, rgba(251, 251, 251, 0.6)); font-family: Satoshi; From 68a624042d25747af85440cc40c3c65fec77f8e6 Mon Sep 17 00:00:00 2001 From: leo Date: Wed, 7 Aug 2024 08:56:28 +0800 Subject: [PATCH 09/11] update protocol spin --- src/components/DashboardS2/Tabs/EcoDApps.tsx | 63 +++++++++++++------- src/pages/DashboardS2/index2.tsx | 2 +- 2 files changed, 43 insertions(+), 22 deletions(-) diff --git a/src/components/DashboardS2/Tabs/EcoDApps.tsx b/src/components/DashboardS2/Tabs/EcoDApps.tsx index 0b22f9a4..98a58b2a 100644 --- a/src/components/DashboardS2/Tabs/EcoDApps.tsx +++ b/src/components/DashboardS2/Tabs/EcoDApps.tsx @@ -248,7 +248,7 @@ interface EcoDAppItem { iconURL: string; }[]; holdingPoints: NovaProjectTotalPoints; - remainSpinNum: number; + remainSpinNum?: number; projectName: string; totalPoints?: NovaProjectTotalPoints; details: { @@ -301,7 +301,7 @@ const EcoDApp = (props: { }, [data]); const handleSpinModal = (e: React.MouseEvent) => { - if (data.remainSpinNum < 1) { + if (!data.remainSpinNum) { return; } e.stopPropagation(); @@ -420,23 +420,30 @@ const EcoDApp = (props: {
-
- - Spin -
+ {data.remainSpinNum === 0 && + data.projectName !== "orbiter" && + data.projectName !== "symbiosis" && + data.projectName !== "meson" ? ( + Spined + ) : ( +
+ + Spin +
+ )}
@@ -630,7 +637,7 @@ export default function EcoDApps({ const data = spinList.find((item) => item.projectName === project); return { project, - remainSpinNum: data?.remainSpinNum || 0, + remainSpinNum: data?.remainSpinNum, }; }; @@ -1257,7 +1264,21 @@ export default function EcoDApps({
Points Booster
Rewards
Allocated Points
-
Roulette
+
+
+ Roulette + + + +
+
diff --git a/src/pages/DashboardS2/index2.tsx b/src/pages/DashboardS2/index2.tsx index 1f3925cc..03e8c9b9 100644 --- a/src/pages/DashboardS2/index2.tsx +++ b/src/pages/DashboardS2/index2.tsx @@ -599,7 +599,7 @@ export default function Dashboard() { return ( -
+
{/* */} From c062447d82e7a6836995851e5c213ec13f52a12b Mon Sep 17 00:00:00 2001 From: leo Date: Wed, 7 Aug 2024 11:55:52 +0800 Subject: [PATCH 10/11] update spin --- src/components/DashboardS2/Tabs/EcoDApps.tsx | 43 +++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src/components/DashboardS2/Tabs/EcoDApps.tsx b/src/components/DashboardS2/Tabs/EcoDApps.tsx index 98a58b2a..1d56b59c 100644 --- a/src/components/DashboardS2/Tabs/EcoDApps.tsx +++ b/src/components/DashboardS2/Tabs/EcoDApps.tsx @@ -420,29 +420,32 @@ const EcoDApp = (props: {
- {data.remainSpinNum === 0 && - data.projectName !== "orbiter" && + {data.projectName !== "orbiter" && data.projectName !== "symbiosis" && data.projectName !== "meson" ? ( - Spined + data.remainSpinNum === 0 ? ( + Spined + ) : ( +
+ + Spin +
+ ) ) : ( -
- - Spin -
+ "" )}
From 1a7956e5448e8d7aa3469ef019e5fcf2ff100873 Mon Sep 17 00:00:00 2001 From: leo Date: Wed, 7 Aug 2024 12:33:02 +0800 Subject: [PATCH 11/11] update protocol spin --- src/components/DashboardS2/Tabs/EcoDApps.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/DashboardS2/Tabs/EcoDApps.tsx b/src/components/DashboardS2/Tabs/EcoDApps.tsx index 1d56b59c..1ab5c74b 100644 --- a/src/components/DashboardS2/Tabs/EcoDApps.tsx +++ b/src/components/DashboardS2/Tabs/EcoDApps.tsx @@ -1276,7 +1276,7 @@ export default function EcoDApps({ content: "py-[20px] px-[16px] text-[14px] text-[#FBFBFB99] bg-[#000811]", }} - content="Interact with dApp and after receive more than 1 Nova points, you will earn a chance to do three one time roulette to win Nova Points & Trademark NFTs." + content="Interact with the dApp and once you earn more than 1 Nova Point, you'll get a chance to spin the roulette three times to win more Nova Points and Trademark NFTs." >