From 1c20d5ac5c7e62f2bc569da258612245e7054537 Mon Sep 17 00:00:00 2001 From: songwongtp <16089160+songwongtp@users.noreply.github.com> Date: Mon, 1 Jul 2024 16:32:54 +0700 Subject: [PATCH 1/2] feat: module info lcd --- CHANGELOG.md | 1 + .../module-details/components/ModuleInfo.tsx | 19 ++++--- .../components/ModuleInfoBody.tsx | 51 +++++++++---------- src/lib/pages/module-details/index.tsx | 15 +++--- src/lib/services/move/module/api.ts | 10 ++-- src/lib/services/move/module/index.ts | 10 ++-- src/lib/services/types/move/module.ts | 9 ++-- src/lib/types/move/module.ts | 2 +- 8 files changed, 60 insertions(+), 57 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d5313781..26225ea1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -80,6 +80,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Improvements +- [#1000](https://github.com/alleslabs/celatone-frontend/pull/1000) Query module info from lcd directly - [#998](https://github.com/alleslabs/celatone-frontend/pull/998) Use expression on Nft query - [#996](https://github.com/alleslabs/celatone-frontend/pull/996) Allow disable voting period tally config - [#960](https://github.com/alleslabs/celatone-frontend/pull/960) Adjust UI in contract and account detail page diff --git a/src/lib/pages/module-details/components/ModuleInfo.tsx b/src/lib/pages/module-details/components/ModuleInfo.tsx index 8e4ed539f..e11638866 100644 --- a/src/lib/pages/module-details/components/ModuleInfo.tsx +++ b/src/lib/pages/module-details/components/ModuleInfo.tsx @@ -3,19 +3,22 @@ import { Flex, Heading, Text } from "@chakra-ui/react"; import { CustomIcon } from "lib/components/icon"; import { ModuleSourceCode } from "lib/components/module"; import type { ModuleVerificationInternal } from "lib/services/types"; -import type { ModuleData, Nullable, Option } from "lib/types"; +import type { + IndexedModule, + ModulePublishInfo, + Nullish, + Option, +} from "lib/types"; import { ModuleInfoBody } from "./ModuleInfoBody"; export interface ModuleInfoProps { - verificationData: Option>; - moduleData: Partial; + indexedModule: IndexedModule; + modulePublishInfo: Option; + verificationData: Nullish; } -export const ModuleInfo = ({ - verificationData, - moduleData, -}: ModuleInfoProps) => ( +export const ModuleInfo = ({ verificationData, ...props }: ModuleInfoProps) => ( @@ -31,7 +34,7 @@ export const ModuleInfo = ({ )} - + ); diff --git a/src/lib/pages/module-details/components/ModuleInfoBody.tsx b/src/lib/pages/module-details/components/ModuleInfoBody.tsx index 0277e4185..242e1d3ae 100644 --- a/src/lib/pages/module-details/components/ModuleInfoBody.tsx +++ b/src/lib/pages/module-details/components/ModuleInfoBody.tsx @@ -3,41 +3,38 @@ import { Grid } from "@chakra-ui/react"; import { useTierConfig } from "lib/app-provider"; import { ExplorerLink } from "lib/components/ExplorerLink"; import { LabelText } from "lib/components/LabelText"; -import type { ModuleData } from "lib/types"; import { dateFromNow, formatUTC } from "lib/utils"; import type { ModuleInfoProps } from "./ModuleInfo"; const ModuleInfoBodyPublishedAndRepublished = ({ - moduleData, -}: { - moduleData: Partial; -}) => { - const { isRepublished, recentPublishTransaction, recentPublishProposal } = - moduleData; - const labelPrefix = isRepublished ? "Latest Republished" : "Published"; + modulePublishInfo, +}: Pick) => { + const labelPrefix = modulePublishInfo?.isRepublished + ? "Latest Republished" + : "Published"; - if (recentPublishTransaction) { + if (modulePublishInfo?.recentPublishTransaction) { return ( ); } - if (recentPublishProposal) { + if (modulePublishInfo?.recentPublishProposal) { return ( @@ -48,15 +45,11 @@ const ModuleInfoBodyPublishedAndRepublished = ({ }; export const ModuleInfoBody = ({ - moduleData, + indexedModule, + modulePublishInfo, }: Omit) => { const isFullTier = useTierConfig() === "full"; - const { - address, - upgradePolicy, - recentPublishBlockHeight, - recentPublishBlockTimestamp, - } = moduleData; + const { address, upgradePolicy } = indexedModule; return ( {isFullTier && ( <> - {recentPublishBlockTimestamp && ( + {modulePublishInfo?.recentPublishBlockTimestamp && ( - {recentPublishBlockHeight ? ( + {modulePublishInfo?.recentPublishBlockHeight ? ( ) : ( @@ -94,7 +91,9 @@ export const ModuleInfoBody = ({ )} )} - + )} diff --git a/src/lib/pages/module-details/index.tsx b/src/lib/pages/module-details/index.tsx index 8e8d735f2..99c7b78ff 100644 --- a/src/lib/pages/module-details/index.tsx +++ b/src/lib/pages/module-details/index.tsx @@ -14,7 +14,7 @@ import { UserDocsLink } from "lib/components/UserDocsLink"; import { useFormatAddresses } from "lib/hooks/useFormatAddresses"; import { useModuleByAddressLcd, - useModuleData, + useModulePublishInfo, useModuleTableCounts, useVerifyModule, } from "lib/services/move/module"; @@ -50,13 +50,13 @@ const ModuleDetailsBody = ({ const isFullTier = useTierConfig() === "full"; const currentTab = !isFullTier && tab === TabIndex.TxsHistories ? TabIndex.Overview : tab; - const fullData = useModuleData(vmAddress, moduleName, isFullTier); - const liteData = useModuleByAddressLcd({ + + const { data, isLoading: isModuleLoading } = useModuleByAddressLcd({ address: vmAddress, moduleName, - options: { enabled: !isFullTier }, }); - const { data, isLoading } = isFullTier ? fullData : liteData; + const { data: modulePublishInfo, isFetching: isPublishInfoLoading } = + useModulePublishInfo(vmAddress, moduleName, isFullTier); const { data: moduleTableCounts } = useModuleTableCounts( vmAddress, @@ -115,7 +115,7 @@ const ModuleDetailsBody = ({ ? Object.values(TabIndex) : Object.values(TabIndex).filter((t) => t !== TabIndex.TxsHistories); - if (isLoading) return ; + if (isModuleLoading || isPublishInfoLoading) return ; if (!data) return ; return ( @@ -187,8 +187,9 @@ const ModuleDetailsBody = ({ }} /> {isFullTier && ( parseWithError(zModulesResponse, data)); -export const getModuleData = async ( +export const getModulePublishInfo = async ( endpoint: string, vmAddress: HexAddr, moduleName: string, isGov: boolean -): Promise => +): Promise => axios .get(`${endpoint}/${encodeURI(vmAddress)}/${encodeURI(moduleName)}/info`, { params: { is_gov: isGov, }, }) - .then(({ data }) => parseWithError(zModuleDataResponse, data)); + .then(({ data }) => parseWithError(zModulePublishInfoResponse, data)); export const getModuleTableCounts = async ( endpoint: string, diff --git a/src/lib/services/move/module/index.ts b/src/lib/services/move/module/index.ts index b3d5fba1e..c056b5a41 100644 --- a/src/lib/services/move/module/index.ts +++ b/src/lib/services/move/module/index.ts @@ -31,7 +31,7 @@ import type { ExposedFunction, HexAddr, IndexedModule, - ModuleData, + ModulePublishInfo, Nullable, Option, RpcQueryError, @@ -42,8 +42,8 @@ import { decodeModule, decodeScript, getFunctionView, - getModuleData, getModuleHistories, + getModulePublishInfo, getModuleRelatedProposals, getModules, getModulesByAddress, @@ -251,7 +251,7 @@ export const useModules = ( ); }; -export const useModuleData = ( +export const useModulePublishInfo = ( vmAddress: HexAddr, moduleName: string, enabled = true @@ -259,7 +259,7 @@ export const useModuleData = ( const endpoint = useBaseApiRoute("modules"); const govConfig = useGovConfig({ shouldRedirect: false }); - return useQuery( + return useQuery( [ CELATONE_QUERY_KEYS.MODULE_DATA, endpoint, @@ -268,7 +268,7 @@ export const useModuleData = ( govConfig.enabled, ], async () => - getModuleData(endpoint, vmAddress, moduleName, govConfig.enabled), + getModulePublishInfo(endpoint, vmAddress, moduleName, govConfig.enabled), { retry: 1, refetchOnWindowFocus: false, diff --git a/src/lib/services/types/move/module.ts b/src/lib/services/types/move/module.ts index 2193f4b8c..2f408e0e3 100644 --- a/src/lib/services/types/move/module.ts +++ b/src/lib/services/types/move/module.ts @@ -6,8 +6,8 @@ import type { HexAddr, IndexedModule, ModuleAbi, - ModuleData, ModuleInfo, + ModulePublishInfo, Option, } from "lib/types"; import { @@ -84,8 +84,8 @@ export const zModulesResponse = z.object({ }); export type ModulesResponse = z.infer; -export const zModuleDataResponse = zBaseModuleLcd - .extend({ +export const zModulePublishInfoResponse = z + .object({ recent_publish_transaction: z.string().nullable(), recent_publish_proposal: zProposal .pick({ id: true, title: true }) @@ -95,9 +95,8 @@ export const zModuleDataResponse = zBaseModuleLcd recent_publish_block_timestamp: zUtcDate, is_republished: z.boolean(), }) - .transform((val) => ({ + .transform((val) => ({ ...snakeToCamel(val), - ...indexModuleAbi(val.abi), recentPublishTransaction: val.recent_publish_transaction ? parseTxHash(val.recent_publish_transaction) : null, diff --git a/src/lib/types/move/module.ts b/src/lib/types/move/module.ts index b1a9c2667..0459b5aaf 100644 --- a/src/lib/types/move/module.ts +++ b/src/lib/types/move/module.ts @@ -31,7 +31,7 @@ export interface ModuleInfo isVerified?: boolean; } -export interface ModuleData extends IndexedModule { +export interface ModulePublishInfo { recentPublishTransaction: Nullable; recentPublishProposal: Nullable>; recentPublishBlockHeight: number; From 883716cffd1adbcd5c7e3610dbd74bdeefc9fcdc Mon Sep 17 00:00:00 2001 From: songwongtp <16089160+songwongtp@users.noreply.github.com> Date: Mon, 1 Jul 2024 16:44:12 +0700 Subject: [PATCH 2/2] fix: link path --- src/lib/services/move/module/api.ts | 13 ++++++++----- src/lib/services/types/move/module.ts | 5 ++--- src/lib/types/move/module.ts | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/lib/services/move/module/api.ts b/src/lib/services/move/module/api.ts index 9dca6bda5..acb10c1df 100644 --- a/src/lib/services/move/module/api.ts +++ b/src/lib/services/move/module/api.ts @@ -105,11 +105,14 @@ export const getModulePublishInfo = async ( isGov: boolean ): Promise => axios - .get(`${endpoint}/${encodeURI(vmAddress)}/${encodeURI(moduleName)}/info`, { - params: { - is_gov: isGov, - }, - }) + .get( + `${endpoint}/${encodeURI(vmAddress)}/${encodeURI(moduleName)}/publish_info`, + { + params: { + is_gov: isGov, + }, + } + ) .then(({ data }) => parseWithError(zModulePublishInfoResponse, data)); export const getModuleTableCounts = async ( diff --git a/src/lib/services/types/move/module.ts b/src/lib/services/types/move/module.ts index 2f408e0e3..e06bf8f85 100644 --- a/src/lib/services/types/move/module.ts +++ b/src/lib/services/types/move/module.ts @@ -89,8 +89,7 @@ export const zModulePublishInfoResponse = z recent_publish_transaction: z.string().nullable(), recent_publish_proposal: zProposal .pick({ id: true, title: true }) - .nullish() - .default(null), + .nullish(), recent_publish_block_height: z.number().nonnegative(), recent_publish_block_timestamp: zUtcDate, is_republished: z.boolean(), @@ -105,7 +104,7 @@ export const zModulePublishInfoResponse = z export const zModuleTableCountsResponse = z.object({ txs: z.number().nonnegative().nullable(), histories: z.number().nonnegative().nullable(), - proposals: z.number().nonnegative().nullish().default(null), + proposals: z.number().nonnegative().nullish(), }); export type ModuleTableCountsResponse = z.infer< typeof zModuleTableCountsResponse diff --git a/src/lib/types/move/module.ts b/src/lib/types/move/module.ts index 0459b5aaf..0e423ea27 100644 --- a/src/lib/types/move/module.ts +++ b/src/lib/types/move/module.ts @@ -33,7 +33,7 @@ export interface ModuleInfo export interface ModulePublishInfo { recentPublishTransaction: Nullable; - recentPublishProposal: Nullable>; + recentPublishProposal?: Nullable>; recentPublishBlockHeight: number; recentPublishBlockTimestamp: Date; isRepublished: boolean;