aboutsummaryrefslogtreecommitdiff
path: root/packages/aml-backoffice-ui/src/hooks/useCases.ts
blob: 04b7c383bd110c70b7c055865b9b5b8aba33abd6 (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
import { useEffect, useState } from "preact/hooks";

import { AmlExchangeBackend } from "../types.js";
import {
  HttpResponse,
  HttpResponseOk,
  HttpResponsePaginated,
  RequestError,
} from "@gnu-taler/web-util/browser";
// FIX default import https://github.com/microsoft/TypeScript/issues/49189
import _useSWR, { SWRHook } from "swr";
import { usePublicBackend } from "./useBackend.js";
import { AccountId, buildQuerySignature } from "../account.js";
import { useOfficer } from "./useOfficer.js";
const useSWR = _useSWR as unknown as SWRHook;

const PAGE_SIZE = 10;
const MAX_RESULT_SIZE = PAGE_SIZE * 2 - 1;
/**
 * FIXME: mutate result when balance change (transaction )
 * @param account
 * @param args
 * @returns
 */
export function useCases(
  account: AccountId,
  state: AmlExchangeBackend.AmlState,
  signature: string | undefined,
): HttpResponsePaginated<
  AmlExchangeBackend.AmlRecords,
  AmlExchangeBackend.AmlError
> {
  const { paginatedFetcher } = usePublicBackend();

  const [page, setPage] = useState(1);

  const {
    data: afterData,
    error: afterError,
    isValidating: loadingAfter,
  } = useSWR<
    HttpResponseOk<AmlExchangeBackend.AmlRecords>,
    RequestError<AmlExchangeBackend.AmlError>
  >(
    [
      `aml/${account}/decisions/${AmlExchangeBackend.AmlState[state]}`,
      page,
      PAGE_SIZE,
      signature,
    ],
    paginatedFetcher,
  );

  const [lastAfter, setLastAfter] = useState<
    HttpResponse<AmlExchangeBackend.AmlRecords, AmlExchangeBackend.AmlError>
  >({ loading: true });

  useEffect(() => {
    if (afterData) setLastAfter(afterData);
  }, [afterData]);

  if (afterError) {
    return afterError.cause;
  }

  // if the query returns less that we ask, then we have reach the end or beginning
  const isReachingEnd =
    afterData && afterData.data && afterData.data.records.length < PAGE_SIZE;
  const isReachingStart = false;

  const pagination = {
    isReachingEnd,
    isReachingStart,
    loadMore: () => {
      if (!afterData || isReachingEnd) return;
      if (afterData.data && afterData.data.records.length < MAX_RESULT_SIZE) {
        setPage(page + 1);
      }
    },
    loadMorePrev: () => {
      null;
    },
  };

  const records = !afterData
    ? []
    : ((afterData ?? lastAfter).data ?? { records: [] }).records;
  console.log("afterdata", afterData, lastAfter, records)
  if (loadingAfter) return { loading: true, data: { records } };
  if (afterData) {
    return { ok: true, data: { records }, ...pagination };
  }
  return { loading: true };
}