-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathExecuteJsContract.tsx
More file actions
114 lines (102 loc) · 2.81 KB
/
ExecuteJsContract.tsx
File metadata and controls
114 lines (102 loc) · 2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import { useMemo, useState } from 'react';
import { Box, Text, TextField } from '@interchain-ui/react';
import { useChain } from '@interchain-kit/react';
import { InputField, JsonInput, ContractIndexField } from '../common';
import { Button } from '../../common';
import { validateJson } from '@/utils';
import { useChainStore } from '@/contexts';
import { useExecuteContractTx } from '@/hooks';
const INPUT_LINES = 12;
type ExecuteJsContractProps = {
show: boolean;
indexValue: string;
onIndexInput: (input: string) => void;
};
export const ExecuteJsContract = ({
show,
indexValue,
onIndexInput,
}: ExecuteJsContractProps) => {
const [contractIndex, setContractIndex] = useState('');
const [fnName, setFnName] = useState('');
const [arg, setArg] = useState('');
const [isLoading, setIsLoading] = useState(false);
const { selectedChain } = useChainStore();
const { address, connect } = useChain(selectedChain);
const { executeJsdTx } = useExecuteContractTx(selectedChain);
const handleExecute = () => {
if (!address) {
connect();
return;
}
setIsLoading(true);
executeJsdTx({
address,
contractIndex,
fnName,
arg,
onTxSucceed: () => setIsLoading(false),
onTxFailed: () => setIsLoading(false),
});
};
const isArgValid = validateJson(arg) === null;
const buttonText = useMemo(() => {
if (!address) return 'Connect Wallet';
return 'Execute';
}, [address]);
const isButtonDisabled = useMemo(() => {
if (!address) return false;
return !contractIndex || !fnName || !isArgValid;
}, [address, contractIndex, fnName, isArgValid]);
return (
<Box
display={show ? 'flex' : 'none'}
maxWidth="560px"
mx="auto"
flexDirection="column"
gap="20px"
>
<Text
fontSize="24px"
fontWeight="500"
color="$blackAlpha600"
textAlign="center"
>
Execute Contract
</Text>
<ContractIndexField
indexValue={indexValue}
onIndexInput={onIndexInput}
onValidIndexChange={setContractIndex}
/>
<InputField title="Function Name">
<TextField
id="fnName"
value={fnName}
onChange={(e) => setFnName(e.target.value)}
autoComplete="off"
/>
<InputField.Description>
Provide the name of the function to call.
</InputField.Description>
</InputField>
<InputField title="Argument">
<JsonInput
value={arg}
setValue={setArg}
minLines={INPUT_LINES}
height="250px"
/>
</InputField>
<Button
disabled={isButtonDisabled}
onClick={handleExecute}
isLoading={isLoading}
width="100%"
variant="primary"
>
{buttonText}
</Button>
</Box>
);
};