From 3cda71d6970073da2408d04dfb122a5042982fb9 Mon Sep 17 00:00:00 2001 From: iain nash Date: Sat, 20 Apr 2024 23:43:10 -0400 Subject: [PATCH] update across the board ownership changes, url updates --- src/app/NewSafeProposal.tsx | 46 +++++++++++------- src/chains.ts | 2 +- src/components/SetOwnerModal.tsx | 65 ++++++++++++++------------ src/hooks/useLoadProposalFromQuery.ts | 4 ++ src/hooks/useSetParamsFromQuery.ts | 8 +++- src/hooks/useUpdateProposalViaQuery.ts | 19 ++++++++ 6 files changed, 94 insertions(+), 50 deletions(-) create mode 100644 src/hooks/useUpdateProposalViaQuery.ts diff --git a/src/app/NewSafeProposal.tsx b/src/app/NewSafeProposal.tsx index 06bff06..41d9870 100644 --- a/src/app/NewSafeProposal.tsx +++ b/src/app/NewSafeProposal.tsx @@ -1,7 +1,13 @@ import { Field, FieldArray, Formik } from "formik"; import { SafeInformation } from "../components/SafeInformation"; import { Card, View, Text, Button, useToast } from "reshaped"; -import { SyntheticEvent, useCallback, useEffect, useState } from "react"; +import { + SyntheticEvent, + createContext, + useCallback, + useEffect, + useState, +} from "react"; import { Address, Hex, formatEther } from "viem"; import { validateAddress, validateETH } from "../utils/validators"; import { GenericField } from "../components/GenericField"; @@ -407,6 +413,8 @@ const EditProposal = ({ ); }; +export const ProposalContext = createContext(undefined); + export const NewSafeProposal = () => { const [proposal, setProposal] = useState( DEFAULT_PROPOSAL, @@ -431,22 +439,24 @@ export const NewSafeProposal = () => { ); return ( - - - {isEditing && ( - - )} - {!isEditing && proposal && ( - - )} - - + + + + {isEditing && ( + + )} + {!isEditing && proposal && ( + + )} + + + ); }; diff --git a/src/chains.ts b/src/chains.ts index 3534252..075c7a0 100644 --- a/src/chains.ts +++ b/src/chains.ts @@ -70,7 +70,7 @@ Object.keys(contractNetworks).map((network) => { return; } const viemChain = Object.values(chains).find( - (chain) => chain.id.toString() === network + (chain) => chain.id.toString() === network, ); if (!viemChain) { diff --git a/src/components/SetOwnerModal.tsx b/src/components/SetOwnerModal.tsx index 9da9d5b..131a7ba 100644 --- a/src/components/SetOwnerModal.tsx +++ b/src/components/SetOwnerModal.tsx @@ -1,4 +1,4 @@ -import { SyntheticEvent } from "react"; +import { SyntheticEvent, useContext } from "react"; import { Button, Modal, Text, View, useToast } from "reshaped"; import { AddressView } from "./AddressView"; import { Address } from "viem"; @@ -6,8 +6,10 @@ import { Field, Form, Formik } from "formik"; import { GenericField } from "./GenericField"; import { yupAddress } from "../utils/validators"; import { number, object } from "yup"; -import { useOutletContext, useSearchParams } from "react-router-dom"; +import { useOutletContext } from "react-router-dom"; import { SafeContext } from "./Contexts"; +import { ProposalContext } from "../app/NewSafeProposal"; +import { useUpdateProposalViaQuery } from "../hooks/useUpdateProposalViaQuery"; export type OwnerAction = | undefined @@ -43,7 +45,9 @@ const ButtonPanel = ({ const AddOwnerModalContent = ({ onClose }: { onClose: () => void }) => { const { safeInformation } = useOutletContext(); const toast = useToast(); - const [, setSearchParams] = useSearchParams(); + const updateProposalQuery = useUpdateProposalViaQuery(); + const currentProposal = useContext(ProposalContext); + return ( void }) => { ownerAddress: address, threshold: threshold, }); - setSearchParams({ - proposal: JSON.stringify({ - actions: [ - { - data: addOwnerTx.data.data, - value: 0, - to: safeInformation.address, - }, - ], - }), + updateProposalQuery({ + data: addOwnerTx.data.data, + value: "0", + to: safeInformation.address, }); } catch (err: any) { toast.show({ title: "Error Updating Safe", text: err.toString() }); @@ -76,7 +74,7 @@ const AddOwnerModalContent = ({ onClose }: { onClose: () => void }) => { }} >
- Add Owner + Add Signer {GenericField({ label: "New User Address" })} @@ -102,25 +100,34 @@ const RemoveOwnerModalContent = ({ onClose: () => void; target: string; }) => { - const [_, setParams] = useSearchParams(); const { safeInformation } = useOutletContext(); + const updateProposalViaQuery = useUpdateProposalViaQuery(); + const toaster = useToast(); const onSubmitClick = async ({ threshold }: any) => { - const removeOwnerTx = await safeInformation?.safeSdk.createRemoveOwnerTx({ - ownerAddress: safeInformation!.address, - threshold: threshold, - }); - if (!removeOwnerTx || !safeInformation) { - return; + try { + const removeOwnerTx = await safeInformation?.safeSdk2.createRemoveOwnerTx( + { + ownerAddress: target, + threshold: threshold, + }, + ); + if (!removeOwnerTx || !safeInformation) { + return; + } + + updateProposalViaQuery({ + data: removeOwnerTx.data.data, + value: "0", + to: safeInformation.address, + }); + onClose(); + } catch (err: any) { + toaster.show({ + title: "Error Removing Owner", + text: `Error setting up transaction: ${err.toString()}`, + }); } - setParams({ - proposal: JSON.stringify({ - actions: [ - { data: removeOwnerTx.data, value: "0", to: safeInformation.address }, - ], - }), - }); - onClose(); }; return ( { const [params] = useSearchParams(); useEffect(() => { + console.log("parsing params", params); + const targets = params.get("targets")?.split("|"); const calldatas = params.get("calldatas")?.split("|"); const values = params.get("values")?.split("|"); @@ -26,9 +28,11 @@ export const useLoadProposalFromQuery = () => { data: calldatas[index]!, value: (values && values[index]) || "0", })); + console.log({ actions, txt: "setting proposal" }); setProposal({ actions }); } }, [params, setProposal]); + console.log({ proposal }); return proposal; }; diff --git a/src/hooks/useSetParamsFromQuery.ts b/src/hooks/useSetParamsFromQuery.ts index 1a0a1a4..526c4e5 100644 --- a/src/hooks/useSetParamsFromQuery.ts +++ b/src/hooks/useSetParamsFromQuery.ts @@ -10,11 +10,15 @@ export const useSetParamsFromQuery = () => { if (!proposal.actions?.length) { return; } - console.log("setting params", proposal.actions); setParams({ targets: proposal.actions!.map((action) => action.to).join("|"), - data: proposal.actions!.map((action) => action.data).join("|"), + calldatas: proposal.actions!.map((action) => action.data).join("|"), value: proposal.actions!.map((action) => action.value).join("|"), + ...(proposal.nonce + ? { + nonce: proposal.nonce.toString(), + } + : {}), }); }, [setParams], diff --git a/src/hooks/useUpdateProposalViaQuery.ts b/src/hooks/useUpdateProposalViaQuery.ts new file mode 100644 index 0000000..e75f4f2 --- /dev/null +++ b/src/hooks/useUpdateProposalViaQuery.ts @@ -0,0 +1,19 @@ +import { useCallback, useContext } from "react"; +import { Proposal } from "../schemas/proposal"; +import { ProposalContext } from "../app/NewSafeProposal"; +import { useSetParamsFromQuery } from "./useSetParamsFromQuery"; + +export const useUpdateProposalViaQuery = () => { + const setParams = useSetParamsFromQuery(); + const proposal = useContext(ProposalContext); + + return useCallback( + (newAction: NonNullable[0]) => { + setParams({ + actions: [...(proposal?.actions || []), newAction], + nonce: proposal?.nonce, + }); + }, + [proposal, setParams], + ); +};