/*
This file is part of TALER
(C) 2016 GNUnet e.V.
TALER is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 3, or (at your option) any later version.
TALER is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
TALER; see the file COPYING. If not, see
*/
import {
AmountJson,
Amounts,
AmountString,
PaytoUri,
} from "@gnu-taler/taler-util";
import { DepositFee } from "@gnu-taler/taler-wallet-core/src/operations/deposits";
import { Fragment, h, VNode } from "preact";
import { useEffect, useState } from "preact/hooks";
import { Loading } from "../components/Loading";
import { SelectList } from "../components/SelectList";
import {
ButtonBoxWarning,
ButtonPrimary,
ErrorText,
Input,
InputWithLabel,
WarningBox,
} from "../components/styled";
import { useTranslationContext } from "../context/translation";
import { useAsyncAsHook } from "../hooks/useAsyncAsHook";
import * as wxApi from "../wxApi";
interface Props {
currency: string;
onSuccess: (currency: string) => void;
}
export function DepositPage({ currency, onSuccess }: Props): VNode {
const state = useAsyncAsHook(async () => {
const balance = await wxApi.getBalance();
const bs = balance.balances.filter((b) => b.available.startsWith(currency));
const currencyBalance =
bs.length === 0
? Amounts.getZero(currency)
: Amounts.parseOrThrow(bs[0].available);
const knownAccounts = await wxApi.listKnownBankAccounts(currency);
return { accounts: knownAccounts.accounts, currencyBalance };
});
const accounts =
state === undefined ? [] : state.hasError ? [] : state.response.accounts;
const currencyBalance =
state === undefined
? Amounts.getZero(currency)
: state.hasError
? Amounts.getZero(currency)
: state.response.currencyBalance;
async function doSend(account: string, amount: AmountString): Promise {
await wxApi.createDepositGroup(account, amount);
onSuccess(currency);
}
async function getFeeForAmount(
account: string,
amount: AmountString,
): Promise {
return await wxApi.getFeeForDeposit(account, amount);
}
if (accounts.length === 0) return ;
return (
);
}
interface ViewProps {
knownBankAccounts: Array;
balance: AmountJson;
onSend: (account: string, amount: AmountString) => Promise;
onCalculateFee: (
account: string,
amount: AmountString,
) => Promise;
}
export function View({
knownBankAccounts,
balance,
onSend,
onCalculateFee,
}: ViewProps): VNode {
const { i18n } = useTranslationContext();
const accountMap = createLabelsForBankAccount(knownBankAccounts);
const [accountIdx, setAccountIdx] = useState(0);
const [amount, setAmount] = useState(undefined);
const [fee, setFee] = useState(undefined);
function updateAmount(num: number | undefined) {
setAmount(num);
setFee(undefined);
}
const currency = balance.currency;
const amountStr: AmountString = `${currency}:${amount}`;
const feeSum =
fee !== undefined
? Amounts.sum([fee.wire, fee.coin, fee.refresh]).amount
: Amounts.getZero(currency);
const account = knownBankAccounts.length
? knownBankAccounts[accountIdx]
: undefined;
const accountURI = !account
? ""
: `payto://${account.targetType}/${account.targetPath}`;
useEffect(() => {
if (amount === undefined) return;
onCalculateFee(accountURI, amountStr).then((result) => {
setFee(result);
});
}, [amount]);
if (!balance) {
return (
no balance
);
}
if (!knownBankAccounts || !knownBankAccounts.length) {
return (