From f9ed6c859edc704469ca8bef890b902788554f05 Mon Sep 17 00:00:00 2001 From: songwongtp <16089160+songwongtp@users.noreply.github.com> Date: Mon, 29 Apr 2024 15:18:36 +0700 Subject: [PATCH 1/7] feat: recent code lite --- CHANGELOG.md | 1 + src/config/chain/terra.ts | 2 +- src/lib/components/LoadNext.tsx | 32 +++++ src/lib/components/modal/code/SaveNewCode.tsx | 16 +-- src/lib/components/select-code/CodeSelect.tsx | 12 +- .../select-code/CodeSelectSection.tsx | 4 +- src/lib/model/code.ts | 2 +- src/lib/pages/account-details/data.ts | 2 +- .../components/code-info/CodeInfoSection.tsx | 2 +- .../components/code-info/CodeTopInfo.tsx | 2 +- src/lib/pages/code-details/index.tsx | 2 +- .../codes/components/RecentCodesTable.tsx | 91 ------------- .../codes/components/RecentCodesTableFull.tsx | 109 +++++++++++++++ .../codes/components/RecentCodesTableLite.tsx | 62 +++++++++ src/lib/pages/codes/data.ts | 18 ++- src/lib/pages/codes/index.tsx | 33 +---- src/lib/pages/instantiate/instantiate.tsx | 14 +- .../migrate/components/MigrateContract.tsx | 14 +- src/lib/services/contractService.ts | 6 +- src/lib/services/contractState.ts | 8 +- src/lib/services/move/module.ts | 2 +- src/lib/services/searchService.ts | 2 +- src/lib/services/wasm/code/api.ts | 105 +++++++++++++++ .../{codeService.ts => wasm/code/gql.ts} | 82 +----------- src/lib/services/wasm/code/index.ts | 4 + src/lib/services/wasm/code/lcd.ts | 65 +++++++++ .../services/{code.ts => wasm/code/types.ts} | 124 +++++++----------- src/lib/types/rest.ts | 12 +- 28 files changed, 499 insertions(+), 329 deletions(-) create mode 100644 src/lib/components/LoadNext.tsx delete mode 100644 src/lib/pages/codes/components/RecentCodesTable.tsx create mode 100644 src/lib/pages/codes/components/RecentCodesTableFull.tsx create mode 100644 src/lib/pages/codes/components/RecentCodesTableLite.tsx create mode 100644 src/lib/services/wasm/code/api.ts rename src/lib/services/{codeService.ts => wasm/code/gql.ts} (52%) create mode 100644 src/lib/services/wasm/code/index.ts create mode 100644 src/lib/services/wasm/code/lcd.ts rename src/lib/services/{code.ts => wasm/code/types.ts} (58%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 107cdc706..8125115ef 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 +- [#900](https://github.com/alleslabs/celatone-frontend/pull/900) Support lite version recent codes - [#897](https://github.com/alleslabs/celatone-frontend/pull/897) Add config for lite version support ### Improvements diff --git a/src/config/chain/terra.ts b/src/config/chain/terra.ts index 93661dee6..f49b03908 100644 --- a/src/config/chain/terra.ts +++ b/src/config/chain/terra.ts @@ -9,7 +9,7 @@ export const TERRA_CHAIN_CONFIGS: ChainConfigs = { chain: "terra", registryChainName: "terra2testnet", prettyName: "Terra Testnet Lite", - lcd: "https://pisco-lcd.terra.dev:443", + lcd: "https://terra-testnet-api.polkachu.com", rpc: "https://terra-testnet-rpc.polkachu.com:443", indexer: "https://pisco-1-graphql.alleslabs.dev/v1/graphql", wallets: [...staionWallets, ...keplrWallets], diff --git a/src/lib/components/LoadNext.tsx b/src/lib/components/LoadNext.tsx new file mode 100644 index 000000000..d979d528d --- /dev/null +++ b/src/lib/components/LoadNext.tsx @@ -0,0 +1,32 @@ +import { Button, Flex, Spinner } from "@chakra-ui/react"; + +import { CustomIcon } from "./icon"; + +interface LoadNextProps { + text: string; + fetchNextPage: () => void; + isFetchingNextPage: boolean; +} + +export const LoadNext = ({ + text, + fetchNextPage, + isFetchingNextPage, +}: LoadNextProps) => ( + + {isFetchingNextPage ? ( + + ) : ( + + )} + +); diff --git a/src/lib/components/modal/code/SaveNewCode.tsx b/src/lib/components/modal/code/SaveNewCode.tsx index 33e1103de..072f5bbca 100644 --- a/src/lib/components/modal/code/SaveNewCode.tsx +++ b/src/lib/components/modal/code/SaveNewCode.tsx @@ -10,7 +10,7 @@ import { NumberInput, TextInput } from "lib/components/forms"; import { CustomIcon } from "lib/components/icon"; import { useGetMaxLengthError } from "lib/hooks"; import { useCodeStore } from "lib/providers/store"; -import { useLCDCodeInfo } from "lib/services/codeService"; +import { useCodeInfoLcd } from "lib/services/wasm/code"; import type { BechAddr } from "lib/types"; import { getNameAndDescriptionDefault, getPermissionHelper } from "lib/utils"; @@ -55,24 +55,24 @@ export function SaveNewCodeModal({ buttonProps }: SaveNewCodeModalProps) { const { isCodeIdSaved, saveNewCode, updateCodeInfo, getCodeLocalInfo } = useCodeStore(); - const { refetch, isFetching, isRefetching } = useLCDCodeInfo(codeId, { + const { refetch, isFetching, isRefetching } = useCodeInfoLcd(codeId, { enabled: false, retry: false, cacheTime: 0, onSuccess(data) { const { message, messageColor } = getPermissionHelper( address, - data.code_info.instantiate_permission.permission, - data.code_info.instantiate_permission.address - ? [data.code_info.instantiate_permission.address] - : data.code_info.instantiate_permission.addresses + data.codeInfo.instantiatePermission.permission, + data.codeInfo.instantiatePermission.address + ? [data.codeInfo.instantiatePermission.address] + : data.codeInfo.instantiatePermission.addresses ); setCodeIdStatus({ state: "success", - message: `${message} (${data.code_info.instantiate_permission.permission})`, + message: `${message} (${data.codeInfo.instantiatePermission.permission})`, messageColor, }); - setUploader(data.code_info.creator); + setUploader(data.codeInfo.creator); setUploaderStatus({ state: "success" }); }, onError() { diff --git a/src/lib/components/select-code/CodeSelect.tsx b/src/lib/components/select-code/CodeSelect.tsx index 381a1d4ac..54ff841bd 100644 --- a/src/lib/components/select-code/CodeSelect.tsx +++ b/src/lib/components/select-code/CodeSelect.tsx @@ -6,8 +6,8 @@ import { PermissionChip } from "../PermissionChip"; import type { FormStatus } from "lib/components/forms"; import { UploadIcon } from "lib/components/icon"; import { useCodeStore } from "lib/providers/store"; -import type { LCDCodeInfoSuccessCallback } from "lib/services/codeService"; -import { useLCDCodeInfo } from "lib/services/codeService"; +import { useCodeInfoLcd } from "lib/services/wasm/code"; +import type { CodeInfoResponseLcd } from "lib/services/wasm/code"; import { AccessConfigPermission } from "lib/types"; import { isId } from "lib/utils"; @@ -15,7 +15,7 @@ import { CodeSelectDrawerButton } from "./CodeSelectDrawerButton"; interface CodeSelectProps extends Omit { onCodeSelect: (code: string) => void; - setCodeHash?: LCDCodeInfoSuccessCallback; + setCodeHash?: (data: CodeInfoResponseLcd) => void; codeId: string; status: FormStatus; } @@ -29,7 +29,7 @@ export const CodeSelect = ({ }: CodeSelectProps) => { const { getCodeLocalInfo } = useCodeStore(); const name = getCodeLocalInfo(Number(codeId))?.name; - const { data: codeInfo } = useLCDCodeInfo(codeId, { + const { data: codeInfo } = useCodeInfoLcd(codeId, { onSuccess: setCodeHash, enabled: isId(codeId), }); @@ -66,11 +66,11 @@ export const CodeSelect = ({ diff --git a/src/lib/components/select-code/CodeSelectSection.tsx b/src/lib/components/select-code/CodeSelectSection.tsx index fa617b9f2..da57009ae 100644 --- a/src/lib/components/select-code/CodeSelectSection.tsx +++ b/src/lib/components/select-code/CodeSelectSection.tsx @@ -5,7 +5,7 @@ import type { Control, FieldPath, FieldValues } from "react-hook-form"; import { AmpEvent, track } from "lib/amplitude"; import { ControllerInput } from "lib/components/forms"; import type { FormStatus } from "lib/components/forms"; -import type { LCDCodeInfoSuccessCallback } from "lib/services/codeService"; +import type { CodeInfoResponseLcd } from "lib/services/wasm/code"; import type { Option } from "lib/types"; import { CodeSelect } from "./CodeSelect"; @@ -16,7 +16,7 @@ interface CodeSelectSectionProps { control: Control; error: Option; onCodeSelect: (codeId: string) => void; - setCodeHash?: LCDCodeInfoSuccessCallback; + setCodeHash?: (data: CodeInfoResponseLcd) => void; status: FormStatus; } diff --git a/src/lib/model/code.ts b/src/lib/model/code.ts index 8f2d0c455..71e87e457 100644 --- a/src/lib/model/code.ts +++ b/src/lib/model/code.ts @@ -11,7 +11,7 @@ import { useCodeStore } from "lib/providers/store"; import { useCodeListByCodeIds, useCodeListByWalletAddress, -} from "lib/services/codeService"; +} from "lib/services/wasm/code"; import type { CodeInfo } from "lib/types"; import { AccessConfigPermission } from "lib/types"; diff --git a/src/lib/pages/account-details/data.ts b/src/lib/pages/account-details/data.ts index 351f239e4..2e3071415 100644 --- a/src/lib/pages/account-details/data.ts +++ b/src/lib/pages/account-details/data.ts @@ -1,11 +1,11 @@ import { useCodeStore, useContractStore } from "lib/providers/store"; import { useAccountTableCounts } from "lib/services/accountService"; import { useBalances } from "lib/services/balanceService"; -import { useCodesByAddress } from "lib/services/codeService"; import { useAdminContractsByAddress, useInstantiatedContractsByAddress, } from "lib/services/contractService"; +import { useCodesByAddress } from "lib/services/wasm/code"; import type { BechAddr, CodeInfo, diff --git a/src/lib/pages/code-details/components/code-info/CodeInfoSection.tsx b/src/lib/pages/code-details/components/code-info/CodeInfoSection.tsx index 68de19b0f..30f520e10 100644 --- a/src/lib/pages/code-details/components/code-info/CodeInfoSection.tsx +++ b/src/lib/pages/code-details/components/code-info/CodeInfoSection.tsx @@ -17,7 +17,7 @@ import { JsonSchemaModal } from "lib/components/json-schema"; import { LabelText } from "lib/components/LabelText"; import { PermissionChip } from "lib/components/PermissionChip"; import { ViewPermissionAddresses } from "lib/components/ViewPermissionAddresses"; -import type { Code } from "lib/services/code"; +import type { Code } from "lib/services/wasm/code"; import type { Option } from "lib/types"; import { dateFromNow, formatUTC, getAddressTypeText } from "lib/utils"; diff --git a/src/lib/pages/code-details/components/code-info/CodeTopInfo.tsx b/src/lib/pages/code-details/components/code-info/CodeTopInfo.tsx index 26c3be207..0eca44fad 100644 --- a/src/lib/pages/code-details/components/code-info/CodeTopInfo.tsx +++ b/src/lib/pages/code-details/components/code-info/CodeTopInfo.tsx @@ -8,7 +8,7 @@ import { CustomIcon } from "lib/components/icon"; import { GitHubLink } from "lib/components/links"; import { PublicDescription } from "lib/components/PublicDescription"; import { useCodeStore } from "lib/providers/store"; -import type { Code } from "lib/services/code"; +import type { Code } from "lib/services/wasm/code"; import { AccessConfigPermission } from "lib/types"; import type { Nullable, ProjectInfo, PublicCodeInfo } from "lib/types"; import { getCw2Info } from "lib/utils"; diff --git a/src/lib/pages/code-details/index.tsx b/src/lib/pages/code-details/index.tsx index eb922eff5..0175316f2 100644 --- a/src/lib/pages/code-details/index.tsx +++ b/src/lib/pages/code-details/index.tsx @@ -16,7 +16,7 @@ import PageContainer from "lib/components/PageContainer"; import { ErrorFetching, InvalidState } from "lib/components/state"; import { UserDocsLink } from "lib/components/UserDocsLink"; import { useSchemaStore } from "lib/providers/store"; -import { useCodeDataByCodeId } from "lib/services/codeService"; +import { useCodeDataByCodeId } from "lib/services/wasm/code"; import { CodeContractsTable, CodeInfoSection } from "./components/code-info"; import { CodeTopInfo } from "./components/code-info/CodeTopInfo"; diff --git a/src/lib/pages/codes/components/RecentCodesTable.tsx b/src/lib/pages/codes/components/RecentCodesTable.tsx deleted file mode 100644 index 7c04515af..000000000 --- a/src/lib/pages/codes/components/RecentCodesTable.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import { observer } from "mobx-react-lite"; -import { useEffect } from "react"; - -import { useRecentCodes } from "../data"; -import { useCurrentChain, useInternalNavigate } from "lib/app-provider"; -import { Pagination } from "lib/components/pagination"; -import { usePaginator } from "lib/components/pagination/usePaginator"; -import { EmptyState, ErrorFetching } from "lib/components/state"; -import { CodesTable } from "lib/components/table"; -import type { PermissionFilterValue } from "lib/hooks"; - -interface RecentCodesTableProps { - permissionValue: PermissionFilterValue; -} - -export const RecentCodesTable = observer( - ({ permissionValue }: RecentCodesTableProps) => { - const navigate = useInternalNavigate(); - const { address } = useCurrentChain(); - - const { - pagesQuantity, - setTotalData, - currentPage, - setCurrentPage, - pageSize, - setPageSize, - offset, - } = usePaginator({ - initialState: { - pageSize: 10, - currentPage: 1, - isDisabled: false, - }, - }); - const { data, isLoading } = useRecentCodes( - pageSize, - offset, - address, - permissionValue, - setTotalData - ); - - const onRowSelect = (codeId: number) => - navigate({ - pathname: "/codes/[codeId]", - query: { codeId }, - }); - - useEffect(() => { - setCurrentPage(1); - setPageSize(10); - }, [permissionValue, setCurrentPage, setPageSize]); - - return ( - <> - - ) : ( - - ) - } - onRowSelect={onRowSelect} - /> - {data && data.total > 10 && ( - { - const size = Number(e.target.value); - setPageSize(size); - setCurrentPage(1); - }} - /> - )} - - ); - } -); diff --git a/src/lib/pages/codes/components/RecentCodesTableFull.tsx b/src/lib/pages/codes/components/RecentCodesTableFull.tsx new file mode 100644 index 000000000..87a9cd939 --- /dev/null +++ b/src/lib/pages/codes/components/RecentCodesTableFull.tsx @@ -0,0 +1,109 @@ +import { Box } from "@chakra-ui/react"; +import { observer } from "mobx-react-lite"; +import { useEffect } from "react"; +import { useForm } from "react-hook-form"; + +import { useRecentCodes } from "../data"; +import { useCurrentChain, useInternalNavigate } from "lib/app-provider"; +import { FilterByPermission } from "lib/components/forms"; +import { Pagination } from "lib/components/pagination"; +import { usePaginator } from "lib/components/pagination/usePaginator"; +import { EmptyState, ErrorFetching } from "lib/components/state"; +import { CodesTable } from "lib/components/table"; +import type { PermissionFilterValue } from "lib/hooks"; + +interface RecentCodesState { + permissionValue: PermissionFilterValue; +} + +export const RecentCodesTableFull = observer(() => { + const navigate = useInternalNavigate(); + const { address } = useCurrentChain(); + + const { watch, setValue } = useForm({ + defaultValues: { + permissionValue: "all", + }, + }); + const { permissionValue } = watch(); + + const { + pagesQuantity, + setTotalData, + currentPage, + setCurrentPage, + pageSize, + setPageSize, + offset, + } = usePaginator({ + initialState: { + pageSize: 10, + currentPage: 1, + isDisabled: false, + }, + }); + const { data, isLoading } = useRecentCodes( + pageSize, + offset, + address, + permissionValue, + setTotalData + ); + + const onRowSelect = (codeId: number) => + navigate({ + pathname: "/codes/[codeId]", + query: { codeId }, + }); + + useEffect(() => { + setCurrentPage(1); + setPageSize(10); + }, [permissionValue, setCurrentPage, setPageSize]); + + return ( + <> + + { + if (newVal === permissionValue) return; + setValue("permissionValue", newVal); + }} + /> + + + ) : ( + + ) + } + onRowSelect={onRowSelect} + /> + {data && data.total > 10 && ( + { + const size = Number(e.target.value); + setPageSize(size); + setCurrentPage(1); + }} + /> + )} + + ); +}); diff --git a/src/lib/pages/codes/components/RecentCodesTableLite.tsx b/src/lib/pages/codes/components/RecentCodesTableLite.tsx new file mode 100644 index 000000000..b4bc7c19e --- /dev/null +++ b/src/lib/pages/codes/components/RecentCodesTableLite.tsx @@ -0,0 +1,62 @@ +import { Alert, AlertDescription } from "@chakra-ui/react"; +import { observer } from "mobx-react-lite"; + +import { useRecentCodesLcd } from "../data"; +import { useInternalNavigate } from "lib/app-provider"; +import { LoadNext } from "lib/components/LoadNext"; +import { EmptyState, ErrorFetching } from "lib/components/state"; +import { CodesTable } from "lib/components/table"; + +export const RecentCodesTableLite = observer(() => { + const navigate = useInternalNavigate(); + + const { + data, + error, + fetchNextPage, + hasNextPage, + isLoading, + isFetchingNextPage, + } = useRecentCodesLcd(); + + const onRowSelect = (codeId: number) => + navigate({ + pathname: "/codes/[codeId]", + query: { codeId }, + }); + + return ( + <> + {data && !!error && ( + + + Error fetching data from LCD. Please refresh to try again. + + + )} + + ) : ( + + ) + } + onRowSelect={onRowSelect} + /> + {hasNextPage && ( + + )} + + ); +}); diff --git a/src/lib/pages/codes/data.ts b/src/lib/pages/codes/data.ts index 96b0d792f..560ab1d0c 100644 --- a/src/lib/pages/codes/data.ts +++ b/src/lib/pages/codes/data.ts @@ -1,6 +1,6 @@ import type { PermissionFilterValue } from "lib/hooks"; import { useCodeStore } from "lib/providers/store"; -import { useCodes } from "lib/services/codeService"; +import { useCodes, useCodesLcd } from "lib/services/wasm/code"; import type { BechAddr20, CodeInfo, Option } from "lib/types"; export const useRecentCodes = ( @@ -36,3 +36,19 @@ export const useRecentCodes = ( isLoading, }; }; + +export const useRecentCodesLcd = () => { + const { getCodeLocalInfo, isCodeIdSaved } = useCodeStore(); + const { data, ...rest } = useCodesLcd(); + + return { + data: data?.pages.flatMap((page) => + page.code_infos.map((code) => ({ + ...code, + name: getCodeLocalInfo(code.id)?.name, + isSaved: isCodeIdSaved(code.id), + })) + ), + ...rest, + }; +}; diff --git a/src/lib/pages/codes/index.tsx b/src/lib/pages/codes/index.tsx index 1f96364fe..162c135f5 100644 --- a/src/lib/pages/codes/index.tsx +++ b/src/lib/pages/codes/index.tsx @@ -1,33 +1,20 @@ -import { Box } from "@chakra-ui/react"; import { observer } from "mobx-react-lite"; import { useRouter } from "next/router"; import { useEffect } from "react"; -import { useForm } from "react-hook-form"; import { AmpEvent, track } from "lib/amplitude"; -import { useWasmConfig } from "lib/app-provider"; -import { FilterByPermission } from "lib/components/forms"; +import { useTierConfig, useWasmConfig } from "lib/app-provider"; import PageContainer from "lib/components/PageContainer"; import { PageHeader } from "lib/components/PageHeader"; -import type { PermissionFilterValue } from "lib/hooks"; -import { RecentCodesTable } from "./components/RecentCodesTable"; - -interface RecentCodesState { - permissionValue: PermissionFilterValue; -} +import { RecentCodesTableFull } from "./components/RecentCodesTableFull"; +import { RecentCodesTableLite } from "./components/RecentCodesTableLite"; const RecentCodes = observer(() => { useWasmConfig({ shouldRedirect: true }); + const tier = useTierConfig(); const router = useRouter(); - const { watch, setValue } = useForm({ - defaultValues: { - permissionValue: "all", - }, - }); - const { permissionValue } = watch(); - useEffect(() => { if (router.isReady) track(AmpEvent.TO_CODES); }, [router.isReady]); @@ -39,17 +26,7 @@ const RecentCodes = observer(() => { subtitle="This page displays all codes on this network sorted by recency" docHref="introduction/overview#recent-codes" /> - - { - if (newVal === permissionValue) return; - setValue("permissionValue", newVal); - }} - /> - - + {tier === "lite" ? : } ); }); diff --git a/src/lib/pages/instantiate/instantiate.tsx b/src/lib/pages/instantiate/instantiate.tsx index 3055596f8..9d1bc8034 100644 --- a/src/lib/pages/instantiate/instantiate.tsx +++ b/src/lib/pages/instantiate/instantiate.tsx @@ -47,8 +47,8 @@ import { UserDocsLink } from "lib/components/UserDocsLink"; import WasmPageContainer from "lib/components/WasmPageContainer"; import { useSchemaStore } from "lib/providers/store"; import { useTxBroadcast } from "lib/providers/tx-broadcast"; -import type { CodeIdInfoResponse } from "lib/services/code"; -import { useLCDCodeInfo } from "lib/services/codeService"; +import { useCodeInfoLcd } from "lib/services/wasm/code"; +import type { CodeInfoResponseLcd } from "lib/services/wasm/code"; import type { BechAddr, BechAddr20, ComposedMsg } from "lib/types"; import { MsgType } from "lib/types"; import { @@ -193,13 +193,13 @@ const Instantiate = ({ onComplete }: InstantiatePageProps) => { }, }); - const { refetch } = useLCDCodeInfo(codeId, { + const { refetch } = useCodeInfoLcd(codeId, { enabled: false, retry: false, cacheTime: 0, onSuccess(data) { - const permission = data.code_info.instantiate_permission; - setValue("codeHash", data.code_info.data_hash.toLowerCase()); + const permission = data.codeInfo.instantiatePermission; + setValue("codeHash", data.codeInfo.dataHash.toLowerCase()); if ( resolvePermission( address, @@ -417,8 +417,8 @@ const Instantiate = ({ onComplete }: InstantiatePageProps) => { setValue("codeId", code); resetMsgInputSchema(); }} - setCodeHash={(data: CodeIdInfoResponse) => { - setValue("codeHash", data.code_info.data_hash.toLowerCase()); + setCodeHash={(data: CodeInfoResponseLcd) => { + setValue("codeHash", data.codeInfo.dataHash.toLowerCase()); }} codeId={codeId} /> diff --git a/src/lib/pages/migrate/components/MigrateContract.tsx b/src/lib/pages/migrate/components/MigrateContract.tsx index 84355915e..0477f8762 100644 --- a/src/lib/pages/migrate/components/MigrateContract.tsx +++ b/src/lib/pages/migrate/components/MigrateContract.tsx @@ -27,8 +27,8 @@ import { import { CodeSelectSection } from "lib/components/select-code"; import { useSchemaStore } from "lib/providers/store"; import { useTxBroadcast } from "lib/providers/tx-broadcast"; -import type { CodeIdInfoResponse } from "lib/services/code"; -import { useLCDCodeInfo } from "lib/services/codeService"; +import type { CodeInfoResponseLcd } from "lib/services/wasm/code"; +import { useCodeInfoLcd } from "lib/services/wasm/code"; import type { BechAddr32, ComposedMsg } from "lib/types"; import { MsgType } from "lib/types"; import { composeMsg, isId, jsonValidate, resolvePermission } from "lib/utils"; @@ -120,13 +120,13 @@ export const MigrateContract = ({ }, }); - const { refetch } = useLCDCodeInfo(codeId, { + const { refetch } = useCodeInfoLcd(codeId, { enabled: false, retry: false, cacheTime: 0, onSuccess(data) { - const permission = data.code_info.instantiate_permission; - setValue("codeHash", data.code_info.data_hash.toLowerCase()); + const permission = data.codeInfo.instantiatePermission; + setValue("codeHash", data.codeInfo.dataHash.toLowerCase()); if ( resolvePermission( address, @@ -256,8 +256,8 @@ export const MigrateContract = ({ setValue("codeId", code); resetMsgInputSchema(); }} - setCodeHash={(data: CodeIdInfoResponse) => { - setValue("codeHash", data.code_info.data_hash.toLowerCase()); + setCodeHash={(data: CodeInfoResponseLcd) => { + setValue("codeHash", data.codeInfo.dataHash.toLowerCase()); }} codeId={codeId} /> diff --git a/src/lib/services/contractService.ts b/src/lib/services/contractService.ts index 99929040e..c6971e9c8 100644 --- a/src/lib/services/contractService.ts +++ b/src/lib/services/contractService.ts @@ -19,7 +19,6 @@ import { import type { ContractLocalInfo } from "lib/stores/contract"; import type { BechAddr, BechAddr20, BechAddr32, Dict, Option } from "lib/types"; -import { getCodeIdInfo } from "./code"; import { getAdminContractsByAddress, getContractDataByContractAddress, @@ -36,6 +35,7 @@ import type { ContractTableCounts, MigrationHistoriesResponse, } from "./contract"; +import { getCodeIdInfoLcd } from "./wasm/code"; export interface ContractDetail extends ContractLocalInfo { codeId: number; @@ -57,10 +57,10 @@ export const useContractDetailByContractAddress = ( .then(async ({ contracts_by_pk }) => { if (!contracts_by_pk) throw Error("Contract not found"); // TODO: retrieve code hash from gql instead when available - const codeHash = await getCodeIdInfo( + const codeHash = await getCodeIdInfoLcd( lcdEndpoint, contracts_by_pk.code_id - ).then((data) => data.code_info.data_hash); + ).then((data) => data.codeInfo.dataHash); return { contractAddress, codeId: contracts_by_pk.code_id, diff --git a/src/lib/services/contractState.ts b/src/lib/services/contractState.ts index 681239f27..9cd825340 100644 --- a/src/lib/services/contractState.ts +++ b/src/lib/services/contractState.ts @@ -1,7 +1,7 @@ import axios from "axios"; import { z } from "zod"; -import type { BechAddr32, ContractState } from "lib/types"; +import type { BechAddr32, ContractState, Option } from "lib/types"; import { zPagination } from "lib/types/rest"; import { libDecode, @@ -24,13 +24,13 @@ export const getContractStates = async ( baseEndpoint: string, contractAddress: BechAddr32, numStatesToLoad: number, - paginationKey: string | null + paginationKey: Option ) => { const states = await axios .get(`${baseEndpoint}/${contractAddress}/states`, { params: { limit: numStatesToLoad, - pagination_key: paginationKey, + "pagination.key": paginationKey, }, }) .then(({ data }) => parseWithError(zResponseContractStates, data)); @@ -44,6 +44,6 @@ export const getContractStates = async ( return { states: parsedStates, rawStates: states.models, - nextKey: states.pagination.next_key, + nextKey: states.pagination.nextKey, }; }; diff --git a/src/lib/services/move/module.ts b/src/lib/services/move/module.ts index 961d8ce6f..53b285759 100644 --- a/src/lib/services/move/module.ts +++ b/src/lib/services/move/module.ts @@ -60,7 +60,7 @@ export const getAccountModules = async ( }` ); result.push(...data.modules); - if (data.pagination.next_key) await fetchFn(data.pagination.next_key); + if (data.pagination.nextKey) await fetchFn(data.pagination.nextKey); }; await fetchFn(null); diff --git a/src/lib/services/searchService.ts b/src/lib/services/searchService.ts index 3d95d047c..a659568b2 100644 --- a/src/lib/services/searchService.ts +++ b/src/lib/services/searchService.ts @@ -20,7 +20,6 @@ import { } from "lib/utils"; import { useBlockData } from "./blockService"; -import { useCodeDataByCodeId } from "./codeService"; import { queryContract } from "./contract"; import { useAccountModules } from "./move/moduleService"; import { useAddressByICNSName, useICNSNamesByAddress } from "./nameService"; @@ -29,6 +28,7 @@ import { usePoolByPoolId } from "./poolService"; import { useProposalData } from "./proposalService"; import { useTxData } from "./txService"; import { useValidatorData } from "./validatorService"; +import { useCodeDataByCodeId } from "./wasm/code"; export type SearchResultType = | "Code ID" diff --git a/src/lib/services/wasm/code/api.ts b/src/lib/services/wasm/code/api.ts new file mode 100644 index 000000000..da3ae7f53 --- /dev/null +++ b/src/lib/services/wasm/code/api.ts @@ -0,0 +1,105 @@ +import type { UseQueryOptions, UseQueryResult } from "@tanstack/react-query"; +import { useQuery } from "@tanstack/react-query"; +import axios from "axios"; + +import { + CELATONE_QUERY_KEYS, + useBaseApiRoute, + useGovConfig, +} from "lib/app-provider"; +import type { BechAddr, BechAddr20, Option } from "lib/types"; +import { parseWithError } from "lib/utils"; + +import { zCodeData, zCodesResponse } from "./types"; +import type { CodeData, CodesResponse } from "./types"; + +const getCodes = async ( + endpoint: string, + limit: number, + offset: number, + address: Option, + permission: Option +): Promise => + axios + .get(`${endpoint}`, { + params: { + limit, + offset, + address, + permission, + }, + }) + .then(({ data }) => parseWithError(zCodesResponse, data)); + +export const useCodes = ( + limit: number, + offset: number, + address: Option, + permission: Option, + options?: Pick, "onSuccess"> +): UseQueryResult => { + const endpoint = useBaseApiRoute("codes"); + + return useQuery( + [CELATONE_QUERY_KEYS.CODES, endpoint, limit, offset, address, permission], + async () => getCodes(endpoint, limit, offset, address, permission), + { retry: 1, refetchOnWindowFocus: false, ...options } + ); +}; + +const getCodesByAddress = async ( + endpoint: string, + address: BechAddr, + limit: number, + offset: number +): Promise => + axios + .get(`${endpoint}/${encodeURIComponent(address)}/wasm/codes`, { + params: { + limit, + offset, + }, + }) + .then(({ data }) => zCodesResponse.parse(data)); + +export const useCodesByAddress = ( + address: BechAddr, + limit: number, + offset: number +): UseQueryResult => { + const endpoint = useBaseApiRoute("accounts"); + + return useQuery( + [CELATONE_QUERY_KEYS.CODES_BY_ADDRESS, endpoint, address, limit, offset], + async () => getCodesByAddress(endpoint, address, limit, offset), + { retry: 1, refetchOnWindowFocus: false } + ); +}; + +const getCodeDataByCodeId = async ( + endpoint: string, + codeId: number, + isGov: boolean +): Promise => + axios + .get(`${endpoint}/${codeId}/info`, { + params: { + is_gov: isGov, + }, + }) + .then(({ data }) => parseWithError(zCodeData, data)); + +export const useCodeDataByCodeId = (codeId: number, enabled = true) => { + const { enabled: isGov } = useGovConfig({ shouldRedirect: false }); + const endpoint = useBaseApiRoute("codes"); + + return useQuery( + [CELATONE_QUERY_KEYS.CODE_DATA, endpoint, codeId, isGov], + async () => getCodeDataByCodeId(endpoint, codeId, isGov), + { + retry: 1, + refetchOnWindowFocus: false, + enabled, + } + ); +}; diff --git a/src/lib/services/codeService.ts b/src/lib/services/wasm/code/gql.ts similarity index 52% rename from src/lib/services/codeService.ts rename to src/lib/services/wasm/code/gql.ts index 185ef9874..387aa7253 100644 --- a/src/lib/services/codeService.ts +++ b/src/lib/services/wasm/code/gql.ts @@ -1,14 +1,8 @@ -/* eslint-disable sonarjs/no-identical-functions */ -import type { UseQueryOptions, UseQueryResult } from "@tanstack/react-query"; +import type { UseQueryResult } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query"; import { useCallback } from "react"; -import { - CELATONE_QUERY_KEYS, - useBaseApiRoute, - useCelatoneApp, - useGovConfig, -} from "lib/app-provider"; +import { CELATONE_QUERY_KEYS, useCelatoneApp } from "lib/app-provider"; import { getCodeListByIDsQueryDocument, getCodeListByUserQueryDocument, @@ -21,15 +15,6 @@ import type { Option, PermissionAddresses, } from "lib/types"; -import { isId } from "lib/utils"; - -import type { CodeData, CodeIdInfoResponse, CodesResponse } from "./code"; -import { - getCodeDataByCodeId, - getCodeIdInfo, - getCodes, - getCodesByAddress, -} from "./code"; export const useCodeListByWalletAddress = ( walletAddr: Option @@ -107,66 +92,3 @@ export const useCodeListByCodeIds = ( } ); }; - -export const useCodeDataByCodeId = (codeId: number, enabled = true) => { - const { enabled: isGov } = useGovConfig({ shouldRedirect: false }); - const endpoint = useBaseApiRoute("codes"); - - return useQuery( - [CELATONE_QUERY_KEYS.CODE_DATA, endpoint, codeId, isGov], - async () => getCodeDataByCodeId(endpoint, codeId, isGov), - { - retry: 1, - refetchOnWindowFocus: false, - enabled, - } - ); -}; - -export const useCodes = ( - limit: number, - offset: number, - address: Option, - permission: Option, - options?: Pick, "onSuccess"> -): UseQueryResult => { - const endpoint = useBaseApiRoute("codes"); - - return useQuery( - [CELATONE_QUERY_KEYS.CODES, endpoint, limit, offset, address, permission], - async () => getCodes(endpoint, limit, offset, address, permission), - { retry: 1, refetchOnWindowFocus: false, ...options } - ); -}; - -export const useCodesByAddress = ( - address: BechAddr, - limit: number, - offset: number -): UseQueryResult => { - const endpoint = useBaseApiRoute("accounts"); - - return useQuery( - [CELATONE_QUERY_KEYS.CODES_BY_ADDRESS, endpoint, address, limit, offset], - async () => getCodesByAddress(endpoint, address, limit, offset), - { retry: 1, refetchOnWindowFocus: false } - ); -}; - -export type LCDCodeInfoSuccessCallback = (data: CodeIdInfoResponse) => void; - -export const useLCDCodeInfo = ( - codeId: string, - options?: Omit, "queryKey"> -) => { - const lcdEndpoint = useBaseApiRoute("rest"); - const queryFn = async () => { - if (!isId(codeId)) throw new Error("Invalid code ID"); - return getCodeIdInfo(lcdEndpoint, Number(codeId)); - }; - return useQuery( - [CELATONE_QUERY_KEYS.CODE_INFO, lcdEndpoint, codeId], - queryFn, - options - ); -}; diff --git a/src/lib/services/wasm/code/index.ts b/src/lib/services/wasm/code/index.ts new file mode 100644 index 000000000..bf74e6f68 --- /dev/null +++ b/src/lib/services/wasm/code/index.ts @@ -0,0 +1,4 @@ +export * from "./api"; +export * from "./gql"; +export * from "./lcd"; +export * from "./types"; diff --git a/src/lib/services/wasm/code/lcd.ts b/src/lib/services/wasm/code/lcd.ts new file mode 100644 index 000000000..f2db12568 --- /dev/null +++ b/src/lib/services/wasm/code/lcd.ts @@ -0,0 +1,65 @@ +import type { UseQueryOptions } from "@tanstack/react-query"; +import { useInfiniteQuery, useQuery } from "@tanstack/react-query"; +import axios from "axios"; + +import { + CELATONE_QUERY_KEYS, + useBaseApiRoute, + useLCDEndpoint, +} from "lib/app-provider"; +import type { Option } from "lib/types"; +import { isId, parseWithError } from "lib/utils"; + +import { zCodeInfoResponseLcd, zCodesResponseLcd } from "./types"; +import type { CodeInfoResponseLcd, CodesResponseLcd } from "./types"; + +export const getCodeIdInfoLcd = async ( + endpoint: string, + id: number +): Promise => + axios + .get(`${endpoint}/cosmwasm/wasm/v1/code/${id}`) + .then(({ data }) => parseWithError(zCodeInfoResponseLcd, data)); + +export const useCodeInfoLcd = ( + codeId: string, + options?: Omit, "queryKey"> +) => { + const lcdEndpoint = useBaseApiRoute("rest"); + const queryFn = async () => { + if (!isId(codeId)) throw new Error("Invalid code ID"); + return getCodeIdInfoLcd(lcdEndpoint, Number(codeId)); + }; + return useQuery( + [CELATONE_QUERY_KEYS.CODE_INFO, lcdEndpoint, codeId], + queryFn, + options + ); +}; + +const getCodesLcd = async ( + endpoint: string, + paginationKey: Option +): Promise => + axios + .get(`${endpoint}/cosmwasm/wasm/v1/code`, { + params: { + "pagination.limit": 10, + "pagination.reverse": true, + "pagination.key": paginationKey, + }, + }) + .then(({ data }) => parseWithError(zCodesResponseLcd, data)); + +export const useCodesLcd = () => { + const endpoint = useLCDEndpoint(); + + return useInfiniteQuery( + [CELATONE_QUERY_KEYS.CODES, endpoint], + ({ pageParam }) => getCodesLcd(endpoint, pageParam), + { + getNextPageParam: (lastPage) => lastPage.pagination.nextKey ?? undefined, + refetchOnWindowFocus: false, + } + ); +}; diff --git a/src/lib/services/code.ts b/src/lib/services/wasm/code/types.ts similarity index 58% rename from src/lib/services/code.ts rename to src/lib/services/wasm/code/types.ts index 8c63a6772..9ff1db597 100644 --- a/src/lib/services/code.ts +++ b/src/lib/services/wasm/code/types.ts @@ -1,43 +1,55 @@ -import axios from "axios"; import { z } from "zod"; +import type { CodeInfo } from "lib/types"; import { AccessConfigPermission, zBechAddr, zProjectInfo, zPublicCodeInfo, } from "lib/types"; -import type { BechAddr, BechAddr20, CodeInfo, Option } from "lib/types"; -import { - parseDate, - parseTxHash, - parseWithError, - snakeToCamel, -} from "lib/utils"; +import { zPagination } from "lib/types/rest"; +import { parseDate, parseTxHash, snakeToCamel } from "lib/utils"; -export interface CodeIdInfoResponse { - code_info: { - code_id: string; - creator: BechAddr; - data_hash: string; - instantiate_permission: { - permission: AccessConfigPermission; - address: BechAddr; - addresses: BechAddr[]; - }; - }; - data: string; -} +export const zCodeInfoResponseLcd = z + .object({ + code_info: z.object({ + code_id: z.string(), + creator: zBechAddr, + data_hash: z.string(), + instantiate_permission: z.object({ + permission: z.nativeEnum(AccessConfigPermission), + address: zBechAddr, + addresses: z.array(zBechAddr), + }), + }), + }) + .transform(snakeToCamel); +export type CodeInfoResponseLcd = z.infer; -export const getCodeIdInfo = async ( - endpoint: string, - id: number -): Promise => { - const { data } = await axios.get( - `${endpoint}/cosmwasm/wasm/v1/code/${id}` - ); - return data; -}; +const zCodesResponseItemLcd = z + .object({ + code_id: z.coerce.number(), + creator: zBechAddr, + instantiate_permission: z.object({ + permission: z.nativeEnum(AccessConfigPermission), + addresses: z.array(zBechAddr), + }), + }) + .transform((val) => ({ + id: val.code_id, + cw2Contract: undefined, + cw2Version: undefined, + uploader: val.creator, + contractCount: undefined, + instantiatePermission: val.instantiate_permission.permission, + permissionAddresses: val.instantiate_permission.addresses, + })); + +export const zCodesResponseLcd = z.object({ + code_infos: z.array(zCodesResponseItemLcd), + pagination: zPagination, +}); +export type CodesResponseLcd = z.infer; const zCodesResponseItem = z .object({ @@ -59,46 +71,12 @@ const zCodesResponseItem = z permissionAddresses: val.permission_addresses, })); -const zCodesResponse = z.object({ +export const zCodesResponse = z.object({ items: z.array(zCodesResponseItem), total: z.number().nonnegative(), }); - export type CodesResponse = z.infer; -export const getCodes = async ( - endpoint: string, - limit: number, - offset: number, - address: Option, - permission: Option -): Promise => - axios - .get(`${endpoint}`, { - params: { - limit, - offset, - address, - permission, - }, - }) - .then(({ data }) => parseWithError(zCodesResponse, data)); - -export const getCodesByAddress = async ( - endpoint: string, - address: BechAddr, - limit: number, - offset: number -): Promise => - axios - .get(`${endpoint}/${encodeURIComponent(address)}/wasm/codes`, { - params: { - limit, - offset, - }, - }) - .then(({ data }) => zCodesResponse.parse(data)); - const zCode = z .object({ code_id: z.number().positive(), @@ -149,25 +127,11 @@ const zCode = z export type Code = z.infer; -const zCodeData = z +export const zCodeData = z .object({ info: zCode, project_info: zProjectInfo.nullable(), public_info: zPublicCodeInfo.nullable(), }) .transform(snakeToCamel); - export type CodeData = z.infer; - -export const getCodeDataByCodeId = async ( - endpoint: string, - codeId: number, - isGov: boolean -): Promise => - axios - .get(`${endpoint}/${codeId}/info`, { - params: { - is_gov: isGov, - }, - }) - .then(({ data }) => parseWithError(zCodeData, data)); diff --git a/src/lib/types/rest.ts b/src/lib/types/rest.ts index 9d9d96761..937a50f36 100644 --- a/src/lib/types/rest.ts +++ b/src/lib/types/rest.ts @@ -1,7 +1,11 @@ import { z } from "zod"; -export const zPagination = z.object({ - next_key: z.string().nullable(), - total: z.coerce.number(), -}); +import { snakeToCamel } from "lib/utils"; + +export const zPagination = z + .object({ + next_key: z.string().nullable(), + total: z.coerce.number(), + }) + .transform(snakeToCamel); export type Pagination = z.infer; From cff4800b60b4422a92f8511fbb3350f38c0cdf36 Mon Sep 17 00:00:00 2001 From: songwongtp <16089160+songwongtp@users.noreply.github.com> Date: Mon, 29 Apr 2024 15:39:03 +0700 Subject: [PATCH 2/7] fix: handle instantiate permission --- src/lib/components/modal/code/SaveNewCode.tsx | 4 +--- src/lib/components/select-code/CodeSelect.tsx | 2 +- .../select-code/CodeSelectSection.tsx | 2 +- src/lib/pages/instantiate/instantiate.tsx | 7 +------ .../migrate/components/MigrateContract.tsx | 7 +------ src/lib/services/wasm/code/types.ts | 18 +++++++++++++++--- src/lib/utils/codePermission.ts | 7 ++----- 7 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/lib/components/modal/code/SaveNewCode.tsx b/src/lib/components/modal/code/SaveNewCode.tsx index 072f5bbca..01087d0b9 100644 --- a/src/lib/components/modal/code/SaveNewCode.tsx +++ b/src/lib/components/modal/code/SaveNewCode.tsx @@ -63,9 +63,7 @@ export function SaveNewCodeModal({ buttonProps }: SaveNewCodeModalProps) { const { message, messageColor } = getPermissionHelper( address, data.codeInfo.instantiatePermission.permission, - data.codeInfo.instantiatePermission.address - ? [data.codeInfo.instantiatePermission.address] - : data.codeInfo.instantiatePermission.addresses + data.codeInfo.instantiatePermission.addresses ); setCodeIdStatus({ state: "success", diff --git a/src/lib/components/select-code/CodeSelect.tsx b/src/lib/components/select-code/CodeSelect.tsx index 54ff841bd..b63e5acb3 100644 --- a/src/lib/components/select-code/CodeSelect.tsx +++ b/src/lib/components/select-code/CodeSelect.tsx @@ -15,7 +15,7 @@ import { CodeSelectDrawerButton } from "./CodeSelectDrawerButton"; interface CodeSelectProps extends Omit { onCodeSelect: (code: string) => void; - setCodeHash?: (data: CodeInfoResponseLcd) => void; + setCodeHash: (data: CodeInfoResponseLcd) => void; codeId: string; status: FormStatus; } diff --git a/src/lib/components/select-code/CodeSelectSection.tsx b/src/lib/components/select-code/CodeSelectSection.tsx index da57009ae..81f711744 100644 --- a/src/lib/components/select-code/CodeSelectSection.tsx +++ b/src/lib/components/select-code/CodeSelectSection.tsx @@ -16,7 +16,7 @@ interface CodeSelectSectionProps { control: Control; error: Option; onCodeSelect: (codeId: string) => void; - setCodeHash?: (data: CodeInfoResponseLcd) => void; + setCodeHash: (data: CodeInfoResponseLcd) => void; status: FormStatus; } diff --git a/src/lib/pages/instantiate/instantiate.tsx b/src/lib/pages/instantiate/instantiate.tsx index 9d1bc8034..47986d003 100644 --- a/src/lib/pages/instantiate/instantiate.tsx +++ b/src/lib/pages/instantiate/instantiate.tsx @@ -201,12 +201,7 @@ const Instantiate = ({ onComplete }: InstantiatePageProps) => { const permission = data.codeInfo.instantiatePermission; setValue("codeHash", data.codeInfo.dataHash.toLowerCase()); if ( - resolvePermission( - address, - permission.permission, - permission.addresses, - permission.address - ) + resolvePermission(address, permission.permission, permission.addresses) ) setStatus({ state: "success" }); else { diff --git a/src/lib/pages/migrate/components/MigrateContract.tsx b/src/lib/pages/migrate/components/MigrateContract.tsx index 0477f8762..2d134d317 100644 --- a/src/lib/pages/migrate/components/MigrateContract.tsx +++ b/src/lib/pages/migrate/components/MigrateContract.tsx @@ -128,12 +128,7 @@ export const MigrateContract = ({ const permission = data.codeInfo.instantiatePermission; setValue("codeHash", data.codeInfo.dataHash.toLowerCase()); if ( - resolvePermission( - address, - permission.permission, - permission.addresses, - permission.address - ) + resolvePermission(address, permission.permission, permission.addresses) ) setStatus({ state: "success" }); else { diff --git a/src/lib/services/wasm/code/types.ts b/src/lib/services/wasm/code/types.ts index 9ff1db597..ec049a8b0 100644 --- a/src/lib/services/wasm/code/types.ts +++ b/src/lib/services/wasm/code/types.ts @@ -18,12 +18,24 @@ export const zCodeInfoResponseLcd = z data_hash: z.string(), instantiate_permission: z.object({ permission: z.nativeEnum(AccessConfigPermission), - address: zBechAddr, - addresses: z.array(zBechAddr), + address: zBechAddr.optional(), + addresses: z.array(zBechAddr).default([]), }), }), }) - .transform(snakeToCamel); + .transform(({ code_info: { instantiate_permission, ...rest } }) => ({ + codeInfo: { + ...snakeToCamel(rest), + instantiatePermission: { + permission: instantiate_permission.permission, + addresses: + instantiate_permission.address && + instantiate_permission.address !== "" + ? [instantiate_permission.address] + : instantiate_permission.addresses, + }, + }, + })); export type CodeInfoResponseLcd = z.infer; const zCodesResponseItemLcd = z diff --git a/src/lib/utils/codePermission.ts b/src/lib/utils/codePermission.ts index 1f0187f1c..6cffac44e 100644 --- a/src/lib/utils/codePermission.ts +++ b/src/lib/utils/codePermission.ts @@ -6,13 +6,10 @@ import { truncate } from "./truncate"; export const resolvePermission = ( address: Option, permission: AccessConfigPermission = AccessConfigPermission.UNKNOWN, - permissionAddresses: PermissionAddresses = [], - permissionAddress = "" + permissionAddresses: PermissionAddresses = [] ): boolean => permission === AccessConfigPermission.EVERYBODY || - (address - ? permissionAddresses.includes(address) || permissionAddress === address - : false); + (address ? permissionAddresses.includes(address) : false); export const getPermissionHelper = ( address: Option, From f3ee76f63cc72de601867a962f6fed6fd2f183ee Mon Sep 17 00:00:00 2001 From: songwongtp <16089160+songwongtp@users.noreply.github.com> Date: Mon, 29 Apr 2024 15:46:01 +0700 Subject: [PATCH 3/7] fix: change lcd pisco --- src/config/chain/terra.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/chain/terra.ts b/src/config/chain/terra.ts index f49b03908..86cc15746 100644 --- a/src/config/chain/terra.ts +++ b/src/config/chain/terra.ts @@ -105,7 +105,7 @@ export const TERRA_CHAIN_CONFIGS: ChainConfigs = { chain: "terra", registryChainName: "terra2testnet", prettyName: "Terra Testnet", - lcd: "https://pisco-lcd.terra.dev:443", + lcd: "https://terra-testnet-api.polkachu.com", rpc: "https://terra-testnet-rpc.polkachu.com:443", indexer: "https://pisco-1-graphql.alleslabs.dev/v1/graphql", wallets: [...staionWallets, ...keplrWallets], From c1e293b9917eee421f1eb2958255add2fc60baeb Mon Sep 17 00:00:00 2001 From: songwongtp <16089160+songwongtp@users.noreply.github.com> Date: Mon, 29 Apr 2024 15:52:52 +0700 Subject: [PATCH 4/7] fix: change log --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8125115ef..030f324e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,7 +39,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Features -- [#900](https://github.com/alleslabs/celatone-frontend/pull/900) Support lite version recent codes +- [#901](https://github.com/alleslabs/celatone-frontend/pull/901) Support lite version recent codes - [#897](https://github.com/alleslabs/celatone-frontend/pull/897) Add config for lite version support ### Improvements From 14d6ee19397afb5960f6f7fb2e05a4231c423c71 Mon Sep 17 00:00:00 2001 From: songwongtp <16089160+songwongtp@users.noreply.github.com> Date: Mon, 29 Apr 2024 16:15:14 +0700 Subject: [PATCH 5/7] fix: mobile card --- src/lib/components/table/codes/CodesTable.tsx | 13 +++-- .../table/codes/CodesTableHeader.tsx | 10 +++- .../table/codes/CodesTableMobileCard.tsx | 48 +++++++++++-------- .../components/table/codes/CodesTableRow.tsx | 42 +++++++++------- .../components/tables/StoredCodesTable.tsx | 14 ++---- .../codes/components/RecentCodesTableFull.tsx | 16 +++---- .../codes/components/RecentCodesTableLite.tsx | 17 +++---- 7 files changed, 86 insertions(+), 74 deletions(-) diff --git a/src/lib/components/table/codes/CodesTable.tsx b/src/lib/components/table/codes/CodesTable.tsx index d204184af..7e707d3e6 100644 --- a/src/lib/components/table/codes/CodesTable.tsx +++ b/src/lib/components/table/codes/CodesTable.tsx @@ -1,6 +1,7 @@ import { MobileTableContainer, TableContainer } from "../tableComponents"; import { useMobile } from "lib/app-provider"; import { Loading } from "lib/components/Loading"; +import { ErrorFetching } from "lib/components/state"; import type { CodeInfo, Option } from "lib/types"; import { CodesTableHeader } from "./CodesTableHeader"; @@ -13,6 +14,7 @@ interface CodesTableProps { emptyState: JSX.Element; onRowSelect: (codeId: number) => void; isReadOnly?: boolean; + showCw2andContracts?: boolean; } export const CodesTable = ({ @@ -21,15 +23,15 @@ export const CodesTable = ({ emptyState, onRowSelect, isReadOnly = false, + showCw2andContracts = true, }: CodesTableProps) => { const isMobile = useMobile(); if (isLoading) return ; - if (!codes?.length) return emptyState; + if (!codes) return ; + if (!codes.length) return emptyState; - const templateColumns = isReadOnly - ? "max(100px) minmax(250px, 1fr) minmax(200px, 1fr) max(100px) max(160px) 150px" - : "max(100px) minmax(250px, 1fr) minmax(200px, 1fr) max(100px) max(160px) 150px 180px"; + const templateColumns = `max(100px) minmax(250px, 1fr)${showCw2andContracts ? " minmax(200px, 1fr) max(100px)" : ""} max(160px) 150px ${!isReadOnly ? " 180px" : ""}`; return isMobile ? ( @@ -37,6 +39,7 @@ export const CodesTable = ({ ))} @@ -45,6 +48,7 @@ export const CodesTable = ({ {codes.map((code) => ( ))} diff --git a/src/lib/components/table/codes/CodesTableHeader.tsx b/src/lib/components/table/codes/CodesTableHeader.tsx index 6268171bb..daee209b2 100644 --- a/src/lib/components/table/codes/CodesTableHeader.tsx +++ b/src/lib/components/table/codes/CodesTableHeader.tsx @@ -6,15 +6,21 @@ import { TableHeader } from "../tableComponents"; export const CodesTableHeader = ({ templateColumns, isReadOnly, + showCw2andContracts, }: { templateColumns: GridProps["templateColumns"]; isReadOnly: boolean; + showCw2andContracts: boolean; }) => ( Code ID Code Name - CW2 Info - Contracts + {showCw2andContracts && ( + <> + CW2 Info + Contracts + + )} Uploader Permission {!isReadOnly && } diff --git a/src/lib/components/table/codes/CodesTableMobileCard.tsx b/src/lib/components/table/codes/CodesTableMobileCard.tsx index 3c8205f5b..1634f03c3 100644 --- a/src/lib/components/table/codes/CodesTableMobileCard.tsx +++ b/src/lib/components/table/codes/CodesTableMobileCard.tsx @@ -12,9 +12,11 @@ import { CodeNameCell } from "./CodeNameCell"; interface CodesTableMobileCardProps { codeInfo: CodeInfo; + showCw2andContracts: boolean; } export const CodesTableMobileCard = ({ codeInfo, + showCw2andContracts, }: CodesTableMobileCardProps) => { const cw2Info = getCw2Info(codeInfo.cw2Contract, codeInfo.cw2Version); const navigate = useInternalNavigate(); @@ -43,31 +45,35 @@ export const CodesTableMobileCard = ({ - - - e.stopPropagation()} - > - {cw2Info ?? "N/A"} - - + {showCw2andContracts && ( + + + e.stopPropagation()} + > + {cw2Info ?? "N/A"} + + + )} } bottomContent={ - - - e.stopPropagation()} - cursor="text" - color={codeInfo.contractCount ? "text.main" : "text.disabled"} - > - {codeInfo.contractCount ?? "N/A"} - - + {showCw2andContracts && ( + + + e.stopPropagation()} + cursor="text" + color={codeInfo.contractCount ? "text.main" : "text.disabled"} + > + {codeInfo.contractCount ?? "N/A"} + + + )} void; isReadOnly: boolean; + showCw2andContracts: boolean; } export const CodesTableRow = ({ @@ -23,6 +24,7 @@ export const CodesTableRow = ({ templateColumns, onRowSelect, isReadOnly, + showCw2andContracts, }: CodesTableRowProps) => { const getAddressType = useGetAddressType(); const cw2Info = getCw2Info(codeInfo.cw2Contract, codeInfo.cw2Version); @@ -45,24 +47,28 @@ export const CodesTableRow = ({ - - - {cw2Info ?? "N/A"} - - - - e.stopPropagation()} - cursor="text" - color={codeInfo.contractCount ? "text.main" : "text.disabled"} - > - {codeInfo.contractCount ?? "N/A"} - - + {showCw2andContracts && ( + <> + + + {cw2Info ?? "N/A"} + + + + e.stopPropagation()} + cursor="text" + color={codeInfo.contractCount ? "text.main" : "text.disabled"} + > + {codeInfo.contractCount ?? "N/A"} + + + + )} - ) : ( - - ) + } onRowSelect={onRowSelect} /> diff --git a/src/lib/pages/codes/components/RecentCodesTableFull.tsx b/src/lib/pages/codes/components/RecentCodesTableFull.tsx index 87a9cd939..e18e1eb02 100644 --- a/src/lib/pages/codes/components/RecentCodesTableFull.tsx +++ b/src/lib/pages/codes/components/RecentCodesTableFull.tsx @@ -8,7 +8,7 @@ import { useCurrentChain, useInternalNavigate } from "lib/app-provider"; import { FilterByPermission } from "lib/components/forms"; import { Pagination } from "lib/components/pagination"; import { usePaginator } from "lib/components/pagination/usePaginator"; -import { EmptyState, ErrorFetching } from "lib/components/state"; +import { EmptyState } from "lib/components/state"; import { CodesTable } from "lib/components/table"; import type { PermissionFilterValue } from "lib/hooks"; @@ -77,15 +77,11 @@ export const RecentCodesTableFull = observer(() => { codes={data?.items} isLoading={isLoading} emptyState={ - data ? ( - - ) : ( - - ) + } onRowSelect={onRowSelect} /> diff --git a/src/lib/pages/codes/components/RecentCodesTableLite.tsx b/src/lib/pages/codes/components/RecentCodesTableLite.tsx index b4bc7c19e..1507926a9 100644 --- a/src/lib/pages/codes/components/RecentCodesTableLite.tsx +++ b/src/lib/pages/codes/components/RecentCodesTableLite.tsx @@ -4,7 +4,7 @@ import { observer } from "mobx-react-lite"; import { useRecentCodesLcd } from "../data"; import { useInternalNavigate } from "lib/app-provider"; import { LoadNext } from "lib/components/LoadNext"; -import { EmptyState, ErrorFetching } from "lib/components/state"; +import { EmptyState } from "lib/components/state"; import { CodesTable } from "lib/components/table"; export const RecentCodesTableLite = observer(() => { @@ -38,17 +38,14 @@ export const RecentCodesTableLite = observer(() => { codes={data} isLoading={isLoading} emptyState={ - data ? ( - - ) : ( - - ) + } onRowSelect={onRowSelect} + showCw2andContracts={false} /> {hasNextPage && ( Date: Mon, 29 Apr 2024 16:22:26 +0700 Subject: [PATCH 6/7] feat: mobile --- .../table/codes/CodesTableMobileCard.tsx | 57 +++++++++++-------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/src/lib/components/table/codes/CodesTableMobileCard.tsx b/src/lib/components/table/codes/CodesTableMobileCard.tsx index 1634f03c3..63a578bd3 100644 --- a/src/lib/components/table/codes/CodesTableMobileCard.tsx +++ b/src/lib/components/table/codes/CodesTableMobileCard.tsx @@ -45,23 +45,34 @@ export const CodesTableMobileCard = ({ - {showCw2andContracts && ( - - - e.stopPropagation()} - > - {cw2Info ?? "N/A"} - - - )} + + {showCw2andContracts ? ( + <> + + e.stopPropagation()} + > + {cw2Info ?? "N/A"} + + + ) : ( + + + + + )} + } bottomContent={ - - {showCw2andContracts && ( + showCw2andContracts && ( + - )} - - - + + + + - + ) } /> ); From 73b7c1caca963a223851dc5b6ddd7838332d799e Mon Sep 17 00:00:00 2001 From: songwongtp <16089160+songwongtp@users.noreply.github.com> Date: Mon, 29 Apr 2024 16:59:35 +0700 Subject: [PATCH 7/7] fix: mobile layout --- .../components/table/MobileCardTemplate.tsx | 16 ++-- .../table/codes/CodesTableMobileCard.tsx | 76 ++++++++++--------- src/lib/components/table/tableComponents.ts | 2 +- 3 files changed, 51 insertions(+), 43 deletions(-) diff --git a/src/lib/components/table/MobileCardTemplate.tsx b/src/lib/components/table/MobileCardTemplate.tsx index 8df428864..fc53b9124 100644 --- a/src/lib/components/table/MobileCardTemplate.tsx +++ b/src/lib/components/table/MobileCardTemplate.tsx @@ -1,4 +1,4 @@ -import { Divider, Flex } from "@chakra-ui/react"; +import { Flex } from "@chakra-ui/react"; import type { ReactNode } from "react"; interface MobileCardTemplateProps { @@ -30,16 +30,22 @@ export const MobileCardTemplate = ({ {middleContent && ( {middleContent} )} - {!middleContent && } - {bottomContent && {bottomContent}} + {bottomContent && ( + + {bottomContent} + + )} ); diff --git a/src/lib/components/table/codes/CodesTableMobileCard.tsx b/src/lib/components/table/codes/CodesTableMobileCard.tsx index 63a578bd3..ac5182c3d 100644 --- a/src/lib/components/table/codes/CodesTableMobileCard.tsx +++ b/src/lib/components/table/codes/CodesTableMobileCard.tsx @@ -8,8 +8,6 @@ import { PermissionChip } from "lib/components/PermissionChip"; import type { CodeInfo } from "lib/types"; import { getCw2Info } from "lib/utils"; -import { CodeNameCell } from "./CodeNameCell"; - interface CodesTableMobileCardProps { codeInfo: CodeInfo; showCw2andContracts: boolean; @@ -30,45 +28,49 @@ export const CodesTableMobileCard = ({ }) } topContent={ - - - - + showCw2andContracts ? ( + + + + + ) : ( + + + + + + + + + + + ) } middleContent={ - - - - - + showCw2andContracts && ( - {showCw2andContracts ? ( - <> - - e.stopPropagation()} - > - {cw2Info ?? "N/A"} - - - ) : ( - - - - - )} + + e.stopPropagation()} + > + {cw2Info ?? "N/A"} + - + ) } bottomContent={ showCw2andContracts && ( diff --git a/src/lib/components/table/tableComponents.ts b/src/lib/components/table/tableComponents.ts index 5919bc50a..75157b2e9 100644 --- a/src/lib/components/table/tableComponents.ts +++ b/src/lib/components/table/tableComponents.ts @@ -74,6 +74,6 @@ export const MobileTableContainer = chakra(SimpleGrid, { columns: 1, gap: 4, w: "full", - mt: 4, + my: 4, }, });