diff --git a/components/dialogs/NewActionDialog.tsx b/components/dialogs/NewActionDialog.tsx index 77e378e..df2bd03 100644 --- a/components/dialogs/NewActionDialog.tsx +++ b/components/dialogs/NewActionDialog.tsx @@ -6,36 +6,37 @@ import { ElseIf, If, Then } from "@/components/if"; import { useState } from "react"; import { AbiFunction } from "viem"; import { CalldataForm } from "../input/calldata-form"; +import { ImportActionsForm } from "../input/import-actions-form"; -export type NewActionType = "" | "withdrawal" | "select-abi-function" | "calldata" | "custom-abi"; +export type NewActionType = "" | "withdrawal" | "select-abi-function" | "calldata" | "import-json"; interface INewActionDialogProps extends IDialogRootProps { - onClose: (newAction: RawAction | null, abi: AbiFunction | null) => void; + onClose: (newAction: RawAction[] | null, abi: AbiFunction | null) => void; newActionType: NewActionType; } export const NewActionDialog: React.FC = (props) => { const { onClose, newActionType } = props; - const [stagedAction, setStagedAction] = useState(null); + const [stagedActions, setStagedActions] = useState(null); const [abi, setAbi] = useState(null); const onReceiveAbiAction = (action: RawAction, newAbi: AbiFunction) => { - setStagedAction(action); + setStagedActions([action]); setAbi(newAbi); }; const onActionCleared = () => { - setStagedAction(null); + setStagedActions(null); setAbi(null); }; const handleSubmit = () => { - if (!stagedAction) return; + if (!stagedActions) return; - onClose(stagedAction, abi || null); - setStagedAction(null); + onClose(stagedActions, abi || null); + setStagedActions(null); }; const dismiss = () => { onClose(null, null); - setStagedAction(null); + setStagedActions(null); }; const show = newActionType !== ""; @@ -46,7 +47,7 @@ export const NewActionDialog: React.FC = (props) => { - setStagedAction(action)} onSubmit={() => handleSubmit()} /> + setStagedActions([action])} onSubmit={() => handleSubmit()} /> = (props) => { onActionCleared={onActionCleared} /> - - setStagedAction(action)} onSubmit={() => handleSubmit()} /> + setStagedActions([action])} onSubmit={() => handleSubmit()} /> + + + setStagedActions(actions)} /> @@ -64,7 +67,7 @@ export const NewActionDialog: React.FC = (props) => { - diff --git a/components/input/calldata-form.tsx b/components/input/calldata-form.tsx index 6c1b256..15e9215 100644 --- a/components/input/calldata-form.tsx +++ b/components/input/calldata-form.tsx @@ -20,7 +20,7 @@ import { useAbi } from "@/hooks/useAbi"; import { CallFunctionSignatureField, CallParamField } from "../proposalActions/callParamField"; interface ICalldataFormProps { - onChange: (actions: RawAction) => any; + onChange: (action: RawAction) => any; onSubmit?: () => any; } diff --git a/components/input/import-actions-form.tsx b/components/input/import-actions-form.tsx new file mode 100644 index 0000000..3b6ed33 --- /dev/null +++ b/components/input/import-actions-form.tsx @@ -0,0 +1,62 @@ +import { type RawAction } from "@/utils/types"; +import { type FC, useState } from "react"; +import { TextArea } from "@aragon/ods"; +import { If } from "../if"; +import { decodeStrJson } from "@/utils/json-actions"; + +interface IImportActionsFormProps { + onChange: (actions: RawAction[]) => any; +} + +export const ImportActionsForm: FC = ({ onChange }) => { + const [actions, setActions] = useState([]); + const [strJson, setStrJson] = useState(""); + + const onJsonData = (strJson: string) => { + try { + setStrJson(strJson); + + const actions = decodeStrJson(strJson); + setActions(actions); + onChange(actions); + } catch (_) { + // + setActions([]); + onChange([]); + } + }; + + return ( +
+
+