b27fa51092
* Chore/browser extension bootstrap (#3257) * init package * set up TS and Webpack * add eslint config * add prettier config * add react and mui theme * add CI * update mui theme version number * Chore/browser extension routes (#3327) * start routes * create layouts * add initial app routes * add initial app pages * add global types * create reuseable components * move password and mnemonic fields to shared react components package * refactor register routes * move client address component to shared package * move components to ui folder * create menu and appbar components * adjust layout components * add readme * use memory router * Feature/nym browser extension login and send (#3373) * init package * set up TS and Webpack * add eslint config * add prettier config * add react and mui theme * add CI * update mui theme version number * Chore/browser extension routes (#3327) * start routes * create layouts * add initial app routes * add initial app pages * add global types * create reuseable components * move password and mnemonic fields to shared react components package * refactor register routes * move client address component to shared package * move components to ui folder * create menu and appbar components * adjust layout components * add readme * use memory router * add extension to mono-repo config * fix webpack build * util functions * add TX type * refactor routes * refactor pages + add send page * add page layout for app pages * set up app context * app components * set up connection config * fix lint errors * Chore/browser extension bootstrap (#3257) * init package * set up TS and Webpack * add eslint config * add prettier config * add react and mui theme * add CI * update mui theme version number * Chore/browser extension routes (#3327) * start routes * create layouts * add initial app routes * add initial app pages * add global types * create reuseable components * move password and mnemonic fields to shared react components package * refactor register routes * move client address component to shared package * move components to ui folder * create menu and appbar components * adjust layout components * add readme * use memory router * add extension to mono-repo config * util functions * add TX type * refactor routes * refactor pages + add send page * add page layout for app pages * set up app context * app components * set up connection config * use fee simulation when sending tokens * use object argument for simulate send api * login validation + fee refinements * use components from shared components lib * add receive modal (#3408) * account storage via wasm * method to get all storage keys * Feature/nym browser extension password encryption (single account) (#3442) * build wasm * reuse components and state for password pages * refactor registration pages * use login with password * import storage as local package * add yarn preinstall script to ts lint gh action * install wasm-pack for CI * use @nym scope for ext storage package * introduced a call to check if database was already initialised (#3465) * introduced a call to check if database was already initialised * use extension storage method to check for db existance --------- Co-authored-by: fmtabbara <fmtabbara@hotmail.co.uk> * introduced mnemonic key existence check (#3462) * Browser extension - Multi-accounts + view mnemonic action (#3488) * add UI for multi-accounts + add view mnemonic for accounts * refactor routes * set up import account * add account to existing wallet * check if account name exists before creating new one * handle password errors * add token to currency conversion * fixed ClientStorageError import path * fix CI * fix CI --------- Co-authored-by: Jędrzej Stuczyński <jedrzej.stuczynski@gmail.com>
113 lines
3.1 KiB
TypeScript
113 lines
3.1 KiB
TypeScript
import React, { useMemo, useState } from 'react';
|
|
import { DecCoin } from '@nymproject/types';
|
|
import { useNavigate } from 'react-router-dom';
|
|
import { nymToUnym } from 'src/utils/coin';
|
|
import { TTransaction } from 'src/types';
|
|
import { Fee, useGetFee } from 'src/hooks/useGetFee';
|
|
import { createFeeObject } from 'src/utils/fee';
|
|
import { useAppContext } from './app';
|
|
|
|
type TSendContext = {
|
|
address?: string;
|
|
amount?: DecCoin;
|
|
transaction?: TTransaction;
|
|
fee?: Fee;
|
|
handleChangeAddress: (address?: string) => void;
|
|
handleChangeAmount: (amount?: DecCoin) => void;
|
|
handleSend: () => void;
|
|
resetTx: () => void;
|
|
onDone: () => void;
|
|
handleGetFee: (address: string, amount: string) => Promise<void>;
|
|
};
|
|
|
|
const SendContext = React.createContext({} as TSendContext);
|
|
|
|
export const SendProvider = ({ children }: { children: React.ReactNode }) => {
|
|
const [address, setAddress] = useState<string>();
|
|
const [amount, setAmount] = useState<DecCoin>();
|
|
const [transaction, setTransaction] = useState<TTransaction>();
|
|
|
|
const { client, minorDenom } = useAppContext();
|
|
const navigate = useNavigate();
|
|
|
|
const handleChangeAddress = (_address?: string) => setAddress(_address);
|
|
|
|
const handleChangeAmount = (_amount?: DecCoin) => setAmount(_amount);
|
|
|
|
const { getFee, fee } = useGetFee();
|
|
|
|
const handleGetFee = async (addressVal: string, amountVal: string) => {
|
|
const unym = nymToUnym(Number(amountVal));
|
|
|
|
if (client) {
|
|
// client loses its 'this' context when passing the method
|
|
// TODO find a better way of doing this.
|
|
getFee(client.simulateSend.bind(client), {
|
|
signingAddress: client.address,
|
|
from: client.address,
|
|
to: addressVal,
|
|
amount: [{ amount: unym.toString(), denom: minorDenom }],
|
|
});
|
|
}
|
|
};
|
|
|
|
const handleSend = async () => {
|
|
setTransaction({ status: 'loading', type: 'send' });
|
|
let unyms;
|
|
|
|
if (!Number(amount?.amount)) {
|
|
setTransaction({ status: 'error', type: 'send', message: 'Amount is not a valid number' });
|
|
}
|
|
|
|
if (amount) {
|
|
unyms = nymToUnym(Number(amount.amount));
|
|
}
|
|
|
|
if (client && address && unyms) {
|
|
try {
|
|
const response = await client.send(
|
|
address,
|
|
[{ amount: unyms.toString(), denom: minorDenom }],
|
|
createFeeObject(fee?.unym),
|
|
);
|
|
|
|
setTransaction({ status: 'success', type: 'send', txHash: response?.transactionHash });
|
|
} catch (e) {
|
|
setTransaction({
|
|
status: 'error',
|
|
type: 'send',
|
|
message: e instanceof Error ? e.message : 'Error making send transaction. Please try again',
|
|
});
|
|
}
|
|
}
|
|
};
|
|
|
|
const resetTx = () => {
|
|
setTransaction(undefined);
|
|
};
|
|
|
|
const onDone = () => {
|
|
navigate('/user/balance');
|
|
};
|
|
|
|
const value = useMemo<TSendContext>(
|
|
() => ({
|
|
address,
|
|
amount,
|
|
transaction,
|
|
fee,
|
|
handleChangeAddress,
|
|
handleChangeAmount,
|
|
handleSend,
|
|
resetTx,
|
|
onDone,
|
|
handleGetFee,
|
|
}),
|
|
[address, amount, transaction, fee],
|
|
);
|
|
|
|
return <SendContext.Provider value={value}>{children}</SendContext.Provider>;
|
|
};
|
|
|
|
export const useSendContext = () => React.useContext(SendContext);
|