support object Amount
This commit is contained in:
@@ -82,7 +82,7 @@ const Transaction: FC<TransactionProps> = ({
|
||||
let st: TransactionState | undefined;
|
||||
if (viewType === "json") {
|
||||
// save the editor state first
|
||||
const pst = prepareState(editorValue);
|
||||
const pst = prepareState(editorValue || '', txState);
|
||||
if (!pst) return;
|
||||
|
||||
st = setState(pst);
|
||||
@@ -116,16 +116,7 @@ const Transaction: FC<TransactionProps> = ({
|
||||
}
|
||||
}
|
||||
setState({ txIsLoading: false });
|
||||
}, [
|
||||
viewType,
|
||||
editorValue,
|
||||
accounts,
|
||||
txIsDisabled,
|
||||
setState,
|
||||
selectedAccount?.value,
|
||||
prepareOptions,
|
||||
header,
|
||||
]);
|
||||
}, [viewType, accounts, txIsDisabled, setState, header, editorValue, txState, selectedAccount?.value, prepareOptions]);
|
||||
|
||||
const resetState = useCallback(() => {
|
||||
modifyTransaction(header, { viewType }, { replaceState: true });
|
||||
|
||||
@@ -45,8 +45,8 @@ export const TxJson: FC<JsonProps> = ({
|
||||
else setHasUnsaved(true);
|
||||
}, [editorValue, value]);
|
||||
|
||||
const saveState = (value: string) => {
|
||||
const tx = prepareState(value);
|
||||
const saveState = (value: string, txState: TransactionState) => {
|
||||
const tx = prepareState(value, txState);
|
||||
if (tx) setState(tx);
|
||||
};
|
||||
|
||||
@@ -61,7 +61,7 @@ export const TxJson: FC<JsonProps> = ({
|
||||
const onExit = (value: string) => {
|
||||
const options = parseJSON(value);
|
||||
if (options) {
|
||||
saveState(value);
|
||||
saveState(value, txState);
|
||||
return;
|
||||
}
|
||||
showAlert("Error!", {
|
||||
@@ -106,7 +106,7 @@ export const TxJson: FC<JsonProps> = ({
|
||||
{hasUnsaved && (
|
||||
<Text muted small css={{ position: "absolute", bottom: 0, right: 0 }}>
|
||||
This file has unsaved changes.{" "}
|
||||
<Link onClick={() => saveState(editorValue)}>save</Link>{" "}
|
||||
<Link onClick={() => saveState(editorValue, txState)}>save</Link>{" "}
|
||||
<Link onClick={discardChanges}>discard</Link>
|
||||
</Text>
|
||||
)}
|
||||
|
||||
@@ -9,7 +9,6 @@ import {
|
||||
TransactionState,
|
||||
transactionsData,
|
||||
TxFields,
|
||||
OtherFields,
|
||||
} from "../../state/transactions";
|
||||
import { useSnapshot } from "valtio";
|
||||
import state from "../../state";
|
||||
@@ -74,11 +73,11 @@ export const TxUI: FC<UIProps> = ({ state: txState, setState }) => {
|
||||
resetOptions(tt.value);
|
||||
};
|
||||
|
||||
const usualFields = ["TransactionType", "Amount", "Account", "Destination"];
|
||||
const specialFields = ["TransactionType", "Account", "Destination"];
|
||||
|
||||
const otherFields = Object.keys(txFields).filter(
|
||||
k => !usualFields.includes(k)
|
||||
) as OtherFields;
|
||||
k => !specialFields.includes(k)
|
||||
) as [keyof TxFields];
|
||||
|
||||
return (
|
||||
<Container
|
||||
@@ -135,34 +134,6 @@ export const TxUI: FC<UIProps> = ({ state: txState, setState }) => {
|
||||
onChange={(acc: any) => handleSetAccount(acc)} // TODO make react-select have correct types for acc
|
||||
/>
|
||||
</Flex>
|
||||
{txFields.Amount !== undefined && (
|
||||
<Flex
|
||||
row
|
||||
fluid
|
||||
css={{
|
||||
justifyContent: "flex-end",
|
||||
alignItems: "center",
|
||||
mb: "$3",
|
||||
pr: "1px",
|
||||
}}
|
||||
>
|
||||
<Text muted css={{ mr: "$3" }}>
|
||||
Amount (XRP):{" "}
|
||||
</Text>
|
||||
<Input
|
||||
value={txFields.Amount.value}
|
||||
onChange={e =>
|
||||
setState({
|
||||
txFields: {
|
||||
...txFields,
|
||||
Amount: { type: "currency", value: e.target.value },
|
||||
},
|
||||
})
|
||||
}
|
||||
css={{ width: "70%", flex: "inherit" }}
|
||||
/>
|
||||
</Flex>
|
||||
)}
|
||||
{txFields.Destination !== undefined && (
|
||||
<Flex
|
||||
row
|
||||
@@ -202,8 +173,7 @@ export const TxUI: FC<UIProps> = ({ state: txState, setState }) => {
|
||||
value = _value?.toString();
|
||||
}
|
||||
|
||||
let isCurrency =
|
||||
typeof _value === "object" && _value.type === "currency";
|
||||
let isXrp = typeof _value === "object" && _value.type === "xrp";
|
||||
return (
|
||||
<Flex
|
||||
key={field}
|
||||
@@ -217,7 +187,7 @@ export const TxUI: FC<UIProps> = ({ state: txState, setState }) => {
|
||||
}}
|
||||
>
|
||||
<Text muted css={{ mr: "$3" }}>
|
||||
{field + (isCurrency ? " (XRP)" : "")}:{" "}
|
||||
{field + (isXrp ? " (XRP)" : "")}:{" "}
|
||||
</Text>
|
||||
<Input
|
||||
value={value}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"TransactionType": "CheckCash",
|
||||
"Amount": {
|
||||
"value": "100",
|
||||
"type": "currency"
|
||||
"type": "xrp"
|
||||
},
|
||||
"CheckID": "838766BA2B995C00744175F69A1B11E32C3DBC40E64801A4056FCBD657F57334",
|
||||
"Fee": "12"
|
||||
@@ -62,7 +62,7 @@
|
||||
"TransactionType": "EscrowCreate",
|
||||
"Amount": {
|
||||
"value": "100",
|
||||
"type": "currency"
|
||||
"type": "xrp"
|
||||
},
|
||||
"Destination": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
|
||||
"CancelAfter": 533257958,
|
||||
@@ -100,7 +100,7 @@
|
||||
"TokenID": "000100001E962F495F07A990F4ED55ACCFEEF365DBAA76B6A048C0A200000007",
|
||||
"Amount": {
|
||||
"value": "100",
|
||||
"type": "currency"
|
||||
"type": "xrp"
|
||||
},
|
||||
"Flags": 1
|
||||
},
|
||||
@@ -123,7 +123,7 @@
|
||||
"TakerGets": "6000000",
|
||||
"Amount": {
|
||||
"value": "100",
|
||||
"type": "currency"
|
||||
"type": "xrp"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -132,7 +132,7 @@
|
||||
"Destination": "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX",
|
||||
"Amount": {
|
||||
"value": "100",
|
||||
"type": "currency"
|
||||
"type": "xrp"
|
||||
},
|
||||
"Fee": "12",
|
||||
"Flags": 2147483648,
|
||||
@@ -143,7 +143,7 @@
|
||||
"TransactionType": "PaymentChannelCreate",
|
||||
"Amount": {
|
||||
"value": "100",
|
||||
"type": "currency"
|
||||
"type": "xrp"
|
||||
},
|
||||
"Destination": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
|
||||
"SettleDelay": 86400,
|
||||
@@ -158,7 +158,7 @@
|
||||
"Channel": "C1AE6DDDEEC05CF2978C0BAD6FE302948E9533691DC749DCDD3B9E5992CA6198",
|
||||
"Amount": {
|
||||
"value": "200",
|
||||
"type": "currency"
|
||||
"type": "xrp"
|
||||
},
|
||||
"Expiration": 543171558
|
||||
},
|
||||
@@ -214,7 +214,7 @@
|
||||
"LastLedgerSequence": 8007750,
|
||||
"Amount": {
|
||||
"value": "100",
|
||||
"type": "currency"
|
||||
"type": "xrp"
|
||||
},
|
||||
"Sequence": 12
|
||||
}
|
||||
|
||||
@@ -27,8 +27,6 @@ export type TxFields = Omit<
|
||||
"Account" | "Sequence" | "TransactionType"
|
||||
>;
|
||||
|
||||
export type OtherFields = (keyof Omit<TxFields, "Destination">)[];
|
||||
|
||||
export const defaultTransaction: TransactionState = {
|
||||
selectedTransaction: null,
|
||||
selectedAccount: null,
|
||||
@@ -107,8 +105,8 @@ export const prepareTransaction = (data: any) => {
|
||||
|
||||
(Object.keys(options)).forEach(field => {
|
||||
let _value = options[field];
|
||||
// convert currency
|
||||
if (_value && typeof _value === "object" && _value.type === "currency") {
|
||||
// convert xrp
|
||||
if (_value && typeof _value === "object" && _value.type === "xrp") {
|
||||
if (+_value.value) {
|
||||
options[field] = (+_value.value * 1000000 + "") as any;
|
||||
} else {
|
||||
@@ -141,7 +139,7 @@ export const prepareTransaction = (data: any) => {
|
||||
}
|
||||
|
||||
// editor value to state
|
||||
export const prepareState = (value?: string) => {
|
||||
export const prepareState = (value: string, txState: TransactionState) => {
|
||||
const options = parseJSON(value);
|
||||
if (!options) {
|
||||
showAlert("Error!", {
|
||||
@@ -152,6 +150,7 @@ export const prepareState = (value?: string) => {
|
||||
|
||||
const { Account, TransactionType, Destination, ...rest } = options;
|
||||
let tx: Partial<TransactionState> = {};
|
||||
const { txFields } = txState
|
||||
|
||||
if (Account) {
|
||||
const acc = state.accounts.find(acc => acc.address === Account);
|
||||
@@ -179,7 +178,7 @@ export const prepareState = (value?: string) => {
|
||||
tx.selectedTransaction = null;
|
||||
}
|
||||
|
||||
if (Destination !== undefined) {
|
||||
if (txFields.Destination !== undefined) {
|
||||
const dest = state.accounts.find(acc => acc.address === Destination);
|
||||
rest.Destination = null
|
||||
if (dest) {
|
||||
@@ -201,10 +200,12 @@ export const prepareState = (value?: string) => {
|
||||
|
||||
Object.keys(rest).forEach(field => {
|
||||
const value = rest[field];
|
||||
if (field === "Amount") {
|
||||
const origValue = txFields[field as keyof TxFields]
|
||||
const isXrp = typeof value !== 'object' && origValue && typeof origValue === 'object' && origValue.type === 'xrp'
|
||||
if (isXrp) {
|
||||
rest[field] = {
|
||||
type: "currency",
|
||||
value: +value / 1000000, // TODO handle object currencies
|
||||
type: "xrp",
|
||||
value: +value / 1000000, // TODO maybe use bigint?
|
||||
};
|
||||
} else if (typeof value === "object") {
|
||||
rest[field] = {
|
||||
|
||||
Reference in New Issue
Block a user