diff options
author | Sebastian <sebasjm@gmail.com> | 2023-10-23 16:02:58 -0300 |
---|---|---|
committer | Sebastian <sebasjm@gmail.com> | 2023-10-23 16:02:58 -0300 |
commit | 58c0b115175ffc963e394258ec888b2be7ad3d74 (patch) | |
tree | 90f444ea73dc915f387c42ab6e82ba777a2fb320 /packages/demobank-ui | |
parent | c66f06eb73e53a8804b8c2b36ff45972836c633c (diff) |
fix more error cases
Diffstat (limited to 'packages/demobank-ui')
9 files changed, 65 insertions, 61 deletions
diff --git a/packages/demobank-ui/src/hooks/circuit.ts b/packages/demobank-ui/src/hooks/circuit.ts index fc17c0184..e7a28bd98 100644 --- a/packages/demobank-ui/src/hooks/circuit.ts +++ b/packages/demobank-ui/src/hooks/circuit.ts @@ -96,32 +96,6 @@ export function useEstimator(): CashoutEstimators { }; } -export function useRatiosAndFeeConfig() { - const { api, config } = useBankCoreApiContext(); - - function fetcher() { - return api.getConversionRates() - } - - const { data, error } = useSWR<TalerCoreBankResultByMethod<"getConversionRates">, TalerHttpError>( - !config.have_cashout || !config.fiat_currency ? false : [, "getConversionRates"], fetcher, { - refreshInterval: 60 * 1000, - refreshWhenHidden: false, - revalidateOnFocus: false, - revalidateIfStale: false, - revalidateOnReconnect: false, - refreshWhenOffline: false, - errorRetryCount: 0, - errorRetryInterval: 1, - shouldRetryOnError: false, - keepPreviousData: true, - }); - - if (data) return data; - if (error) return error; - return undefined; -} - export function useBusinessAccounts() { const { state: credentials } = useBackendState(); const token = credentials.status !== "loggedIn" ? undefined : credentials.token @@ -130,7 +104,8 @@ export function useBusinessAccounts() { const [offset, setOffset] = useState<string | undefined>(); function fetcher([token, offset]: [AccessToken, string]) { - return api.getAccounts(token, { + //FIXME: add account name filter + return api.getAccounts(token,{}, { limit: MAX_RESULT_SIZE, offset, order: "asc" @@ -183,13 +158,16 @@ function notUndefined(c: CashoutWithId | undefined): c is CashoutWithId { } export function useCashouts(account: string) { const { state: credentials } = useBackendState(); - const { api } = useBankCoreApiContext(); + const { api, config } = useBankCoreApiContext(); const token = credentials.status !== "loggedIn" ? undefined : credentials.token async function fetcher([username, token]: [string, AccessToken]) { const list = await api.getAccountCashouts({ username, token }) if (list.type !== "ok") { - assertUnreachable(list.type) + if (list.case === "cashout-not-supported") { + throw Error("cashout is not supported") + } + assertUnreachable(list.case) } const all: Array<CashoutWithId | undefined> = await Promise.all(list.body.cashouts.map(c => { return api.getCashoutById({ username, token }, c.cashout_id).then(r => { @@ -203,7 +181,7 @@ export function useCashouts(account: string) { } const { data, error } = useSWR<OperationOk<{ cashouts: CashoutWithId[] }>, TalerHttpError>( - [account, token, "getAccountCashouts"], fetcher, { + !config.have_cashout ? false : [account, token, "getAccountCashouts"], fetcher, { refreshInterval: 0, refreshWhenHidden: false, revalidateOnFocus: false, diff --git a/packages/demobank-ui/src/pages/AccountPage/state.ts b/packages/demobank-ui/src/pages/AccountPage/state.ts index 793593f0d..6da066d77 100644 --- a/packages/demobank-ui/src/pages/AccountPage/state.ts +++ b/packages/demobank-ui/src/pages/AccountPage/state.ts @@ -14,11 +14,11 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { Amounts, HttpStatusCode, TalerError, TalerErrorCode, parsePaytoUri } from "@gnu-taler/taler-util"; -import { ErrorType, notifyError, useTranslationContext } from "@gnu-taler/web-util/browser"; +import { Amounts, TalerError, parsePaytoUri } from "@gnu-taler/taler-util"; +import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { useAccountDetails } from "../../hooks/access.js"; -import { Props, State } from "./index.js"; import { assertUnreachable } from "../WithdrawalOperationPage.js"; +import { Props, State } from "./index.js"; export function useComponentState({ account, goToConfirmOperation }: Props): State { const result = useAccountDetails(account); @@ -48,6 +48,11 @@ export function useComponentState({ account, goToConfirmOperation }: Props): Sta status: "login", reason: "not-found", } + case "no-rights": return { + //users are forbiden to see others account + status: "login", + reason: "not-found", + } default: { assertUnreachable(result) } diff --git a/packages/demobank-ui/src/pages/ShowAccountDetails.tsx b/packages/demobank-ui/src/pages/ShowAccountDetails.tsx index 74346985a..b109441a6 100644 --- a/packages/demobank-ui/src/pages/ShowAccountDetails.tsx +++ b/packages/demobank-ui/src/pages/ShowAccountDetails.tsx @@ -43,6 +43,7 @@ export function ShowAccountDetails({ switch (result.case) { case "not-found": return <LoginForm reason="not-found" /> case "unauthorized": return <LoginForm reason="forbidden" /> + case "no-rights": return <LoginForm reason="forbidden" /> default: assertUnreachable(result) } } @@ -77,6 +78,12 @@ export function ShowAccountDetails({ description: resp.detail.hint as TranslatedString, debug: resp.detail, }) + case "cant-change-legal-name-or-admin": return notify({ + type: "error", + title: i18n.str`Can't change legal name`, + description: resp.detail.hint as TranslatedString, + debug: resp.detail, + }) default: assertUnreachable(resp) } } diff --git a/packages/demobank-ui/src/pages/UpdateAccountPassword.tsx b/packages/demobank-ui/src/pages/UpdateAccountPassword.tsx index f23285528..b14c6d90b 100644 --- a/packages/demobank-ui/src/pages/UpdateAccountPassword.tsx +++ b/packages/demobank-ui/src/pages/UpdateAccountPassword.tsx @@ -59,7 +59,7 @@ export function UpdateAccountPassword({ type: "error", title: i18n.str`Not authorized to change the password, maybe the session is invalid.` }) - case "no-rights": return notify({ + case "old-password-invalid-or-not-allowed": return notify({ type: "error", title: current ? i18n.str`This user have no right on to change the password.` : diff --git a/packages/demobank-ui/src/pages/admin/Account.tsx b/packages/demobank-ui/src/pages/admin/Account.tsx index a1e80ccb9..1818de655 100644 --- a/packages/demobank-ui/src/pages/admin/Account.tsx +++ b/packages/demobank-ui/src/pages/admin/Account.tsx @@ -25,6 +25,7 @@ export function WireTransfer({ toAccount, onRegister, onCancel, onSuccess }: { o switch (result.case) { case "unauthorized": return <LoginForm reason="forbidden" onRegister={onRegister} /> case "not-found": return <LoginForm reason="not-found" onRegister={onRegister} /> + case "no-rights": return <LoginForm reason="not-found" onRegister={onRegister} /> default: assertUnreachable(result) } } diff --git a/packages/demobank-ui/src/pages/admin/AccountList.tsx b/packages/demobank-ui/src/pages/admin/AccountList.tsx index 7d3dd5595..a88badb58 100644 --- a/packages/demobank-ui/src/pages/admin/AccountList.tsx +++ b/packages/demobank-ui/src/pages/admin/AccountList.tsx @@ -31,7 +31,8 @@ export function AccountList({ onRemoveAccount, onShowAccountDetails, onUpdateAcc if (result.data.type === "fail") { switch (result.data.case) { case "unauthorized": return <div>un auth</div> - default: assertUnreachable(result.data.case) + case "no-rights": return <div>un auth</div> + default: assertUnreachable(result.data) } } diff --git a/packages/demobank-ui/src/pages/admin/RemoveAccount.tsx b/packages/demobank-ui/src/pages/admin/RemoveAccount.tsx index 4aa17e302..89f634080 100644 --- a/packages/demobank-ui/src/pages/admin/RemoveAccount.tsx +++ b/packages/demobank-ui/src/pages/admin/RemoveAccount.tsx @@ -43,6 +43,7 @@ export function RemoveAccount({ switch (result.case) { case "unauthorized": return <LoginForm reason="forbidden" /> case "not-found": return <LoginForm reason="not-found" /> + case "no-rights": return <LoginForm reason="not-found" /> default: assertUnreachable(result) } } diff --git a/packages/demobank-ui/src/pages/business/CreateCashout.tsx b/packages/demobank-ui/src/pages/business/CreateCashout.tsx index a3a48eed4..a71915622 100644 --- a/packages/demobank-ui/src/pages/business/CreateCashout.tsx +++ b/packages/demobank-ui/src/pages/business/CreateCashout.tsx @@ -14,7 +14,6 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ import { - AmountJson, Amounts, TalerError, TranslatedString @@ -23,10 +22,10 @@ import { notify, useTranslationContext } from "@gnu-taler/web-util/browser"; -import { format } from "date-fns"; import { Fragment, VNode, h } from "preact"; import { useEffect, useState } from "preact/hooks"; import { mutate } from "swr"; +import { Attention } from "../../components/Attention.js"; import { ErrorLoading } from "../../components/ErrorLoading.js"; import { Loading } from "../../components/Loading.js"; import { ShowInputErrorLabel } from "../../components/ShowInputErrorLabel.js"; @@ -34,9 +33,7 @@ import { useBankCoreApiContext } from "../../context/config.js"; import { useAccountDetails } from "../../hooks/access.js"; import { useBackendState } from "../../hooks/backend.js"; import { - useCashoutDetails, - useEstimator, - useRatiosAndFeeConfig, + useEstimator } from "../../hooks/circuit.js"; import { TanChannel, @@ -46,7 +43,6 @@ import { import { LoginForm } from "../LoginForm.js"; import { InputAmount } from "../PaytoWireTransferForm.js"; import { assertUnreachable } from "../WithdrawalOperationPage.js"; -import { Attention } from "../../components/Attention.js"; interface Props { account: string; @@ -71,7 +67,6 @@ export function CreateCashout({ onCancel, }: Props): VNode { const { i18n } = useTranslationContext(); - const resultRatios = useRatiosAndFeeConfig(); const resultAccount = useAccountDetails(accountName); const { estimateByCredit: calculateFromCredit, @@ -93,19 +88,17 @@ export function CreateCashout({ </Attention> } - if (!resultAccount || !resultRatios) { + if (!resultAccount) { return <Loading /> } if (resultAccount instanceof TalerError) { return <ErrorLoading error={resultAccount} /> } - if (resultRatios instanceof TalerError) { - return <ErrorLoading error={resultRatios} /> - } if (resultAccount.type === "fail") { switch (resultAccount.case) { case "unauthorized": return <LoginForm reason="forbidden" /> case "not-found": return <LoginForm reason="not-found" /> + case "no-rights": return <LoginForm reason="not-found" /> default: assertUnreachable(resultAccount) } } @@ -133,14 +126,16 @@ export function CreateCashout({ const zeroCalc = { debit: zero, credit: zero, beforeFee: zero }; const [calc, setCalc] = useState(zeroCalc); - const sellRate = ratio.sell_at_ratio; - const sellFee = !ratio.sell_out_fee + const sellRate = config.conversion_info?.sell_at_ratio; + const sellFee = !config.conversion_info?.sell_out_fee ? zero : Amounts.parseOrThrow( - `${account.balance.currency}:${ratio.sell_out_fee}`, + `${account.balance.currency}:${config.conversion_info.sell_out_fee}`, ); - if (!sellRate || sellRate < 0) return <div>error rate</div>; + if (sellRate === undefined || sellRate < 0) return <div>error rate</div>; + + const safeSellRate = sellRate const amount = Amounts.parseOrThrow( `${!form.isDebit ? config.fiat_currency.name : account.balance.currency}:${!form.amount ? "0" : form.amount @@ -151,8 +146,8 @@ export function CreateCashout({ async function doAsync() { await withRuntimeErrorHandling(i18n, async () => { const resp = await (form.isDebit ? - calculateFromDebit(amount, sellFee, sellRate) : - calculateFromCredit(amount, sellFee, sellRate)); + calculateFromDebit(amount, sellFee, safeSellRate) : + calculateFromCredit(amount, sellFee, safeSellRate)); setCalc(resp) }) } @@ -383,12 +378,6 @@ export function CreateCashout({ description: resp.detail.hint as TranslatedString, debug: resp.detail, }); - case "no-allowed": return notify({ - type: "error", - title: i18n.str`This user is not allowed to make a cashout`, - description: resp.detail.hint as TranslatedString, - debug: resp.detail, - }); case "no-contact-info": return notify({ type: "error", title: i18n.str`Need a contact data where to send the TAN`, @@ -401,12 +390,18 @@ export function CreateCashout({ description: resp.detail.hint as TranslatedString, debug: resp.detail, }); - case "tan-not-supported": return notify({ + case "cashout-or-tan-not-supported": return notify({ type: "error", title: i18n.str`The bank does not support the TAN channel for this operation`, description: resp.detail.hint as TranslatedString, debug: resp.detail, }); + // case "": return notify({ + // type: "error", + // title: i18n.str`This user is not allowed to make a cashout`, + // description: resp.detail.hint as TranslatedString, + // debug: resp.detail, + // }); default: assertUnreachable(resp) } } diff --git a/packages/demobank-ui/src/pages/business/ShowCashoutDetails.tsx b/packages/demobank-ui/src/pages/business/ShowCashoutDetails.tsx index 5c09e2001..b8e566348 100644 --- a/packages/demobank-ui/src/pages/business/ShowCashoutDetails.tsx +++ b/packages/demobank-ui/src/pages/business/ShowCashoutDetails.tsx @@ -38,6 +38,7 @@ import { withRuntimeErrorHandling } from "../../utils.js"; import { assertUnreachable } from "../WithdrawalOperationPage.js"; +import { Attention } from "../../components/Attention.js"; interface Props { id: string; @@ -62,8 +63,11 @@ export function ShowCashoutDetails({ } if (result.type === "fail") { switch (result.case) { - case "already-aborted": return <div>this cashout is already aborted</div> - default: assertUnreachable(result.case) + case "already-aborted": return <Attention type="warning" title={i18n.str`This cashout has already been aborted.`}> + </Attention> + case "cashout-not-supported": return <Attention type="warning" title={i18n.str`Cashouts are not supported`}> + </Attention> + default: assertUnreachable(result) } } const errors = undefinedIfEmpty({ @@ -175,6 +179,12 @@ export function ShowCashoutDetails({ description: resp.detail.hint as TranslatedString, debug: resp.detail, }) + case "cashout-not-supported": return notify({ + type: "error", + title: i18n.str`Cashout operation is not supported.`, + description: resp.detail.hint as TranslatedString, + debug: resp.detail, + }) default: { assertUnreachable(resp) } @@ -219,6 +229,12 @@ export function ShowCashoutDetails({ description: resp.detail.hint as TranslatedString, debug: resp.detail, }) + case "cashout-not-supported": return notify({ + type: "error", + title: i18n.str`Cashout operation is not supported.`, + description: resp.detail.hint as TranslatedString, + debug: resp.detail, + }) default: assertUnreachable(resp) } } |