Skip to content

Commit

Permalink
Merge pull request #796 from alleslabs/feat/depositor-list
Browse files Browse the repository at this point in the history
feat: depositor list
  • Loading branch information
evilpeach authored Feb 22, 2024
2 parents 7250cf3 + 0e8a9e2 commit 769fe71
Show file tree
Hide file tree
Showing 10 changed files with 216 additions and 50 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Features

- [#796](https://github.com/alleslabs/celatone-frontend/pull/796) Depositors list in vote details section
- [#793](https://github.com/alleslabs/celatone-frontend/pull/793) Proposal Validator Votes Table
- [#788](https://github.com/alleslabs/celatone-frontend/pull/788) Add voting power chart component
- [#790](https://github.com/alleslabs/celatone-frontend/pull/790) Handling period tab condition
Expand Down
30 changes: 30 additions & 0 deletions src/lib/pages/proposal-details/components/DepositAmounts.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { Flex, Text } from "@chakra-ui/react";

import { TokenImageRender } from "lib/components/token";
import type { ProposalDeposit } from "lib/types";
import { formatUTokenWithPrecision, getTokenLabel } from "lib/utils";

interface DepositAmountsProps {
deposit: ProposalDeposit;
}

export const DepositAmounts = ({ deposit }: DepositAmountsProps) => (
<div>
{deposit.amount.map((token) => (
<Flex key={token.denom} alignItems="center" gap={2}>
<Text variant="body2">
<Text as="span" fontWeight={700} mr={1}>
{formatUTokenWithPrecision(
token.amount,
token.precision ?? 0,
true,
2
)}
</Text>
{getTokenLabel(token.denom, token.symbol)}
</Text>
<TokenImageRender logo={token.logo} />
</Flex>
))}
</div>
);
25 changes: 4 additions & 21 deletions src/lib/pages/proposal-details/components/DepositList.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { Flex, Text } from "@chakra-ui/react";
import { Flex } from "@chakra-ui/react";

import { useMobile } from "lib/app-provider";
import { ExplorerLink } from "lib/components/ExplorerLink";
import { TokenImageRender } from "lib/components/token";
import type { ProposalDeposit } from "lib/types";
import { formatUTokenWithPrecision, getTokenLabel } from "lib/utils";

import { DepositAmounts } from "./DepositAmounts";

interface DepositListProps {
proposalDeposits: ProposalDeposit[];
Expand All @@ -27,24 +27,7 @@ export const DepositList = ({ proposalDeposits }: DepositListProps) => {
type="user_address"
showCopyOnHover={!isMobile}
/>
<div>
{deposit.amount.map((token) => (
<Flex key={token.denom} alignItems="center" gap={2}>
<Text variant="body2">
<Text as="span" fontWeight={700} mr={1}>
{formatUTokenWithPrecision(
token.amount,
token.precision ?? 0,
true,
2
)}
</Text>
{getTokenLabel(token.denom, token.symbol)}
</Text>
<TokenImageRender logo={token.logo} />
</Flex>
))}
</div>
<DepositAmounts deposit={deposit} />
</Flex>
))}
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export const ProgressBar = ({ value, max, isCompact }: ProgressBarProps) => {
<Box py={1} h={isCompact ? "28px" : "30px"} w="full">
<Flex
h="full"
w={isCompact ? "full" : "90%"}
w="full"
bgColor="gray.700"
borderRadius={10}
align="center"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,12 @@ export const DepositBar = ({
return (
<Flex direction="column" gap="2px" w="full">
{pairDeposit.map(({ current, min }) => (
<Flex key={min.denom} direction={isCompact ? "column" : "row"} w="full">
<Flex
key={min.denom}
direction={isCompact ? "column" : "row"}
w="full"
gap={isCompact ? 0 : 4}
>
<ProgressBar
value={current.amount}
max={min.amount}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,31 @@
import { Flex, Text } from "@chakra-ui/react";
import { Box, Flex, Grid, Text } from "@chakra-ui/react";

import { DepositBar } from "../../deposit-bar";
import { DepositList } from "../../DepositList";
import { ErrorFetchingProposalInfos } from "../../ErrorFetchingProposalInfos";
import type { ProposalOverviewProps } from "../../proposal-overview";
import { useMobile } from "lib/app-provider";
import { CustomIcon } from "lib/components/icon";
import { Loading } from "lib/components/Loading";
import { TableTitle } from "lib/components/table";
import { Tooltip } from "lib/components/Tooltip";
import { extractParams } from "lib/pages/proposal-details/utils";

export const DepositPeriodSection = () => {
import { DepositorsTable } from "./depositors-table";

export const DepositPeriodSection = ({
proposalData,
params,
isLoading,
}: ProposalOverviewProps) => {
const isMobile = useMobile();

if (isLoading) return <Loading my={0} />;

if (!params) return <ErrorFetchingProposalInfos isParamsOnly />;

const { minDeposit } = extractParams(params, proposalData.isExpedited);

return (
<Flex
direction="column"
Expand All @@ -17,30 +36,56 @@ export const DepositPeriodSection = () => {
p={isMobile ? 0 : 6}
gap={4}
>
{!isMobile && (
<Flex alignItems="center" justifyContent="space-between">
<TableTitle title="Depositors" mb={0} />
<Tooltip
label="After reaching the total deposit amount, the proposal proceeds to the voting period."
closeOnClick={false}
>
<Flex alignItems="center" gap={1}>
<Text variant="body2" color="text.dark">
Total Deposited
<CustomIcon
name="info-circle-solid"
color="gray.600"
boxSize={3}
/>
</Text>
{isMobile ? (
<>
<DepositBar
deposit={proposalData.totalDeposit}
minDeposit={minDeposit}
isCompact
/>
<DepositList proposalDeposits={proposalData.proposalDeposits} />
</>
) : (
<>
<Grid templateColumns="1fr 1fr minmax(300px, 3fr)">
<TableTitle
title="Depositors"
mb={0}
count={proposalData.proposalDeposits.length}
/>
<Box />
<Flex alignContent="center">
<Tooltip
label="After reaching the total deposit amount, the proposal proceeds to the voting period."
closeOnClick={false}
>
<Text
variant="body2"
color="text.dark"
fontWeight={500}
whiteSpace="nowrap"
lineHeight={1.8}
pt={1}
>
Total Deposited
<CustomIcon
name="info-circle-solid"
color="gray.600"
boxSize={3}
my={0}
/>
</Text>
</Tooltip>
<DepositBar
deposit={proposalData.totalDeposit}
minDeposit={minDeposit}
isCompact={false}
/>
</Flex>
</Tooltip>
</Flex>
</Grid>
<DepositorsTable depositors={proposalData.proposalDeposits} />
</>
)}
Depositor Tables Lorem ipsum dolor sit amet consectetur adipisicing elit.
Porro, soluta in molestias saepe vero possimus ullam tempora eum vitae
provident corporis ab eligendi non facilis quae consequatur beatae quo.
Nostrum!
</Flex>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import type { GridProps } from "@chakra-ui/react";
import { Grid } from "@chakra-ui/react";

import { TableHeader } from "lib/components/table";

interface DepositorsTableHeaderProps {
templateColumns: GridProps["templateColumns"];
}

export const DepositorsTableHeader = ({
templateColumns,
}: DepositorsTableHeaderProps) => (
<Grid templateColumns={templateColumns} minW="min-content">
<TableHeader>Depositor</TableHeader>
<TableHeader>Transaction Hash</TableHeader>
<TableHeader>Timestamp</TableHeader>
<TableHeader textAlign="right">Deposited Amount</TableHeader>
</Grid>
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { Flex, Grid, Text } from "@chakra-ui/react";

import { DepositAmounts } from "../../../DepositAmounts";
import { ExplorerLink } from "lib/components/ExplorerLink";
import { TableRow } from "lib/components/table";
import type { ProposalDeposit } from "lib/types";
import { dateFromNow, formatUTC } from "lib/utils";

interface DepositorsTableRowProps {
proposalDeposit: ProposalDeposit;
templateColumns: string;
}

export const DepositorsTableRow = ({
proposalDeposit,
templateColumns,
}: DepositorsTableRowProps) => (
<Grid templateColumns={templateColumns} minW="min-content">
<TableRow>
<ExplorerLink type="user_address" value={proposalDeposit.depositor} />
</TableRow>
<TableRow>
{proposalDeposit.txHash ? (
<ExplorerLink
type="tx_hash"
value={proposalDeposit.txHash.toUpperCase()}
/>
) : (
<Text variant="body3" textColor="text.dark">
N/A
</Text>
)}
</TableRow>
<TableRow>
{proposalDeposit.timestamp ? (
<Flex direction="column">
<Text variant="body3">{formatUTC(proposalDeposit.timestamp)}</Text>
<Text variant="body3" color="text.dark" mt="2px">
({dateFromNow(proposalDeposit.timestamp)})
</Text>
</Flex>
) : (
<Text variant="body3" color="text.dark">
N/A
</Text>
)}
</TableRow>
<TableRow justifyContent="flex-end">
<DepositAmounts deposit={proposalDeposit} />
</TableRow>
</Grid>
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { TableContainer } from "@chakra-ui/react";

import { EmptyState } from "lib/components/state";
import type { ProposalDeposit } from "lib/types";

import { DepositorsTableHeader } from "./DepositorsTableHeader";
import { DepositorsTableRow } from "./DepositorsTableRow";

interface DepositorsTableProps {
depositors: ProposalDeposit[];
}

const templateColumns = `1.5fr 1.5fr 2fr 1fr`;

export const DepositorsTable = ({ depositors }: DepositorsTableProps) => {
if (depositors.length === 0)
return <EmptyState message="The proposal has no depositors yet." />;

return (
<TableContainer>
<DepositorsTableHeader templateColumns={templateColumns} />
{depositors.map((each) => (
<DepositorsTableRow
key={each.depositor}
proposalDeposit={each}
templateColumns={templateColumns}
/>
))}
</TableContainer>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -79,14 +79,14 @@ export const VoteDetails = ({
allowToggle
w="full"
variant="transparent"
index={[periodTabIndex]}
defaultIndex={[periodTabIndex]}
>
<VoteDetailsAccordionItem
step={1}
proposalData={proposalData}
onClick={handleTabChange(PeriodIndex.Deposit)}
>
<DepositPeriodSection />
<DepositPeriodSection proposalData={proposalData} {...props} />
</VoteDetailsAccordionItem>
<VoteDetailsAccordionItem
step={2}
Expand Down Expand Up @@ -126,7 +126,7 @@ export const VoteDetails = ({
borderRadius="0px 0px 8px 8px"
>
<TabPanel>
<DepositPeriodSection />
<DepositPeriodSection proposalData={proposalData} {...props} />
</TabPanel>
<TabPanel>
<VotingPeriod proposalData={proposalData} {...props} />
Expand Down

0 comments on commit 769fe71

Please sign in to comment.