/* 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 { useState } from "preact/hooks"; import { Loading } from "../components/Loading"; import { LoadingError } from "../components/LoadingError"; import { ButtonBoxPrimary, ButtonBoxWarning, ButtonPrimary, CenteredBoldText, CenteredText, DateSeparator, NiceSelect, WarningBox, } from "../components/styled"; import { Time } from "../components/Time"; import { TransactionItem } from "../components/TransactionItem"; import { useAsyncAsHook } from "../hooks/useAsyncAsHook"; import * as wxApi from "../wxApi"; interface Props { currency?: string; goToWalletDeposit: (currency: string) => void; goToWalletManualWithdraw: (currency?: string) => void; } export function HistoryPage({ currency, goToWalletManualWithdraw, goToWalletDeposit, }: Props): VNode { const balance = useAsyncAsHook(wxApi.getBalance); const balanceWithoutError = balance?.hasError ? [] : balance?.response.balances || []; const transactionQuery = useAsyncAsHook(wxApi.getTransactions, [ NotificationType.WithdrawGroupFinished, ]); if (!transactionQuery || !balance) { return ; } if (transactionQuery.hasError) { return ( ); } 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 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_ms === "never" ? 0 : normalizeToDay(x.timestamp.t_ms); 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 (

You have no balance. Withdraw some founds into your wallet

goToWalletManualWithdraw()}> Withdraw
); } 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) => ( ))} ); })}
)}
); }