/* 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 { Amounts, Balance, NotificationType, Transaction, } from "@gnu-taler/taler-util"; import { Fragment, h, VNode } from "preact"; import { useEffect, useState } from "preact/hooks"; import { Loading } from "../components/Loading.js"; import { LoadingError } from "../components/LoadingError.js"; import { ButtonBoxPrimary, ButtonPrimary, CenteredBoldText, CenteredText, DateSeparator, NiceSelect, } from "../components/styled/index.js"; import { Time } from "../components/Time.js"; import { TransactionItem } from "../components/TransactionItem.js"; import { useTranslationContext } from "../context/translation.js"; import { useAsyncAsHook } from "../hooks/useAsyncAsHook.js"; import { NoBalanceHelp } from "../popup/NoBalanceHelp.js"; import * as wxApi from "../wxApi.js"; interface Props { currency?: string; goToWalletDeposit: (currency: string) => void; goToWalletManualWithdraw: (currency?: string) => void; } export function HistoryPage({ currency, goToWalletManualWithdraw, goToWalletDeposit, }: Props): VNode { const { i18n } = useTranslationContext(); const state = useAsyncAsHook(async () => ({ b: await wxApi.getBalance(), tx: await wxApi.getTransactions(), })); useEffect(() => { wxApi.onUpdateNotification([NotificationType.WithdrawGroupFinished], () => { state?.retry(); }); }); if (!state) { return ; } if (state.hasError) { return ( Could not load the list of transactions } error={state} /> ); } return ( ); } const term = 1000 * 60 * 60 * 24; function normalizeToDay(x: number): number { return Math.round(x / term) * term; } export function HistoryView({ defaultCurrency, transactions, balances, goToWalletManualWithdraw, goToWalletDeposit, }: { goToWalletDeposit: (currency: string) => void; goToWalletManualWithdraw: (currency?: string) => void; defaultCurrency?: string; transactions: Transaction[]; balances: Balance[]; }): VNode { const { i18n } = useTranslationContext(); const currencies = balances.map((b) => b.available.split(":")[0]); const defaultCurrencyIndex = currencies.findIndex( (c) => c === defaultCurrency, ); const [currencyIndex, setCurrencyIndex] = useState( defaultCurrencyIndex === -1 ? 0 : defaultCurrencyIndex, ); const selectedCurrency = currencies.length > 0 ? currencies[currencyIndex] : undefined; const currencyAmount = balances[currencyIndex] ? Amounts.jsonifyAmount(balances[currencyIndex].available) : undefined; const byDate = transactions .filter((t) => t.amountRaw.split(":")[0] === selectedCurrency) .reduce((rv, x) => { const theDate = x.timestamp.t_s === "never" ? 0 : normalizeToDay(x.timestamp.t_s * 1000); if (theDate) { (rv[theDate] = rv[theDate] || []).push(x); } return rv; }, {} as { [x: string]: Transaction[] }); const datesWithTransaction = Object.keys(byDate); if (balances.length === 0 || !selectedCurrency) { return ( ); } return (
{currencies.length === 1 ? ( {selectedCurrency} ) : ( )} {currencyAmount && ( {Amounts.stringifyValue(currencyAmount)} )}
goToWalletManualWithdraw(selectedCurrency)} > Withdraw {currencyAmount && Amounts.isNonZero(currencyAmount) && ( goToWalletDeposit(selectedCurrency)} > Deposit )}
{datesWithTransaction.length === 0 ? (
There is no history for this currency
) : (
{datesWithTransaction.map((d, i) => { return ( {byDate[d].map((tx, i) => ( ))} ); })}
)}
); }