Skip to content

Commit

Permalink
Fixes on protocol, chain, token and campaign pages (#30)
Browse files Browse the repository at this point in the history
* Fixes on protocol, chain, token and campaign pages

* lint

* fix tooltip
  • Loading branch information
hugolxt authored Dec 16, 2024
1 parent d942f68 commit 39be322
Show file tree
Hide file tree
Showing 11 changed files with 54 additions and 124 deletions.
22 changes: 11 additions & 11 deletions src/components/composite/Hero.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -126,9 +126,9 @@ export default function Hero({
);
}

export function heroBuildSideDatas(count: number, maxApr: number, dailyRewards: number) {
export function defaultHeroSideDatas(count: number, maxApr: number, dailyRewards: number) {
return [
{
!!count && {
data: (
<Value format="0" size={4} className="!text-main-12">
{count}
Expand All @@ -137,23 +137,23 @@ export function heroBuildSideDatas(count: number, maxApr: number, dailyRewards:
label: "Live opportunities",
key: crypto.randomUUID(),
},
{
!!dailyRewards && {
data: (
<Value format="0a%" size={4} className="!text-main-12">
{maxApr / 100}
<Value format="$0.00a" size={4} className="!text-main-12">
{dailyRewards}
</Value>
),
label: "APR",
label: "Daily rewards",
key: crypto.randomUUID(),
},
{
!!maxApr && {
data: (
<Value format="$0.00a" size={4} className="!text-main-12">
{dailyRewards}
<Value format="0a%" size={4} className="!text-main-12">
{maxApr / 100}
</Value>
),
label: "Daily rewards",
label: "Max APR",
key: crypto.randomUUID(),
},
];
].filter(data => !!data);
}
6 changes: 1 addition & 5 deletions src/components/element/Tag.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ export default function Tag<T extends keyof TagTypes>({ type, filter, value, ...
<Group size="xs" className="flex-col">
<Group className="justify-between" size="xl">
<Text size="xs">Token</Text>
<Hash format="short" size="xs">
<Hash format="short" size="xs" copy>
{token.address}
</Hash>
</Group>
Expand All @@ -192,10 +192,6 @@ export default function Tag<T extends keyof TagTypes>({ type, filter, value, ...
</Group>
<Divider look="soft" horizontal />
<Group className="flex-col" size="md">
<Button to={`/tokens/${token?.symbol}`} size="xs" look="soft">
<Icon remix="RiArrowRightLine" />
Check opportunities with {token?.symbol}
</Button>
<Button to={`/chains/${token.chain?.name}`} size="xs" look="soft">
<Icon remix="RiArrowRightLine" /> Check opportunities on {token.chain?.name}
</Button>
Expand Down
10 changes: 2 additions & 8 deletions src/components/element/campaign/CampaignTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,10 @@ import { createTable } from "dappkit";
export const [CampaignTable, CampaignRow, CampaignColumns] = createTable({
dailyRewards: {
name: "Daily rewards",
size: "minmax(200px,250px)",
compact: "1fr",
className: "justify-start",
main: true,
},
restrictions: {
name: "",
size: "minmax(170px,1fr)",
compactSize: "1fr",
className: "justify-end",
className: "justify-start",
main: true,
},
chain: {
name: "Chain",
Expand Down
34 changes: 16 additions & 18 deletions src/components/element/campaign/CampaignTableRow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
import moment from "moment";
import Collapsible from "packages/dappkit/src/components/primitives/Collapsible";
import Time from "packages/dappkit/src/components/primitives/Time";
import Tooltip from "packages/dappkit/src/components/primitives/Tooltip";
import { type ReactNode, useCallback, useMemo, useState } from "react";
import type { Opportunity } from "src/api/services/opportunity/opportunity.model";
import useCampaign from "src/hooks/resources/useCampaign";
Expand Down Expand Up @@ -48,7 +49,7 @@ export default function CampaignTableRow({
const campaignInformation = useMemo(() => {
const columns = [
[
"Total distributed",
"Total Distributed",
<Token
key="token"
symbol={false}
Expand Down Expand Up @@ -81,14 +82,20 @@ export default function CampaignTableRow({
</Hash>,
],
[
"Last snapshot",
<Text key="computedUntil">
{campaign?.campaignStatus?.computedUntil ? (
<Time timestamp={Number(campaign?.campaignStatus?.computedUntil) * 1000} />
) : (
"not computed yet"
)}
</Text>,
"Last Snapshot",
<Tooltip
helper={
"Indicates when the campaign has last been processed by the Merkl engine. Once a campaign is processed, its rewards can then be included in the following distribution of the associated chain. Distributions on a chain may easily be delayed, for example by disputers, or by instabilities in Merkl dependencies"
}
key="computedUntil">
<Text>
{campaign?.campaignStatus?.computedUntil ? (
<Time timestamp={Number(campaign?.campaignStatus?.computedUntil) * 1000} />
) : (
"Never"
)}
</Text>
</Tooltip>,
],
] as const satisfies [string, ReactNode][];

Expand All @@ -112,15 +119,6 @@ export default function CampaignTableRow({
className={mergeClass("cursor-pointer py-4", className)}
onClick={toggleIsOpen}
chainColumn={<Chain chain={campaign.chain} />}
restrictionsColumn={
<Group className="justify-end">
{rules
?.filter(({ type }) => type === "address")
.map(rule => (
<Rule size="sm" key={crypto.randomUUID()} type={rule.type} value={rule.value} />
))}
</Group>
}
dailyRewardsColumn={
<Group className="align-middle items-center flex-nowrap">
<OverrideTheme accent={"good"}>
Expand Down
Empty file.
4 changes: 2 additions & 2 deletions src/components/element/token/TokenTooltip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export default function TokenTooltip({ token, size, chain }: TokenTooltipProps)
<Group className="flex-col" size="md">
<Button to={`/tokens/${token?.symbol}`} size="xs" look="soft">
<Icon remix="RiArrowRightLine" />
{token?.symbol} on Merkl
Check opportunities with {token?.symbol}
</Button>
{chain?.explorers?.map(explorer => {
return (
Expand All @@ -39,7 +39,7 @@ export default function TokenTooltip({ token, size, chain }: TokenTooltipProps)
size="xs"
look="soft">
<Icon remix="RiArrowRightLine" />
{token?.symbol} on Etherscan
Visit explorer
</Button>
);
})}
Expand Down
16 changes: 8 additions & 8 deletions src/hooks/resources/useOpportunity.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,11 @@ export default function useOpportunity(opportunity: Opportunity) {
}, [opportunity]);

const herosData = useMemo(() => {
switch (opportunity.type) {
case "CLAMM":
return [
{
let data = [];
switch (opportunity.action) {
default:
data = [
!!opportunity.dailyRewards && {
label: "Daily rewards",
data: (
<Value format="$0.00a" size={4} className="!text-main-12">
Expand All @@ -77,7 +78,7 @@ export default function useOpportunity(opportunity: Opportunity) {
),
key: crypto.randomUUID(),
},
{
!!opportunity.apr && {
label: "APR",
data: (
<Value format="0.00%" size={4} className="!text-main-12">
Expand All @@ -86,7 +87,7 @@ export default function useOpportunity(opportunity: Opportunity) {
),
key: crypto.randomUUID(),
},
{
!!opportunity.tvl && {
label: "Total value locked",
data: (
<Value format="$0.00a" size={4} className="!text-main-12">
Expand All @@ -96,9 +97,8 @@ export default function useOpportunity(opportunity: Opportunity) {
key: crypto.randomUUID(),
},
];
default:
return;
}
return data.filter(data => !!data);
}, [opportunity]);

const rewardsBreakdown = useMemo(() => {
Expand Down
22 changes: 2 additions & 20 deletions src/routes/_merkl.chains.$id.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Outlet, useLoaderData } from "@remix-run/react";
import { Cache } from "src/api/services/cache.service";
import { ChainService } from "src/api/services/chain.service";
import { OpportunityService } from "src/api/services/opportunity/opportunity.service";
import Hero, { heroBuildSideDatas } from "src/components/composite/Hero";
import Hero, { defaultHeroSideDatas } from "src/components/composite/Hero";

export async function loader({ params: { id } }: LoaderFunctionArgs) {
const chain = await ChainService.get({ search: id });
Expand All @@ -28,7 +28,6 @@ export const meta: MetaFunction<typeof loader> = ({ data }) => {

export default function Index() {
const { chain, count, dailyRewards, maxApr } = useLoaderData<typeof loader>();
const label = chain.name.toLowerCase();

return (
<Hero
Expand All @@ -40,24 +39,7 @@ export default function Index() {
navigation={{ label: "Back to opportunities", link: "/" }}
title={chain.name}
description={`Earn rewards by supplying liquidity on ${chain.name}`}
tabs={[
{
label: "Opportunities",
link: `/chains/${label?.toLowerCase()}`,
key: crypto.randomUUID(),
},
{
label: "Leaderboard",
link: `/chains/${label?.toLowerCase()}/leaderboard`,
key: crypto.randomUUID(),
},
{
label: "Analytics",
link: `/chains/${label?.toLowerCase()}/analytics`,
key: crypto.randomUUID(),
},
]}
sideDatas={heroBuildSideDatas(count, maxApr, dailyRewards)}>
sideDatas={defaultHeroSideDatas(count, maxApr, dailyRewards)}>
<Outlet />
</Hero>
);
Expand Down
48 changes: 8 additions & 40 deletions src/routes/_merkl.protocols.$id.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import type { Opportunity } from "@merkl/api";
import { type LoaderFunctionArgs, type MetaFunction, json } from "@remix-run/node";
import { Outlet, useLoaderData } from "@remix-run/react";
import { Group, Value } from "dappkit";
import { Group } from "dappkit";
import { Cache } from "src/api/services/cache.service";
import { OpportunityService } from "src/api/services/opportunity/opportunity.service";
import { ProtocolService } from "src/api/services/protocol.service";
import Hero from "src/components/composite/Hero";
import Hero, { defaultHeroSideDatas } from "src/components/composite/Hero";

export async function loader({ params: { id }, request }: LoaderFunctionArgs) {
const protocol = (await ProtocolService.get({ id: id ?? undefined }))?.[0];
Expand All @@ -26,7 +26,7 @@ export async function loader({ params: { id }, request }: LoaderFunctionArgs) {
protocol,
liveOpportunityCount: liveCount,
maxApr: opportunitiesByApr?.[0]?.apr,
sumDailyRewards: sum,
dailyRewards: sum,
});
}

Expand All @@ -38,53 +38,21 @@ export type OutletContextProtocol = {
};

export default function Index() {
const { opportunities, count, protocol, liveOpportunityCount, maxApr, sumDailyRewards } =
useLoaderData<typeof loader>();

const herosData = [
{
label: "Live opportunities",
data: (
<Value format="0" size={4} className="!text-main-12">
{liveOpportunityCount}
</Value>
),
key: crypto.randomUUID(),
},
{
// need a call api here
label: "Daily rewards",
data: (
<Value format="$0.00a" size={4} className="!text-main-12">
{sumDailyRewards}
</Value>
),
key: crypto.randomUUID(),
},
{
label: "Max",
data: (
<Value format="0a%" size={4} className="!text-main-12">
{maxApr / 100}
</Value>
),
key: crypto.randomUUID(),
},
];
const { opportunities, count, protocol, liveOpportunityCount, maxApr, dailyRewards } = useLoaderData<typeof loader>();

return (
<Hero
icons={[{ src: protocol?.icon }]}
title={<Group className="items-center">{protocol?.name}</Group>}
breadcrumbs={[
{ link: "/protocols", name: "Protocols" },
{ link: `/protocols/${protocol.id}`, name: protocol.name },
{ link: `/protocols/${protocol?.id}`, name: protocol?.name },
]}
description={
(protocol.description !== "" && protocol.description) ||
`Earn rewards by supplying liquidity on ${protocol.name}`
(protocol?.description !== "" && protocol?.description) ||
`Earn rewards by supplying liquidity on ${protocol?.name}`
}
sideDatas={herosData}>
sideDatas={defaultHeroSideDatas(liveOpportunityCount, maxApr, dailyRewards)}>
<Outlet context={{ opportunities, count }} />
</Hero>
);
Expand Down
4 changes: 2 additions & 2 deletions src/routes/_merkl.tokens.$symbol.(opportunities).tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import { ChainService } from "src/api/services/chain.service";
import { OpportunityService } from "src/api/services/opportunity/opportunity.service";
import OpportunityLibrary from "src/components/element/opportunity/OpportunityLibrary";

export async function loader({ params: { symbol } }: LoaderFunctionArgs) {
const { opportunities, count } = await OpportunityService.getMany({ tokens: symbol });
export async function loader({ params: { symbol }, request }: LoaderFunctionArgs) {
const { opportunities, count } = await OpportunityService.getManyFromRequest(request, { tokens: symbol });
const chains = await ChainService.getAll();

return json({ opportunities, chains, count });
Expand Down
12 changes: 2 additions & 10 deletions src/routes/_merkl.tokens.$symbol.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { Cache } from "src/api/services/cache.service";
import { ChainService } from "src/api/services/chain.service";
import { OpportunityService } from "src/api/services/opportunity/opportunity.service";
import { TokenService } from "src/api/services/token.service";
import Hero, { heroBuildSideDatas } from "src/components/composite/Hero";
import Hero, { defaultHeroSideDatas } from "src/components/composite/Hero";
import Tag, { type TagType } from "src/components/element/Tag";
import { chainIdOrder } from "src/constants/chain";

Expand Down Expand Up @@ -72,15 +72,7 @@ export default function Index() {
</>
}
description={`Earn rewards by using ${token.symbol} as liquidity, or directly earn ${token.symbol} as rewards`}
tabs={[
{
label: "Opportunities",
link: `/tokens/${token.symbol?.toLowerCase()}`,
key: crypto.randomUUID(),
},
]}
// TODO: Make this dynamic
sideDatas={heroBuildSideDatas(count, maxApr, dailyRewards)}
sideDatas={defaultHeroSideDatas(count, maxApr, dailyRewards)}
tags={tags.map(tag => <Tag key={`${tag.type}_${tag.value?.address ?? tag.value}`} {...tag} size="lg" />)}>
<Outlet />
</Hero>
Expand Down

0 comments on commit 39be322

Please sign in to comment.