diff --git a/CHANGELOG.md b/CHANGELOG.md index 31f102fb5..935e7ecd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -126,6 +126,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Bug fixes +- [#154](https://github.com/alleslabs/celatone-frontend/pull/154) Stay on the same contract list page after renaming the list - [#155](https://github.com/alleslabs/celatone-frontend/pull/155) Fix uncontrolled input error and fix space bar issue in editable cell - [#156](https://github.com/alleslabs/celatone-frontend/pull/156) Fix json editor cannot focus by clicking on empty area - [#166](https://github.com/alleslabs/celatone-frontend/pull/166) Change default list when editing contract information diff --git a/src/lib/app-provider/hooks/useInternalNavigate.ts b/src/lib/app-provider/hooks/useInternalNavigate.ts index 00b5d0c3f..9cf2a561e 100644 --- a/src/lib/app-provider/hooks/useInternalNavigate.ts +++ b/src/lib/app-provider/hooks/useInternalNavigate.ts @@ -7,14 +7,21 @@ interface NavigationArgs { pathname: string; query?: ParsedUrlQueryInput; options?: Parameters["push"]>[2]; + replace?: boolean; } export const useInternalNavigate = () => { const router = useRouter(); return useCallback( - ({ pathname, query = {}, options = {} }: NavigationArgs) => { - router.push( + ({ + pathname, + query = {}, + options = {}, + replace = false, + }: NavigationArgs) => { + const routerFn = replace ? router.replace : router.push; + routerFn( { pathname: `/[network]${pathname}`, /** diff --git a/src/lib/components/ContractSelectSection.tsx b/src/lib/components/ContractSelectSection.tsx index 40bdc8751..70d8aece2 100644 --- a/src/lib/components/ContractSelectSection.tsx +++ b/src/lib/components/ContractSelectSection.tsx @@ -12,7 +12,7 @@ import type { ContractLocalInfo } from "lib/stores/contract"; import type { ContractAddr, Option } from "lib/types"; import { ExplorerLink } from "./ExplorerLink"; -import { EditContractDetails, SaveContractDetails } from "./modal"; +import { EditContractDetailsModal, SaveContractDetailsModal } from "./modal"; import { SelectContractAdmin, SelectContractInstantiator, @@ -68,7 +68,7 @@ const ContractDetailsButton = ({ }: ContractDetailsButtonProps) => { const isExist = !!contractLocalInfo?.lists; return isExist ? ( - ) : ( - { > Update Admin - ( ))} {/* creation section */} {canCreateOption && ( - { +}: CodeDetailsTemplateModalProps) => { const { saveNewCode, updateCodeInfo } = useCodeStore(); const toast = useToast(); const getAddressType = useGetAddressType(); diff --git a/src/lib/components/modal/code/EditCodeDetails.tsx b/src/lib/components/modal/code/EditCodeDetails.tsx index 40f821f8a..2c45f3841 100644 --- a/src/lib/components/modal/code/EditCodeDetails.tsx +++ b/src/lib/components/modal/code/EditCodeDetails.tsx @@ -1,16 +1,16 @@ import type { CodeLocalInfo } from "lib/stores/code"; -import { CodeDetailsTemplate } from "./CodeDetailsTemplate"; +import { CodeDetailsTemplateModal } from "./CodeDetailsTemplate"; -interface EditCodeDetailsProps { +interface EditCodeDetailsModalProps { codeLocalInfo: CodeLocalInfo; triggerElement: JSX.Element; } -export const EditCodeDetails = ({ +export const EditCodeDetailsModal = ({ codeLocalInfo, triggerElement, -}: EditCodeDetailsProps) => ( - ( + ( - ( + ({ diff --git a/src/lib/components/modal/code/SaveOrEditCode.tsx b/src/lib/components/modal/code/SaveOrEditCode.tsx index 589e337ec..3563485d3 100644 --- a/src/lib/components/modal/code/SaveOrEditCode.tsx +++ b/src/lib/components/modal/code/SaveOrEditCode.tsx @@ -4,8 +4,8 @@ import { MdBookmark, MdMode } from "react-icons/md"; import type { CodeLocalInfo } from "lib/stores/code"; -import { EditCodeDetails } from "./EditCodeDetails"; -import { SaveCodeDetails } from "./SaveCodeDetails"; +import { EditCodeDetailsModal } from "./EditCodeDetails"; +import { SaveCodeDetailsModal } from "./SaveCodeDetails"; interface SaveOrEditCodeModalProps { mode: "save" | "edit"; @@ -21,7 +21,7 @@ const StyledIcon = chakra(Icon, { export const SaveOrEditCodeModal = observer( ({ mode, codeLocalInfo }: SaveOrEditCodeModalProps) => { return mode === "save" ? ( - ) : ( - }> diff --git a/src/lib/components/modal/code/SaveOrRemoveCode.tsx b/src/lib/components/modal/code/SaveOrRemoveCode.tsx index f33566294..2fe7866e3 100644 --- a/src/lib/components/modal/code/SaveOrRemoveCode.tsx +++ b/src/lib/components/modal/code/SaveOrRemoveCode.tsx @@ -3,8 +3,8 @@ import { MdBookmark, MdBookmarkBorder } from "react-icons/md"; import type { CodeInfo } from "lib/types"; -import { RemoveCode } from "./RemoveCode"; -import { SaveCodeDetails } from "./SaveCodeDetails"; +import { RemoveCodeModal } from "./RemoveCode"; +import { SaveCodeDetailsModal } from "./SaveCodeDetails"; const StyledIconButton = chakra(IconButton, { baseStyle: { @@ -19,9 +19,11 @@ interface SaveOrRemoveCodeModalProps { codeInfo: CodeInfo; } -export function SaveOrRemoveCode({ codeInfo }: SaveOrRemoveCodeModalProps) { +export function SaveOrRemoveCodeModal({ + codeInfo, +}: SaveOrRemoveCodeModalProps) { return codeInfo.isSaved ? ( - ) : ( - { +export const AddToOtherListModal = observer( + ({ contractLocalInfo, triggerElement }: AddToOtherListModalProps) => { const [contractLists, setContractLists] = useState([]); const handleSave = useHandleContractSave({ diff --git a/src/lib/components/modal/contract/ClearAdminContract.tsx b/src/lib/components/modal/contract/ClearAdmin.tsx similarity index 92% rename from src/lib/components/modal/contract/ClearAdminContract.tsx rename to src/lib/components/modal/contract/ClearAdmin.tsx index feb7b080d..9b85a89c1 100644 --- a/src/lib/components/modal/contract/ClearAdminContract.tsx +++ b/src/lib/components/modal/contract/ClearAdmin.tsx @@ -7,15 +7,15 @@ import { useClearAdminTx } from "lib/app-provider"; import { useTxBroadcast } from "lib/providers/tx-broadcast"; import type { ContractAddr } from "lib/types"; -interface ClearAdminContractProps { +interface ClearAdminModalProps { contractAddress: ContractAddr; triggerElement: JSX.Element; } -export const ClearAdminContract = ({ +export const ClearAdminModal = ({ contractAddress, triggerElement, -}: ClearAdminContractProps) => { +}: ClearAdminModalProps) => { const { broadcast } = useTxBroadcast(); const clearAdminTx = useClearAdminTx(contractAddress); diff --git a/src/lib/components/modal/contract/ContractDetailsTemplate.tsx b/src/lib/components/modal/contract/ContractDetailsTemplate.tsx index 9d03d15dd..cd7da62b6 100644 --- a/src/lib/components/modal/contract/ContractDetailsTemplate.tsx +++ b/src/lib/components/modal/contract/ContractDetailsTemplate.tsx @@ -11,20 +11,20 @@ import type { ContractLocalInfo } from "lib/stores/contract"; import type { LVPair } from "lib/types"; import { getDescriptionDefault, getTagsDefault } from "lib/utils"; -interface ContractDetailsTemplateProps { +interface ContractDetailsTemplateModalProps { title: string; subtitle?: string; contractLocalInfo: ContractLocalInfo; triggerElement: JSX.Element; defaultList?: LVPair[]; } -export const ContractDetailsTemplate = ({ +export const ContractDetailsTemplateModal = ({ title, subtitle, contractLocalInfo, triggerElement, defaultList = [], -}: ContractDetailsTemplateProps) => { +}: ContractDetailsTemplateModalProps) => { const defaultValues = useMemo(() => { return { name: contractLocalInfo.name ?? "", diff --git a/src/lib/components/modal/contract/EditContractDetails.tsx b/src/lib/components/modal/contract/EditContractDetails.tsx index 4a2cdf426..bda05ad5d 100644 --- a/src/lib/components/modal/contract/EditContractDetails.tsx +++ b/src/lib/components/modal/contract/EditContractDetails.tsx @@ -1,16 +1,16 @@ import type { ContractLocalInfo } from "lib/stores/contract"; -import { ContractDetailsTemplate } from "./ContractDetailsTemplate"; +import { ContractDetailsTemplateModal } from "./ContractDetailsTemplate"; -interface EditContractDetailsProps { +interface EditContractDetailsModalProps { contractLocalInfo: ContractLocalInfo; triggerElement: JSX.Element; } -export const EditContractDetails = ({ +export const EditContractDetailsModal = ({ contractLocalInfo, triggerElement, -}: EditContractDetailsProps) => ( - ( + ( - void; @@ -19,13 +19,13 @@ interface CreateNewListProps { inputValue?: string; } -export function CreateNewList({ +export function CreateNewListModal({ buttonProps, trigger, inputValue, onCreate, onClose, -}: CreateNewListProps) { +}: CreateNewListModalProps) { const userKey = useUserKey(); const { createNewList, isContractListExist } = useContractStore(); diff --git a/src/lib/components/modal/list/EditListName.tsx b/src/lib/components/modal/list/EditListName.tsx index 8bfef2bc0..bb1e93334 100644 --- a/src/lib/components/modal/list/EditListName.tsx +++ b/src/lib/components/modal/list/EditListName.tsx @@ -3,6 +3,7 @@ import { MenuItem, useToast, Icon } from "@chakra-ui/react"; import { useEffect, useState } from "react"; import { MdAddCircleOutline, MdCheckCircle } from "react-icons/md"; +import { useInternalNavigate } from "lib/app-provider"; import type { FormStatus } from "lib/components/forms"; import { TextInput } from "lib/components/forms/TextInput"; import { ActionModal } from "lib/components/modal/ActionModal"; @@ -11,13 +12,19 @@ import { useContractStore, useUserKey } from "lib/hooks"; import type { LVPair } from "lib/types"; import { formatSlugName, shortenName } from "lib/utils"; -interface ModalProps { +interface EditListNameModalProps { list: LVPair; menuItemProps: MenuItemProps; + reroute?: boolean; } -export function EditList({ list, menuItemProps }: ModalProps) { +export function EditListNameModal({ + list, + menuItemProps, + reroute = false, +}: EditListNameModalProps) { const userKey = useUserKey(); const { renameList, isContractListExist } = useContractStore(); + const navigate = useInternalNavigate(); const [listName, setListName] = useState(list.label); const [status, setStatus] = useState({ state: "init" }); @@ -69,7 +76,14 @@ export function EditList({ list, menuItemProps }: ModalProps) { icon={MdAddCircleOutline} trigger={} mainBtnTitle="Save" - mainAction={handleSave} + mainAction={() => { + handleSave(); + if (reroute) + navigate({ + pathname: `/contract-list/${formatSlugName(listName)}`, + replace: true, + }); + }} disabledMain={status.state !== "success"} otherAction={() => setListName(list.label)} > diff --git a/src/lib/components/modal/list/RemoveList.tsx b/src/lib/components/modal/list/RemoveList.tsx index 16e5281f3..444e4b580 100644 --- a/src/lib/components/modal/list/RemoveList.tsx +++ b/src/lib/components/modal/list/RemoveList.tsx @@ -8,12 +8,12 @@ import { useContractStore, useUserKey } from "lib/hooks"; import type { LVPair } from "lib/types"; import { shortenName } from "lib/utils"; -interface ModalProps { +interface RemoveListModalProps { list: LVPair; menuItemProps: MenuItemProps; } -export function RemoveList({ list, menuItemProps }: ModalProps) { +export function RemoveListModal({ list, menuItemProps }: RemoveListModalProps) { const userKey = useUserKey(); const { removeList } = useContractStore(); diff --git a/src/lib/components/modal/select-contract/ContractListCard.tsx b/src/lib/components/modal/select-contract/ContractListCard.tsx index a18ab4c2b..c4c28bd0d 100644 --- a/src/lib/components/modal/select-contract/ContractListCard.tsx +++ b/src/lib/components/modal/select-contract/ContractListCard.tsx @@ -14,7 +14,7 @@ import { } from "@chakra-ui/react"; import { MdMoreHoriz, MdMode, MdDelete } from "react-icons/md"; -import { EditList, RemoveList } from "../list"; +import { EditListNameModal, RemoveListModal } from "../list"; import { getListIcon, INSTANTIATED_LIST_NAME } from "lib/data"; import type { ContractListInfo } from "lib/stores/contract"; import { dateFromNow, formatSlugName } from "lib/utils"; @@ -94,14 +94,14 @@ export const ContractListCard = ({ - , children: "Edit list name", }} /> - , diff --git a/src/lib/components/state/ZeroState.tsx b/src/lib/components/state/ZeroState.tsx index f6e1e6044..92ec5f80f 100644 --- a/src/lib/components/state/ZeroState.tsx +++ b/src/lib/components/state/ZeroState.tsx @@ -3,7 +3,7 @@ import { useWallet } from "@cosmos-kit/react"; import { MdOutlineAdd, MdBookmarkBorder, MdSearch } from "react-icons/md"; import { useInternalNavigate } from "lib/app-provider"; -import { SaveNewContract } from "lib/components/modal/contract"; +import { SaveNewContractModal } from "lib/components/modal/contract"; import { ADMIN_SPECIAL_SLUG, INSTANTIATED_LIST_NAME } from "lib/data"; import type { LVPair } from "lib/types"; import { formatSlugName } from "lib/utils"; @@ -29,7 +29,7 @@ const ActionSection = ({ list, handleAction }: ActionSectionProps) => Save existing contracts to the list with - { {item.category} {item.category === "Contracts" && ( - {isSaved ? ( - e.stopPropagation()}> {contractInfo.lists ? ( - ) : ( - { codeId={code.id} /> {isRemovable ? ( - + ) : ( - + )} diff --git a/src/lib/pages/contract-details/components/ContractTop.tsx b/src/lib/pages/contract-details/components/ContractTop.tsx index 237f12346..4f63f71a6 100644 --- a/src/lib/pages/contract-details/components/ContractTop.tsx +++ b/src/lib/pages/contract-details/components/ContractTop.tsx @@ -16,9 +16,9 @@ import { useInternalNavigate } from "lib/app-provider"; import { AdminButton } from "lib/components/button"; import { ExplorerLink } from "lib/components/ExplorerLink"; import { - AddToOtherList, - EditContractDetails, - SaveContractDetails, + AddToOtherListModal, + EditContractDetailsModal, + SaveContractDetailsModal, } from "lib/components/modal"; import type { ContractData } from "lib/model/contract"; import type { ContractAddr } from "lib/types"; @@ -54,7 +54,7 @@ export const ContractTop = ({ contractData }: ContractTopProps) => { const renderSaveButton = () => { if (contractLocalInfo) { return ( - { } if (instantiateInfo) { return ( - { {contractLocalInfo && ( - { const renderEditContractButton = () => { if (!contractData.instantiateInfo) return null; return ( - - } /> - Update Admin - - { Contract lists - , diff --git a/src/lib/pages/contract-list/slug.tsx b/src/lib/pages/contract-list/slug.tsx index 3857935a3..6d811760b 100644 --- a/src/lib/pages/contract-list/slug.tsx +++ b/src/lib/pages/contract-list/slug.tsx @@ -26,8 +26,8 @@ import { import { useInternalNavigate } from "lib/app-provider"; import { AppLink } from "lib/components/AppLink"; -import { SaveNewContract } from "lib/components/modal/contract"; -import { EditList, RemoveList } from "lib/components/modal/list"; +import { SaveNewContractModal } from "lib/components/modal/contract"; +import { EditListNameModal, RemoveListModal } from "lib/components/modal/list"; import { ContractListDetail } from "lib/components/modal/select-contract"; import { INSTANTIATED_LIST_NAME } from "lib/data"; import { useContractStore } from "lib/hooks"; @@ -112,7 +112,7 @@ const ContractsByList = observer(() => { Deploy New Contract ) : ( - { /> - { icon: , children: "Edit list name", }} + reroute /> -