vega-frontend-monorepo/libs/web3/src/lib/use-ethereum-withdraw-approvals-store.tsx
m.ray 7ea7edc1e2
feat(#2565): orderbook populate limit (#2690)
Co-authored-by: asiaznik <artur@vegaprotocol.io>
2023-01-25 11:38:26 -08:00

112 lines
3.2 KiB
TypeScript

import { create } from 'zustand';
import produce from 'immer';
import type BigNumber from 'bignumber.js';
import type { WithdrawalBusEventFieldsFragment } from '@vegaprotocol/wallet';
import { useVegaTransactionStore } from '@vegaprotocol/wallet';
import type { WithdrawalApprovalQuery } from '@vegaprotocol/wallet';
export enum ApprovalStatus {
Idle = 'Idle',
Pending = 'Pending',
Delayed = 'Delayed',
Error = 'Error',
Ready = 'Ready',
}
export interface EthWithdrawalApprovalState {
id: number;
createdAt: Date;
status: ApprovalStatus;
message?: string; //#TODO message is not use anywhere
threshold?: BigNumber;
completeTimestamp?: number | null;
dialogOpen?: boolean;
withdrawal: WithdrawalBusEventFieldsFragment;
approval?: WithdrawalApprovalQuery['erc20WithdrawalApproval'];
}
export interface EthWithdrawApprovalStore {
transactions: (EthWithdrawalApprovalState | undefined)[];
create: (
withdrawal: EthWithdrawalApprovalState['withdrawal'],
approval?: EthWithdrawalApprovalState['approval']
) => number;
update: (
id: EthWithdrawalApprovalState['id'],
update?: Partial<
Pick<
EthWithdrawalApprovalState,
| 'approval'
| 'status'
| 'message'
| 'threshold'
| 'completeTimestamp'
| 'dialogOpen'
>
>
) => void;
dismiss: (index: number) => void;
}
export const useEthWithdrawApprovalsStore = create<EthWithdrawApprovalStore>(
(set, get) => ({
transactions: [] as EthWithdrawalApprovalState[],
create: (
withdrawal: EthWithdrawalApprovalState['withdrawal'],
approval?: EthWithdrawalApprovalState['approval']
) => {
const transactions = get().transactions;
const transaction: EthWithdrawalApprovalState = {
id: transactions.length,
createdAt: new Date(),
status: ApprovalStatus.Idle,
withdrawal,
approval,
dialogOpen: true,
};
// dismiss possible vega transaction dialog/toast
const vegaTransaction = useVegaTransactionStore
.getState()
.transactions.find((t) => t?.withdrawal?.id === withdrawal.id);
if (vegaTransaction) {
useVegaTransactionStore.getState().dismiss(vegaTransaction.id);
}
set({ transactions: transactions.concat(transaction) });
return transaction.id;
},
update: (
id: EthWithdrawalApprovalState['id'],
update?: Partial<
Pick<
EthWithdrawalApprovalState,
| 'approval'
| 'status'
| 'message'
| 'threshold'
| 'completeTimestamp'
| 'dialogOpen'
>
>
) =>
set({
transactions: produce(get().transactions, (draft) => {
const transaction = draft.find(
(transaction) => transaction?.id === id
);
if (transaction) {
Object.assign(transaction, update);
}
}),
}),
dismiss: (index: number) => {
set(
produce((state: EthWithdrawApprovalStore) => {
const transaction = state.transactions[index];
if (transaction) {
transaction.dialogOpen = false;
}
})
);
},
})
);