diff --git a/apps/hyperdrive-trading/src/ui/portfolio/NoWalletConnected.tsx b/apps/hyperdrive-trading/src/ui/portfolio/NoWalletConnected.tsx new file mode 100644 index 000000000..999d046a7 --- /dev/null +++ b/apps/hyperdrive-trading/src/ui/portfolio/NoWalletConnected.tsx @@ -0,0 +1,15 @@ +import { ReactElement } from "react"; +import { NonIdealState } from "src/ui/base/components/NonIdealState"; +import { ConnectWalletButton } from "src/ui/compliance/ConnectWallet"; +import { PositionContainer } from "src/ui/portfolio/PositionContainer"; + +export function NoWalletConnected(): ReactElement { + return ( + + } + /> + + ); +} diff --git a/apps/hyperdrive-trading/src/ui/portfolio/Portfolio.tsx b/apps/hyperdrive-trading/src/ui/portfolio/Portfolio.tsx index 999df5b33..efeeb7536 100644 --- a/apps/hyperdrive-trading/src/ui/portfolio/Portfolio.tsx +++ b/apps/hyperdrive-trading/src/ui/portfolio/Portfolio.tsx @@ -4,6 +4,7 @@ import { Tabs } from "src/ui/base/components/Tabs/Tabs"; import { useFeatureFlag } from "src/ui/base/featureFlags/featureFlags"; import { OpenLongsContainer } from "src/ui/portfolio/longs/LongsContainer"; import { LpAndWithdrawalSharesContainer } from "src/ui/portfolio/lp/LpAndWithdrawalSharesContainer"; +import { RewardsContainer } from "src/ui/portfolio/rewards/RewardsContainer"; import { PORTFOLIO_ROUTE } from "src/ui/portfolio/routes"; import { OpenShortsContainer } from "src/ui/portfolio/shorts/ShortsContainer"; @@ -48,7 +49,7 @@ export function Portfolio(): ReactElement { if (isPortfolioRewardsFeatureFlagEnabled) { tabs.push({ id: "rewards", - content: <>, + content: , label: "Rewards", onClick: () => { navigate({ diff --git a/apps/hyperdrive-trading/src/ui/portfolio/longs/LongsContainer.tsx b/apps/hyperdrive-trading/src/ui/portfolio/longs/LongsContainer.tsx index 619bc2113..22c55aa09 100644 --- a/apps/hyperdrive-trading/src/ui/portfolio/longs/LongsContainer.tsx +++ b/apps/hyperdrive-trading/src/ui/portfolio/longs/LongsContainer.tsx @@ -4,13 +4,13 @@ import { ReactElement } from "react"; import { ExternalLink } from "src/ui/analytics/ExternalLink"; import LoadingState from "src/ui/base/components/LoadingState"; import { NonIdealState } from "src/ui/base/components/NonIdealState"; -import { ConnectWalletButton } from "src/ui/compliance/ConnectWallet"; import { OpenLongsTableDesktop } from "src/ui/portfolio/longs/OpenLongsTable/OpenLongsTableDesktop"; import { TotalOpenLongsValue } from "src/ui/portfolio/longs/TotalOpenLongsValue/TotalOpenLongsValue"; import { OpenLongPositionsData, usePortfolioLongsData, } from "src/ui/portfolio/longs/usePortfolioLongsData"; +import { NoWalletConnected } from "src/ui/portfolio/NoWalletConnected"; import { PositionContainer } from "src/ui/portfolio/PositionContainer"; import { PositionTableHeading } from "src/ui/portfolio/PositionTableHeading"; import { useAccount } from "wagmi"; @@ -20,14 +20,7 @@ export function OpenLongsContainer(): ReactElement { const { openLongPositions, openLongPositionsStatus } = usePortfolioLongsData(); if (!account) { - return ( - - } - /> - - ); + return ; } if (openLongPositionsStatus === "loading") { diff --git a/apps/hyperdrive-trading/src/ui/portfolio/lp/LpAndWithdrawalSharesContainer.tsx b/apps/hyperdrive-trading/src/ui/portfolio/lp/LpAndWithdrawalSharesContainer.tsx index 15ed190e0..60364cefd 100644 --- a/apps/hyperdrive-trading/src/ui/portfolio/lp/LpAndWithdrawalSharesContainer.tsx +++ b/apps/hyperdrive-trading/src/ui/portfolio/lp/LpAndWithdrawalSharesContainer.tsx @@ -4,10 +4,10 @@ import { ReactElement } from "react"; import { ExternalLink } from "src/ui/analytics/ExternalLink"; import LoadingState from "src/ui/base/components/LoadingState"; import { NonIdealState } from "src/ui/base/components/NonIdealState"; -import { ConnectWalletButton } from "src/ui/compliance/ConnectWallet"; import { OpenLpTableDesktop } from "src/ui/portfolio/lp/LpAndWithdrawalSharesTable/LpAndWithdrawalSharesTable"; import { TotalLpValue } from "src/ui/portfolio/lp/LpAndWithdrawalSharesTable/TotalLpValue"; import { usePortfolioLpData } from "src/ui/portfolio/lp/usePortfolioLpData"; +import { NoWalletConnected } from "src/ui/portfolio/NoWalletConnected"; import { PositionContainer } from "src/ui/portfolio/PositionContainer"; import { PositionTableHeading } from "src/ui/portfolio/PositionTableHeading"; import { useAccount } from "wagmi"; @@ -16,14 +16,7 @@ export function LpAndWithdrawalSharesContainer(): ReactElement { const { openLpPositions, openLpPositionStatus } = usePortfolioLpData(); const { address: account } = useAccount(); if (!account) { - return ( - - } - /> - - ); + return ; } if (openLpPositionStatus === "loading") { diff --git a/apps/hyperdrive-trading/src/ui/portfolio/rewards/RewardsContainer.tsx b/apps/hyperdrive-trading/src/ui/portfolio/rewards/RewardsContainer.tsx new file mode 100644 index 000000000..414424731 --- /dev/null +++ b/apps/hyperdrive-trading/src/ui/portfolio/rewards/RewardsContainer.tsx @@ -0,0 +1,63 @@ +import { Link } from "@tanstack/react-router"; +import { ReactElement } from "react"; +import LoadingState from "src/ui/base/components/LoadingState"; +import { NonIdealState } from "src/ui/base/components/NonIdealState"; +import { NoWalletConnected } from "src/ui/portfolio/NoWalletConnected"; +import { PositionContainer } from "src/ui/portfolio/PositionContainer"; +import { useRewardsData } from "src/ui/portfolio/rewards/useRewardsData"; +import { useAccount } from "wagmi"; + +export function RewardsContainer(): ReactElement { + const { address: account } = useAccount(); + const { rewards, rewardsStatus } = useRewardsData({ account }); + + if (!account) { + return ; + } + + if (rewardsStatus === "loading") { + return ( + + + + ); + } + + if (rewardsStatus === "error") { + return ( + + + + ); + } + + const hasClaimableRewards = rewards?.some((reward) => reward); + + if (!hasClaimableRewards) { + return ( + + + Open a position in Hyperdrive to begin earning rewards. +

+ } + action={ + + View Pools + + } + /> +
+ ); + } + + return TODO; +} diff --git a/apps/hyperdrive-trading/src/ui/portfolio/rewards/useRewardsData.ts b/apps/hyperdrive-trading/src/ui/portfolio/rewards/useRewardsData.ts new file mode 100644 index 000000000..47ad0054a --- /dev/null +++ b/apps/hyperdrive-trading/src/ui/portfolio/rewards/useRewardsData.ts @@ -0,0 +1,25 @@ +import { useQuery } from "@tanstack/react-query"; +import { makeQueryKey } from "src/base/makeQueryKey"; +import { Address } from "viem"; + +export function useRewardsData({ account }: { account: Address | undefined }): { + rewards: unknown[] | undefined; + rewardsStatus: "error" | "success" | "loading"; +} { + const queryEnabled = !!account; + const { data: rewards, status: rewardsStatus } = useQuery({ + queryKey: makeQueryKey("rewards", { account }), + queryFn: queryEnabled + ? async () => { + // TODO: Fetch rewards from server + return []; + } + : undefined, + enabled: queryEnabled, + }); + + return { + rewards, + rewardsStatus, + }; +} diff --git a/apps/hyperdrive-trading/src/ui/portfolio/shorts/ShortsContainer.tsx b/apps/hyperdrive-trading/src/ui/portfolio/shorts/ShortsContainer.tsx index fc1ede8ac..a9ea92cea 100644 --- a/apps/hyperdrive-trading/src/ui/portfolio/shorts/ShortsContainer.tsx +++ b/apps/hyperdrive-trading/src/ui/portfolio/shorts/ShortsContainer.tsx @@ -4,7 +4,7 @@ import { ReactElement } from "react"; import { ExternalLink } from "src/ui/analytics/ExternalLink"; import LoadingState from "src/ui/base/components/LoadingState"; import { NonIdealState } from "src/ui/base/components/NonIdealState"; -import { ConnectWalletButton } from "src/ui/compliance/ConnectWallet"; +import { NoWalletConnected } from "src/ui/portfolio/NoWalletConnected"; import { PositionContainer } from "src/ui/portfolio/PositionContainer"; import { PositionTableHeading } from "src/ui/portfolio/PositionTableHeading"; import { OpenShortsTableDesktop } from "src/ui/portfolio/shorts/OpenShortsTable/OpenShortsTableDesktop"; @@ -20,14 +20,7 @@ export function OpenShortsContainer(): ReactElement { usePortfolioShortsData(); const { address: account } = useAccount(); if (!account) { - return ( - - } - /> - - ); + return ; } if (openShortPositionsStatus === "loading") {