From a4d9b43f9e282543534c11270bba8b978fcc90f4 Mon Sep 17 00:00:00 2001 From: Jennie Alles Date: Thu, 11 Jan 2024 16:28:13 +0700 Subject: [PATCH 1/4] feat(components): add delegation to contract detail --- CHANGELOG.md | 1 + public/PilatWide-Bold.woff2 | Bin 23940 -> 0 bytes public/validator.svg | 6 -- src/lib/components/TotalValue.tsx | 8 +- src/lib/components/ValidatorBadge.tsx | 6 +- .../components/delegations/DelegationInfo.tsx | 16 +-- .../delegations/DelegationsBody.tsx | 5 +- .../delegations/NonRedelegatableSection.tsx | 7 +- .../delegations/RedelegationsSection.tsx | 8 +- .../components/delegations/index.tsx | 2 +- .../radio-card/MultiBondsRadioCard.tsx | 0 .../radio-card/SingleBondRadioCard.tsx | 0 .../delegations/radio-card/index.tsx | 0 .../delegations/total-card/MultiBondsCard.tsx | 0 .../delegations/total-card/OverviewCard.tsx | 0 .../delegations/total-card/TotalCardModal.tsx | 0 .../delegations/total-card/TotalCardTop.tsx | 0 .../delegations/total-card/index.tsx | 0 .../single-bond-card/SingleBondCardBody.tsx | 0 .../SingleBondCardBodyMulti.tsx | 0 .../SingleBondCardBodySingle.tsx | 0 .../total-card/single-bond-card/index.tsx | 0 .../tables => components/table}/TokenCell.tsx | 0 .../table}/bonded/BondedTableHeader.tsx | 2 +- .../table}/bonded/BondedTableMobileCard.tsx | 4 +- .../table}/bonded/BondedTableRow.tsx | 4 +- .../table}/bonded/DelegationsTable.tsx | 10 +- .../table}/bonded/TokensCell.tsx | 0 .../table}/bonded/UnbondingsTable.tsx | 10 +- .../table}/bonded/constants.ts | 0 .../table}/bonded/index.ts | 0 .../table}/bonded/types.ts | 0 src/lib/components/table/index.ts | 6 +- .../NonRedelegatableTableHeader.tsx | 2 +- .../NonRedelegatableTableMobileCard.tsx | 6 +- .../NonRedelegatableTableRow.tsx | 6 +- .../table}/non-redelegatable/index.tsx | 4 +- .../redelegation/RedelegationTableHeader.tsx | 2 +- .../RedelegationTableMobileCard.tsx | 8 +- .../redelegation/RedelegationTableRow.tsx | 6 +- .../table}/redelegation/index.tsx | 4 +- src/lib/model/account.ts | 17 +-- .../components/AccountHeader.tsx | 2 +- .../components/asset/AssetSectionContent.tsx | 5 +- .../components/asset/UserAssetInfoCard.tsx | 1 + .../components/asset/index.tsx | 12 ++- .../components/tables/index.ts | 3 - src/lib/pages/account-details/index.tsx | 98 ++++++++++-------- src/lib/pages/account-details/types.ts | 30 ------ .../components/ContractTop.tsx | 85 ++++++++------- .../SupportedTokensSection.tsx | 58 ----------- .../components/contract-balances/index.tsx | 52 ---------- .../components/contract-description/index.tsx | 8 +- src/lib/pages/contract-details/index.tsx | 67 +++++++++--- src/lib/pages/contract-details/types.ts | 1 + src/lib/types/delegation.ts | 31 ++++++ src/lib/types/index.ts | 1 + 57 files changed, 265 insertions(+), 339 deletions(-) delete mode 100644 public/PilatWide-Bold.woff2 delete mode 100644 public/validator.svg rename src/lib/{pages/account-details => }/components/delegations/DelegationInfo.tsx (91%) rename src/lib/{pages/account-details => }/components/delegations/DelegationsBody.tsx (91%) rename src/lib/{pages/account-details => }/components/delegations/NonRedelegatableSection.tsx (89%) rename src/lib/{pages/account-details => }/components/delegations/RedelegationsSection.tsx (88%) rename src/lib/{pages/account-details => }/components/delegations/index.tsx (99%) rename src/lib/{pages/account-details => }/components/delegations/radio-card/MultiBondsRadioCard.tsx (100%) rename src/lib/{pages/account-details => }/components/delegations/radio-card/SingleBondRadioCard.tsx (100%) rename src/lib/{pages/account-details => }/components/delegations/radio-card/index.tsx (100%) rename src/lib/{pages/account-details => }/components/delegations/total-card/MultiBondsCard.tsx (100%) rename src/lib/{pages/account-details => }/components/delegations/total-card/OverviewCard.tsx (100%) rename src/lib/{pages/account-details => }/components/delegations/total-card/TotalCardModal.tsx (100%) rename src/lib/{pages/account-details => }/components/delegations/total-card/TotalCardTop.tsx (100%) rename src/lib/{pages/account-details => }/components/delegations/total-card/index.tsx (100%) rename src/lib/{pages/account-details => }/components/delegations/total-card/single-bond-card/SingleBondCardBody.tsx (100%) rename src/lib/{pages/account-details => }/components/delegations/total-card/single-bond-card/SingleBondCardBodyMulti.tsx (100%) rename src/lib/{pages/account-details => }/components/delegations/total-card/single-bond-card/SingleBondCardBodySingle.tsx (100%) rename src/lib/{pages/account-details => }/components/delegations/total-card/single-bond-card/index.tsx (100%) rename src/lib/{pages/account-details/components/tables => components/table}/TokenCell.tsx (100%) rename src/lib/{pages/account-details/components/tables => components/table}/bonded/BondedTableHeader.tsx (91%) rename src/lib/{pages/account-details/components/tables => components/table}/bonded/BondedTableMobileCard.tsx (93%) rename src/lib/{pages/account-details/components/tables => components/table}/bonded/BondedTableRow.tsx (93%) rename src/lib/{pages/account-details/components/tables => components/table}/bonded/DelegationsTable.tsx (92%) rename src/lib/{pages/account-details/components/tables => components/table}/bonded/TokensCell.tsx (100%) rename src/lib/{pages/account-details/components/tables => components/table}/bonded/UnbondingsTable.tsx (93%) rename src/lib/{pages/account-details/components/tables => components/table}/bonded/constants.ts (100%) rename src/lib/{pages/account-details/components/tables => components/table}/bonded/index.ts (100%) rename src/lib/{pages/account-details/components/tables => components/table}/bonded/types.ts (100%) rename src/lib/{pages/account-details/components/tables => components/table}/non-redelegatable/NonRedelegatableTableHeader.tsx (88%) rename src/lib/{pages/account-details/components/tables => components/table}/non-redelegatable/NonRedelegatableTableMobileCard.tsx (82%) rename src/lib/{pages/account-details/components/tables => components/table}/non-redelegatable/NonRedelegatableTableRow.tsx (83%) rename src/lib/{pages/account-details/components/tables => components/table}/non-redelegatable/index.tsx (90%) rename src/lib/{pages/account-details/components/tables => components/table}/redelegation/RedelegationTableHeader.tsx (90%) rename src/lib/{pages/account-details/components/tables => components/table}/redelegation/RedelegationTableMobileCard.tsx (87%) rename src/lib/{pages/account-details/components/tables => components/table}/redelegation/RedelegationTableRow.tsx (88%) rename src/lib/{pages/account-details/components/tables => components/table}/redelegation/index.tsx (93%) delete mode 100644 src/lib/pages/contract-details/components/contract-balances/SupportedTokensSection.tsx delete mode 100644 src/lib/pages/contract-details/components/contract-balances/index.tsx create mode 100644 src/lib/types/delegation.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 972ba6e5c..c98ca88f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Features +- [#720](https://github.com/alleslabs/celatone-frontend/pull/720) Add delegations for contract detail - [#717](https://github.com/alleslabs/celatone-frontend/pull/717) Add total value for contract detail - [#681](https://github.com/alleslabs/celatone-frontend/pull/681) Add Initia wallet - [#704](https://github.com/alleslabs/celatone-frontend/pull/704) Fix client undefined after disconnected diff --git a/public/PilatWide-Bold.woff2 b/public/PilatWide-Bold.woff2 deleted file mode 100644 index d91e8f17ed077e5bd0208b11ae5ee12d56756c97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23940 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 - - - - - diff --git a/src/lib/components/TotalValue.tsx b/src/lib/components/TotalValue.tsx index ed410ce5c..0506fab4c 100644 --- a/src/lib/components/TotalValue.tsx +++ b/src/lib/components/TotalValue.tsx @@ -19,9 +19,9 @@ export const TotalValue = ({ {label} @@ -36,8 +36,8 @@ export const TotalValue = ({ /> ) : ( ; badgeSize?: ImageProps["boxSize"]; @@ -55,7 +55,7 @@ export const ValidatorBadge = ({ src={valImgSrc} alt={validator.moniker} borderRadius="50%" - fallbackSrc={validatorDefaultImg.src} + fallbackSrc="https://assets.alleslabs.dev/webapp-assets/placeholder/validator.svg" fallbackStrategy="beforeLoadOrError" /> )} diff --git a/src/lib/pages/account-details/components/delegations/DelegationInfo.tsx b/src/lib/components/delegations/DelegationInfo.tsx similarity index 91% rename from src/lib/pages/account-details/components/delegations/DelegationInfo.tsx rename to src/lib/components/delegations/DelegationInfo.tsx index d8671622a..736cb8634 100644 --- a/src/lib/pages/account-details/components/delegations/DelegationInfo.tsx +++ b/src/lib/components/delegations/DelegationInfo.tsx @@ -1,6 +1,7 @@ import { Button, Flex, Heading } from "@chakra-ui/react"; import type { MouseEventHandler } from "react"; +import { TableTitle } from "../table"; import { AmpEvent, track } from "lib/amplitude"; import { useMobile } from "lib/app-provider"; import { CustomIcon } from "lib/components/icon"; @@ -21,8 +22,9 @@ export const DelegationInfo = ({ onViewMore, }: DelegationInfoProps) => { const isMobile = useMobile(); - const isMobileOverview = isMobile && !!onViewMore; + const tableTitle = ; + return ( <> {isMobileOverview ? ( @@ -43,16 +45,8 @@ export const DelegationInfo = ({ ) : ( - - - Delegations - + + {tableTitle} ; const redelegationCount = redelegations?.length ?? 0; + return ( { if (error) return ; @@ -26,7 +28,8 @@ export const AssetSectionContent = ({ ) : ( - This address does not hold any supported assets + This {isAccount ? "address" : "contract"} does not hold any supported + assets ); }; diff --git a/src/lib/pages/account-details/components/asset/UserAssetInfoCard.tsx b/src/lib/pages/account-details/components/asset/UserAssetInfoCard.tsx index 00bf539c2..0b339a68f 100644 --- a/src/lib/pages/account-details/components/asset/UserAssetInfoCard.tsx +++ b/src/lib/pages/account-details/components/asset/UserAssetInfoCard.tsx @@ -22,6 +22,7 @@ export const UserAssetInfoCard = ({ {helperText} void; + isAccount?: boolean; } -export const AssetsSection = ({ address, onViewMore }: AssetsSectionProps) => { +export const AssetsSection = ({ + address, + onViewMore, + isAccount = false, +}: AssetsSectionProps) => { const isMobile = useMobile(); const isMobileOverview = isMobile && !!onViewMore; @@ -44,7 +49,7 @@ export const AssetsSection = ({ address, onViewMore }: AssetsSectionProps) => { @@ -65,7 +70,7 @@ export const AssetsSection = ({ address, onViewMore }: AssetsSectionProps) => { ) : ( <> - {isMobile && tableTitle} + {tableTitle} { )} - - - {accountData?.publicInfo?.description && ( - - - - - Public Account Description + + + {accountData?.publicInfo?.description && ( + + + + + Public Account Description + + + + {accountData.publicInfo.description} - - {accountData.publicInfo.description} - - - )} - - - - - - {!disableDelegation && ( + )} + + - - )} + {!disableDelegation && ( + + + + )}{" "} + )} - - + + - + diff --git a/src/lib/pages/account-details/types.ts b/src/lib/pages/account-details/types.ts index ae19c1066..b87e51fa0 100644 --- a/src/lib/pages/account-details/types.ts +++ b/src/lib/pages/account-details/types.ts @@ -1,7 +1,6 @@ import { z } from "zod"; import { zAddr } from "lib/types"; -import type { TokenWithValue, Validator } from "lib/types"; export enum TabIndex { Overview = "overview", @@ -26,32 +25,3 @@ export const zAccountDetailsQueryParams = z.object({ .transform(() => TabIndex.Overview), ]), }); - -export interface StakingParams { - unbondingTime: string; // e.g. "14 days" - maxEntries: number; - bondDenoms: TokenWithValue[]; -} - -export interface Delegation { - validator: Validator; - balances: TokenWithValue[]; -} - -export interface Unbonding { - validator: Validator; - completionTime: Date; - balances: TokenWithValue[]; -} - -export interface Redelegation { - srcValidator: Validator; - dstValidator: Validator; - completionTime: Date; - balances: TokenWithValue[]; -} - -export interface NonRedelegatable { - dstValidator: Validator; - completionTime: Date; -} diff --git a/src/lib/pages/contract-details/components/ContractTop.tsx b/src/lib/pages/contract-details/components/ContractTop.tsx index c13f6df47..379ce4b51 100644 --- a/src/lib/pages/contract-details/components/ContractTop.tsx +++ b/src/lib/pages/contract-details/components/ContractTop.tsx @@ -132,7 +132,7 @@ export const ContractTop = ({ > @@ -162,41 +162,30 @@ export const ContractTop = ({ {displayName} - - - Contract Address - - - - - - Label - - - {contract.label} - - - {publicInfo?.name && ( + + + Contract Address + + + + - Public Name + Label - {publicInfo.name} + {contract.label} - )} - {publicInfo?.github && ( - - )} + {publicInfo?.name && ( + + + Public Name + + + {publicInfo.name} + + + )} + {publicInfo?.github && ( + + )} + ; - isBalancesLoading: boolean; - supportedAssets: TokenWithValue[]; - onViewMore?: () => void; -} - -export const SupportedTokensSection = ({ - total, - isBalancesLoading, - supportedAssets, - onViewMore, -}: SupportedTokensSectionProps) => { - if (isBalancesLoading) return ; - if (!total) - return ( - - This contract does not hold any assets - - ); - return ( - <> - - {supportedAssets.slice(0, onViewMore ? 4 : undefined).map((balance) => ( - - ))} - - - {supportedAssets.length > 4 && onViewMore && ( - - )} - - ); -}; diff --git a/src/lib/pages/contract-details/components/contract-balances/index.tsx b/src/lib/pages/contract-details/components/contract-balances/index.tsx deleted file mode 100644 index 13747e5bf..000000000 --- a/src/lib/pages/contract-details/components/contract-balances/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { Flex, Heading } from "@chakra-ui/react"; - -import { UnsupportedTokensModal } from "lib/components/modal"; -import { ErrorFetching } from "lib/components/state/ErrorFetching"; -import { useBalanceInfos } from "lib/services/balanceService"; -import type { BechAddr32 } from "lib/types"; - -import { SupportedTokensSection } from "./SupportedTokensSection"; - -interface ContractBalancesProps { - contractAddress: BechAddr32; - amptrackPage?: string; - onViewMore?: () => void; -} - -export const ContractBalances = ({ - contractAddress, - amptrackPage, - onViewMore, -}: ContractBalancesProps) => { - const { supportedAssets, unsupportedAssets, isLoading, totalData, error } = - useBalanceInfos(contractAddress); - - if (error) return ; - - return ( - - - - Assets - - - - - - ); -}; diff --git a/src/lib/pages/contract-details/components/contract-description/index.tsx b/src/lib/pages/contract-details/components/contract-description/index.tsx index 1ccb30cc7..ab40c996e 100644 --- a/src/lib/pages/contract-details/components/contract-description/index.tsx +++ b/src/lib/pages/contract-details/components/contract-description/index.tsx @@ -22,13 +22,7 @@ export const ContractDesc = ({ const isMobile = useMobile(); return ( - + {publicInfo?.description && ( Overview - + Assets + + Delegations + Transactions & Histories @@ -122,17 +136,35 @@ const ContractDetailsBody = observer( - {/* Contract Description Section */} - - {/* Tokens Section */} - + + + + + + + + + {/* Query/Execute commands section */} - + + + + - + diff --git a/src/lib/pages/contract-details/types.ts b/src/lib/pages/contract-details/types.ts index c16229969..0d4ea39f7 100644 --- a/src/lib/pages/contract-details/types.ts +++ b/src/lib/pages/contract-details/types.ts @@ -5,6 +5,7 @@ import { zBechAddr32 } from "lib/types"; export enum TabIndex { Overview = "overview", Assets = "assets", + Delegations = "delegations", TxsHistories = "txs-histories", States = "states", } diff --git a/src/lib/types/delegation.ts b/src/lib/types/delegation.ts new file mode 100644 index 000000000..1b14e1df8 --- /dev/null +++ b/src/lib/types/delegation.ts @@ -0,0 +1,31 @@ +import type { TokenWithValue } from "./asset"; +import type { Validator } from "./validator"; + +export interface StakingParams { + unbondingTime: string; // e.g. "14 days" + maxEntries: number; + bondDenoms: TokenWithValue[]; +} + +export interface Delegation { + validator: Validator; + balances: TokenWithValue[]; +} + +export interface Unbonding { + validator: Validator; + completionTime: Date; + balances: TokenWithValue[]; +} + +export interface Redelegation { + srcValidator: Validator; + dstValidator: Validator; + completionTime: Date; + balances: TokenWithValue[]; +} + +export interface NonRedelegatable { + dstValidator: Validator; + completionTime: Date; +} diff --git a/src/lib/types/index.ts b/src/lib/types/index.ts index 5fbe9e10c..8f5860f74 100644 --- a/src/lib/types/index.ts +++ b/src/lib/types/index.ts @@ -10,6 +10,7 @@ export * from "./common"; export * from "./contract"; export * from "./contractState"; export * from "./converter"; +export * from "./delegation"; export * from "./json"; export * from "./LVPair"; export * from "./pool"; From 72838a8fe45eda4336846b6e989a2778019928ad Mon Sep 17 00:00:00 2001 From: Jennie Alles Date: Thu, 11 Jan 2024 16:48:39 +0700 Subject: [PATCH 2/4] fix(components): remove delegation badge --- src/lib/components/delegations/DelegationInfo.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib/components/delegations/DelegationInfo.tsx b/src/lib/components/delegations/DelegationInfo.tsx index 736cb8634..89a99c282 100644 --- a/src/lib/components/delegations/DelegationInfo.tsx +++ b/src/lib/components/delegations/DelegationInfo.tsx @@ -23,7 +23,9 @@ export const DelegationInfo = ({ }: DelegationInfoProps) => { const isMobile = useMobile(); const isMobileOverview = isMobile && !!onViewMore; - const tableTitle = ; + const tableTitle = ( + + ); return ( <> From af470f9c7c8a9ce5368fbd7c49ef739627ad49df Mon Sep 17 00:00:00 2001 From: Jennie Alles Date: Mon, 15 Jan 2024 15:35:20 +0700 Subject: [PATCH 3/4] fix(components): fix as comment --- src/lib/components/delegations/DelegationInfo.tsx | 5 +---- src/lib/pages/contract-details/index.tsx | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/lib/components/delegations/DelegationInfo.tsx b/src/lib/components/delegations/DelegationInfo.tsx index 89a99c282..73ca25443 100644 --- a/src/lib/components/delegations/DelegationInfo.tsx +++ b/src/lib/components/delegations/DelegationInfo.tsx @@ -23,9 +23,6 @@ export const DelegationInfo = ({ }: DelegationInfoProps) => { const isMobile = useMobile(); const isMobileOverview = isMobile && !!onViewMore; - const tableTitle = ( - - ); return ( <> @@ -48,7 +45,7 @@ export const DelegationInfo = ({ ) : ( - {tableTitle} + Date: Tue, 16 Jan 2024 13:35:59 +0700 Subject: [PATCH 4/4] fix(components): fix changelog --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bd7adde4..fd2dc3b6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Features +- [#720](https://github.com/alleslabs/celatone-frontend/pull/720) Add delegations for contract detail - [#684](https://github.com/alleslabs/celatone-frontend/pull/684) Add nft page - [#717](https://github.com/alleslabs/celatone-frontend/pull/717) Add total value for contract detail - [#711](https://github.com/alleslabs/celatone-frontend/pull/711) Refactor assetInfos and add movePoolInfos to tx details @@ -60,8 +61,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Features -- [#720](https://github.com/alleslabs/celatone-frontend/pull/720) Add delegations for contract detail -- [#717](https://github.com/alleslabs/celatone-frontend/pull/717) Add total value for contract detail - [#681](https://github.com/alleslabs/celatone-frontend/pull/681) Add Initia wallet - [#704](https://github.com/alleslabs/celatone-frontend/pull/704) Fix client undefined after disconnected - [#698](https://github.com/alleslabs/celatone-frontend/pull/698) Add ledger