Files
nym/nym-browser-extension/src/context/send.tsx
T
Fouad b27fa51092 Feature/nym browser extension (#3637)
* 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>
2023-07-07 11:02:05 +01:00

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);