summaryrefslogtreecommitdiff
path: root/packages/demobank-ui/src/pages/admin/RemoveAccount.tsx
blob: 2900db9d2993e889bd66e1b37f63007ef6fcd80d (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
import { ErrorType, HttpResponsePaginated, RequestError, notify, notifyError, useTranslationContext } from "@gnu-taler/web-util/browser";
import { VNode,h,Fragment } from "preact";
import { useAccountDetails } from "../../hooks/access.js";
import { useAdminAccountAPI } from "../../hooks/circuit.js";
import { Amounts, HttpStatusCode, TranslatedString } from "@gnu-taler/taler-util";
import { buildRequestErrorMessage } from "../../utils.js";

export function RemoveAccount({
    account,
    onClear,
    onUpdateSuccess,
    onLoadNotOk,
  }: {
    onLoadNotOk: <T>(
      error: HttpResponsePaginated<T, SandboxBackend.SandboxError>,
    ) => VNode;
    onClear: () => void;
    onUpdateSuccess: () => void;
    account: string;
  }): VNode {
    const { i18n } = useTranslationContext();
    const result = useAccountDetails(account);
    const { deleteAccount } = useAdminAccountAPI();
  
    if (!result.ok) {
      if (result.loading || result.type === ErrorType.TIMEOUT) {
        return onLoadNotOk(result);
      }
      if (result.status === HttpStatusCode.NotFound) {
        return <div>account not found</div>;
      }
      return onLoadNotOk(result);
    }
  
    const balance = Amounts.parse(result.data.balance.amount);
    if (!balance) {
      return <div>there was an error reading the balance</div>;
    }
    const isBalanceEmpty = Amounts.isZero(balance);
    return (
      <div>
        <div>
          <h1 class="nav welcome-text">
            <i18n.Translate>Remove account: {account}</i18n.Translate>
          </h1>
        </div>
        {/* {FXME: SHOW WARNING} */}
        {/* {!isBalanceEmpty && (
          <ErrorBannerFloat
            error={{
              title: i18n.str`Can't delete the account`,
              description: i18n.str`Balance is not empty`,
            }}
            onClear={() => saveError(undefined)}
          />
        )} */}
  
        <p>
          <div style={{ display: "flex", justifyContent: "space-between" }}>
            <div>
              <input
                class="pure-button"
                type="submit"
                value={i18n.str`Cancel`}
                onClick={async (e) => {
                  e.preventDefault();
                  onClear();
                }}
              />
            </div>
            <div>
              <input
                id="select-exchange"
                class="pure-button pure-button-primary content"
                disabled={!isBalanceEmpty}
                type="submit"
                value={i18n.str`Confirm`}
                onClick={async (e) => {
                  e.preventDefault();
                  try {
                    const r = await deleteAccount(account);
                    onUpdateSuccess();
                  } catch (error) {
                    if (error instanceof RequestError) {
                      notify(
                        buildRequestErrorMessage(i18n, error.cause, {
                          onClientError: (status) =>
                            status === HttpStatusCode.Forbidden
                              ? i18n.str`The administrator specified a institutional username`
                              : status === HttpStatusCode.NotFound
                                ? i18n.str`The username was not found`
                                : status === HttpStatusCode.PreconditionFailed
                                  ? i18n.str`Balance was not zero`
                                  : undefined,
                        }),
                      );
                    } else {
                      notifyError(i18n.str`Operation failed, please report`,
                        (error instanceof Error
                            ? error.message
                            : JSON.stringify(error)) as TranslatedString);
                    }
                  }
                }}
              />
            </div>
          </div>
        </p>
      </div>
    );
  }