aboutsummaryrefslogtreecommitdiff
path: root/packages/demobank-ui/src/components/Transactions/state.ts
blob: 9e1bce39b31c6064b7e24adf92e697aade6826bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
 This file is part of GNU Taler
 (C) 2022 Taler Systems S.A.

 GNU 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.

 GNU 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
 GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
 */

import { AbsoluteTime, Amounts } from "@gnu-taler/taler-util";
import { useTransactions } from "../../hooks/access.js";
import { Props, State, Transaction } from "./index.js";

export function useComponentState({
  account,
}: Props): State {
  const result = useTransactions(account)
  if (result.loading) {
    return {
      status: "loading",
      error: undefined
    }
  }
  if (!result.ok) {
    return {
      status: "loading-error",
      error: result
    }
  }
  // if (error) {
  //   switch (error.status) {
  //     case 404:
  //       return {
  //         status: "loading-error",
  //         error: {
  //           hasError: true,
  //           operational: false,
  //           message: `Transactions page ${pageNumber} was not found.`,
  //         },
  //       };
  //     case 401:
  //       return {
  //         status: "loading-error",
  //         error: {
  //           hasError: true,
  //           operational: false,
  //           message: "Wrong credentials given.",
  //         },
  //       };
  //     default:
  //       return {
  //         status: "loading-error",
  //         error: {
  //           hasError: true,
  //           operational: false,
  //           message: `Transaction page ${pageNumber} could not be retrieved.`,
  //         } as any,
  //       };
  //   }
  // }

  // if (!data) {
  //   return {
  //     status: "loading",
  //     error: undefined,
  //   };
  // }

  const transactions = result.data.transactions.map((item: unknown) => {
    if (
      !item ||
      typeof item !== "object" ||
      !("direction" in item) ||
      !("creditorIban" in item) ||
      !("debtorIban" in item) ||
      !("date" in item) ||
      !("subject" in item) ||
      !("currency" in item) ||
      !("amount" in item)
    ) {
      //not valid
      return;
    }
    const anyItem = item as any;
    if (
      !(typeof anyItem.creditorIban === "string") ||
      !(typeof anyItem.debtorIban === "string") ||
      !(typeof anyItem.date === "string") ||
      !(typeof anyItem.subject === "string") ||
      !(typeof anyItem.currency === "string") ||
      !(typeof anyItem.amount === "string")
    ) {
      return;
    }

    const negative = anyItem.direction === "DBIT";
    const counterpart = negative ? anyItem.creditorIban : anyItem.debtorIban;

    let date = anyItem.date ? parseInt(anyItem.date, 10) : 0
    if (isNaN(date) || !isFinite(date)) {
      date = 0
    }
    const when: AbsoluteTime = !date ? AbsoluteTime.never() : {
      t_ms: date,
    };
    const amount = Amounts.parse(`${anyItem.currency}:${anyItem.amount}`);
    const subject = anyItem.subject;
    return {
      negative,
      counterpart,
      when,
      amount,
      subject,
    };
  }).filter((x): x is Transaction => x !== undefined);

  return {
    status: "ready",
    error: undefined,
    transactions,
  };
}