/* 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 { AmountString, Balance, Timestamp, Transaction, TransactionsResponse, TransactionType } from "@gnu-taler/taler-util"; import { format } from "date-fns"; import { Fragment, JSX, h } from "preact"; import { useEffect, useState } from "preact/hooks"; import imageBank from '../../static/img/ri-bank-line.svg'; import imageHandHeart from '../../static/img/ri-hand-heart-line.svg'; import imageRefresh from '../../static/img/ri-refresh-line.svg'; import imageRefund from '../../static/img/ri-refund-2-line.svg'; import imageShoppingCart from '../../static/img/ri-shopping-cart-line.svg'; import { Column, ExtraLargeText, HistoryRow, WalletBox, DateSeparator, SmallTextLight } from "../components/styled"; import { useBalances } from "../hooks/useBalances"; import * as wxApi from "../wxApi"; import { Pages } from "../NavigationBar"; export function HistoryPage(props: any): JSX.Element { const [transactions, setTransactions] = useState< TransactionsResponse | undefined >(undefined); const balance = useBalances() const balanceWithoutError = balance?.error ? [] : (balance?.response.balances || []) useEffect(() => { const fetchData = async (): Promise => { const res = await wxApi.getTransactions(); setTransactions(res); }; fetchData(); }, []); if (!transactions) { return
Loading ...
; } return ; } function amountToString(c: AmountString) { const idx = c.indexOf(':') return `${c.substring(idx + 1)} ${c.substring(0, idx)}` } export function HistoryView({ list, balances }: { list: Transaction[], balances: Balance[] }) { const byDate = list.reduce(function (rv, x) { const theDate = x.timestamp.t_ms === "never" ? "never" : format(x.timestamp.t_ms, 'dd MMMM yyyy'); (rv[theDate] = rv[theDate] || []).push(x); return rv; }, {} as { [x: string]: Transaction[] }); return {balances.length > 0 &&
{balances.length === 1 &&
Balance: {amountToString(balances[0].available)}
} {balances.length > 1 &&
Balance:
    {balances.map(b =>
  • {b.available}
  • )}
}
}
{Object.keys(byDate).map(d => { return {d} {byDate[d].map((tx, i) => ( ))} })}
} function TransactionItem(props: { tx: Transaction }): JSX.Element { const tx = props.tx; switch (tx.type) { case TransactionType.Withdrawal: return ( ); case TransactionType.Payment: return ( ); case TransactionType.Refund: return ( ); case TransactionType.Tip: return ( ); case TransactionType.Refresh: return ( ); case TransactionType.Deposit: return ( ); } } function TransactionLayout(props: TransactionLayoutProps): JSX.Element { const date = new Date(props.timestamp.t_ms); const dateStr = format(date, 'HH:mm:ss') return ( // {props.title} {props.pending ? ( (Pending) ) : null} {dateStr} // ); } interface TransactionLayoutProps { debitCreditIndicator: "debit" | "credit" | "unknown"; amount: AmountString | "unknown"; timestamp: Timestamp; title: string; id: string; subtitle: string; iconPath: string; pending: boolean; } interface TransactionAmountProps { debitCreditIndicator: "debit" | "credit" | "unknown"; amount: AmountString | "unknown"; pending: boolean; } function TransactionAmount(props: TransactionAmountProps): JSX.Element { const [currency, amount] = props.amount.split(":"); let sign: string; switch (props.debitCreditIndicator) { case "credit": sign = "+"; break; case "debit": sign = "-"; break; case "unknown": sign = ""; } return ( {sign} {amount}
{currency}
); }