From 5181d060cf09ffc7250c9f1069920da0724e0284 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Fri, 22 Mar 2024 15:15:15 -0300 Subject: wip, doesn't compile. now merchant doesn't have it's own definition of types... it uses the one defined by taler-util --- packages/merchant-backoffice-ui/src/Routing.tsx | 11 +- .../src/components/form/InputCurrency.tsx | 4 +- .../src/components/form/InputPaytoForm.tsx | 4 +- .../src/components/form/InputStock.tsx | 6 +- .../src/components/form/InputTaxes.tsx | 4 +- .../components/product/InventoryProductForm.tsx | 8 +- .../components/product/NonInventoryProductForm.tsx | 14 +- .../src/components/product/ProductForm.tsx | 13 +- .../src/components/product/ProductList.tsx | 9 +- .../merchant-backoffice-ui/src/context/instance.ts | 1 - .../merchant-backoffice-ui/src/declaration.d.ts | 26 +-- .../merchant-backoffice-ui/src/hooks/backend.ts | 115 +--------- packages/merchant-backoffice-ui/src/hooks/bank.ts | 32 +-- .../src/hooks/instance.test.ts | 100 ++++----- .../merchant-backoffice-ui/src/hooks/instance.ts | 51 ++--- .../merchant-backoffice-ui/src/hooks/merchant.ts | 32 +-- .../merchant-backoffice-ui/src/hooks/order.test.ts | 21 +- packages/merchant-backoffice-ui/src/hooks/order.ts | 56 ++--- packages/merchant-backoffice-ui/src/hooks/otp.ts | 45 ++-- .../src/hooks/product.test.ts | 44 ++-- .../merchant-backoffice-ui/src/hooks/product.ts | 34 +-- .../src/hooks/reserve.test.ts | 207 ----------------- .../merchant-backoffice-ui/src/hooks/reserves.ts | 94 -------- .../merchant-backoffice-ui/src/hooks/templates.ts | 48 ++-- .../src/hooks/transfer.test.ts | 10 +- .../merchant-backoffice-ui/src/hooks/transfer.ts | 26 +-- packages/merchant-backoffice-ui/src/hooks/urls.ts | 120 +++------- .../merchant-backoffice-ui/src/hooks/webhooks.ts | 31 +-- .../src/paths/admin/create/CreatePage.tsx | 11 +- .../src/paths/admin/create/index.tsx | 10 +- .../src/paths/admin/list/TableActive.tsx | 18 +- .../src/paths/admin/list/View.tsx | 8 +- .../src/paths/admin/list/index.tsx | 13 +- .../paths/instance/accounts/create/CreatePage.tsx | 8 +- .../src/paths/instance/accounts/create/index.tsx | 6 +- .../src/paths/instance/accounts/list/ListPage.tsx | 11 +- .../src/paths/instance/accounts/list/Table.tsx | 10 +- .../src/paths/instance/accounts/list/index.tsx | 10 +- .../paths/instance/accounts/update/UpdatePage.tsx | 14 +- .../src/paths/instance/accounts/update/index.tsx | 7 +- .../src/paths/instance/details/DetailPage.tsx | 8 +- .../src/paths/instance/details/index.tsx | 5 +- .../src/paths/instance/details/stories.tsx | 2 +- .../paths/instance/kyc/list/ListPage.stories.tsx | 13 +- .../src/paths/instance/kyc/list/ListPage.tsx | 8 +- .../src/paths/instance/kyc/list/index.tsx | 5 +- .../paths/instance/orders/create/CreatePage.tsx | 75 +++---- .../src/paths/instance/orders/create/index.tsx | 13 +- .../instance/orders/details/Detail.stories.tsx | 33 +-- .../paths/instance/orders/details/DetailPage.tsx | 75 ++++--- .../src/paths/instance/orders/details/index.tsx | 11 +- .../paths/instance/orders/list/List.stories.tsx | 11 +- .../src/paths/instance/orders/list/ListPage.tsx | 12 +- .../src/paths/instance/orders/list/Table.tsx | 13 +- .../src/paths/instance/orders/list/index.tsx | 15 +- .../instance/otp_devices/create/CreatePage.tsx | 6 +- .../otp_devices/create/CreatedSuccessfully.tsx | 4 +- .../paths/instance/otp_devices/create/index.tsx | 11 +- .../paths/instance/otp_devices/list/ListPage.tsx | 11 +- .../src/paths/instance/otp_devices/list/Table.tsx | 9 +- .../src/paths/instance/otp_devices/list/index.tsx | 7 +- .../instance/otp_devices/update/UpdatePage.tsx | 5 +- .../paths/instance/otp_devices/update/index.tsx | 17 +- .../paths/instance/products/create/CreatePage.tsx | 4 +- .../src/paths/instance/products/create/index.tsx | 6 +- .../paths/instance/products/list/List.stories.tsx | 5 +- .../src/paths/instance/products/list/Table.tsx | 19 +- .../src/paths/instance/products/list/index.tsx | 15 +- .../instance/products/update/Update.stories.tsx | 7 +- .../paths/instance/products/update/UpdatePage.tsx | 4 +- .../src/paths/instance/products/update/index.tsx | 9 +- .../paths/instance/templates/create/CreatePage.tsx | 6 +- .../src/paths/instance/templates/create/index.tsx | 6 +- .../src/paths/instance/templates/list/ListPage.tsx | 15 +- .../src/paths/instance/templates/list/Table.tsx | 9 +- .../src/paths/instance/templates/list/index.tsx | 15 +- .../src/paths/instance/templates/qr/QrPage.tsx | 7 +- .../src/paths/instance/templates/qr/index.tsx | 15 +- .../paths/instance/templates/update/UpdatePage.tsx | 6 +- .../src/paths/instance/templates/update/index.tsx | 9 +- .../src/paths/instance/templates/use/UsePage.tsx | 6 +- .../src/paths/instance/templates/use/index.tsx | 11 +- .../src/paths/instance/token/index.tsx | 7 +- .../paths/instance/transfers/create/CreatePage.tsx | 6 +- .../src/paths/instance/transfers/create/index.tsx | 9 +- .../paths/instance/transfers/list/List.stories.tsx | 15 +- .../src/paths/instance/transfers/list/ListPage.tsx | 4 +- .../src/paths/instance/transfers/list/Table.tsx | 9 +- .../src/paths/instance/transfers/list/index.tsx | 10 +- .../src/paths/instance/update/Update.stories.tsx | 4 +- .../src/paths/instance/update/UpdatePage.tsx | 19 +- .../src/paths/instance/update/index.tsx | 13 +- .../paths/instance/webhooks/create/CreatePage.tsx | 4 +- .../src/paths/instance/webhooks/create/index.tsx | 6 +- .../src/paths/instance/webhooks/list/ListPage.tsx | 8 +- .../src/paths/instance/webhooks/list/Table.tsx | 9 +- .../src/paths/instance/webhooks/list/index.tsx | 7 +- .../paths/instance/webhooks/update/UpdatePage.tsx | 4 +- .../src/paths/instance/webhooks/update/index.tsx | 7 +- .../src/paths/login/index.tsx | 7 +- .../merchant-backoffice-ui/src/schemas/index.ts | 4 +- .../merchant-backoffice-ui/src/utils/amount.ts | 8 +- packages/merchant-backoffice-ui/src/utils/table.ts | 1 - packages/merchant-backoffice-ui/src/utils/types.ts | 2 +- packages/taler-util/src/http-client/merchant.ts | 246 +++++++++++++++++---- packages/taler-util/src/http-client/types.ts | 6 +- 106 files changed, 935 insertions(+), 1315 deletions(-) delete mode 100644 packages/merchant-backoffice-ui/src/hooks/reserve.test.ts delete mode 100644 packages/merchant-backoffice-ui/src/hooks/reserves.ts (limited to 'packages') diff --git a/packages/merchant-backoffice-ui/src/Routing.tsx b/packages/merchant-backoffice-ui/src/Routing.tsx index 4ed5850e7..c30b1912a 100644 --- a/packages/merchant-backoffice-ui/src/Routing.tsx +++ b/packages/merchant-backoffice-ui/src/Routing.tsx @@ -19,7 +19,7 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { AbsoluteTime, TranslatedString } from "@gnu-taler/taler-util"; +import { AbsoluteTime, TalerErrorDetail, TranslatedString } from "@gnu-taler/taler-util"; import { ErrorType, HttpError, @@ -35,7 +35,6 @@ import { NotConnectedAppMenu, NotificationCard, } from "./components/menu/index.js"; -import { MerchantBackend } from "./declaration.js"; import { useInstanceBankAccounts } from "./hooks/bank.js"; import { useInstanceKYCDetails } from "./hooks/instance.js"; import { usePreference } from "./hooks/preference.js"; @@ -164,7 +163,7 @@ export function Routing(_p: Props): VNode { function ServerErrorRedirectTo(to: InstancePaths | AdminPaths) { return function ServerErrorRedirectToImpl( - error: HttpError, + error: HttpError, ) { if (error.type === ErrorType.TIMEOUT) { setGlobalNotification({ @@ -179,7 +178,7 @@ export function Routing(_p: Props): VNode { description: i18n.str`Diagnostic from ${error.info.url} is '${error.message}'`, details: error.type === ErrorType.CLIENT || error.type === ErrorType.SERVER - ? error.payload.detail + ? error.payload.hint : undefined, type: "ERROR", to, @@ -679,7 +678,7 @@ function AdminInstanceUpdatePage({ ) => { + onLoadError={(error: HttpError) => { const notif = error.type === ErrorType.TIMEOUT ? { @@ -693,7 +692,7 @@ function AdminInstanceUpdatePage({ details: error.type === ErrorType.CLIENT || error.type === ErrorType.SERVER - ? error.payload.detail + ? error.payload.hint : undefined, type: "ERROR" as const, }; diff --git a/packages/merchant-backoffice-ui/src/components/form/InputCurrency.tsx b/packages/merchant-backoffice-ui/src/components/form/InputCurrency.tsx index f60508504..76d38db84 100644 --- a/packages/merchant-backoffice-ui/src/components/form/InputCurrency.tsx +++ b/packages/merchant-backoffice-ui/src/components/form/InputCurrency.tsx @@ -20,9 +20,9 @@ */ import { useMerchantApiContext } from "@gnu-taler/web-util/browser"; import { ComponentChildren, h, VNode } from "preact"; -import { Amount } from "../../declaration.js"; import { InputWithAddon } from "./InputWithAddon.js"; import { InputProps } from "./useField.js"; +import { AmountString } from "@gnu-taler/taler-util"; export interface Props extends InputProps { expand?: boolean; @@ -57,7 +57,7 @@ export function InputCurrency({ addonAfter={addonAfter} inputType="number" expand={expand} - toStr={(v?: Amount) => v?.split(":")[1] || ""} + toStr={(v?: AmountString) => v?.split(":")[1] || ""} fromStr={(v: string) => (!v ? undefined : `${config.currency}:${v}`)} inputExtra={{ min: 0 }} > diff --git a/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx b/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx index 7eba8b0b5..3337e5f57 100644 --- a/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx +++ b/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx @@ -233,11 +233,11 @@ export function InputPaytoForm({ }, [str]) // const submit = useCallback((): void => { - // // const accounts: MerchantBackend.BankAccounts.AccountAddDetails[] = paytos; + // // const accounts: TalerMerchantApi.AccountAddDetails[] = paytos; // // const alreadyExists = // // accounts.findIndex((x) => x.payto_uri === paytoURL) !== -1; // // if (!alreadyExists) { - // const newValue: MerchantBackend.BankAccounts.AccountAddDetails = { + // const newValue: TalerMerchantApi.AccountAddDetails = { // payto_uri: paytoURL, // }; // if (value.auth) { diff --git a/packages/merchant-backoffice-ui/src/components/form/InputStock.tsx b/packages/merchant-backoffice-ui/src/components/form/InputStock.tsx index 5c98f7311..e47259732 100644 --- a/packages/merchant-backoffice-ui/src/components/form/InputStock.tsx +++ b/packages/merchant-backoffice-ui/src/components/form/InputStock.tsx @@ -18,16 +18,16 @@ * * @author Sebastian Javier Marchano (sebasjm) */ -import { useTranslationContext } from "@gnu-taler/web-util/browser"; +import { Location, useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, h } from "preact"; import { useLayoutEffect, useState } from "preact/hooks"; -import { MerchantBackend, Timestamp } from "../../declaration.js"; import { FormErrors, FormProvider } from "./FormProvider.js"; import { InputDate } from "./InputDate.js"; import { InputGroup } from "./InputGroup.js"; import { InputLocation } from "./InputLocation.js"; import { InputNumber } from "./InputNumber.js"; import { InputProps, useField } from "./useField.js"; +import { TalerMerchantApi } from "@gnu-taler/taler-util"; export interface Props extends InputProps { alreadyExist?: boolean; @@ -39,7 +39,7 @@ export interface Stock { current: number; lost: number; sold: number; - address?: MerchantBackend.Location; + address?: TalerMerchantApi.Location; nextRestock?: Timestamp; } diff --git a/packages/merchant-backoffice-ui/src/components/form/InputTaxes.tsx b/packages/merchant-backoffice-ui/src/components/form/InputTaxes.tsx index 984b496e7..4392c7659 100644 --- a/packages/merchant-backoffice-ui/src/components/form/InputTaxes.tsx +++ b/packages/merchant-backoffice-ui/src/components/form/InputTaxes.tsx @@ -22,18 +22,18 @@ import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { h, VNode } from "preact"; import { useCallback, useState } from "preact/hooks"; import * as yup from "yup"; -import { MerchantBackend } from "../../declaration.js"; import { TaxSchema as schema } from "../../schemas/index.js"; import { FormErrors, FormProvider } from "./FormProvider.js"; import { Input } from "./Input.js"; import { InputGroup } from "./InputGroup.js"; import { InputProps, useField } from "./useField.js"; +import { TalerMerchantApi } from "@gnu-taler/taler-util"; export interface Props extends InputProps { isValid?: (e: any) => boolean; } -type Entity = MerchantBackend.Tax; +type Entity = TalerMerchantApi.Tax; export function InputTaxes({ name, readonly, diff --git a/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.tsx b/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.tsx index 25b1f0e2d..52ac2a1fe 100644 --- a/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.tsx +++ b/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.tsx @@ -16,24 +16,24 @@ import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { h, VNode } from "preact"; import { useState } from "preact/hooks"; -import { MerchantBackend, WithId } from "../../declaration.js"; import { ProductMap } from "../../paths/instance/orders/create/CreatePage.js"; import { FormErrors, FormProvider } from "../form/FormProvider.js"; import { InputNumber } from "../form/InputNumber.js"; import { InputSearchOnList } from "../form/InputSearchOnList.js"; +import { TalerMerchantApi } from "@gnu-taler/taler-util"; type Form = { - product: MerchantBackend.Products.ProductDetail & WithId; + product: TalerMerchantApi.ProductDetail & WithId; quantity: number; }; interface Props { currentProducts: ProductMap; onAddProduct: ( - product: MerchantBackend.Products.ProductDetail & WithId, + product: TalerMerchantApi.ProductDetail & WithId, quantity: number, ) => void; - inventory: (MerchantBackend.Products.ProductDetail & WithId)[]; + inventory: (TalerMerchantApi.ProductDetail & WithId)[]; } export function InventoryProductForm({ diff --git a/packages/merchant-backoffice-ui/src/components/product/NonInventoryProductForm.tsx b/packages/merchant-backoffice-ui/src/components/product/NonInventoryProductForm.tsx index 8ddd9fa95..a127999fc 100644 --- a/packages/merchant-backoffice-ui/src/components/product/NonInventoryProductForm.tsx +++ b/packages/merchant-backoffice-ui/src/components/product/NonInventoryProductForm.tsx @@ -13,11 +13,11 @@ You should have received a copy of the GNU General Public License along with GNU Taler; see the file COPYING. If not, see */ +import { AmountString, TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, h, VNode } from "preact"; import { useCallback, useEffect, useState } from "preact/hooks"; import * as yup from "yup"; -import { MerchantBackend } from "../../declaration.js"; import { useListener } from "../../hooks/listener.js"; import { NonInventoryProductSchema as schema } from "../../schemas/index.js"; import { FormErrors, FormProvider } from "../form/FormProvider.js"; @@ -27,7 +27,7 @@ import { InputImage } from "../form/InputImage.js"; import { InputNumber } from "../form/InputNumber.js"; import { InputTaxes } from "../form/InputTaxes.js"; -type Entity = MerchantBackend.Product; +type Entity = TalerMerchantApi.Product; interface Props { onAddProduct: (p: Entity) => Promise; @@ -46,7 +46,7 @@ export function NonInventoryProductFrom({ }, [isEditing]); const [submitForm, addFormSubmitter] = useListener< - Partial | undefined + Partial | undefined >((result) => { if (result) { setShowCreateProduct(false); @@ -55,7 +55,7 @@ export function NonInventoryProductFrom({ taxes: result.taxes || [], description: result.description || "", image: result.image || "", - price: result.price || "", + price: (result.price || "") as AmountString, unit: result.unit || "", }); } @@ -136,7 +136,7 @@ interface NonInventoryProduct { unit: string; price: string; image: string; - taxes: MerchantBackend.Tax[]; + taxes: TalerMerchantApi.Tax[]; } export function ProductForm({ onSubscribe, initial }: ProductProps): VNode { @@ -144,7 +144,7 @@ export function ProductForm({ onSubscribe, initial }: ProductProps): VNode { taxes: [], ...initial, }); - let errors: FormErrors = {}; + let errors: FormErrors = {}; try { schema.validateSync(value, { abortEarly: false }); } catch (err) { @@ -159,7 +159,7 @@ export function ProductForm({ onSubscribe, initial }: ProductProps): VNode { } const submit = useCallback((): Entity | undefined => { - return value as MerchantBackend.Product; + return value as TalerMerchantApi.Product; }, [value]); const hasErrors = Object.keys(errors).some( diff --git a/packages/merchant-backoffice-ui/src/components/product/ProductForm.tsx b/packages/merchant-backoffice-ui/src/components/product/ProductForm.tsx index 11344cde3..468e5f635 100644 --- a/packages/merchant-backoffice-ui/src/components/product/ProductForm.tsx +++ b/packages/merchant-backoffice-ui/src/components/product/ProductForm.tsx @@ -20,13 +20,12 @@ */ import { - useMerchantApiContext, - useTranslationContext, + useTranslationContext } from "@gnu-taler/web-util/browser"; import { h } from "preact"; import { useCallback, useEffect, useState } from "preact/hooks"; import * as yup from "yup"; -import { MerchantBackend } from "../../declaration.js"; +import { useSessionContext } from "../../context/session.js"; import { ProductCreateSchema as createSchema, ProductUpdateSchema as updateSchema, @@ -39,9 +38,9 @@ import { InputNumber } from "../form/InputNumber.js"; import { InputStock, Stock } from "../form/InputStock.js"; import { InputTaxes } from "../form/InputTaxes.js"; import { InputWithAddon } from "../form/InputWithAddon.js"; -import { useSessionContext } from "../../context/session.js"; +import { AmountString, TalerMerchantApi } from "@gnu-taler/taler-util"; -type Entity = MerchantBackend.Products.ProductDetail & { product_id: string }; +type Entity = TalerMerchantApi.ProductDetail & { product_id: string }; interface Props { onSubscribe: (c?: () => Entity | undefined) => void; @@ -55,7 +54,7 @@ export function ProductForm({ onSubscribe, initial, alreadyExist }: Props) { description_i18n: {}, taxes: [], next_restock: { t_s: "never" }, - price: ":0", + price: ":0" as AmountString, ...initial, stock: !initial || initial.total_stock === -1 @@ -108,7 +107,7 @@ export function ProductForm({ onSubscribe, initial, alreadyExist }: Props) { delete value.minimum_age; } - return value as MerchantBackend.Products.ProductDetail & { + return value as TalerMerchantApi.ProductDetail & { product_id: string; }; }, [value]); diff --git a/packages/merchant-backoffice-ui/src/components/product/ProductList.tsx b/packages/merchant-backoffice-ui/src/components/product/ProductList.tsx index d89c5371b..4fff66fd7 100644 --- a/packages/merchant-backoffice-ui/src/components/product/ProductList.tsx +++ b/packages/merchant-backoffice-ui/src/components/product/ProductList.tsx @@ -13,18 +13,17 @@ You should have received a copy of the GNU General Public License along with GNU Taler; see the file COPYING. If not, see */ -import { Amounts } from "@gnu-taler/taler-util"; +import { Amounts, TalerMerchantApi } from "@gnu-taler/taler-util"; import { h, VNode } from "preact"; import emptyImage from "../../assets/empty.png"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; -import { MerchantBackend } from "../../declaration.js"; interface Props { - list: MerchantBackend.Product[]; + list: TalerMerchantApi.Product[]; actions?: { name: string; tooltip: string; - handler: (d: MerchantBackend.Product, index: number) => void; + handler: (d: TalerMerchantApi.Product, index: number) => void; }[]; } export function ProductList({ list, actions = [] }: Props): VNode { @@ -60,7 +59,7 @@ export function ProductList({ list, actions = [] }: Props): VNode { : Amounts.stringify( Amounts.mult( Amounts.parseOrThrow(entry.price), - entry.quantity, + entry.quantity ?? 0 ).amount, ); diff --git a/packages/merchant-backoffice-ui/src/context/instance.ts b/packages/merchant-backoffice-ui/src/context/instance.ts index f969a99d6..9b67f7170 100644 --- a/packages/merchant-backoffice-ui/src/context/instance.ts +++ b/packages/merchant-backoffice-ui/src/context/instance.ts @@ -21,7 +21,6 @@ import { createContext } from "preact"; import { useContext } from "preact/hooks"; -import { LoginToken } from "../declaration.js"; interface Type { id: string; diff --git a/packages/merchant-backoffice-ui/src/declaration.d.ts b/packages/merchant-backoffice-ui/src/declaration.d.ts index e39257a79..93fecd9c4 100644 --- a/packages/merchant-backoffice-ui/src/declaration.d.ts +++ b/packages/merchant-backoffice-ui/src/declaration.d.ts @@ -28,7 +28,7 @@ type ImageDataUrl = string; type MerchantUserType = "business" | "individual"; -export interface WithId { +interface WithId { id: string; } @@ -118,7 +118,7 @@ interface LoginToken { // must forget after used declare const __ac_token: unique symbol; -export namespace ExchangeBackend { +namespace dead_ExchangeBackend2 { interface WireResponse { // Master public key of the exchange, must match the key returned in /keys. master_public_key: EddsaPublicKey; @@ -153,7 +153,7 @@ export namespace ExchangeBackend { sig: EddsaSignature; } } -export namespace MerchantBackend { +namespace dead_MerchantBackend2 { interface ErrorDetail { // Numeric error code unique to the condition. // The other arguments are specific to the error value reported here. @@ -344,7 +344,7 @@ export namespace MerchantBackend { // Free-form address lines, should not exceed 7 elements. address_lines?: string[]; } - namespace Instances { + namespace dead_Instances2 { //POST /private/instances/$INSTANCE/auth interface InstanceAuthConfigurationMessage { // Type of authentication. @@ -570,7 +570,7 @@ export namespace MerchantBackend { } } - namespace KYC { + namespace dead_KYC { //GET /private/instances/$INSTANCE/kyc interface AccountKycRedirects { // Array of pending KYCs. @@ -612,7 +612,7 @@ export namespace MerchantBackend { } - namespace BankAccounts { + namespace dead_BankAccounts { interface AccountAddDetails { @@ -706,7 +706,7 @@ export namespace MerchantBackend { } - namespace Products { + namespace dead_Products { // POST /private/products interface ProductAddDetail { // product ID to use. @@ -865,7 +865,7 @@ export namespace MerchantBackend { // DELETE /private/products/$PRODUCT_ID } - namespace Orders { + namespace dead_Orders { type MerchantOrderStatusResponse = | CheckPaymentPaidResponse | CheckPaymentClaimedResponse @@ -1147,7 +1147,7 @@ export namespace MerchantBackend { } } - namespace Rewards { + namespace dead_Rewards { // GET /private/reserves interface RewardReserveStatus { // Array of all known reserves (possibly empty!) @@ -1303,7 +1303,7 @@ export namespace MerchantBackend { } } - namespace Transfers { + namespace dead_Transfers { interface TransferList { // list of all the transfers that fit the filter that we know transfers: TransferDetails[]; @@ -1355,7 +1355,7 @@ export namespace MerchantBackend { } } - namespace OTP { + namespace dead_OTP { interface OtpDeviceAddDetails { // Device ID to use. otp_device_id: string; @@ -1412,7 +1412,7 @@ export namespace MerchantBackend { } - namespace Template { + namespace dead_Template { interface TemplateAddDetails { // Template ID to use. template_id: string; @@ -1494,7 +1494,7 @@ export namespace MerchantBackend { } } - namespace Webhooks { + namespace dead_Webhooks { type MerchantWebhookType = "pay" | "refund"; interface WebhookAddDetails { // Webhook ID to use. diff --git a/packages/merchant-backoffice-ui/src/hooks/backend.ts b/packages/merchant-backoffice-ui/src/hooks/backend.ts index 37dfd8fd6..8eb9b4cf2 100644 --- a/packages/merchant-backoffice-ui/src/hooks/backend.ts +++ b/packages/merchant-backoffice-ui/src/hooks/backend.ts @@ -20,24 +20,21 @@ */ import { - AbsoluteTime, - AccessToken, - HttpStatusCode, + TalerErrorDetail, + TalerMerchantApi } from "@gnu-taler/taler-util"; import { EmptyObject, - ErrorType, HttpError, HttpResponse, HttpResponseOk, RequestError, RequestOptions, - useApiContext, + useApiContext } from "@gnu-taler/web-util/browser"; import { useCallback, useEffect, useState } from "preact/hooks"; import { useSWRConfig } from "swr"; import { useSessionContext } from "../context/session.js"; -import { LoginToken, MerchantBackend, Timestamp } from "../declaration.js"; export function useMatchMutate(): ( re?: RegExp, @@ -72,21 +69,21 @@ export function useMatchMutate(): ( } export function useBackendInstancesTestForAdmin(): HttpResponse< - MerchantBackend.Instances.InstancesResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.InstancesResponse, + TalerErrorDetail > { const { request } = useBackendBaseRequest(); - type Type = MerchantBackend.Instances.InstancesResponse; + type Type = TalerMerchantApi.InstancesResponse; const [result, setResult] = useState< - HttpResponse + HttpResponse >({ loading: true }); useEffect(() => { request(`/management/instances`) .then((data) => setResult(data)) - .catch((error: RequestError) => + .catch((error: RequestError) => setResult(error.cause), ); }, [request]); @@ -98,14 +95,14 @@ const CHECK_CONFIG_INTERVAL_OK = 5 * 60 * 1000; const CHECK_CONFIG_INTERVAL_FAIL = 2 * 1000; export function useBackendConfig(): HttpResponse< - MerchantBackend.VersionResponse | undefined, - RequestError + TalerMerchantApi.VersionResponse | undefined, + RequestError > { const { request } = useBackendBaseRequest(); - type Type = MerchantBackend.VersionResponse; + type Type = TalerMerchantApi.VersionResponse; type State = { - data: HttpResponse>; + data: HttpResponse>; timer: number; }; const [result, setResult] = useState({ @@ -191,94 +188,6 @@ type LoginResult = cause: HttpError; }; -export function useCredentialsChecker() { - const { request } = useApiContext(); - //check against instance details endpoint - //while merchant backend doesn't have a login endpoint - async function requestNewLoginToken( - baseUrl: string, - token: AccessToken, - ): Promise { - const data: MerchantBackend.Instances.LoginTokenRequest = { - scope: "write", - duration: { - d_us: "forever", - }, - refreshable: true, - }; - try { - const response = - await request( - baseUrl, - `/private/token`, - { - method: "POST", - token, - data, - }, - ); - return { - valid: true, - token: response.data.token, - expiration: response.data.expiration, - }; - } catch (error) { - if (error instanceof RequestError) { - return { valid: false, cause: error.cause }; - } - - return { - valid: false, - cause: { - type: ErrorType.UNEXPECTED, - loading: false, - info: { - hasToken: true, - status: 0, - options: {}, - url: `/private/token`, - payload: {}, - }, - exception: error, - message: - error instanceof Error ? error.message : "unpexepected error", - }, - }; - } - } - - async function refreshLoginToken( - baseUrl: string, - token: LoginToken, - ): Promise { - if ( - AbsoluteTime.isExpired( - AbsoluteTime.fromProtocolTimestamp(token.expiration), - ) - ) { - return { - valid: false, - cause: { - type: ErrorType.CLIENT, - status: HttpStatusCode.Unauthorized, - message: "login token expired, login again.", - info: { - hasToken: true, - status: 401, - options: {}, - url: `/private/token`, - payload: {}, - }, - payload: {}, - }, - }; - } - - return requestNewLoginToken(baseUrl, token.token as AccessToken); - } - return { requestNewLoginToken, refreshLoginToken }; -} - /** * * @param root the request is intended to the base URL and no the instance URL diff --git a/packages/merchant-backoffice-ui/src/hooks/bank.ts b/packages/merchant-backoffice-ui/src/hooks/bank.ts index d01b579b9..3cf9c7846 100644 --- a/packages/merchant-backoffice-ui/src/hooks/bank.ts +++ b/packages/merchant-backoffice-ui/src/hooks/bank.ts @@ -20,15 +20,15 @@ import { RequestError, } from "@gnu-taler/web-util/browser"; import { useEffect, useState } from "preact/hooks"; -import { MerchantBackend } from "../declaration.js"; import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants.js"; import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 import _useSWR, { SWRHook, mutate } from "swr"; +import { TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; const useSWR = _useSWR as unknown as SWRHook; -// const MOCKED_ACCOUNTS: Record = { +// const MOCKED_ACCOUNTS: Record = { // "hwire1": { // h_wire: "hwire1", // payto_uri: "payto://fake/iban/123", @@ -46,7 +46,7 @@ export function useBankAccountAPI(): BankAccountAPI { const { request } = useBackendInstanceRequest(); const createBankAccount = async ( - data: MerchantBackend.BankAccounts.AccountAddDetails, + data: TalerMerchantApi.AccountAddDetails, ): Promise> => { // MOCKED_ACCOUNTS[data.h_wire] = data // return Promise.resolve({ ok: true, data: undefined }); @@ -60,7 +60,7 @@ export function useBankAccountAPI(): BankAccountAPI { const updateBankAccount = async ( h_wire: string, - data: MerchantBackend.BankAccounts.AccountPatchDetails, + data: TalerMerchantApi.AccountPatchDetails, ): Promise> => { // MOCKED_ACCOUNTS[h_wire].credit_facade_credentials = data.credit_facade_credentials // MOCKED_ACCOUNTS[h_wire].credit_facade_url = data.credit_facade_url @@ -94,11 +94,11 @@ export function useBankAccountAPI(): BankAccountAPI { export interface BankAccountAPI { createBankAccount: ( - data: MerchantBackend.BankAccounts.AccountAddDetails, + data: TalerMerchantApi.AccountAddDetails, ) => Promise>; updateBankAccount: ( id: string, - data: MerchantBackend.BankAccounts.AccountPatchDetails, + data: TalerMerchantApi.AccountPatchDetails, ) => Promise>; deleteBankAccount: (id: string) => Promise>; } @@ -114,8 +114,8 @@ export function useInstanceBankAccounts( args?: InstanceBankAccountFilter, updatePosition?: (id: string) => void, ): HttpResponsePaginated< - MerchantBackend.BankAccounts.AccountsSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.AccountsSummaryResponse, + TalerErrorDetail > { const { fetcher } = useBackendInstanceRequest(); @@ -128,14 +128,14 @@ export function useInstanceBankAccounts( error: afterError, isValidating: loadingAfter, } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >([`/private/accounts`], fetcher); const [lastAfter, setLastAfter] = useState< HttpResponse< - MerchantBackend.BankAccounts.AccountsSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.AccountsSummaryResponse, + TalerErrorDetail > >({ loading: true }); useEffect(() => { @@ -179,8 +179,8 @@ export function useInstanceBankAccounts( export function useBankAccountDetails( h_wire: string, ): HttpResponse< - MerchantBackend.BankAccounts.BankAccountEntry, - MerchantBackend.ErrorDetail + TalerMerchantApi.BankAccountEntry, + TalerErrorDetail > { // return { // ok: true, @@ -192,8 +192,8 @@ export function useBankAccountDetails( const { fetcher } = useBackendInstanceRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >([`/private/accounts/${h_wire}`], fetcher, { refreshInterval: 0, refreshWhenHidden: false, diff --git a/packages/merchant-backoffice-ui/src/hooks/instance.test.ts b/packages/merchant-backoffice-ui/src/hooks/instance.test.ts index a1bb3d5d4..f73f07d68 100644 --- a/packages/merchant-backoffice-ui/src/hooks/instance.test.ts +++ b/packages/merchant-backoffice-ui/src/hooks/instance.test.ts @@ -19,9 +19,9 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { AccessToken, TalerMerchantApi } from "@gnu-taler/taler-util"; import * as tests from "@gnu-taler/web-util/testing"; import { expect } from "chai"; -import { MerchantBackend } from "../declaration.js"; import { useAdminAPI, useBackendInstances, @@ -35,12 +35,10 @@ import { API_DELETE_INSTANCE, API_GET_CURRENT_INSTANCE, API_LIST_INSTANCES, - API_NEW_LOGIN, API_UPDATE_CURRENT_INSTANCE, API_UPDATE_CURRENT_INSTANCE_AUTH, API_UPDATE_INSTANCE_BY_ID, } from "./urls.js"; -import { AccessToken } from "@gnu-taler/taler-util"; describe("instance api interaction with details", () => { it("should evict cache when updating an instance", async () => { @@ -49,7 +47,7 @@ describe("instance api interaction with details", () => { env.addRequestExpectation(API_GET_CURRENT_INSTANCE, { response: { name: "instance_name", - } as MerchantBackend.Instances.QueryInstancesResponse, + } as TalerMerchantApi.QueryInstancesResponse, }); const hookBehavior = await tests.hookBehaveLikeThis( @@ -77,16 +75,16 @@ describe("instance api interaction with details", () => { env.addRequestExpectation(API_UPDATE_CURRENT_INSTANCE, { request: { name: "other_name", - } as MerchantBackend.Instances.InstanceReconfigurationMessage, + } as TalerMerchantApi.InstanceReconfigurationMessage, }); env.addRequestExpectation(API_GET_CURRENT_INSTANCE, { response: { name: "other_name", - } as MerchantBackend.Instances.QueryInstancesResponse, + } as TalerMerchantApi.QueryInstancesResponse, }); api.updateInstance({ name: "other_name", - } as MerchantBackend.Instances.InstanceReconfigurationMessage); + } as TalerMerchantApi.InstanceReconfigurationMessage); }, ({ query, api }) => { expect(env.assertJustExpectedRequestWereMade()).deep.eq({ @@ -110,15 +108,15 @@ describe("instance api interaction with details", () => { it("should evict cache when setting the instance's token", async () => { const env = new ApiMockEnvironment(); - env.addRequestExpectation(API_GET_CURRENT_INSTANCE, { - response: { - name: "instance_name", - auth: { - method: "token", - // token: "not-secret", - }, - } as MerchantBackend.Instances.QueryInstancesResponse, - }); + // env.addRequestExpectation(API_GET_CURRENT_INSTANCE, { + // response: { + // name: "instance_name", + // auth: { + // method: "token", + // // token: "not-secret", + // }, + // } as TalerMerchantApi.QueryInstancesResponse, + // }); const hookBehavior = await tests.hookBehaveLikeThis( () => { @@ -148,26 +146,26 @@ describe("instance api interaction with details", () => { request: { method: "token", token: "secret", - } as MerchantBackend.Instances.InstanceAuthConfigurationMessage, - }); - env.addRequestExpectation(API_NEW_LOGIN, { - auth: "secret", - request: { - scope: "write", - duration: { - "d_us": "forever", - }, - refreshable: true, - }, - }); + } as TalerMerchantApi.InstanceAuthConfigurationMessage, + }); + // env.addRequestExpectation(API_NEW_LOGIN, { + // auth: "secret", + // request: { + // scope: "write", + // duration: { + // "d_us": "forever", + // }, + // refreshable: true, + // }, + // }); env.addRequestExpectation(API_GET_CURRENT_INSTANCE, { response: { name: "instance_name", auth: { - method: "token", + type: "token", // token: "secret", }, - } as MerchantBackend.Instances.QueryInstancesResponse, + } as TalerMerchantApi.QueryInstancesResponse, }); api.setNewAccessToken(undefined, "secret" as AccessToken); }, @@ -200,10 +198,10 @@ describe("instance api interaction with details", () => { response: { name: "instance_name", auth: { - method: "token", + type: "token", // token: "not-secret", }, - } as MerchantBackend.Instances.QueryInstancesResponse, + } as TalerMerchantApi.QueryInstancesResponse, }); const hookBehavior = await tests.hookBehaveLikeThis( @@ -234,15 +232,15 @@ describe("instance api interaction with details", () => { env.addRequestExpectation(API_UPDATE_CURRENT_INSTANCE_AUTH, { request: { method: "external", - } as MerchantBackend.Instances.InstanceAuthConfigurationMessage, + } as TalerMerchantApi.InstanceAuthConfigurationMessage, }); env.addRequestExpectation(API_GET_CURRENT_INSTANCE, { response: { name: "instance_name", auth: { - method: "external", + type: "external", }, - } as MerchantBackend.Instances.QueryInstancesResponse, + } as TalerMerchantApi.QueryInstancesResponse, }); api.clearAccessToken(undefined); @@ -332,7 +330,7 @@ describe("instance admin api interaction with listing", () => { instances: [ { name: "instance_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, ], }, }); @@ -366,24 +364,24 @@ describe("instance admin api interaction with listing", () => { env.addRequestExpectation(API_CREATE_INSTANCE, { request: { name: "other_name", - } as MerchantBackend.Instances.InstanceConfigurationMessage, + } as TalerMerchantApi.InstanceConfigurationMessage, }); env.addRequestExpectation(API_LIST_INSTANCES, { response: { instances: [ { name: "instance_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, { name: "other_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, ], }, }); api.createInstance({ name: "other_name", - } as MerchantBackend.Instances.InstanceConfigurationMessage); + } as TalerMerchantApi.InstanceConfigurationMessage); }, ({ query, api }) => { expect(env.assertJustExpectedRequestWereMade()).deep.eq({ @@ -419,11 +417,11 @@ describe("instance admin api interaction with listing", () => { { id: "default", name: "instance_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, { id: "the_id", name: "second_instance", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, ], }, }); @@ -466,7 +464,7 @@ describe("instance admin api interaction with listing", () => { { id: "default", name: "instance_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, ], }, }); @@ -543,7 +541,7 @@ describe("instance admin api interaction with listing", () => { // instances: [{ // id: 'default', // name: 'instance_name' - // } as MerchantBackend.Instances.Instance] + // } as TalerMerchantApi.Instance] // }, // }); @@ -573,11 +571,11 @@ describe("instance admin api interaction with listing", () => { { id: "default", name: "instance_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, { id: "the_id", name: "second_instance", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, ], }, }); @@ -624,7 +622,7 @@ describe("instance admin api interaction with listing", () => { { id: "default", name: "instance_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, ], }, }); @@ -665,7 +663,7 @@ describe("instance management api interaction with listing", () => { { id: "managed", name: "instance_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, ], }, }); @@ -700,7 +698,7 @@ describe("instance management api interaction with listing", () => { env.addRequestExpectation(API_UPDATE_INSTANCE_BY_ID("managed"), { request: { name: "other_name", - } as MerchantBackend.Instances.InstanceReconfigurationMessage, + } as TalerMerchantApi.InstanceReconfigurationMessage, }); env.addRequestExpectation(API_LIST_INSTANCES, { response: { @@ -708,14 +706,14 @@ describe("instance management api interaction with listing", () => { { id: "managed", name: "other_name", - } as MerchantBackend.Instances.Instance, + } as TalerMerchantApi.Instance, ], }, }); api.updateInstance({ name: "other_name", - } as MerchantBackend.Instances.InstanceConfigurationMessage); + } as TalerMerchantApi.InstanceConfigurationMessage); }, ({ query, api }) => { expect(env.assertJustExpectedRequestWereMade()).deep.eq({ diff --git a/packages/merchant-backoffice-ui/src/hooks/instance.ts b/packages/merchant-backoffice-ui/src/hooks/instance.ts index dfe97fd61..2da82989b 100644 --- a/packages/merchant-backoffice-ui/src/hooks/instance.ts +++ b/packages/merchant-backoffice-ui/src/hooks/instance.ts @@ -16,26 +16,23 @@ import { HttpResponse, HttpResponseOk, - RequestError, - useMerchantApiContext, + RequestError } from "@gnu-taler/web-util/browser"; -import { MerchantBackend } from "../declaration.js"; import { useBackendBaseRequest, useBackendInstanceRequest, - useCredentialsChecker, useMatchMutate, } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 +import { AccessToken, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import _useSWR, { SWRHook, useSWRConfig } from "swr"; import { useSessionContext } from "../context/session.js"; -import { AccessToken } from "@gnu-taler/taler-util"; const useSWR = _useSWR as unknown as SWRHook; interface InstanceAPI { updateInstance: ( - data: MerchantBackend.Instances.InstanceReconfigurationMessage, + data: TalerMerchantApi.InstanceReconfigurationMessage, ) => Promise; deleteInstance: () => Promise; clearAccessToken: (currentToken: AccessToken | undefined) => Promise; @@ -50,7 +47,7 @@ export function useAdminAPI(): AdminAPI { const mutateAll = useMatchMutate(); const createInstance = async ( - instance: MerchantBackend.Instances.InstanceConfigurationMessage, + instance: TalerMerchantApi.InstanceConfigurationMessage, ): Promise => { await request(`/management/instances`, { method: "POST", @@ -84,7 +81,7 @@ export function useAdminAPI(): AdminAPI { export interface AdminAPI { createInstance: ( - data: MerchantBackend.Instances.InstanceConfigurationMessage, + data: TalerMerchantApi.InstanceConfigurationMessage, ) => Promise; deleteInstance: (id: string) => Promise; purgeInstance: (id: string) => Promise; @@ -98,10 +95,9 @@ export function useManagementAPI(instanceId: string): InstanceAPI { logOut, } = useSessionContext(); const { request } = useBackendBaseRequest(); - const { requestNewLoginToken } = useCredentialsChecker(); const updateInstance = async ( - instance: MerchantBackend.Instances.InstanceReconfigurationMessage, + instance: TalerMerchantApi.InstanceReconfigurationMessage, ): Promise => { await request(`/management/instances/${instanceId}`, { method: "PATCH", @@ -166,14 +162,13 @@ export function useInstanceAPI(): InstanceAPI { } = useSessionContext(); const { request } = useBackendInstanceRequest(); - const { requestNewLoginToken } = useCredentialsChecker(); const { state, logIn, logOut } = useSessionContext(); const adminToken = state.status === "loggedIn" && state.isAdmin ? state.token : undefined; const updateInstance = async ( - instance: MerchantBackend.Instances.InstanceReconfigurationMessage, + instance: TalerMerchantApi.InstanceReconfigurationMessage, ): Promise => { await request(`/private/`, { method: "PATCH", @@ -239,14 +234,14 @@ export function useInstanceAPI(): InstanceAPI { } export function useInstanceDetails(): HttpResponse< - MerchantBackend.Instances.QueryInstancesResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.QueryInstancesResponse, + TalerErrorDetail > { const { fetcher } = useBackendInstanceRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >([`/private/`], fetcher, { refreshInterval: 0, refreshWhenHidden: false, @@ -267,17 +262,17 @@ export function useInstanceDetails(): HttpResponse< type KYCStatus = | { type: "ok" } - | { type: "redirect"; status: MerchantBackend.KYC.AccountKycRedirects }; + | { type: "redirect"; status: TalerMerchantApi.AccountKycRedirects }; export function useInstanceKYCDetails(): HttpResponse< KYCStatus, - MerchantBackend.ErrorDetail + TalerErrorDetail > { const { fetcher } = useBackendInstanceRequest(); const { data, error } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >([`/private/kyc`], fetcher, { refreshInterval: 60 * 1000, refreshWhenHidden: false, @@ -303,14 +298,14 @@ export function useInstanceKYCDetails(): HttpResponse< export function useManagedInstanceDetails( instanceId: string, ): HttpResponse< - MerchantBackend.Instances.QueryInstancesResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.QueryInstancesResponse, + TalerErrorDetail > { const { request } = useBackendBaseRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >([`/management/instances/${instanceId}`], request, { refreshInterval: 0, refreshWhenHidden: false, @@ -329,14 +324,14 @@ export function useManagedInstanceDetails( } export function useBackendInstances(): HttpResponse< - MerchantBackend.Instances.InstancesResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.InstancesResponse, + TalerErrorDetail > { const { request } = useBackendBaseRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >(["/management/instances"], request); if (isValidating) return { loading: true, data: data?.data }; diff --git a/packages/merchant-backoffice-ui/src/hooks/merchant.ts b/packages/merchant-backoffice-ui/src/hooks/merchant.ts index d01b579b9..47d9e5624 100644 --- a/packages/merchant-backoffice-ui/src/hooks/merchant.ts +++ b/packages/merchant-backoffice-ui/src/hooks/merchant.ts @@ -20,15 +20,15 @@ import { RequestError, } from "@gnu-taler/web-util/browser"; import { useEffect, useState } from "preact/hooks"; -import { MerchantBackend } from "../declaration.js"; import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants.js"; import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 +import { TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import _useSWR, { SWRHook, mutate } from "swr"; const useSWR = _useSWR as unknown as SWRHook; -// const MOCKED_ACCOUNTS: Record = { +// const MOCKED_ACCOUNTS: Record = { // "hwire1": { // h_wire: "hwire1", // payto_uri: "payto://fake/iban/123", @@ -46,7 +46,7 @@ export function useBankAccountAPI(): BankAccountAPI { const { request } = useBackendInstanceRequest(); const createBankAccount = async ( - data: MerchantBackend.BankAccounts.AccountAddDetails, + data: TalerMerchantApi.AccountAddDetails, ): Promise> => { // MOCKED_ACCOUNTS[data.h_wire] = data // return Promise.resolve({ ok: true, data: undefined }); @@ -60,7 +60,7 @@ export function useBankAccountAPI(): BankAccountAPI { const updateBankAccount = async ( h_wire: string, - data: MerchantBackend.BankAccounts.AccountPatchDetails, + data: TalerMerchantApi.AccountPatchDetails, ): Promise> => { // MOCKED_ACCOUNTS[h_wire].credit_facade_credentials = data.credit_facade_credentials // MOCKED_ACCOUNTS[h_wire].credit_facade_url = data.credit_facade_url @@ -94,11 +94,11 @@ export function useBankAccountAPI(): BankAccountAPI { export interface BankAccountAPI { createBankAccount: ( - data: MerchantBackend.BankAccounts.AccountAddDetails, + data: TalerMerchantApi.AccountAddDetails, ) => Promise>; updateBankAccount: ( id: string, - data: MerchantBackend.BankAccounts.AccountPatchDetails, + data: TalerMerchantApi.AccountPatchDetails, ) => Promise>; deleteBankAccount: (id: string) => Promise>; } @@ -114,8 +114,8 @@ export function useInstanceBankAccounts( args?: InstanceBankAccountFilter, updatePosition?: (id: string) => void, ): HttpResponsePaginated< - MerchantBackend.BankAccounts.AccountsSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.AccountsSummaryResponse, + TalerErrorDetail > { const { fetcher } = useBackendInstanceRequest(); @@ -128,14 +128,14 @@ export function useInstanceBankAccounts( error: afterError, isValidating: loadingAfter, } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >([`/private/accounts`], fetcher); const [lastAfter, setLastAfter] = useState< HttpResponse< - MerchantBackend.BankAccounts.AccountsSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.AccountsSummaryResponse, + TalerErrorDetail > >({ loading: true }); useEffect(() => { @@ -179,8 +179,8 @@ export function useInstanceBankAccounts( export function useBankAccountDetails( h_wire: string, ): HttpResponse< - MerchantBackend.BankAccounts.BankAccountEntry, - MerchantBackend.ErrorDetail + TalerMerchantApi.BankAccountEntry, + TalerErrorDetail > { // return { // ok: true, @@ -192,8 +192,8 @@ export function useBankAccountDetails( const { fetcher } = useBackendInstanceRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >([`/private/accounts/${h_wire}`], fetcher, { refreshInterval: 0, refreshWhenHidden: false, diff --git a/packages/merchant-backoffice-ui/src/hooks/order.test.ts b/packages/merchant-backoffice-ui/src/hooks/order.test.ts index 86f53a342..08fffbcf0 100644 --- a/packages/merchant-backoffice-ui/src/hooks/order.test.ts +++ b/packages/merchant-backoffice-ui/src/hooks/order.test.ts @@ -19,9 +19,9 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { AmountString, TalerMerchantApi } from "@gnu-taler/taler-util"; import * as tests from "@gnu-taler/web-util/testing"; import { expect } from "chai"; -import { MerchantBackend } from "../declaration.js"; import { useInstanceOrders, useOrderAPI, useOrderDetails } from "./order.js"; import { ApiMockEnvironment } from "./testing.js"; import { @@ -40,7 +40,7 @@ describe("order api interaction with listing", () => { env.addRequestExpectation(API_LIST_ORDERS, { qparam: { delta: -20, paid: "yes" }, response: { - orders: [{ order_id: "1" }, { order_id: "2" } as MerchantBackend.Orders.OrderHistoryEntry], + orders: [{ order_id: "1" }, { order_id: "2" } as TalerMerchantApi.OrderHistoryEntry], }, }); @@ -72,7 +72,8 @@ describe("order api interaction with listing", () => { env.addRequestExpectation(API_CREATE_ORDER, { request: { - order: { amount: "ARS:12", summary: "pay me" }, + order: { amount: "ARS:12" as AmountString, summary: "pay me" }, + lock_uuids: [] }, response: { order_id: "3" }, }); @@ -116,7 +117,7 @@ describe("order api interaction with listing", () => { order_id: "1", amount: "EUR:12", refundable: true, - } as MerchantBackend.Orders.OrderHistoryEntry] }, + } as TalerMerchantApi.OrderHistoryEntry] }, }); const newDate = (d: Date) => { @@ -202,7 +203,7 @@ describe("order api interaction with listing", () => { env.addRequestExpectation(API_LIST_ORDERS, { qparam: { delta: -20, paid: "yes" }, response: { - orders: [{ order_id: "1" }, { order_id: "2" } as MerchantBackend.Orders.OrderHistoryEntry], + orders: [{ order_id: "1" }, { order_id: "2" } as TalerMerchantApi.OrderHistoryEntry], }, }); @@ -271,7 +272,7 @@ describe("order api interaction with details", () => { response: { summary: "description", refund_amount: "EUR:0", - } as unknown as MerchantBackend.Orders.CheckPaymentPaidResponse, + } as unknown as TalerMerchantApi.CheckPaymentPaidResponse, }); const newDate = (d: Date) => { @@ -311,12 +312,12 @@ describe("order api interaction with details", () => { response: { summary: "description", refund_amount: "EUR:1", - } as unknown as MerchantBackend.Orders.CheckPaymentPaidResponse, + } as unknown as TalerMerchantApi.CheckPaymentPaidResponse, }); api.refundOrder("1", { reason: "double pay", - refund: "EUR:1", + refund: "EUR:1" as AmountString, }); }, ({ query, api }) => { @@ -347,7 +348,7 @@ describe("order api interaction with details", () => { response: { summary: "description", refund_amount: "EUR:0", - } as unknown as MerchantBackend.Orders.CheckPaymentPaidResponse, + } as unknown as TalerMerchantApi.CheckPaymentPaidResponse, }); const newDate = (d: Date) => { @@ -385,7 +386,7 @@ describe("order api interaction with details", () => { env.addRequestExpectation(API_GET_ORDER_BY_ID("1"), { response: { summary: undefined, - } as unknown as MerchantBackend.Orders.CheckPaymentPaidResponse, + } as unknown as TalerMerchantApi.CheckPaymentPaidResponse, }); api.forgetOrder("1", { diff --git a/packages/merchant-backoffice-ui/src/hooks/order.ts b/packages/merchant-backoffice-ui/src/hooks/order.ts index efc7bdcbe..39bc1725b 100644 --- a/packages/merchant-backoffice-ui/src/hooks/order.ts +++ b/packages/merchant-backoffice-ui/src/hooks/order.ts @@ -20,27 +20,27 @@ import { RequestError, } from "@gnu-taler/web-util/browser"; import { useEffect, useState } from "preact/hooks"; -import { MerchantBackend } from "../declaration.js"; import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants.js"; import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 +import { TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import _useSWR, { SWRHook } from "swr"; const useSWR = _useSWR as unknown as SWRHook; export interface OrderAPI { //FIXME: add OutOfStockResponse on 410 createOrder: ( - data: MerchantBackend.Orders.PostOrderRequest, - ) => Promise>; + data: TalerMerchantApi.PostOrderRequest, + ) => Promise>; forgetOrder: ( id: string, - data: MerchantBackend.Orders.ForgetRequest, + data: TalerMerchantApi.ForgetRequest, ) => Promise>; refundOrder: ( id: string, - data: MerchantBackend.Orders.RefundRequest, - ) => Promise>; + data: TalerMerchantApi.RefundRequest, + ) => Promise>; deleteOrder: (id: string) => Promise>; getPaymentURL: (id: string) => Promise>; } @@ -52,9 +52,9 @@ export function useOrderAPI(): OrderAPI { const { request } = useBackendInstanceRequest(); const createOrder = async ( - data: MerchantBackend.Orders.PostOrderRequest, - ): Promise> => { - const res = await request( + data: TalerMerchantApi.PostOrderRequest, + ): Promise> => { + const res = await request( `/private/orders`, { method: "POST", @@ -67,10 +67,10 @@ export function useOrderAPI(): OrderAPI { }; const refundOrder = async ( orderId: string, - data: MerchantBackend.Orders.RefundRequest, - ): Promise> => { + data: TalerMerchantApi.RefundRequest, + ): Promise> => { mutateAll(/@"\/private\/orders"@/); - const res = request( + const res = request( `/private/orders/${orderId}/refund`, { method: "POST", @@ -85,7 +85,7 @@ export function useOrderAPI(): OrderAPI { const forgetOrder = async ( orderId: string, - data: MerchantBackend.Orders.ForgetRequest, + data: TalerMerchantApi.ForgetRequest, ): Promise> => { mutateAll(/@"\/private\/orders"@/); const res = request(`/private/orders/${orderId}/forget`, { @@ -110,7 +110,7 @@ export function useOrderAPI(): OrderAPI { const getPaymentURL = async ( orderId: string, ): Promise> => { - return request( + return request( `/private/orders/${orderId}`, { method: "GET", @@ -132,14 +132,14 @@ export function useOrderAPI(): OrderAPI { export function useOrderDetails( oderId: string, ): HttpResponse< - MerchantBackend.Orders.MerchantOrderStatusResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.MerchantOrderStatusResponse, + TalerErrorDetail > { const { fetcher } = useBackendInstanceRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >([`/private/orders/${oderId}`], fetcher, { refreshInterval: 0, refreshWhenHidden: false, @@ -165,8 +165,8 @@ export function useInstanceOrders( args?: InstanceOrderFilter, updateFilter?: (d: Date) => void, ): HttpResponsePaginated< - MerchantBackend.Orders.OrderHistory, - MerchantBackend.ErrorDetail + TalerMerchantApi.OrderHistory, + TalerErrorDetail > { const { orderFetcher } = useBackendInstanceRequest(); @@ -187,8 +187,8 @@ export function useInstanceOrders( error: beforeError, isValidating: loadingBefore, } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >( [ `/private/orders`, @@ -205,8 +205,8 @@ export function useInstanceOrders( error: afterError, isValidating: loadingAfter, } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >( [ `/private/orders`, @@ -222,14 +222,14 @@ export function useInstanceOrders( //this will save last result const [lastBefore, setLastBefore] = useState< HttpResponse< - MerchantBackend.Orders.OrderHistory, - MerchantBackend.ErrorDetail + TalerMerchantApi.OrderHistory, + TalerErrorDetail > >({ loading: true }); const [lastAfter, setLastAfter] = useState< HttpResponse< - MerchantBackend.Orders.OrderHistory, - MerchantBackend.ErrorDetail + TalerMerchantApi.OrderHistory, + TalerErrorDetail > >({ loading: true }); useEffect(() => { diff --git a/packages/merchant-backoffice-ui/src/hooks/otp.ts b/packages/merchant-backoffice-ui/src/hooks/otp.ts index 76ece7055..4b45dcf06 100644 --- a/packages/merchant-backoffice-ui/src/hooks/otp.ts +++ b/packages/merchant-backoffice-ui/src/hooks/otp.ts @@ -20,35 +20,20 @@ import { RequestError, } from "@gnu-taler/web-util/browser"; import { useEffect, useState } from "preact/hooks"; -import { MerchantBackend } from "../declaration.js"; import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants.js"; import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 +import { TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import _useSWR, { SWRHook } from "swr"; const useSWR = _useSWR as unknown as SWRHook; -const MOCKED_DEVICES: Record = { - "1": { - otp_device_description: "first device", - otp_algorithm: 1, - otp_device_id: "1", - otp_key: "123", - }, - "2": { - otp_device_description: "second device", - otp_algorithm: 0, - otp_device_id: "2", - otp_key: "456", - } -} - export function useOtpDeviceAPI(): OtpDeviceAPI { const mutateAll = useMatchMutate(); const { request } = useBackendInstanceRequest(); const createOtpDevice = async ( - data: MerchantBackend.OTP.OtpDeviceAddDetails, + data: TalerMerchantApi.OtpDeviceAddDetails, ): Promise> => { // MOCKED_DEVICES[data.otp_device_id] = data // return Promise.resolve({ ok: true, data: undefined }); @@ -62,7 +47,7 @@ export function useOtpDeviceAPI(): OtpDeviceAPI { const updateOtpDevice = async ( deviceId: string, - data: MerchantBackend.OTP.OtpDevicePatchDetails, + data: TalerMerchantApi.OtpDevicePatchDetails, ): Promise> => { // MOCKED_DEVICES[deviceId].otp_algorithm = data.otp_algorithm // MOCKED_DEVICES[deviceId].otp_ctr = data.otp_ctr @@ -98,11 +83,11 @@ export function useOtpDeviceAPI(): OtpDeviceAPI { export interface OtpDeviceAPI { createOtpDevice: ( - data: MerchantBackend.OTP.OtpDeviceAddDetails, + data: TalerMerchantApi.OtpDeviceAddDetails, ) => Promise>; updateOtpDevice: ( id: string, - data: MerchantBackend.OTP.OtpDevicePatchDetails, + data: TalerMerchantApi.OtpDevicePatchDetails, ) => Promise>; deleteOtpDevice: (id: string) => Promise>; } @@ -114,8 +99,8 @@ export function useInstanceOtpDevices( args?: InstanceOtpDeviceFilter, updatePosition?: (id: string) => void, ): HttpResponsePaginated< - MerchantBackend.OTP.OtpDeviceSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.OtpDeviceSummaryResponse, + TalerErrorDetail > { // return { // ok: true, @@ -139,14 +124,14 @@ export function useInstanceOtpDevices( error: afterError, isValidating: loadingAfter, } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >([`/private/otp-devices`], fetcher); const [lastAfter, setLastAfter] = useState< HttpResponse< - MerchantBackend.OTP.OtpDeviceSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.OtpDeviceSummaryResponse, + TalerErrorDetail > >({ loading: true }); useEffect(() => { @@ -190,8 +175,8 @@ export function useInstanceOtpDevices( export function useOtpDeviceDetails( deviceId: string, ): HttpResponse< - MerchantBackend.OTP.OtpDeviceDetails, - MerchantBackend.ErrorDetail + TalerMerchantApi.OtpDeviceDetails, + TalerErrorDetail > { // return { // ok: true, @@ -204,8 +189,8 @@ export function useOtpDeviceDetails( const { fetcher } = useBackendInstanceRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >([`/private/otp-devices/${deviceId}`], fetcher, { refreshInterval: 0, refreshWhenHidden: false, diff --git a/packages/merchant-backoffice-ui/src/hooks/product.test.ts b/packages/merchant-backoffice-ui/src/hooks/product.test.ts index fd2b83ecc..64dbd0103 100644 --- a/packages/merchant-backoffice-ui/src/hooks/product.test.ts +++ b/packages/merchant-backoffice-ui/src/hooks/product.test.ts @@ -21,7 +21,6 @@ import * as tests from "@gnu-taler/web-util/testing"; import { expect } from "chai"; -import { MerchantBackend } from "../declaration.js"; import { useInstanceProducts, useProductAPI, @@ -35,6 +34,7 @@ import { API_LIST_PRODUCTS, API_UPDATE_PRODUCT_BY_ID, } from "./urls.js"; +import { TalerMerchantApi } from "@gnu-taler/taler-util"; describe("product api interaction with listing", () => { it("should evict cache when creating a product", async () => { @@ -42,11 +42,11 @@ describe("product api interaction with listing", () => { env.addRequestExpectation(API_LIST_PRODUCTS, { response: { - products: [{ product_id: "1234" }], + products: [{ product_id: "1234", product_serial: 1 }], }, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("1234"), { - response: { price: "ARS:12" } as MerchantBackend.Products.ProductDetail, + response: { price: "ARS:12" } as TalerMerchantApi.ProductDetail, }); const hookBehavior = await tests.hookBehaveLikeThis( @@ -70,33 +70,33 @@ describe("product api interaction with listing", () => { expect(query.loading).undefined; expect(query.ok).true; if (!query.ok) return; - expect(query.data).deep.equals([{ id: "1234", price: "ARS:12" }]); + expect(query.data).deep.equals([{ id: "1234" , price: "ARS:12" }]); env.addRequestExpectation(API_CREATE_PRODUCT, { request: { price: "ARS:23", - } as MerchantBackend.Products.ProductAddDetail, + } as TalerMerchantApi.ProductAddDetail, }); env.addRequestExpectation(API_LIST_PRODUCTS, { response: { - products: [{ product_id: "1234" }, { product_id: "2345" }], + products: [{ product_id: "1234", product_serial: 1 }, { product_id: "2345", product_serial: 2 }], }, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("1234"), { response: { price: "ARS:12", - } as MerchantBackend.Products.ProductDetail, + } as TalerMerchantApi.ProductDetail, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("1234"), { response: { price: "ARS:12", - } as MerchantBackend.Products.ProductDetail, + } as TalerMerchantApi.ProductDetail, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("2345"), { response: { price: "ARS:23", - } as MerchantBackend.Products.ProductDetail, + } as TalerMerchantApi.ProductDetail, }); api.createProduct({ @@ -140,11 +140,11 @@ describe("product api interaction with listing", () => { env.addRequestExpectation(API_LIST_PRODUCTS, { response: { - products: [{ product_id: "1234" }], + products: [{ product_id: "1234", product_serial: 1 }], }, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("1234"), { - response: { price: "ARS:12" } as MerchantBackend.Products.ProductDetail, + response: { price: "ARS:12" } as TalerMerchantApi.ProductDetail, }); const hookBehavior = await tests.hookBehaveLikeThis( @@ -173,18 +173,18 @@ describe("product api interaction with listing", () => { env.addRequestExpectation(API_UPDATE_PRODUCT_BY_ID("1234"), { request: { price: "ARS:13", - } as MerchantBackend.Products.ProductPatchDetail, + } as TalerMerchantApi.ProductPatchDetail, }); env.addRequestExpectation(API_LIST_PRODUCTS, { response: { - products: [{ product_id: "1234" }], + products: [{ product_id: "1234", product_serial: 1 }], }, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("1234"), { response: { price: "ARS:13", - } as MerchantBackend.Products.ProductDetail, + } as TalerMerchantApi.ProductDetail, }); api.updateProduct("1234", { @@ -218,14 +218,14 @@ describe("product api interaction with listing", () => { env.addRequestExpectation(API_LIST_PRODUCTS, { response: { - products: [{ product_id: "1234" }, { product_id: "2345" }], + products: [{ product_id: "1234" , product_serial: 1}, { product_id: "2345", product_serial: 2 }], }, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("1234"), { - response: { price: "ARS:12" } as MerchantBackend.Products.ProductDetail, + response: { price: "ARS:12" } as TalerMerchantApi.ProductDetail, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("2345"), { - response: { price: "ARS:23" } as MerchantBackend.Products.ProductDetail, + response: { price: "ARS:23" } as TalerMerchantApi.ProductDetail, }); const hookBehavior = await tests.hookBehaveLikeThis( @@ -258,14 +258,14 @@ describe("product api interaction with listing", () => { env.addRequestExpectation(API_LIST_PRODUCTS, { response: { - products: [{ product_id: "1234" }], + products: [{ product_id: "1234", product_serial: 1 }], }, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("1234"), { response: { price: "ARS:12", - } as MerchantBackend.Products.ProductDetail, + } as TalerMerchantApi.ProductDetail, }); api.deleteProduct("2345"); }, @@ -300,7 +300,7 @@ describe("product api interaction with details", () => { env.addRequestExpectation(API_GET_PRODUCT_BY_ID("12"), { response: { description: "this is a description", - } as MerchantBackend.Products.ProductDetail, + } as TalerMerchantApi.ProductDetail, }); const hookBehavior = await tests.hookBehaveLikeThis( @@ -328,13 +328,13 @@ describe("product api interaction with details", () => { env.addRequestExpectation(API_UPDATE_PRODUCT_BY_ID("12"), { request: { description: "other description", - } as MerchantBackend.Products.ProductPatchDetail, + } as TalerMerchantApi.ProductPatchDetail, }); env.addRequestExpectation(API_GET_PRODUCT_BY_ID("12"), { response: { description: "other description", - } as MerchantBackend.Products.ProductDetail, + } as TalerMerchantApi.ProductDetail, }); api.updateProduct("12", { diff --git a/packages/merchant-backoffice-ui/src/hooks/product.ts b/packages/merchant-backoffice-ui/src/hooks/product.ts index 345ca5bf2..c0ace0d32 100644 --- a/packages/merchant-backoffice-ui/src/hooks/product.ts +++ b/packages/merchant-backoffice-ui/src/hooks/product.ts @@ -18,11 +18,11 @@ import { HttpResponseOk, RequestError, } from "@gnu-taler/web-util/browser"; -import { MerchantBackend, WithId } from "../declaration.js"; import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 import _useSWR, { SWRHook, useSWRConfig } from "swr"; +import { TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; const useSWR = _useSWR as unknown as SWRHook; export interface ProductAPI { @@ -30,16 +30,16 @@ export interface ProductAPI { id: string, ) => Promise; createProduct: ( - data: MerchantBackend.Products.ProductAddDetail, + data: TalerMerchantApi.ProductAddDetail, ) => Promise; updateProduct: ( id: string, - data: MerchantBackend.Products.ProductPatchDetail, + data: TalerMerchantApi.ProductPatchDetail, ) => Promise; deleteProduct: (id: string) => Promise; lockProduct: ( id: string, - data: MerchantBackend.Products.LockRequest, + data: TalerMerchantApi.LockRequest, ) => Promise; } @@ -50,7 +50,7 @@ export function useProductAPI(): ProductAPI { const { request } = useBackendInstanceRequest(); const createProduct = async ( - data: MerchantBackend.Products.ProductAddDetail, + data: TalerMerchantApi.ProductAddDetail, ): Promise => { const res = await request(`/private/products`, { method: "POST", @@ -62,7 +62,7 @@ export function useProductAPI(): ProductAPI { const updateProduct = async ( productId: string, - data: MerchantBackend.Products.ProductPatchDetail, + data: TalerMerchantApi.ProductPatchDetail, ): Promise => { const r = await request(`/private/products/${productId}`, { method: "PATCH", @@ -81,7 +81,7 @@ export function useProductAPI(): ProductAPI { const lockProduct = async ( productId: string, - data: MerchantBackend.Products.LockRequest, + data: TalerMerchantApi.LockRequest, ): Promise => { await request(`/private/products/${productId}/lock`, { method: "POST", @@ -105,14 +105,14 @@ export function useProductAPI(): ProductAPI { } export function useInstanceProducts(): HttpResponse< - (MerchantBackend.Products.ProductDetail & WithId)[], - MerchantBackend.ErrorDetail + (TalerMerchantApi.ProductDetail & WithId)[], + TalerErrorDetail > { const { fetcher, multiFetcher } = useBackendInstanceRequest(); const { data: list, error: listError } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >([`/private/products`], fetcher, { refreshInterval: 0, refreshWhenHidden: false, @@ -125,8 +125,8 @@ export function useInstanceProducts(): HttpResponse< (p) => `/private/products/${p.product_id}`, ); const { data: products, error: productError } = useSWR< - HttpResponseOk[], - RequestError + HttpResponseOk[], + RequestError >([paths], multiFetcher, { refreshInterval: 0, refreshWhenHidden: false, @@ -154,14 +154,14 @@ export function useInstanceProducts(): HttpResponse< export function useProductDetails( productId: string, ): HttpResponse< - MerchantBackend.Products.ProductDetail, - MerchantBackend.ErrorDetail + TalerMerchantApi.ProductDetail, + TalerErrorDetail > { const { fetcher } = useBackendInstanceRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >([`/private/products/${productId}`], fetcher, { refreshInterval: 0, refreshWhenHidden: false, diff --git a/packages/merchant-backoffice-ui/src/hooks/reserve.test.ts b/packages/merchant-backoffice-ui/src/hooks/reserve.test.ts deleted file mode 100644 index 58472399f..000000000 --- a/packages/merchant-backoffice-ui/src/hooks/reserve.test.ts +++ /dev/null @@ -1,207 +0,0 @@ -/* - This file is part of GNU Taler - (C) 2021-2024 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 - */ - -/** - * - * @author Sebastian Javier Marchano (sebasjm) - */ - -import * as tests from "@gnu-taler/web-util/testing"; -import { expect } from "chai"; -import { MerchantBackend } from "../declaration.js"; -import { - useInstanceReserves, - useReservesAPI, -} from "./reserves.js"; -import { ApiMockEnvironment } from "./testing.js"; -import { - API_CREATE_RESERVE, - API_DELETE_RESERVE, - API_LIST_RESERVES -} from "./urls.js"; - -describe("reserve api interaction with listing", () => { - it("should evict cache when creating a reserve", async () => { - const env = new ApiMockEnvironment(); - - env.addRequestExpectation(API_LIST_RESERVES, { - response: { - reserves: [ - { - reserve_pub: "11", - } as MerchantBackend.Rewards.ReserveStatusEntry, - ], - }, - }); - - const hookBehavior = await tests.hookBehaveLikeThis( - () => { - const api = useReservesAPI(); - const query = useInstanceReserves(); - return { query, api }; - }, - {}, - [ - ({ query, api }) => { - expect(query.loading).true; - }, - ({ query, api }) => { - expect(query.loading).false; - expect(query.ok).true; - if (!query.ok) return; - expect(query.data).deep.equals({ - reserves: [{ reserve_pub: "11" }], - }); - - env.addRequestExpectation(API_CREATE_RESERVE, { - request: { - initial_balance: "ARS:3333", - exchange_url: "http://url", - wire_method: "iban", - }, - response: { - reserve_pub: "22", - accounts: [], - }, - }); - - env.addRequestExpectation(API_LIST_RESERVES, { - response: { - reserves: [ - { - reserve_pub: "11", - } as MerchantBackend.Rewards.ReserveStatusEntry, - { - reserve_pub: "22", - } as MerchantBackend.Rewards.ReserveStatusEntry, - ], - }, - }); - - api.createReserve({ - initial_balance: "ARS:3333", - exchange_url: "http://url", - wire_method: "iban", - }); - }, - ({ query, api }) => { - expect(env.assertJustExpectedRequestWereMade()).deep.eq({ - result: "ok", - }); - expect(query.loading).false; - expect(query.ok).true; - if (!query.ok) return; - - expect(query.data).deep.equals({ - reserves: [ - { - reserve_pub: "11", - } as MerchantBackend.Rewards.ReserveStatusEntry, - { - reserve_pub: "22", - } as MerchantBackend.Rewards.ReserveStatusEntry, - ], - }); - }, - ], - env.buildTestingContext(), - ); - - expect(hookBehavior).deep.eq({ result: "ok" }); - expect(env.assertJustExpectedRequestWereMade()).deep.eq({ result: "ok" }); - }); - - it("should evict cache when deleting a reserve", async () => { - const env = new ApiMockEnvironment(); - - env.addRequestExpectation(API_LIST_RESERVES, { - response: { - reserves: [ - { - reserve_pub: "11", - } as MerchantBackend.Rewards.ReserveStatusEntry, - { - reserve_pub: "22", - } as MerchantBackend.Rewards.ReserveStatusEntry, - { - reserve_pub: "33", - } as MerchantBackend.Rewards.ReserveStatusEntry, - ], - }, - }); - - const hookBehavior = await tests.hookBehaveLikeThis( - () => { - const api = useReservesAPI(); - const query = useInstanceReserves(); - return { query, api }; - }, - {}, - [ - ({ query, api }) => { - expect(query.loading).true; - }, - ({ query, api }) => { - expect(env.assertJustExpectedRequestWereMade()).deep.eq({ - result: "ok", - }); - - expect(query.loading).false; - expect(query.ok).true; - if (!query.ok) return; - expect(query.data).deep.equals({ - reserves: [ - { reserve_pub: "11" }, - { reserve_pub: "22" }, - { reserve_pub: "33" }, - ], - }); - - env.addRequestExpectation(API_DELETE_RESERVE("11"), {}); - env.addRequestExpectation(API_LIST_RESERVES, { - response: { - reserves: [ - { - reserve_pub: "22", - } as MerchantBackend.Rewards.ReserveStatusEntry, - { - reserve_pub: "33", - } as MerchantBackend.Rewards.ReserveStatusEntry, - ], - }, - }); - - api.deleteReserve("11"); - }, - ({ query, api }) => { - expect(env.assertJustExpectedRequestWereMade()).deep.eq({ - result: "ok", - }); - expect(query.loading).false; - expect(query.ok).true; - if (!query.ok) return; - expect(query.data).deep.equals({ - reserves: [{ reserve_pub: "22" }, { reserve_pub: "33" }], - }); - }, - ], - env.buildTestingContext(), - ); - - expect(hookBehavior).deep.eq({ result: "ok" }); - expect(env.assertJustExpectedRequestWereMade()).deep.eq({ result: "ok" }); - }); -}); diff --git a/packages/merchant-backoffice-ui/src/hooks/reserves.ts b/packages/merchant-backoffice-ui/src/hooks/reserves.ts deleted file mode 100644 index 13e4bcce8..000000000 --- a/packages/merchant-backoffice-ui/src/hooks/reserves.ts +++ /dev/null @@ -1,94 +0,0 @@ -/* - This file is part of GNU Taler - (C) 2021-2024 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 - */ -import { - HttpResponse, - HttpResponseOk, - RequestError, -} from "@gnu-taler/web-util/browser"; -import { MerchantBackend } from "../declaration.js"; -import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; - -// FIX default import https://github.com/microsoft/TypeScript/issues/49189 -import _useSWR, { SWRHook, useSWRConfig } from "swr"; -const useSWR = _useSWR as unknown as SWRHook; - -export function useReservesAPI(): ReserveMutateAPI { - const mutateAll = useMatchMutate(); - const { mutate } = useSWRConfig(); - const { request } = useBackendInstanceRequest(); - - const createReserve = async ( - data: MerchantBackend.Rewards.ReserveCreateRequest, - ): Promise< - HttpResponseOk - > => { - const res = await request( - `/private/reserves`, - { - method: "POST", - data, - }, - ); - - //evict reserve list query - await mutateAll(/.*private\/reserves.*/); - - return res; - }; - - - const deleteReserve = async ( - pub: string, - ): Promise> => { - const res = await request(`/private/reserves/${pub}`, { - method: "DELETE", - }); - - //evict reserve list query - await mutateAll(/.*private\/reserves.*/); - - return res; - }; - - return { createReserve, deleteReserve }; -} - -export interface ReserveMutateAPI { - createReserve: ( - data: MerchantBackend.Rewards.ReserveCreateRequest, - ) => Promise>; - deleteReserve: ( - id: string, - ) => Promise>; -} - -export function useInstanceReserves(): HttpResponse< - MerchantBackend.Rewards.RewardReserveStatus, - MerchantBackend.ErrorDetail -> { - const { fetcher } = useBackendInstanceRequest(); - - const { data, error, isValidating } = useSWR< - HttpResponseOk, - RequestError - >([`/private/reserves`], fetcher); - - if (isValidating) return { loading: true, data: data?.data }; - if (data) return data; - if (error) return error.cause; - return { loading: true }; -} - diff --git a/packages/merchant-backoffice-ui/src/hooks/templates.ts b/packages/merchant-backoffice-ui/src/hooks/templates.ts index 96671452e..cdcc418ef 100644 --- a/packages/merchant-backoffice-ui/src/hooks/templates.ts +++ b/packages/merchant-backoffice-ui/src/hooks/templates.ts @@ -20,11 +20,11 @@ import { RequestError, } from "@gnu-taler/web-util/browser"; import { useEffect, useState } from "preact/hooks"; -import { MerchantBackend } from "../declaration.js"; import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants.js"; import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 +import { TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import _useSWR, { SWRHook } from "swr"; const useSWR = _useSWR as unknown as SWRHook; @@ -33,7 +33,7 @@ export function useTemplateAPI(): TemplateAPI { const { request } = useBackendInstanceRequest(); const createTemplate = async ( - data: MerchantBackend.Template.TemplateAddDetails, + data: TalerMerchantApi.TemplateAddDetails, ): Promise> => { const res = await request(`/private/templates`, { method: "POST", @@ -45,7 +45,7 @@ export function useTemplateAPI(): TemplateAPI { const updateTemplate = async ( templateId: string, - data: MerchantBackend.Template.TemplatePatchDetails, + data: TalerMerchantApi.TemplatePatchDetails, ): Promise> => { const res = await request(`/private/templates/${templateId}`, { method: "PATCH", @@ -67,11 +67,11 @@ export function useTemplateAPI(): TemplateAPI { const createOrderFromTemplate = async ( templateId: string, - data: MerchantBackend.Template.UsingTemplateDetails, + data: TalerMerchantApi.UsingTemplateDetails, ): Promise< - HttpResponseOk + HttpResponseOk > => { - const res = await request( + const res = await request( `/templates/${templateId}`, { method: "POST", @@ -101,11 +101,11 @@ export function useTemplateAPI(): TemplateAPI { export interface TemplateAPI { createTemplate: ( - data: MerchantBackend.Template.TemplateAddDetails, + data: TalerMerchantApi.TemplateAddDetails, ) => Promise>; updateTemplate: ( id: string, - data: MerchantBackend.Template.TemplatePatchDetails, + data: TalerMerchantApi.TemplatePatchDetails, ) => Promise>; testTemplateExist: ( id: string @@ -113,8 +113,8 @@ export interface TemplateAPI { deleteTemplate: (id: string) => Promise>; createOrderFromTemplate: ( id: string, - data: MerchantBackend.Template.UsingTemplateDetails, - ) => Promise>; + data: TalerMerchantApi.UsingTemplateDetails, + ) => Promise>; } export interface InstanceTemplateFilter { @@ -126,8 +126,8 @@ export function useInstanceTemplates( args?: InstanceTemplateFilter, updatePosition?: (id: string) => void, ): HttpResponsePaginated< - MerchantBackend.Template.TemplateSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.TemplateSummaryResponse, + TalerErrorDetail > { const { templateFetcher } = useBackendInstanceRequest(); @@ -148,8 +148,8 @@ export function useInstanceTemplates( error: beforeError, isValidating: loadingBefore, } = useSWR< - HttpResponseOk, - RequestError>( + HttpResponseOk, + RequestError>( [ `/private/templates`, args?.position, @@ -162,22 +162,22 @@ export function useInstanceTemplates( error: afterError, isValidating: loadingAfter, } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >([`/private/templates`, args?.position, -totalAfter], templateFetcher); //this will save last result const [lastBefore, setLastBefore] = useState< HttpResponse< - MerchantBackend.Template.TemplateSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.TemplateSummaryResponse, + TalerErrorDetail > >({ loading: true }); const [lastAfter, setLastAfter] = useState< HttpResponse< - MerchantBackend.Template.TemplateSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.TemplateSummaryResponse, + TalerErrorDetail > >({ loading: true }); useEffect(() => { @@ -241,14 +241,14 @@ export function useInstanceTemplates( export function useTemplateDetails( templateId: string, ): HttpResponse< - MerchantBackend.Template.TemplateDetails, - MerchantBackend.ErrorDetail + TalerMerchantApi.TemplateDetails, + TalerErrorDetail > { const { templateFetcher } = useBackendInstanceRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >([`/private/templates/${templateId}`], templateFetcher, { refreshInterval: 0, refreshWhenHidden: false, diff --git a/packages/merchant-backoffice-ui/src/hooks/transfer.test.ts b/packages/merchant-backoffice-ui/src/hooks/transfer.test.ts index 2fd11f02e..ee987af7e 100644 --- a/packages/merchant-backoffice-ui/src/hooks/transfer.test.ts +++ b/packages/merchant-backoffice-ui/src/hooks/transfer.test.ts @@ -19,12 +19,12 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { AmountString, PaytoString, TalerMerchantApi } from "@gnu-taler/taler-util"; import * as tests from "@gnu-taler/web-util/testing"; import { expect } from "chai"; -import { MerchantBackend } from "../declaration.js"; -import { API_INFORM_TRANSFERS, API_LIST_TRANSFERS } from "./urls.js"; import { ApiMockEnvironment } from "./testing.js"; import { useInstanceTransfers, useTransferAPI } from "./transfer.js"; +import { API_INFORM_TRANSFERS, API_LIST_TRANSFERS } from "./urls.js"; describe("transfer api interaction with listing", () => { it("should evict cache when informing a transfer", async () => { @@ -33,7 +33,7 @@ describe("transfer api interaction with listing", () => { env.addRequestExpectation(API_LIST_TRANSFERS, { qparam: { limit: -20 }, response: { - transfers: [{ wtid: "2" } as MerchantBackend.Transfers.TransferDetails], + transfers: [{ wtid: "2" } as TalerMerchantApi.TransferDetails], }, }); @@ -83,9 +83,9 @@ describe("transfer api interaction with listing", () => { api.informTransfer({ wtid: "3", - credit_amount: "EUR:1", + credit_amount: "EUR:1" as AmountString, exchange_url: "exchange.url", - payto_uri: "payto://", + payto_uri: "payto://" as PaytoString, }); }, ({ query, api }) => { diff --git a/packages/merchant-backoffice-ui/src/hooks/transfer.ts b/packages/merchant-backoffice-ui/src/hooks/transfer.ts index 924bd202f..20062a5e2 100644 --- a/packages/merchant-backoffice-ui/src/hooks/transfer.ts +++ b/packages/merchant-backoffice-ui/src/hooks/transfer.ts @@ -20,11 +20,11 @@ import { RequestError, } from "@gnu-taler/web-util/browser"; import { useEffect, useState } from "preact/hooks"; -import { MerchantBackend } from "../declaration.js"; import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants.js"; import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 +import { TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import _useSWR, { SWRHook } from "swr"; const useSWR = _useSWR as unknown as SWRHook; @@ -33,7 +33,7 @@ export function useTransferAPI(): TransferAPI { const { request } = useBackendInstanceRequest(); const informTransfer = async ( - data: MerchantBackend.Transfers.TransferInformation, + data: TalerMerchantApi.TransferInformation, ): Promise> => { const res = await request<{}>(`/private/transfers`, { method: "POST", @@ -49,7 +49,7 @@ export function useTransferAPI(): TransferAPI { export interface TransferAPI { informTransfer: ( - data: MerchantBackend.Transfers.TransferInformation, + data: TalerMerchantApi.TransferInformation, ) => Promise>; } @@ -63,8 +63,8 @@ export function useInstanceTransfers( args?: InstanceTransferFilter, updatePosition?: (id: string) => void, ): HttpResponsePaginated< - MerchantBackend.Transfers.TransferList, - MerchantBackend.ErrorDetail + TalerMerchantApi.TransferList, + TalerErrorDetail > { const { transferFetcher } = useBackendInstanceRequest(); @@ -85,8 +85,8 @@ export function useInstanceTransfers( error: beforeError, isValidating: loadingBefore, } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >( [ `/private/transfers`, @@ -102,8 +102,8 @@ export function useInstanceTransfers( error: afterError, isValidating: loadingAfter, } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >( [ `/private/transfers`, @@ -118,14 +118,14 @@ export function useInstanceTransfers( //this will save last result const [lastBefore, setLastBefore] = useState< HttpResponse< - MerchantBackend.Transfers.TransferList, - MerchantBackend.ErrorDetail + TalerMerchantApi.TransferList, + TalerErrorDetail > >({ loading: true }); const [lastAfter, setLastAfter] = useState< HttpResponse< - MerchantBackend.Transfers.TransferList, - MerchantBackend.ErrorDetail + TalerMerchantApi.TransferList, + TalerErrorDetail > >({ loading: true }); useEffect(() => { diff --git a/packages/merchant-backoffice-ui/src/hooks/urls.ts b/packages/merchant-backoffice-ui/src/hooks/urls.ts index 76c117224..95e1c04f3 100644 --- a/packages/merchant-backoffice-ui/src/hooks/urls.ts +++ b/packages/merchant-backoffice-ui/src/hooks/urls.ts @@ -18,16 +18,16 @@ * * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { Query } from "@gnu-taler/web-util/testing"; -import { MerchantBackend } from "../declaration.js"; //////////////////// // ORDER //////////////////// export const API_CREATE_ORDER: Query< - MerchantBackend.Orders.PostOrderRequest, - MerchantBackend.Orders.PostOrderResponse + TalerMerchantApi.PostOrderRequest, + TalerMerchantApi.PostOrderResponse > = { method: "POST", url: "http://backend/instances/default/private/orders", @@ -35,14 +35,14 @@ export const API_CREATE_ORDER: Query< export const API_GET_ORDER_BY_ID = ( id: string, -): Query => ({ +): Query => ({ method: "GET", url: `http://backend/instances/default/private/orders/${id}`, }); export const API_LIST_ORDERS: Query< unknown, - MerchantBackend.Orders.OrderHistory + TalerMerchantApi.OrderHistory > = { method: "GET", url: "http://backend/instances/default/private/orders", @@ -51,8 +51,8 @@ export const API_LIST_ORDERS: Query< export const API_REFUND_ORDER_BY_ID = ( id: string, ): Query< - MerchantBackend.Orders.RefundRequest, - MerchantBackend.Orders.MerchantRefundResponse + TalerMerchantApi.RefundRequest, + TalerMerchantApi.MerchantRefundResponse > => ({ method: "POST", url: `http://backend/instances/default/private/orders/${id}/refund`, @@ -60,14 +60,14 @@ export const API_REFUND_ORDER_BY_ID = ( export const API_FORGET_ORDER_BY_ID = ( id: string, -): Query => ({ +): Query => ({ method: "PATCH", url: `http://backend/instances/default/private/orders/${id}/forget`, }); export const API_DELETE_ORDER = ( id: string, -): Query => ({ +): Query => ({ method: "DELETE", url: `http://backend/instances/default/private/orders/${id}`, }); @@ -78,14 +78,14 @@ export const API_DELETE_ORDER = ( export const API_LIST_TRANSFERS: Query< unknown, - MerchantBackend.Transfers.TransferList + TalerMerchantApi.TransferList > = { method: "GET", url: "http://backend/instances/default/private/transfers", }; export const API_INFORM_TRANSFERS: Query< - MerchantBackend.Transfers.TransferInformation, + TalerMerchantApi.TransferInformation, {} > = { method: "POST", @@ -97,7 +97,7 @@ export const API_INFORM_TRANSFERS: Query< //////////////////// export const API_CREATE_PRODUCT: Query< - MerchantBackend.Products.ProductAddDetail, + TalerMerchantApi.ProductAddDetail, unknown > = { method: "POST", @@ -106,7 +106,7 @@ export const API_CREATE_PRODUCT: Query< export const API_LIST_PRODUCTS: Query< unknown, - MerchantBackend.Products.InventorySummaryResponse + TalerMerchantApi.InventorySummaryResponse > = { method: "GET", url: "http://backend/instances/default/private/products", @@ -114,7 +114,7 @@ export const API_LIST_PRODUCTS: Query< export const API_GET_PRODUCT_BY_ID = ( id: string, -): Query => ({ +): Query => ({ method: "GET", url: `http://backend/instances/default/private/products/${id}`, }); @@ -122,8 +122,8 @@ export const API_GET_PRODUCT_BY_ID = ( export const API_UPDATE_PRODUCT_BY_ID = ( id: string, ): Query< - MerchantBackend.Products.ProductPatchDetail, - MerchantBackend.Products.InventorySummaryResponse + TalerMerchantApi.ProductPatchDetail, + TalerMerchantApi.InventorySummaryResponse > => ({ method: "PATCH", url: `http://backend/instances/default/private/products/${id}`, @@ -134,68 +134,12 @@ export const API_DELETE_PRODUCT = (id: string): Query => ({ url: `http://backend/instances/default/private/products/${id}`, }); -//////////////////// -// RESERVES -//////////////////// - -export const API_CREATE_RESERVE: Query< - MerchantBackend.Rewards.ReserveCreateRequest, - MerchantBackend.Rewards.ReserveCreateConfirmation -> = { - method: "POST", - url: "http://backend/instances/default/private/reserves", -}; -export const API_LIST_RESERVES: Query< - unknown, - MerchantBackend.Rewards.RewardReserveStatus -> = { - method: "GET", - url: "http://backend/instances/default/private/reserves", -}; - -export const API_GET_RESERVE_BY_ID = ( - pub: string, -): Query => ({ - method: "GET", - url: `http://backend/instances/default/private/reserves/${pub}`, -}); - -export const API_GET_REWARD_BY_ID = ( - pub: string, -): Query => ({ - method: "GET", - url: `http://backend/instances/default/private/rewards/${pub}`, -}); - -export const API_AUTHORIZE_REWARD_FOR_RESERVE = ( - pub: string, -): Query< - MerchantBackend.Rewards.RewardCreateRequest, - MerchantBackend.Rewards.RewardCreateConfirmation -> => ({ - method: "POST", - url: `http://backend/instances/default/private/reserves/${pub}/authorize-reward`, -}); - -export const API_AUTHORIZE_REWARD: Query< - MerchantBackend.Rewards.RewardCreateRequest, - MerchantBackend.Rewards.RewardCreateConfirmation -> = { - method: "POST", - url: `http://backend/instances/default/private/rewards`, -}; - -export const API_DELETE_RESERVE = (id: string): Query => ({ - method: "DELETE", - url: `http://backend/instances/default/private/reserves/${id}`, -}); - //////////////////// // INSTANCE ADMIN //////////////////// export const API_CREATE_INSTANCE: Query< - MerchantBackend.Instances.InstanceConfigurationMessage, + TalerMerchantApi.InstanceConfigurationMessage, unknown > = { method: "POST", @@ -204,21 +148,21 @@ export const API_CREATE_INSTANCE: Query< export const API_GET_INSTANCE_BY_ID = ( id: string, -): Query => ({ +): Query => ({ method: "GET", url: `http://backend/management/instances/${id}`, }); export const API_GET_INSTANCE_KYC_BY_ID = ( id: string, -): Query => ({ +): Query => ({ method: "GET", url: `http://backend/management/instances/${id}/kyc`, }); export const API_LIST_INSTANCES: Query< unknown, - MerchantBackend.Instances.InstancesResponse + TalerMerchantApi.InstancesResponse > = { method: "GET", url: "http://backend/management/instances", @@ -227,7 +171,7 @@ export const API_LIST_INSTANCES: Query< export const API_UPDATE_INSTANCE_BY_ID = ( id: string, ): Query< - MerchantBackend.Instances.InstanceReconfigurationMessage, + TalerMerchantApi.InstanceReconfigurationMessage, unknown > => ({ method: "PATCH", @@ -237,7 +181,7 @@ export const API_UPDATE_INSTANCE_BY_ID = ( export const API_UPDATE_INSTANCE_AUTH_BY_ID = ( id: string, ): Query< - MerchantBackend.Instances.InstanceAuthConfigurationMessage, + TalerMerchantApi.InstanceAuthConfigurationMessage, unknown > => ({ method: "POST", @@ -249,25 +193,13 @@ export const API_DELETE_INSTANCE = (id: string): Query => ({ url: `http://backend/management/instances/${id}`, }); -//////////////////// -// AUTH -//////////////////// - -export const API_NEW_LOGIN: Query< - MerchantBackend.Instances.LoginTokenRequest, - unknown -> = ({ - method: "POST", - url: `http://backend/private/token`, -}); - //////////////////// // INSTANCE //////////////////// export const API_GET_CURRENT_INSTANCE: Query< unknown, - MerchantBackend.Instances.QueryInstancesResponse + TalerMerchantApi.QueryInstancesResponse > = { method: "GET", url: `http://backend/instances/default/private/`, @@ -275,14 +207,14 @@ export const API_GET_CURRENT_INSTANCE: Query< export const API_GET_CURRENT_INSTANCE_KYC: Query< unknown, - MerchantBackend.KYC.AccountKycRedirects + TalerMerchantApi.AccountKycRedirects > = { method: "GET", url: `http://backend/instances/default/private/kyc`, }; export const API_UPDATE_CURRENT_INSTANCE: Query< - MerchantBackend.Instances.InstanceReconfigurationMessage, + TalerMerchantApi.InstanceReconfigurationMessage, unknown > = { method: "PATCH", @@ -290,7 +222,7 @@ export const API_UPDATE_CURRENT_INSTANCE: Query< }; export const API_UPDATE_CURRENT_INSTANCE_AUTH: Query< - MerchantBackend.Instances.InstanceAuthConfigurationMessage, + TalerMerchantApi.InstanceAuthConfigurationMessage, unknown > = { method: "POST", diff --git a/packages/merchant-backoffice-ui/src/hooks/webhooks.ts b/packages/merchant-backoffice-ui/src/hooks/webhooks.ts index 994bfdbb0..4e62a81c9 100644 --- a/packages/merchant-backoffice-ui/src/hooks/webhooks.ts +++ b/packages/merchant-backoffice-ui/src/hooks/webhooks.ts @@ -20,11 +20,11 @@ import { RequestError, } from "@gnu-taler/web-util/browser"; import { useEffect, useState } from "preact/hooks"; -import { MerchantBackend } from "../declaration.js"; import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants.js"; import { useBackendInstanceRequest, useMatchMutate } from "./backend.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 +import { TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import _useSWR, { SWRHook } from "swr"; const useSWR = _useSWR as unknown as SWRHook; @@ -33,7 +33,7 @@ export function useWebhookAPI(): WebhookAPI { const { request } = useBackendInstanceRequest(); const createWebhook = async ( - data: MerchantBackend.Webhooks.WebhookAddDetails, + data: TalerMerchantApi.WebhookAddDetails, ): Promise> => { const res = await request(`/private/webhooks`, { method: "POST", @@ -45,7 +45,7 @@ export function useWebhookAPI(): WebhookAPI { const updateWebhook = async ( webhookId: string, - data: MerchantBackend.Webhooks.WebhookPatchDetails, + data: TalerMerchantApi.WebhookPatchDetails, ): Promise> => { const res = await request(`/private/webhooks/${webhookId}`, { method: "PATCH", @@ -70,11 +70,11 @@ export function useWebhookAPI(): WebhookAPI { export interface WebhookAPI { createWebhook: ( - data: MerchantBackend.Webhooks.WebhookAddDetails, + data: TalerMerchantApi.WebhookAddDetails, ) => Promise>; updateWebhook: ( id: string, - data: MerchantBackend.Webhooks.WebhookPatchDetails, + data: TalerMerchantApi.WebhookPatchDetails, ) => Promise>; deleteWebhook: (id: string) => Promise>; } @@ -88,8 +88,8 @@ export function useInstanceWebhooks( args?: InstanceWebhookFilter, updatePosition?: (id: string) => void, ): HttpResponsePaginated< - MerchantBackend.Webhooks.WebhookSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.WebhookSummaryResponse, + TalerErrorDetail > { const { webhookFetcher } = useBackendInstanceRequest(); @@ -104,14 +104,15 @@ export function useInstanceWebhooks( error: afterError, isValidating: loadingAfter, } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError + >([`/private/webhooks`, args?.position, -totalAfter], webhookFetcher); const [lastAfter, setLastAfter] = useState< HttpResponse< - MerchantBackend.Webhooks.WebhookSummaryResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.WebhookSummaryResponse, + TalerErrorDetail > >({ loading: true }); useEffect(() => { @@ -155,14 +156,14 @@ export function useInstanceWebhooks( export function useWebhookDetails( webhookId: string, ): HttpResponse< - MerchantBackend.Webhooks.WebhookDetails, - MerchantBackend.ErrorDetail + TalerMerchantApi.WebhookDetails, + TalerErrorDetail > { const { webhookFetcher } = useBackendInstanceRequest(); const { data, error, isValidating } = useSWR< - HttpResponseOk, - RequestError + HttpResponseOk, + RequestError >([`/private/webhooks/${webhookId}`], webhookFetcher, { refreshInterval: 0, refreshWhenHidden: false, diff --git a/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx index 8ce7c1d3a..731ea8939 100644 --- a/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx @@ -19,6 +19,7 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { Duration, TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { h, VNode } from "preact"; import { useState } from "preact/hooks"; @@ -28,20 +29,18 @@ import { FormProvider, } from "../../../components/form/FormProvider.js"; import { DefaultInstanceFormFields } from "../../../components/instance/DefaultInstanceFormFields.js"; -import { MerchantBackend } from "../../../declaration.js"; +import { SetTokenNewInstanceModal } from "../../../components/modal/index.js"; import { INSTANCE_ID_REGEX } from "../../../utils/constants.js"; import { undefinedIfEmpty } from "../../../utils/table.js"; -import { SetTokenNewInstanceModal } from "../../../components/modal/index.js"; -import { Duration } from "@gnu-taler/taler-util"; -export type Entity = Omit, "default_wire_transfer_delay"> & { +export type Entity = Omit, "default_wire_transfer_delay"> & { auth_token?: string; default_pay_delay: Duration, default_wire_transfer_delay: Duration, }; interface Props { - onCreate: (d: MerchantBackend.Instances.InstanceConfigurationMessage) => Promise; + onCreate: (d: TalerMerchantApi.InstanceConfigurationMessage) => Promise; onBack?: () => void; forceId?: string; } @@ -134,7 +133,7 @@ export function CreatePage({ onCreate, onBack, forceId }: Props): VNode { // delete value.default_pay_delay; // delete value.default_wire_transfer_delay; - return onCreate(newValue as any as MerchantBackend.Instances.InstanceConfigurationMessage); + return onCreate(newValue as any as TalerMerchantApi.InstanceConfigurationMessage); }; function updateToken(token: string | null) { diff --git a/packages/merchant-backoffice-ui/src/paths/admin/create/index.tsx b/packages/merchant-backoffice-ui/src/paths/admin/create/index.tsx index 440cd2b07..99e20dcd7 100644 --- a/packages/merchant-backoffice-ui/src/paths/admin/create/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/admin/create/index.tsx @@ -17,6 +17,7 @@ * * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useMerchantApiContext, useTranslationContext, @@ -24,9 +25,8 @@ import { import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { NotificationCard } from "../../../components/menu/index.js"; -import { MerchantBackend } from "../../../declaration.js"; -import { useAdminAPI } from "../../../hooks/instance.js"; import { useSessionContext } from "../../../context/session.js"; +import { useAdminAPI } from "../../../hooks/instance.js"; import { Notification } from "../../../utils/types.js"; import { CreatePage } from "./CreatePage.js"; @@ -35,14 +35,14 @@ interface Props { onConfirm: () => void; forceId?: string; } -export type Entity = MerchantBackend.Instances.InstanceConfigurationMessage; +export type Entity = TalerMerchantApi.InstanceConfigurationMessage; export default function Create({ onBack, onConfirm, forceId }: Props): VNode { const { createInstance } = useAdminAPI(); const [notif, setNotif] = useState(undefined); const { i18n } = useTranslationContext(); const { lib } = useMerchantApiContext(); - const { state, logIn } = useSessionContext(); + const { logIn } = useSessionContext(); return ( @@ -52,7 +52,7 @@ export default function Create({ onBack, onConfirm, forceId }: Props): VNode { onBack={onBack} forceId={forceId} onCreate={async ( - d: MerchantBackend.Instances.InstanceConfigurationMessage, + d: TalerMerchantApi.InstanceConfigurationMessage, ) => { try { await createInstance(d); diff --git a/packages/merchant-backoffice-ui/src/paths/admin/list/TableActive.tsx b/packages/merchant-backoffice-ui/src/paths/admin/list/TableActive.tsx index bc18bb352..a03a2659b 100644 --- a/packages/merchant-backoffice-ui/src/paths/admin/list/TableActive.tsx +++ b/packages/merchant-backoffice-ui/src/paths/admin/list/TableActive.tsx @@ -19,17 +19,17 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { h, VNode } from "preact"; import { StateUpdater, useEffect, useState } from "preact/hooks"; -import { MerchantBackend } from "../../../declaration.js"; import { useSessionContext } from "../../../context/session.js"; interface Props { - instances: MerchantBackend.Instances.Instance[]; + instances: TalerMerchantApi.Instance[]; onUpdate: (id: string) => void; - onDelete: (id: MerchantBackend.Instances.Instance) => void; - onPurge: (id: MerchantBackend.Instances.Instance) => void; + onDelete: (id: TalerMerchantApi.Instance) => void; + onPurge: (id: TalerMerchantApi.Instance) => void; onCreate: () => void; selected?: boolean; } @@ -128,10 +128,10 @@ export function CardTable({ } interface TableProps { rowSelection: string[]; - instances: MerchantBackend.Instances.Instance[]; + instances: TalerMerchantApi.Instance[]; onUpdate: (id: string) => void; - onDelete: (id: MerchantBackend.Instances.Instance) => void; - onPurge: (id: MerchantBackend.Instances.Instance) => void; + onDelete: (id: TalerMerchantApi.Instance) => void; + onPurge: (id: TalerMerchantApi.Instance) => void; rowSelectionHandler: StateUpdater; } @@ -265,7 +265,7 @@ function EmptyTable(): VNode { } interface Actions { - element: MerchantBackend.Instances.Instance; + element: TalerMerchantApi.Instance; type: "DELETE" | "UPDATE"; } @@ -274,7 +274,7 @@ function notEmpty(value: TValue | null | undefined): value is TValue { } function buildActions( - instances: MerchantBackend.Instances.Instance[], + instances: TalerMerchantApi.Instance[], selected: string[], action: "DELETE", ): Actions[] { diff --git a/packages/merchant-backoffice-ui/src/paths/admin/list/View.tsx b/packages/merchant-backoffice-ui/src/paths/admin/list/View.tsx index 09ad338d2..940d14334 100644 --- a/packages/merchant-backoffice-ui/src/paths/admin/list/View.tsx +++ b/packages/merchant-backoffice-ui/src/paths/admin/list/View.tsx @@ -19,18 +19,18 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { h, VNode } from "preact"; import { useState } from "preact/hooks"; -import { MerchantBackend } from "../../../declaration.js"; import { CardTable as CardTableActive } from "./TableActive.js"; interface Props { - instances: MerchantBackend.Instances.Instance[]; + instances: TalerMerchantApi.Instance[]; onCreate: () => void; onUpdate: (id: string) => void; - onDelete: (id: MerchantBackend.Instances.Instance) => void; - onPurge: (id: MerchantBackend.Instances.Instance) => void; + onDelete: (id: TalerMerchantApi.Instance) => void; + onPurge: (id: TalerMerchantApi.Instance) => void; selected?: boolean; } diff --git a/packages/merchant-backoffice-ui/src/paths/admin/list/index.tsx b/packages/merchant-backoffice-ui/src/paths/admin/list/index.tsx index 561e275ad..d3fa78b65 100644 --- a/packages/merchant-backoffice-ui/src/paths/admin/list/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/admin/list/index.tsx @@ -19,29 +19,28 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { HttpStatusCode, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import { ErrorType, HttpError, useTranslationContext, } from "@gnu-taler/web-util/browser"; -import { Fragment, h, VNode } from "preact"; +import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../components/exception/loading.js"; import { NotificationCard } from "../../../components/menu/index.js"; import { DeleteModal, PurgeModal } from "../../../components/modal/index.js"; -import { MerchantBackend } from "../../../declaration.js"; import { useAdminAPI, useBackendInstances } from "../../../hooks/instance.js"; import { Notification } from "../../../utils/types.js"; import { View } from "./View.js"; -import { HttpStatusCode } from "@gnu-taler/taler-util"; interface Props { onCreate: () => void; onUpdate: (id: string) => void; - instances: MerchantBackend.Instances.Instance[]; + instances: TalerMerchantApi.Instance[]; onUnauthorized: () => VNode; onNotFound: () => VNode; - onLoadError: (error: HttpError) => VNode; + onLoadError: (error: HttpError) => VNode; } export default function Instances({ @@ -53,9 +52,9 @@ export default function Instances({ }: Props): VNode { const result = useBackendInstances(); const [deleting, setDeleting] = - useState(null); + useState(null); const [purging, setPurging] = - useState(null); + useState(null); const { deleteInstance, purgeInstance } = useAdminAPI(); const [notif, setNotif] = useState(undefined); const { i18n } = useTranslationContext(); diff --git a/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/CreatePage.tsx index bf16686f4..dd77d609c 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/CreatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/CreatePage.tsx @@ -19,6 +19,7 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; @@ -30,13 +31,12 @@ import { import { Input } from "../../../../components/form/Input.js"; import { InputPaytoForm } from "../../../../components/form/InputPaytoForm.js"; import { InputSelector } from "../../../../components/form/InputSelector.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { undefinedIfEmpty } from "../../../../utils/table.js"; -type Entity = MerchantBackend.BankAccounts.AccountAddDetails & { repeatPassword: string }; +type Entity = TalerMerchantApi.AccountAddDetails & { repeatPassword: string }; interface Props { - onCreate: (d: MerchantBackend.BankAccounts.AccountAddDetails) => Promise; + onCreate: (d: TalerMerchantApi.AccountAddDetails) => Promise; onBack?: () => void; } @@ -89,7 +89,7 @@ export function CreatePage({ onCreate, onBack }: Props): VNode { const submitForm = () => { if (hasErrors) return Promise.reject(); const credit_facade_url = !state.credit_facade_url ? undefined : new URL("/", state.credit_facade_url).href - const credit_facade_credentials: MerchantBackend.BankAccounts.FacadeCredentials | undefined = + const credit_facade_credentials: TalerMerchantApi.FacadeCredentials | undefined = credit_facade_url == undefined ? undefined : state.credit_facade_credentials?.type === "basic" ? { type: "basic", diff --git a/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/index.tsx index a2351964a..b12b95f2f 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/index.tsx @@ -19,16 +19,16 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { useBankAccountAPI } from "../../../../hooks/bank.js"; import { Notification } from "../../../../utils/types.js"; import { CreatePage } from "./CreatePage.js"; -export type Entity = MerchantBackend.BankAccounts.AccountAddDetails; +export type Entity = TalerMerchantApi.AccountAddDetails; interface Props { onBack?: () => void; onConfirm: () => void; @@ -46,7 +46,7 @@ export default function CreateValidator({ onConfirm, onBack }: Props): VNode { onBack={onBack} onCreate={(request: Entity) => { return createBankAccount(request) - .then((d) => { + .then(() => { onConfirm() }) .catch((error) => { diff --git a/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/ListPage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/ListPage.tsx index 3359d1a95..50cf0fe70 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/ListPage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/ListPage.tsx @@ -19,18 +19,17 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { h, VNode } from "preact"; -import { MerchantBackend } from "../../../../declaration.js"; -import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { CardTable } from "./Table.js"; export interface Props { - devices: MerchantBackend.BankAccounts.BankAccountEntry[]; + devices: TalerMerchantApi.BankAccountEntry[]; onLoadMoreBefore?: () => void; onLoadMoreAfter?: () => void; onCreate: () => void; - onDelete: (e: MerchantBackend.BankAccounts.BankAccountEntry) => void; - onSelect: (e: MerchantBackend.BankAccounts.BankAccountEntry) => void; + onDelete: (e: TalerMerchantApi.BankAccountEntry) => void; + onSelect: (e: TalerMerchantApi.BankAccountEntry) => void; } export function ListPage({ @@ -41,9 +40,7 @@ export function ListPage({ onLoadMoreBefore, onLoadMoreAfter, }: Props): VNode { - const form = { payto_uri: "" }; - const { i18n } = useTranslationContext(); return (
void; } -function toggleSelected(id: T): (prev: T[]) => T[] { - return (prev: T[]): T[] => - prev.indexOf(id) == -1 ? [...prev, id] : prev.filter((e) => e != id); -} - function Table({ accounts, onLoadMoreAfter, diff --git a/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/index.tsx index 51139c3f3..72efa08c9 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/index.tsx @@ -19,7 +19,7 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { HttpStatusCode } from "@gnu-taler/taler-util"; +import { HttpStatusCode, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import { ErrorType, HttpError, @@ -29,15 +29,13 @@ import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../../components/exception/loading.js"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend } from "../../../../declaration.js"; -import { useInstanceOtpDevices, useOtpDeviceAPI } from "../../../../hooks/otp.js"; +import { useBankAccountAPI, useInstanceBankAccounts } from "../../../../hooks/bank.js"; import { Notification } from "../../../../utils/types.js"; import { ListPage } from "./ListPage.js"; -import { useBankAccountAPI, useInstanceBankAccounts } from "../../../../hooks/bank.js"; interface Props { onUnauthorized: () => VNode; - onLoadError: (error: HttpError) => VNode; + onLoadError: (error: HttpError) => VNode; onNotFound: () => VNode; onCreate: () => void; onSelect: (id: string) => void; @@ -91,7 +89,7 @@ export default function ListOtpDevices({ onSelect={(e) => { onSelect(e.h_wire); }} - onDelete={(e: MerchantBackend.BankAccounts.BankAccountEntry) => + onDelete={(e: TalerMerchantApi.BankAccountEntry) => deleteBankAccount(e.h_wire) .then(() => setNotif({ diff --git a/packages/merchant-backoffice-ui/src/paths/instance/accounts/update/UpdatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/accounts/update/UpdatePage.tsx index 6b67a79a4..6dd264f29 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/accounts/update/UpdatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/accounts/update/UpdatePage.tsx @@ -19,6 +19,7 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; @@ -28,17 +29,16 @@ import { FormProvider, } from "../../../../components/form/FormProvider.js"; import { Input } from "../../../../components/form/Input.js"; -import { MerchantBackend, WithId } from "../../../../declaration.js"; -import { InputSelector } from "../../../../components/form/InputSelector.js"; import { InputPaytoForm } from "../../../../components/form/InputPaytoForm.js"; +import { InputSelector } from "../../../../components/form/InputSelector.js"; import { undefinedIfEmpty } from "../../../../utils/table.js"; -type Entity = MerchantBackend.BankAccounts.BankAccountEntry +type Entity = TalerMerchantApi.BankAccountEntry & WithId; const accountAuthType = ["unedit", "none", "basic"]; interface Props { - onUpdate: (d: MerchantBackend.BankAccounts.AccountPatchDetails) => Promise; + onUpdate: (d: TalerMerchantApi.AccountPatchDetails) => Promise; onBack?: () => void; account: Entity; } @@ -47,7 +47,7 @@ interface Props { export function UpdatePage({ account, onUpdate, onBack }: Props): VNode { const { i18n } = useTranslationContext(); - const [state, setState] = useState>(account); + const [state, setState] = useState>(account); // @ts-expect-error "unedit" is fine since is part of the accountAuthType values if (state.credit_facade_credentials?.type === "unedit") { @@ -55,7 +55,7 @@ export function UpdatePage({ account, onUpdate, onBack }: Props): VNode { state.credit_facade_credentials = undefined } - const errors: FormErrors = { + const errors: FormErrors = { credit_facade_url: !state.credit_facade_url ? undefined : !isValidURL(state.credit_facade_url) ? i18n.str`invalid url` : undefined, credit_facade_credentials: undefinedIfEmpty({ @@ -81,7 +81,7 @@ export function UpdatePage({ account, onUpdate, onBack }: Props): VNode { const credit_facade_url = !state.credit_facade_url ? undefined : new URL("/", state.credit_facade_url).href - const credit_facade_credentials: MerchantBackend.BankAccounts.FacadeCredentials | undefined = + const credit_facade_credentials: TalerMerchantApi.FacadeCredentials | undefined = credit_facade_url == undefined || state.credit_facade_credentials === undefined ? undefined : state.credit_facade_credentials.type === "basic" ? { type: "basic", diff --git a/packages/merchant-backoffice-ui/src/paths/instance/accounts/update/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/accounts/update/index.tsx index ca0b692a3..742d13b67 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/accounts/update/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/accounts/update/index.tsx @@ -19,7 +19,7 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { HttpStatusCode } from "@gnu-taler/taler-util"; +import { HttpStatusCode, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import { ErrorType, HttpError, @@ -29,19 +29,18 @@ import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../../components/exception/loading.js"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend, WithId } from "../../../../declaration.js"; import { useBankAccountAPI, useBankAccountDetails } from "../../../../hooks/bank.js"; import { Notification } from "../../../../utils/types.js"; import { UpdatePage } from "./UpdatePage.js"; -export type Entity = MerchantBackend.BankAccounts.AccountPatchDetails & WithId; +export type Entity = TalerMerchantApi.AccountPatchDetails & WithId; interface Props { onBack?: () => void; onConfirm: () => void; onUnauthorized: () => VNode; onNotFound: () => VNode; - onLoadError: (e: HttpError) => VNode; + onLoadError: (e: HttpError) => VNode; bid: string; } export default function UpdateValidator({ diff --git a/packages/merchant-backoffice-ui/src/paths/instance/details/DetailPage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/details/DetailPage.tsx index 6e9b51106..3168c7cc4 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/details/DetailPage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/details/DetailPage.tsx @@ -24,17 +24,17 @@ import { h, VNode } from "preact"; import { useState } from "preact/hooks"; import { FormProvider } from "../../../components/form/FormProvider.js"; import { Input } from "../../../components/form/Input.js"; -import { MerchantBackend } from "../../../declaration.js"; +import { TalerMerchantApi } from "@gnu-taler/taler-util"; -type Entity = MerchantBackend.Instances.InstanceReconfigurationMessage; +type Entity = TalerMerchantApi.InstanceReconfigurationMessage; interface Props { onUpdate: () => void; onDelete: () => void; - selected: MerchantBackend.Instances.QueryInstancesResponse; + selected: TalerMerchantApi.QueryInstancesResponse; } function convert( - from: MerchantBackend.Instances.QueryInstancesResponse, + from: TalerMerchantApi.QueryInstancesResponse, ): Entity { const defaults = { default_wire_fee_amortization: 1, diff --git a/packages/merchant-backoffice-ui/src/paths/instance/details/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/details/index.tsx index 2a37ee588..b76abee30 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/details/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/details/index.tsx @@ -18,15 +18,14 @@ import { Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../components/exception/loading.js"; import { DeleteModal } from "../../../components/modal/index.js"; -import { MerchantBackend } from "../../../declaration.js"; import { useInstanceAPI, useInstanceDetails } from "../../../hooks/instance.js"; import { DetailPage } from "./DetailPage.js"; -import { HttpStatusCode } from "@gnu-taler/taler-util"; +import { HttpStatusCode, TalerErrorDetail } from "@gnu-taler/taler-util"; import { useSessionContext } from "../../../context/session.js"; interface Props { onUnauthorized: () => VNode; - onLoadError: (error: HttpError) => VNode; + onLoadError: (error: HttpError) => VNode; onUpdate: () => void; onNotFound: () => VNode; onDelete: () => void; diff --git a/packages/merchant-backoffice-ui/src/paths/instance/details/stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/details/stories.tsx index 94e19bb6e..6cd2d9491 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/details/stories.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/details/stories.tsx @@ -70,7 +70,7 @@ function createExample( export const Example = createExample(TestedComponent, { selected: { name: "name", - auth: { method: "external" }, + auth: { type: "external" }, address: {}, user_type: "business", jurisdiction: {}, diff --git a/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/ListPage.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/ListPage.stories.tsx index a914639e5..046636b4b 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/ListPage.stories.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/ListPage.stories.tsx @@ -19,10 +19,9 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { h, VNode, FunctionalComponent } from "preact"; -import { ListPage as TestedComponent } from "./ListPage.js"; +import { PaytoString } from "@gnu-taler/taler-util"; import * as tests from "@gnu-taler/web-util/testing"; -import { MerchantBackend } from "../../../../declaration.js"; +import { ListPage as TestedComponent } from "./ListPage.js"; export default { title: "Pages/KYC/List", @@ -40,19 +39,19 @@ export const Example = tests.createExample(TestedComponent, { { aml_status: 0, exchange_url: "http://exchange.taler", - payto_uri: "payto://iban/de123123123", + payto_uri: "payto://iban/de123123123" as PaytoString, kyc_url: "http://exchange.taler/kyc", }, { aml_status: 1, exchange_url: "http://exchange.taler", - payto_uri: "payto://iban/de123123123", + payto_uri: "payto://iban/de123123123" as PaytoString, }, { aml_status: 2, exchange_url: "http://exchange.taler", - payto_uri: "payto://iban/de123123123", + payto_uri: "payto://iban/de123123123" as PaytoString, }, ], - } as MerchantBackend.KYC.AccountKycRedirects, + }, }); diff --git a/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/ListPage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/ListPage.tsx index 2ec0137d9..3eeed1d7b 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/ListPage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/ListPage.tsx @@ -19,12 +19,12 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { h, VNode } from "preact"; -import { MerchantBackend } from "../../../../declaration.js"; export interface Props { - status: MerchantBackend.KYC.AccountKycRedirects; + status: TalerMerchantApi.AccountKycRedirects; } export function ListPage({ status }: Props): VNode { @@ -85,11 +85,11 @@ export function ListPage({ status }: Props): VNode { ); } interface PendingTableProps { - entries: MerchantBackend.KYC.MerchantAccountKycRedirect[]; + entries: TalerMerchantApi.MerchantAccountKycRedirect[]; } interface TimedOutTableProps { - entries: MerchantBackend.KYC.ExchangeKycTimeout[]; + entries: TalerMerchantApi.ExchangeKycTimeout[]; } function PendingTable({ entries }: PendingTableProps): VNode { diff --git a/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/index.tsx index 664f05f66..555eb47b9 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/index.tsx @@ -22,14 +22,13 @@ import { ErrorType, HttpError } from "@gnu-taler/web-util/browser"; import { h, VNode } from "preact"; import { Loading } from "../../../../components/exception/loading.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { useInstanceKYCDetails } from "../../../../hooks/instance.js"; import { ListPage } from "./ListPage.js"; -import { HttpStatusCode } from "@gnu-taler/taler-util"; +import { HttpStatusCode, TalerErrorDetail } from "@gnu-taler/taler-util"; interface Props { onUnauthorized: () => VNode; - onLoadError: (error: HttpError) => VNode; + onLoadError: (error: HttpError) => VNode; onNotFound: () => VNode; } diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx index fca123773..041ec73e7 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx @@ -21,8 +21,10 @@ import { AbsoluteTime, + AmountString, Amounts, Duration, + TalerMerchantApi, TalerProtocolDuration, } from "@gnu-taler/taler-util"; import { @@ -47,16 +49,15 @@ import { InputToggle } from "../../../../components/form/InputToggle.js"; import { InventoryProductForm } from "../../../../components/product/InventoryProductForm.js"; import { NonInventoryProductFrom } from "../../../../components/product/NonInventoryProductForm.js"; import { ProductList } from "../../../../components/product/ProductList.js"; -import { MerchantBackend, WithId } from "../../../../declaration.js"; import { usePreference } from "../../../../hooks/preference.js"; import { rate } from "../../../../utils/amount.js"; import { undefinedIfEmpty } from "../../../../utils/table.js"; interface Props { - onCreate: (d: MerchantBackend.Orders.PostOrderRequest) => void; + onCreate: (d: TalerMerchantApi.PostOrderRequest) => void; onBack?: () => void; instanceConfig: InstanceConfig; - instanceInventory: (MerchantBackend.Products.ProductDetail & WithId)[]; + instanceInventory: (TalerMerchantApi.ProductDetail & WithId)[]; } interface InstanceConfig { use_stefan: boolean; @@ -92,7 +93,7 @@ function with_defaults( } interface ProductAndQuantity { - product: MerchantBackend.Products.ProductDetail & WithId; + product: TalerMerchantApi.ProductDetail & WithId; quantity: number; } export interface ProductMap { @@ -106,7 +107,7 @@ interface Pricing { } interface Shipping { delivery_date?: Date; - delivery_location?: MerchantBackend.Location; + delivery_location?: TalerMerchantApi.Location; fullfilment_url?: string; } interface Payments { @@ -120,7 +121,7 @@ interface Payments { } interface Entity { inventoryProducts: ProductMap; - products: MerchantBackend.Product[]; + products: TalerMerchantApi.Product[]; pricing: Partial; payments: Partial; shipping: Partial; @@ -214,43 +215,36 @@ export function CreatePage({ if (!value.payments) return; if (!value.shipping) return; - const request: MerchantBackend.Orders.PostOrderRequest = { + const request: TalerMerchantApi.PostOrderRequest = { order: { amount: order.pricing.order_price, summary: order.pricing.summary, products: productList, extra: undefinedIfEmpty(value.extra), - pay_deadline: !value.payments.pay_deadline - ? i18n.str`required` - : AbsoluteTime.toProtocolTimestamp( - AbsoluteTime.addDuration( - AbsoluteTime.now(), - value.payments.pay_deadline, - ), - ), // : undefined, - wire_transfer_deadline: value.payments.wire_transfer_deadline - ? AbsoluteTime.toProtocolTimestamp( - AbsoluteTime.addDuration( - AbsoluteTime.now(), - value.payments.wire_transfer_deadline, - ), - ) - : undefined, - refund_deadline: value.payments.refund_deadline - ? AbsoluteTime.toProtocolTimestamp( - AbsoluteTime.addDuration( - AbsoluteTime.now(), - value.payments.refund_deadline, - ), - ) - : undefined, + pay_deadline: AbsoluteTime.toProtocolTimestamp( + AbsoluteTime.addDuration( + AbsoluteTime.now(), + value.payments.pay_deadline!, + ), + ), + wire_transfer_deadline: AbsoluteTime.toProtocolTimestamp( + AbsoluteTime.addDuration( + AbsoluteTime.now(), + value.payments.wire_transfer_deadline!, + ), + ), + refund_deadline: AbsoluteTime.toProtocolTimestamp( + AbsoluteTime.addDuration( + AbsoluteTime.now(), + value.payments.refund_deadline!, + ), + ), auto_refund: value.payments.auto_refund_deadline ? Duration.toTalerProtocolDuration( value.payments.auto_refund_deadline, ) : undefined, - max_fee: value.payments.max_fee as string, - + max_fee: value.payments.max_fee as AmountString, delivery_date: value.shipping.delivery_date ? { t_s: value.shipping.delivery_date.getTime() / 1000 } : undefined, @@ -269,7 +263,7 @@ export function CreatePage({ }; const addProductToTheInventoryList = ( - product: MerchantBackend.Products.ProductDetail & WithId, + product: TalerMerchantApi.ProductDetail & WithId, quantity: number, ) => { valueHandler((v) => { @@ -287,7 +281,7 @@ export function CreatePage({ }); }; - const addNewProduct = async (product: MerchantBackend.Product) => { + const addNewProduct = async (product: TalerMerchantApi.Product) => { return valueHandler((v) => { const products = v.products ? [...v.products, product] : []; return { ...v, products }; @@ -303,7 +297,7 @@ export function CreatePage({ }; const [editingProduct, setEditingProduct] = useState< - MerchantBackend.Product | undefined + TalerMerchantApi.Product | undefined >(undefined); const totalPriceInventory = inventoryList.reduce((prev, cur) => { @@ -314,7 +308,7 @@ export function CreatePage({ const totalPriceProducts = productList.reduce((prev, cur) => { if (!cur.price) return zero; const p = Amounts.parseOrThrow(cur.price); - return Amounts.add(prev, Amounts.mult(p, cur.quantity).amount).amount; + return Amounts.add(prev, Amounts.mult(p, cur.quantity ?? 0).amount).amount; }, zero); const hasProducts = inventoryList.length > 0 || productList.length > 0; @@ -343,9 +337,9 @@ export function CreatePage({ totalPrice.amount, ); - const minAgeByProducts = allProducts.reduce( + const minAgeByProducts = inventoryList.reduce( (cur, prev) => - !prev.minimum_age || cur > prev.minimum_age ? cur : prev.minimum_age, + !prev.product.minimum_age || cur > prev.product.minimum_age ? cur : prev.product.minimum_age, 0, ); @@ -766,7 +760,7 @@ export function CreatePage({ ); } -function asProduct(p: ProductAndQuantity): MerchantBackend.Product { +function asProduct(p: ProductAndQuantity): TalerMerchantApi.Product { return { product_id: p.product.id, image: p.product.image, @@ -775,7 +769,6 @@ function asProduct(p: ProductAndQuantity): MerchantBackend.Product { quantity: p.quantity, description: p.product.description, taxes: p.product.taxes, - minimum_age: p.product.minimum_age, }; } diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/index.tsx index d2a8619ce..0f8618435 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/index.tsx @@ -19,29 +19,28 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { HttpStatusCode, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import { ErrorType, HttpError } from "@gnu-taler/web-util/browser"; -import { Fragment, h, VNode } from "preact"; +import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../../components/exception/loading.js"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { useInstanceDetails } from "../../../../hooks/instance.js"; import { useOrderAPI } from "../../../../hooks/order.js"; import { useInstanceProducts } from "../../../../hooks/product.js"; import { Notification } from "../../../../utils/types.js"; import { CreatePage } from "./CreatePage.js"; -import { HttpStatusCode } from "@gnu-taler/taler-util"; export type Entity = { - request: MerchantBackend.Orders.PostOrderRequest; - response: MerchantBackend.Orders.PostOrderResponse; + request: TalerMerchantApi.PostOrderRequest; + response: TalerMerchantApi.PostOrderResponse; }; interface Props { onBack?: () => void; onConfirm: (id: string) => void; onUnauthorized: () => VNode; onNotFound: () => VNode; - onLoadError: (error: HttpError) => VNode; + onLoadError: (error: HttpError) => VNode; } export default function OrderCreate({ onConfirm, @@ -93,7 +92,7 @@ export default function OrderCreate({ { + onCreate={(request: TalerMerchantApi.PostOrderRequest) => { createOrder(request) .then((r) => { return onConfirm(r.data.order_id) diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/Detail.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/Detail.stories.tsx index 63f0d5dc4..7d4877db9 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/Detail.stories.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/Detail.stories.tsx @@ -19,9 +19,9 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { AmountString, TalerMerchantApi } from "@gnu-taler/taler-util"; import { addDays } from "date-fns"; -import { h, VNode, FunctionalComponent } from "preact"; -import { MerchantBackend } from "../../../../declaration.js"; +import { FunctionalComponent, h } from "preact"; import { DetailPage as TestedComponent } from "./DetailPage.js"; export default { @@ -42,14 +42,13 @@ function createExample( return r; } -const defaultContractTerm = { - amount: "TESTKUDOS:10", +const defaultContractTerm: TalerMerchantApi.ContractTerms = { + amount: "TESTKUDOS:10" as AmountString, timestamp: { t_s: new Date().getTime() / 1000, }, - auditors: [], exchanges: [], - max_fee: "TESTKUDOS:1", + max_fee: "TESTKUDOS:1" as AmountString, merchant: {} as any, merchant_base_url: "http://merchant.url/", order_id: "2021.165-03GDFC26Y1NNG", @@ -66,7 +65,7 @@ const defaultContractTerm = { }, wire_method: "x-taler-bank", h_wire: "asd", -} as MerchantBackend.ContractTerms; +}; // contract_terms: defaultContracTerm, export const Claimed = createExample(TestedComponent, { @@ -83,15 +82,16 @@ export const PaidNotRefundable = createExample(TestedComponent, { order_status: "paid", contract_terms: defaultContractTerm, refunded: false, - deposit_total: "TESTKUDOS:10", - exchange_ec: 0, + deposit_total: "TESTKUDOS:10" as AmountString, + exchange_code: 0, order_status_url: "http://merchant.backend/status", - exchange_hc: 0, - refund_amount: "TESTKUDOS:0", + exchange_http_status: 0, + refund_amount: "TESTKUDOS:0" as AmountString, refund_details: [], refund_pending: false, wire_details: [], wired: false, + wire_reports: [], }, }); @@ -106,12 +106,13 @@ export const PaidRefundable = createExample(TestedComponent, { }, }, refunded: false, - deposit_total: "TESTKUDOS:10", - exchange_ec: 0, + deposit_total: "TESTKUDOS:10" as AmountString, + exchange_code: 0, order_status_url: "http://merchant.backend/status", - exchange_hc: 0, - refund_amount: "TESTKUDOS:0", + exchange_http_status: 0, + refund_amount: "TESTKUDOS:0" as AmountString, refund_details: [], + wire_reports: [], refund_pending: false, wire_details: [], wired: false, @@ -128,6 +129,6 @@ export const Unpaid = createExample(TestedComponent, { }, summary: "text summary", taler_pay_uri: "pay uri", - total_amount: "TESTKUDOS:10", + total_amount: "TESTKUDOS:10" as AmountString, }, }); diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/DetailPage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/DetailPage.tsx index 69e9df52e..4ed78b002 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/DetailPage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/DetailPage.tsx @@ -19,7 +19,12 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { AmountJson, Amounts, stringifyRefundUri } from "@gnu-taler/taler-util"; +import { + AmountJson, + Amounts, + TalerMerchantApi, + stringifyRefundUri, +} from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { format, formatDistance } from "date-fns"; import { Fragment, VNode, h } from "preact"; @@ -34,27 +39,29 @@ import { InputLocation } from "../../../../components/form/InputLocation.js"; import { TextField } from "../../../../components/form/TextField.js"; import { ProductList } from "../../../../components/product/ProductList.js"; import { useSessionContext } from "../../../../context/session.js"; -import { MerchantBackend } from "../../../../declaration.js"; -import { datetimeFormatForSettings, usePreference } from "../../../../hooks/preference.js"; +import { + datetimeFormatForSettings, + usePreference, +} from "../../../../hooks/preference.js"; import { mergeRefunds } from "../../../../utils/amount.js"; import { RefundModal } from "../list/Table.js"; import { Event, Timeline } from "./Timeline.js"; -type Entity = MerchantBackend.Orders.MerchantOrderStatusResponse; -type CT = MerchantBackend.ContractTerms; +type Entity = TalerMerchantApi.MerchantOrderStatusResponse; +type CT = TalerMerchantApi.ContractTerms; interface Props { onBack: () => void; selected: Entity; id: string; - onRefund: (id: string, value: MerchantBackend.Orders.RefundRequest) => void; + onRefund: (id: string, value: TalerMerchantApi.RefundRequest) => void; } -type Paid = MerchantBackend.Orders.CheckPaymentPaidResponse & { +type Paid = TalerMerchantApi.CheckPaymentPaidResponse & { refund_taken: string; }; -type Unpaid = MerchantBackend.Orders.CheckPaymentUnpaidResponse; -type Claimed = MerchantBackend.Orders.CheckPaymentClaimedResponse; +type Unpaid = TalerMerchantApi.CheckPaymentUnpaidResponse; +type Claimed = TalerMerchantApi.CheckPaymentClaimedResponse; function ContractTerms({ value }: { value: CT }) { const { i18n } = useTranslationContext(); @@ -149,7 +156,7 @@ function ClaimedPage({ order, }: { id: string; - order: MerchantBackend.Orders.CheckPaymentClaimedResponse; + order: TalerMerchantApi.CheckPaymentClaimedResponse; }) { const events: Event[] = []; if (order.contract_terms.timestamp.t_s !== "never") { @@ -193,7 +200,7 @@ function ClaimedPage({ const [value, valueHandler] = useState>(order); const { i18n } = useTranslationContext(); - const [settings] = usePreference() + const [settings] = usePreference(); return (
@@ -237,10 +244,14 @@ function ClaimedPage({ claimed at: {" "} - {format( - new Date(order.contract_terms.timestamp.t_s * 1000), - datetimeFormatForSettings(settings) - )} + {order.contract_terms.timestamp.t_s === "never" + ? "never" + : format( + new Date( + order.contract_terms.timestamp.t_s * 1000, + ), + datetimeFormatForSettings(settings), + )}

@@ -311,7 +322,7 @@ function PaidPage({ onRefund, }: { id: string; - order: MerchantBackend.Orders.CheckPaymentPaidResponse; + order: TalerMerchantApi.CheckPaymentPaidResponse; onRefund: (id: string) => void; }) { const events: Event[] = []; @@ -365,8 +376,8 @@ function PaidPage({ }); if (order.wire_details && order.wire_details.length) { if (order.wire_details.length > 1) { - let last: MerchantBackend.Orders.TransactionWireTransfer | null = null; - let first: MerchantBackend.Orders.TransactionWireTransfer | null = null; + let last: TalerMerchantApi.TransactionWireTransfer | null = null; + let first: TalerMerchantApi.TransactionWireTransfer | null = null; let total: AmountJson | null = null; order.wire_details.forEach((w) => { @@ -410,10 +421,10 @@ function PaidPage({ } } - const now = new Date() + const now = new Date(); const nextEvent = events.find((e) => { - return e.when.getTime() > now.getTime() - }) + return e.when.getTime() > now.getTime(); + }); const [value, valueHandler] = useState>(order); const { @@ -422,9 +433,10 @@ function PaidPage({ const refundurl = stringifyRefundUri({ merchantBaseUrl: backendUrl, - orderId: order.contract_terms.order_id - }) + orderId: order.contract_terms.order_id, + }); const refundable = + order.contract_terms.refund_deadline.t_s !== "never" && new Date().getTime() < order.contract_terms.refund_deadline.t_s * 1000; const { i18n } = useTranslationContext(); @@ -506,15 +518,16 @@ function PaidPage({ textOverflow: "ellipsis", }} > - {nextEvent && + {nextEvent && (

- Next event in {formatDistance( + Next event in {" "} + {formatDistance( nextEvent.when, new Date(), // "yyyy/MM/dd HH:mm:ss", )}

- } + )} @@ -610,11 +623,11 @@ function UnpaidPage({ order, }: { id: string; - order: MerchantBackend.Orders.CheckPaymentUnpaidResponse; + order: TalerMerchantApi.CheckPaymentUnpaidResponse; }) { const [value, valueHandler] = useState>(order); const { i18n } = useTranslationContext(); - const [settings] = usePreference() + const [settings] = usePreference(); return (
@@ -662,9 +675,9 @@ function UnpaidPage({ {order.creation_time.t_s === "never" ? "never" : format( - new Date(order.creation_time.t_s * 1000), - datetimeFormatForSettings(settings) - )} + new Date(order.creation_time.t_s * 1000), + datetimeFormatForSettings(settings), + )}

diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/index.tsx index dfeaa4447..a7fe1801b 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/index.tsx @@ -13,20 +13,19 @@ You should have received a copy of the GNU General Public License along with GNU Taler; see the file COPYING. If not, see */ +import { HttpStatusCode, TalerErrorDetail } from "@gnu-taler/taler-util"; import { - useTranslationContext, - HttpError, ErrorType, + HttpError, + useTranslationContext, } from "@gnu-taler/web-util/browser"; -import { Fragment, h, VNode } from "preact"; +import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../../components/exception/loading.js"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { useOrderAPI, useOrderDetails } from "../../../../hooks/order.js"; import { Notification } from "../../../../utils/types.js"; import { DetailPage } from "./DetailPage.js"; -import { HttpStatusCode } from "@gnu-taler/taler-util"; export interface Props { oid: string; @@ -34,7 +33,7 @@ export interface Props { onBack: () => void; onUnauthorized: () => VNode; onNotFound: () => VNode; - onLoadError: (error: HttpError) => VNode; + onLoadError: (error: HttpError) => VNode; } export default function Update({ diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/List.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/List.stories.tsx index 9df006083..5c9969689 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/List.stories.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/List.stories.tsx @@ -19,8 +19,9 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { h, VNode, FunctionalComponent } from "preact"; +import { FunctionalComponent, h } from "preact"; import { ListPage as TestedComponent } from "./ListPage.js"; +import { AmountString } from "@gnu-taler/taler-util"; export default { title: "Pages/Order/List", @@ -54,7 +55,7 @@ export const Example = createExample(TestedComponent, { orders: [ { id: "123", - amount: "TESTKUDOS:10", + amount: "TESTKUDOS:10" as AmountString, paid: false, refundable: true, row_id: 1, @@ -66,7 +67,7 @@ export const Example = createExample(TestedComponent, { }, { id: "234", - amount: "TESTKUDOS:12", + amount: "TESTKUDOS:12" as AmountString, paid: true, refundable: true, row_id: 2, @@ -79,7 +80,7 @@ export const Example = createExample(TestedComponent, { }, { id: "456", - amount: "TESTKUDOS:1", + amount: "TESTKUDOS:1" as AmountString, paid: false, refundable: false, row_id: 3, @@ -92,7 +93,7 @@ export const Example = createExample(TestedComponent, { }, { id: "234", - amount: "TESTKUDOS:12", + amount: "TESTKUDOS:12" as AmountString, paid: false, refundable: false, row_id: 4, diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/ListPage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/ListPage.tsx index b45d468cb..7b88985dc 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/ListPage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/ListPage.tsx @@ -19,14 +19,14 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { format } from "date-fns"; -import { h, VNode, Fragment } from "preact"; +import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { DatePicker } from "../../../../components/picker/DatePicker.js"; -import { MerchantBackend, WithId } from "../../../../declaration.js"; -import { CardTable } from "./Table.js"; import { dateFormatForSettings, usePreference } from "../../../../hooks/preference.js"; +import { CardTable } from "./Table.js"; export interface ListPageProps { onShowAll: () => void; @@ -46,14 +46,14 @@ export interface ListPageProps { jumpToDate?: Date; onSelectDate: (date?: Date) => void; - orders: (MerchantBackend.Orders.OrderHistoryEntry & WithId)[]; + orders: (TalerMerchantApi.OrderHistoryEntry & WithId)[]; onLoadMoreBefore?: () => void; hasMoreBefore?: boolean; hasMoreAfter?: boolean; onLoadMoreAfter?: () => void; - onSelectOrder: (o: MerchantBackend.Orders.OrderHistoryEntry & WithId) => void; - onRefundOrder: (o: MerchantBackend.Orders.OrderHistoryEntry & WithId) => void; + onSelectOrder: (o: TalerMerchantApi.OrderHistoryEntry & WithId) => void; + onRefundOrder: (o: TalerMerchantApi.OrderHistoryEntry & WithId) => void; onCreate: () => void; } diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/Table.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/Table.tsx index cebc4afe6..c3df81b87 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/Table.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/Table.tsx @@ -19,13 +19,13 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { Amounts } from "@gnu-taler/taler-util"; +import { Amounts, TalerMerchantApi } from "@gnu-taler/taler-util"; import { useMerchantApiContext, useTranslationContext, } from "@gnu-taler/web-util/browser"; import { format } from "date-fns"; -import { h, VNode } from "preact"; +import { VNode, h } from "preact"; import { StateUpdater, useState } from "preact/hooks"; import { FormErrors, @@ -36,14 +36,13 @@ import { InputCurrency } from "../../../../components/form/InputCurrency.js"; import { InputGroup } from "../../../../components/form/InputGroup.js"; import { InputSelector } from "../../../../components/form/InputSelector.js"; import { ConfirmModal } from "../../../../components/modal/index.js"; -import { MerchantBackend, WithId } from "../../../../declaration.js"; -import { mergeRefunds } from "../../../../utils/amount.js"; import { datetimeFormatForSettings, usePreference, } from "../../../../hooks/preference.js"; +import { mergeRefunds } from "../../../../utils/amount.js"; -type Entity = MerchantBackend.Orders.OrderHistoryEntry & WithId; +type Entity = TalerMerchantApi.OrderHistoryEntry & WithId; interface Props { orders: Entity[]; onRefund: (value: Entity) => void; @@ -248,8 +247,8 @@ function EmptyTable(): VNode { interface RefundModalProps { onCancel: () => void; - onConfirm: (value: MerchantBackend.Orders.RefundRequest) => void; - order: MerchantBackend.Orders.MerchantOrderStatusResponse; + onConfirm: (value: TalerMerchantApi.RefundRequest) => void; + order: TalerMerchantApi.MerchantOrderStatusResponse; } export function RefundModal({ diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/index.tsx index 369ef8c8b..cd62685ca 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/index.tsx @@ -19,16 +19,17 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { HttpStatusCode, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import { ErrorType, HttpError, useTranslationContext, } from "@gnu-taler/web-util/browser"; -import { Fragment, h, VNode } from "preact"; +import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../../components/exception/loading.js"; +import { JumpToElementById } from "../../../../components/form/JumpToElementById.js"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { InstanceOrderFilter, useInstanceOrders, @@ -38,12 +39,10 @@ import { import { Notification } from "../../../../utils/types.js"; import { ListPage } from "./ListPage.js"; import { RefundModal } from "./Table.js"; -import { HttpStatusCode } from "@gnu-taler/taler-util"; -import { JumpToElementById } from "../../../../components/form/JumpToElementById.js"; interface Props { onUnauthorized: () => VNode; - onLoadError: (error: HttpError) => VNode; + onLoadError: (error: HttpError) => VNode; onNotFound: () => VNode; onSelect: (id: string) => void; onCreate: () => void; @@ -58,7 +57,7 @@ export default function OrderList({ }: Props): VNode { const [filter, setFilter] = useState({ paid: "no" }); const [orderToBeRefunded, setOrderToBeRefunded] = useState< - MerchantBackend.Orders.OrderHistoryEntry | undefined + TalerMerchantApi.OrderHistoryEntry | undefined >(undefined); const setNewDate = (date?: Date): void => @@ -186,10 +185,10 @@ export default function OrderList({ interface RefundProps { id: string; onUnauthorized: () => VNode; - onLoadError: (error: HttpError) => VNode; + onLoadError: (error: HttpError) => VNode; onNotFound: () => VNode; onCancel: () => void; - onConfirm: (m: MerchantBackend.Orders.RefundRequest) => void; + onConfirm: (m: TalerMerchantApi.RefundRequest) => void; } function RefundModalForTable({ diff --git a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/create/CreatePage.tsx index 930a0d82c..d5522c2d4 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/create/CreatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/create/CreatePage.tsx @@ -20,6 +20,7 @@ */ import { + TalerMerchantApi, isRfc3548Base32Charset, randomRfc3548Base32Key, } from "@gnu-taler/taler-util"; @@ -34,9 +35,8 @@ import { import { Input } from "../../../../components/form/Input.js"; import { InputSelector } from "../../../../components/form/InputSelector.js"; import { InputWithAddon } from "../../../../components/form/InputWithAddon.js"; -import { MerchantBackend } from "../../../../declaration.js"; -type Entity = MerchantBackend.OTP.OtpDeviceAddDetails; +type Entity = TalerMerchantApi.OtpDeviceAddDetails; interface Props { onCreate: (d: Entity) => Promise; @@ -112,7 +112,7 @@ export function CreatePage({ onCreate, onBack }: Props): VNode { toStr={(v) => algorithmsNames[v]} fromStr={(v) => Number(v)} /> - {state.otp_algorithm && state.otp_algorithm > 0 ? ( + {state.otp_algorithm ? ( expand diff --git a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/create/CreatedSuccessfully.tsx b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/create/CreatedSuccessfully.tsx index 60abc3ca6..b1b4a0cf7 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/create/CreatedSuccessfully.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/create/CreatedSuccessfully.tsx @@ -14,14 +14,14 @@ GNU Taler; see the file COPYING. If not, see */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { VNode, h } from "preact"; import { QR } from "../../../../components/exception/QR.js"; import { CreatedSuccessfully as Template } from "../../../../components/notifications/CreatedSuccessfully.js"; import { useSessionContext } from "../../../../context/session.js"; -import { MerchantBackend } from "../../../../declaration.js"; -type Entity = MerchantBackend.OTP.OtpDeviceAddDetails; +type Entity = TalerMerchantApi.OtpDeviceAddDetails; interface Props { entity: Entity; diff --git a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/create/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/create/index.tsx index f0b419f68..e4501a053 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/create/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/create/index.tsx @@ -19,18 +19,17 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend } from "../../../../declaration.js"; -import { useWebhookAPI } from "../../../../hooks/webhooks.js"; -import { Notification } from "../../../../utils/types.js"; -import { CreatePage } from "./CreatePage.js"; import { useOtpDeviceAPI } from "../../../../hooks/otp.js"; +import { Notification } from "../../../../utils/types.js"; import { CreatedSuccessfully } from "./CreatedSuccessfully.js"; +import { CreatePage } from "./CreatePage.js"; -export type Entity = MerchantBackend.OTP.OtpDeviceAddDetails; +export type Entity = TalerMerchantApi.OtpDeviceAddDetails; interface Props { onBack?: () => void; onConfirm: () => void; @@ -40,7 +39,7 @@ export default function CreateValidator({ onConfirm, onBack }: Props): VNode { const { createOtpDevice } = useOtpDeviceAPI(); const [notif, setNotif] = useState(undefined); const { i18n } = useTranslationContext(); - const [created, setCreated] = useState(null) + const [created, setCreated] = useState(null) if (created) { return diff --git a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/list/ListPage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/list/ListPage.tsx index f3b5a2088..9022cc35b 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/list/ListPage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/list/ListPage.tsx @@ -19,18 +19,17 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { h, VNode } from "preact"; -import { MerchantBackend } from "../../../../declaration.js"; -import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { CardTable } from "./Table.js"; export interface Props { - devices: MerchantBackend.OTP.OtpDeviceEntry[]; + devices: TalerMerchantApi.OtpDeviceEntry[]; onLoadMoreBefore?: () => void; onLoadMoreAfter?: () => void; onCreate: () => void; - onDelete: (e: MerchantBackend.OTP.OtpDeviceEntry) => void; - onSelect: (e: MerchantBackend.OTP.OtpDeviceEntry) => void; + onDelete: (e: TalerMerchantApi.OtpDeviceEntry) => void; + onSelect: (e: TalerMerchantApi.OtpDeviceEntry) => void; } export function ListPage({ @@ -41,9 +40,7 @@ export function ListPage({ onLoadMoreBefore, onLoadMoreAfter, }: Props): VNode { - const form = { payto_uri: "" }; - const { i18n } = useTranslationContext(); return (
void; } -function toggleSelected(id: T): (prev: T[]) => T[] { - return (prev: T[]): T[] => - prev.indexOf(id) == -1 ? [...prev, id] : prev.filter((e) => e != id); -} - function Table({ instances, onLoadMoreAfter, diff --git a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/list/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/list/index.tsx index a3299326c..7fd827956 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/list/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/list/index.tsx @@ -19,7 +19,7 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { HttpStatusCode } from "@gnu-taler/taler-util"; +import { HttpStatusCode, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import { ErrorType, HttpError, @@ -29,14 +29,13 @@ import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../../components/exception/loading.js"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { useInstanceOtpDevices, useOtpDeviceAPI } from "../../../../hooks/otp.js"; import { Notification } from "../../../../utils/types.js"; import { ListPage } from "./ListPage.js"; interface Props { onUnauthorized: () => VNode; - onLoadError: (error: HttpError) => VNode; + onLoadError: (error: HttpError) => VNode; onNotFound: () => VNode; onCreate: () => void; onSelect: (id: string) => void; @@ -84,7 +83,7 @@ export default function ListOtpDevices({ onSelect={(e) => { onSelect(e.otp_device_id); }} - onDelete={(e: MerchantBackend.OTP.OtpDeviceEntry) => + onDelete={(e: TalerMerchantApi.OtpDeviceEntry) => deleteOtpDevice(e.otp_device_id) .then(() => setNotif({ diff --git a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/update/UpdatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/update/UpdatePage.tsx index 310810576..35d67cbc6 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/update/UpdatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/update/UpdatePage.tsx @@ -19,7 +19,7 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { randomRfc3548Base32Key } from "@gnu-taler/taler-util"; +import { randomRfc3548Base32Key, TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; @@ -31,9 +31,8 @@ import { import { Input } from "../../../../components/form/Input.js"; import { InputSelector } from "../../../../components/form/InputSelector.js"; import { InputWithAddon } from "../../../../components/form/InputWithAddon.js"; -import { MerchantBackend, WithId } from "../../../../declaration.js"; -type Entity = MerchantBackend.OTP.OtpDevicePatchDetails & WithId; +type Entity = TalerMerchantApi.OtpDevicePatchDetails & WithId; interface Props { onUpdate: (d: Entity) => Promise; diff --git a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/update/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/update/index.tsx index 922a94364..a824c6936 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/update/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/update/index.tsx @@ -19,30 +19,29 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { HttpStatusCode, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import { ErrorType, HttpError, useTranslationContext, } from "@gnu-taler/web-util/browser"; -import { Fragment, h, VNode } from "preact"; +import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../../components/exception/loading.js"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend, WithId } from "../../../../declaration.js"; -import { Notification } from "../../../../utils/types.js"; -import { UpdatePage } from "./UpdatePage.js"; -import { HttpStatusCode } from "@gnu-taler/taler-util"; import { useOtpDeviceAPI, useOtpDeviceDetails } from "../../../../hooks/otp.js"; +import { Notification } from "../../../../utils/types.js"; import { CreatedSuccessfully } from "../create/CreatedSuccessfully.js"; +import { UpdatePage } from "./UpdatePage.js"; -export type Entity = MerchantBackend.OTP.OtpDevicePatchDetails & WithId; +export type Entity = TalerMerchantApi.OtpDevicePatchDetails & WithId; interface Props { onBack?: () => void; onConfirm: () => void; onUnauthorized: () => VNode; onNotFound: () => VNode; - onLoadError: (e: HttpError) => VNode; + onLoadError: (e: HttpError) => VNode; vid: string; } export default function UpdateValidator({ @@ -56,7 +55,7 @@ export default function UpdateValidator({ const { updateOtpDevice } = useOtpDeviceAPI(); const result = useOtpDeviceDetails(vid); const [notif, setNotif] = useState(undefined); - const [keyUpdated, setKeyUpdated] = useState(null) + const [keyUpdated, setKeyUpdated] = useState(null) const { i18n } = useTranslationContext(); @@ -87,7 +86,7 @@ export default function UpdateValidator({ id: vid, otp_algorithm: result.data.otp_algorithm, otp_device_description: result.data.device_description, - otp_key: undefined, + otp_key: "", otp_ctr: result.data.otp_ctr }} onBack={onBack} diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatePage.tsx index 6cbc26d8d..64b174f64 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatePage.tsx @@ -19,14 +19,14 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { h, VNode } from "preact"; import { AsyncButton } from "../../../../components/exception/AsyncButton.js"; import { ProductForm } from "../../../../components/product/ProductForm.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { useListener } from "../../../../hooks/listener.js"; -type Entity = MerchantBackend.Products.ProductAddDetail & { +type Entity = TalerMerchantApi.ProductAddDetail & { product_id: string; }; diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/create/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/create/index.tsx index 5b1b5ecfe..9935a9625 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/products/create/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/products/create/index.tsx @@ -19,16 +19,16 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { useProductAPI } from "../../../../hooks/product.js"; import { Notification } from "../../../../utils/types.js"; import { CreatePage } from "./CreatePage.js"; -export type Entity = MerchantBackend.Products.ProductAddDetail; +export type Entity = TalerMerchantApi.ProductAddDetail; interface Props { onBack?: () => void; onConfirm: () => void; @@ -43,7 +43,7 @@ export default function CreateProduct({ onConfirm, onBack }: Props): VNode { { + onCreate={(request: TalerMerchantApi.ProductAddDetail) => { return createProduct(request) .then(() => onConfirm()) .catch((error) => { diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/list/List.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/list/List.stories.tsx index a2f996221..580a92cdc 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/products/list/List.stories.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/products/list/List.stories.tsx @@ -19,7 +19,8 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { h, VNode, FunctionalComponent } from "preact"; +import { AmountString } from "@gnu-taler/taler-util"; +import { FunctionalComponent, h } from "preact"; import { CardTable as TestedComponent } from "./Table.js"; export default { @@ -49,7 +50,7 @@ export const Example = createExample(TestedComponent, { description: "description1", description_i18n: {} as any, image: "", - price: "TESTKUDOS:10", + price: "TESTKUDOS:10" as AmountString, taxes: [], total_lost: 10, total_sold: 5, diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/list/Table.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/list/Table.tsx index 2526e4d33..265146c01 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/products/list/Table.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/products/list/Table.tsx @@ -19,10 +19,10 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { Amounts } from "@gnu-taler/taler-util"; +import { AmountString, Amounts, TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { format } from "date-fns"; -import { ComponentChildren, Fragment, h, VNode } from "preact"; +import { ComponentChildren, Fragment, VNode, h } from "preact"; import { StateUpdater, useState } from "preact/hooks"; import emptyImage from "../../../../assets/empty.png"; import { @@ -31,10 +31,9 @@ import { } from "../../../../components/form/FormProvider.js"; import { InputCurrency } from "../../../../components/form/InputCurrency.js"; import { InputNumber } from "../../../../components/form/InputNumber.js"; -import { MerchantBackend, WithId } from "../../../../declaration.js"; import { dateFormatForSettings, usePreference } from "../../../../hooks/preference.js"; -type Entity = MerchantBackend.Products.ProductDetail & WithId; +type Entity = TalerMerchantApi.ProductDetail & WithId; interface Props { instances: Entity[]; @@ -42,7 +41,7 @@ interface Props { onSelect: (product: Entity) => void; onUpdate: ( id: string, - data: MerchantBackend.Products.ProductPatchDetail, + data: TalerMerchantApi.ProductPatchDetail, ) => Promise; onCreate: () => void; selected?: boolean; @@ -108,7 +107,7 @@ interface TableProps { onSelect: (id: Entity) => void; onUpdate: ( id: string, - data: MerchantBackend.Products.ProductPatchDetail, + data: TalerMerchantApi.ProductPatchDetail, ) => Promise; onDelete: (id: Entity) => void; rowSelectionHandler: StateUpdater; @@ -305,7 +304,7 @@ function Table({ interface FastProductUpdateFormProps { product: Entity; onUpdate: ( - data: MerchantBackend.Products.ProductPatchDetail, + data: TalerMerchantApi.ProductPatchDetail, ) => Promise; onCancel: () => void; } @@ -361,7 +360,7 @@ function FastProductWithInfiniteStockUpdateForm({ onClick={() => onUpdate({ ...product, - price: value.price, + price: value.price as AmountString, }) } > @@ -446,7 +445,7 @@ function FastProductWithManagedStockUpdateForm({ ...product, total_stock: product.total_stock + value.incoming, total_lost: product.total_lost + value.lost, - price: value.price, + price: value.price as AmountString, }) } > @@ -491,6 +490,6 @@ function difference(price: string, tax: number) { ps[1] = `${p - tax}`; return ps.join(":"); } -function sum(taxes: MerchantBackend.Tax[]) { +function sum(taxes: TalerMerchantApi.Tax[]) { return taxes.reduce((p, c) => p + parseInt(c.tax.split(":")[1], 10), 0); } diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/list/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/list/index.tsx index 6adc221da..1017a9334 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/products/list/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/products/list/index.tsx @@ -19,32 +19,31 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { HttpStatusCode, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import { ErrorType, HttpError, useTranslationContext, } from "@gnu-taler/web-util/browser"; -import { h, VNode } from "preact"; +import { VNode, h } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../../components/exception/loading.js"; +import { JumpToElementById } from "../../../../components/form/JumpToElementById.js"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend, WithId } from "../../../../declaration.js"; +import { ConfirmModal } from "../../../../components/modal/index.js"; import { useInstanceProducts, useProductAPI, } from "../../../../hooks/product.js"; import { Notification } from "../../../../utils/types.js"; import { CardTable } from "./Table.js"; -import { HttpStatusCode } from "@gnu-taler/taler-util"; -import { ConfirmModal, DeleteModal } from "../../../../components/modal/index.js"; -import { JumpToElementById } from "../../../../components/form/JumpToElementById.js"; interface Props { onUnauthorized: () => VNode; onNotFound: () => VNode; onCreate: () => void; onSelect: (id: string) => void; - onLoadError: (e: HttpError) => VNode; + onLoadError: (e: HttpError) => VNode; } export default function ProductList({ onUnauthorized, @@ -56,7 +55,7 @@ export default function ProductList({ const result = useInstanceProducts(); const { deleteProduct, updateProduct, getProduct } = useProductAPI(); const [deleting, setDeleting] = - useState(null); + useState(null); const [notif, setNotif] = useState(undefined); const { i18n } = useTranslationContext(); @@ -107,7 +106,7 @@ export default function ProductList({ ) } onSelect={(product) => onSelect(product.id)} - onDelete={(prod: MerchantBackend.Products.ProductDetail & WithId) => + onDelete={(prod: TalerMerchantApi.ProductDetail & WithId) => setDeleting(prod) } /> diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/update/Update.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/update/Update.stories.tsx index d1dc9d540..7aa93b186 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/products/update/Update.stories.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/products/update/Update.stories.tsx @@ -19,7 +19,8 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { h, VNode, FunctionalComponent } from "preact"; +import { AmountString } from "@gnu-taler/taler-util"; +import { FunctionalComponent, h } from "preact"; import { UpdatePage as TestedComponent } from "./UpdatePage.js"; export default { @@ -46,7 +47,7 @@ export const WithManagedStock = createExample(TestedComponent, { description: "description1", description_i18n: {} as any, image: "", - price: "TESTKUDOS:10", + price: "TESTKUDOS:10" as AmountString, taxes: [], total_lost: 10, total_sold: 5, @@ -62,7 +63,7 @@ export const WithInfiniteStock = createExample(TestedComponent, { description: "description1", description_i18n: {} as any, image: "", - price: "TESTKUDOS:10", + price: "TESTKUDOS:10" as AmountString, taxes: [], total_lost: 10, total_sold: 5, diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/update/UpdatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/update/UpdatePage.tsx index 53aa9d61f..5395ae40f 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/products/update/UpdatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/products/update/UpdatePage.tsx @@ -19,14 +19,14 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { h, VNode } from "preact"; import { AsyncButton } from "../../../../components/exception/AsyncButton.js"; import { ProductForm } from "../../../../components/product/ProductForm.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { useListener } from "../../../../hooks/listener.js"; -type Entity = MerchantBackend.Products.ProductDetail & { product_id: string }; +type Entity = TalerMerchantApi.ProductDetail & { product_id: string }; interface Props { onUpdate: (d: Entity) => Promise; diff --git a/packages/merchant-backoffice-ui/src/paths/instance/products/update/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/products/update/index.tsx index 2d3e7bd6b..842462c12 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/products/update/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/products/update/index.tsx @@ -19,28 +19,27 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { HttpStatusCode, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import { ErrorType, HttpError, useTranslationContext, } from "@gnu-taler/web-util/browser"; -import { Fragment, h, VNode } from "preact"; +import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../../components/exception/loading.js"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { useProductAPI, useProductDetails } from "../../../../hooks/product.js"; import { Notification } from "../../../../utils/types.js"; import { UpdatePage } from "./UpdatePage.js"; -import { HttpStatusCode } from "@gnu-taler/taler-util"; -export type Entity = MerchantBackend.Products.ProductAddDetail; +export type Entity = TalerMerchantApi.ProductAddDetail; interface Props { onBack?: () => void; onConfirm: () => void; onUnauthorized: () => VNode; onNotFound: () => VNode; - onLoadError: (e: HttpError) => VNode; + onLoadError: (e: HttpError) => VNode; pid: string; } export default function UpdateProduct({ diff --git a/packages/merchant-backoffice-ui/src/paths/instance/templates/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/templates/create/CreatePage.tsx index b07582252..31e525226 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/templates/create/CreatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/templates/create/CreatePage.tsx @@ -23,6 +23,7 @@ import { AmountString, Amounts, Duration, + TalerMerchantApi, assertUnreachable, } from "@gnu-taler/taler-util"; import { @@ -43,7 +44,6 @@ import { InputSearchOnList } from "../../../../components/form/InputSearchOnList import { InputTab } from "../../../../components/form/InputTab.js"; import { InputWithAddon } from "../../../../components/form/InputWithAddon.js"; import { useSessionContext } from "../../../../context/session.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { useInstanceOtpDevices } from "../../../../hooks/otp.js"; enum Steps { @@ -53,7 +53,7 @@ enum Steps { NON_FIXED, } -// type Entity = MerchantBackend.Template.TemplateAddDetails & { type: Steps }; +// type Entity = TalerMerchantApi.TemplateAddDetails & { type: Steps }; type Entity = { id?: string; description?: string; @@ -66,7 +66,7 @@ type Entity = { }; interface Props { - onCreate: (d: MerchantBackend.Template.TemplateAddDetails) => Promise; + onCreate: (d: TalerMerchantApi.TemplateAddDetails) => Promise; onBack?: () => void; } diff --git a/packages/merchant-backoffice-ui/src/paths/instance/templates/create/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/templates/create/index.tsx index f76146812..593850268 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/templates/create/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/templates/create/index.tsx @@ -19,16 +19,16 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { useTemplateAPI } from "../../../../hooks/templates.js"; import { Notification } from "../../../../utils/types.js"; import { CreatePage } from "./CreatePage.js"; -export type Entity = MerchantBackend.Transfers.TransferInformation; +export type Entity = TalerMerchantApi.TransferInformation; interface Props { onBack?: () => void; onConfirm: () => void; @@ -44,7 +44,7 @@ export default function CreateTransfer({ onConfirm, onBack }: Props): VNode { { + onCreate={(request: TalerMerchantApi.TemplateAddDetails) => { return createTemplate(request) .then(() => onConfirm()) .catch((error) => { diff --git a/packages/merchant-backoffice-ui/src/paths/instance/templates/list/ListPage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/templates/list/ListPage.tsx index c21f64776..84ff9e0f2 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/templates/list/ListPage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/templates/list/ListPage.tsx @@ -19,20 +19,19 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { h, VNode } from "preact"; -import { MerchantBackend } from "../../../../declaration.js"; -import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { CardTable } from "./Table.js"; export interface Props { - templates: MerchantBackend.Template.TemplateEntry[]; + templates: TalerMerchantApi.TemplateEntry[]; onLoadMoreBefore?: () => void; onLoadMoreAfter?: () => void; onCreate: () => void; - onDelete: (e: MerchantBackend.Template.TemplateEntry) => void; - onSelect: (e: MerchantBackend.Template.TemplateEntry) => void; - onNewOrder: (e: MerchantBackend.Template.TemplateEntry) => void; - onQR: (e: MerchantBackend.Template.TemplateEntry) => void; + onDelete: (e: TalerMerchantApi.TemplateEntry) => void; + onSelect: (e: TalerMerchantApi.TemplateEntry) => void; + onNewOrder: (e: TalerMerchantApi.TemplateEntry) => void; + onQR: (e: TalerMerchantApi.TemplateEntry) => void; } export function ListPage({ @@ -45,9 +44,7 @@ export function ListPage({ onLoadMoreBefore, onLoadMoreAfter, }: Props): VNode { - const form = { payto_uri: "" }; - const { i18n } = useTranslationContext(); return ( ({ diff --git a/packages/merchant-backoffice-ui/src/paths/instance/templates/list/Table.tsx b/packages/merchant-backoffice-ui/src/paths/instance/templates/list/Table.tsx index 00d7982aa..11caca970 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/templates/list/Table.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/templates/list/Table.tsx @@ -19,12 +19,12 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { h, VNode } from "preact"; import { StateUpdater, useState } from "preact/hooks"; -import { MerchantBackend } from "../../../../declaration.js"; -type Entity = MerchantBackend.Template.TemplateEntry; +type Entity = TalerMerchantApi.TemplateEntry; interface Props { templates: Entity[]; @@ -117,11 +117,6 @@ interface TableProps { onLoadMoreAfter?: () => void; } -function toggleSelected(id: T): (prev: T[]) => T[] { - return (prev: T[]): T[] => - prev.indexOf(id) == -1 ? [...prev, id] : prev.filter((e) => e != id); -} - function Table({ instances, onLoadMoreAfter, diff --git a/packages/merchant-backoffice-ui/src/paths/instance/templates/list/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/templates/list/index.tsx index 78f744b39..40ca6ac98 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/templates/list/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/templates/list/index.tsx @@ -19,29 +19,28 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { HttpStatusCode, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import { ErrorType, HttpError, useTranslationContext, } from "@gnu-taler/web-util/browser"; -import { Fragment, h, VNode } from "preact"; +import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../../components/exception/loading.js"; +import { JumpToElementById } from "../../../../components/form/JumpToElementById.js"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend } from "../../../../declaration.js"; +import { ConfirmModal } from "../../../../components/modal/index.js"; import { useInstanceTemplates, useTemplateAPI, } from "../../../../hooks/templates.js"; import { Notification } from "../../../../utils/types.js"; import { ListPage } from "./ListPage.js"; -import { HttpStatusCode, TranslatedString } from "@gnu-taler/taler-util"; -import { ConfirmModal } from "../../../../components/modal/index.js"; -import { JumpToElementById } from "../../../../components/form/JumpToElementById.js"; interface Props { onUnauthorized: () => VNode; - onLoadError: (error: HttpError) => VNode; + onLoadError: (error: HttpError) => VNode; onNotFound: () => VNode; onCreate: () => void; onSelect: (id: string) => void; @@ -64,7 +63,7 @@ export default function ListTemplates({ const { deleteTemplate, testTemplateExist } = useTemplateAPI(); const result = useInstanceTemplates({ position }, (id) => setPosition(id)); const [deleting, setDeleting] = - useState(null); + useState(null); if (result.loading) return ; if (!result.ok) { @@ -108,7 +107,7 @@ export default function ListTemplates({ onQR={(e) => { onQR(e.template_id); }} - onDelete={(e: MerchantBackend.Template.TemplateEntry) => { + onDelete={(e: TalerMerchantApi.TemplateEntry) => { setDeleting(e) } } diff --git a/packages/merchant-backoffice-ui/src/paths/instance/templates/qr/QrPage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/templates/qr/QrPage.tsx index 1aa5bc317..d48e5e956 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/templates/qr/QrPage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/templates/qr/QrPage.tsx @@ -19,7 +19,7 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { stringifyPayTemplateUri } from "@gnu-taler/taler-util"; +import { TalerMerchantApi, stringifyPayTemplateUri } from "@gnu-taler/taler-util"; import { useMerchantApiContext, useTranslationContext, @@ -34,12 +34,11 @@ import { import { Input } from "../../../../components/form/Input.js"; import { InputCurrency } from "../../../../components/form/InputCurrency.js"; import { useSessionContext } from "../../../../context/session.js"; -import { MerchantBackend } from "../../../../declaration.js"; -type Entity = MerchantBackend.Template.UsingTemplateDetails; +type Entity = TalerMerchantApi.UsingTemplateDetails; interface Props { - contract: MerchantBackend.Template.TemplateContractDetails; + contract: TalerMerchantApi.TemplateContractDetails; id: string; onBack?: () => void; } diff --git a/packages/merchant-backoffice-ui/src/paths/instance/templates/qr/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/templates/qr/index.tsx index 65ccc2dcc..37f0e5c74 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/templates/qr/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/templates/qr/index.tsx @@ -19,30 +19,27 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { HttpStatusCode, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import { ErrorType, - HttpError, - useTranslationContext, + HttpError } from "@gnu-taler/web-util/browser"; -import { Fragment, h, VNode } from "preact"; +import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../../components/exception/loading.js"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { - useTemplateAPI, - useTemplateDetails, + useTemplateDetails } from "../../../../hooks/templates.js"; import { Notification } from "../../../../utils/types.js"; import { QrPage } from "./QrPage.js"; -import { HttpStatusCode } from "@gnu-taler/taler-util"; -export type Entity = MerchantBackend.Transfers.TransferInformation; +export type Entity = TalerMerchantApi.TransferInformation; interface Props { onBack?: () => void; onUnauthorized: () => VNode; onNotFound: () => VNode; - onLoadError: (e: HttpError) => VNode; + onLoadError: (e: HttpError) => VNode; tid: string; } diff --git a/packages/merchant-backoffice-ui/src/paths/instance/templates/update/UpdatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/templates/update/UpdatePage.tsx index ae11ad991..f4092b61b 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/templates/update/UpdatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/templates/update/UpdatePage.tsx @@ -23,6 +23,7 @@ import { AmountString, Amounts, Duration, + TalerMerchantApi, assertUnreachable } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; @@ -40,7 +41,6 @@ import { InputNumber } from "../../../../components/form/InputNumber.js"; import { InputSearchOnList } from "../../../../components/form/InputSearchOnList.js"; import { InputTab } from "../../../../components/form/InputTab.js"; import { useSessionContext } from "../../../../context/session.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { useInstanceOtpDevices } from "../../../../hooks/otp.js"; enum Steps { @@ -60,9 +60,9 @@ type Entity = { }; interface Props { - onUpdate: (d: MerchantBackend.Template.TemplatePatchDetails) => Promise; + onUpdate: (d: TalerMerchantApi.TemplatePatchDetails) => Promise; onBack?: () => void; - template: MerchantBackend.Template.TemplateDetails; + template: TalerMerchantApi.TemplateDetails; } export function UpdatePage({ template, onUpdate, onBack }: Props): VNode { diff --git a/packages/merchant-backoffice-ui/src/paths/instance/templates/update/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/templates/update/index.tsx index 1975ed479..ba1939914 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/templates/update/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/templates/update/index.tsx @@ -19,32 +19,31 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { HttpStatusCode, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import { ErrorType, HttpError, useTranslationContext, } from "@gnu-taler/web-util/browser"; -import { Fragment, h, VNode } from "preact"; +import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../../components/exception/loading.js"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend, WithId } from "../../../../declaration.js"; import { useTemplateAPI, useTemplateDetails, } from "../../../../hooks/templates.js"; import { Notification } from "../../../../utils/types.js"; import { UpdatePage } from "./UpdatePage.js"; -import { HttpStatusCode } from "@gnu-taler/taler-util"; -export type Entity = MerchantBackend.Template.TemplatePatchDetails & WithId; +export type Entity = TalerMerchantApi.TemplatePatchDetails & WithId; interface Props { onBack?: () => void; onConfirm: () => void; onUnauthorized: () => VNode; onNotFound: () => VNode; - onLoadError: (e: HttpError) => VNode; + onLoadError: (e: HttpError) => VNode; tid: string; } export default function UpdateTemplate({ diff --git a/packages/merchant-backoffice-ui/src/paths/instance/templates/use/UsePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/templates/use/UsePage.tsx index 93f303537..58e63cc8e 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/templates/use/UsePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/templates/use/UsePage.tsx @@ -19,6 +19,7 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { h, VNode } from "preact"; import { useState } from "preact/hooks"; @@ -29,13 +30,12 @@ import { } from "../../../../components/form/FormProvider.js"; import { Input } from "../../../../components/form/Input.js"; import { InputCurrency } from "../../../../components/form/InputCurrency.js"; -import { MerchantBackend } from "../../../../declaration.js"; -type Entity = MerchantBackend.Template.UsingTemplateDetails; +type Entity = TalerMerchantApi.UsingTemplateDetails; interface Props { id: string; - template: MerchantBackend.Template.TemplateDetails; + template: TalerMerchantApi.TemplateDetails; onCreateOrder: (d: Entity) => Promise; onBack?: () => void; } diff --git a/packages/merchant-backoffice-ui/src/paths/instance/templates/use/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/templates/use/index.tsx index 441a5c5e0..64c38c86b 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/templates/use/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/templates/use/index.tsx @@ -19,31 +19,30 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { HttpStatusCode, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import { ErrorType, HttpError, useTranslationContext, } from "@gnu-taler/web-util/browser"; -import { Fragment, h, VNode } from "preact"; +import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../../components/exception/loading.js"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { useTemplateAPI, useTemplateDetails, } from "../../../../hooks/templates.js"; import { Notification } from "../../../../utils/types.js"; import { UsePage } from "./UsePage.js"; -import { HttpStatusCode } from "@gnu-taler/taler-util"; -export type Entity = MerchantBackend.Transfers.TransferInformation; +export type Entity = TalerMerchantApi.TransferInformation; interface Props { onBack?: () => void; onOrderCreated: (id: string) => void; onUnauthorized: () => VNode; onNotFound: () => VNode; - onLoadError: (e: HttpError) => VNode; + onLoadError: (e: HttpError) => VNode; tid: string; } @@ -83,7 +82,7 @@ export default function TemplateUsePage({ id={tid} onBack={onBack} onCreateOrder={( - request: MerchantBackend.Template.UsingTemplateDetails, + request: TalerMerchantApi.UsingTemplateDetails, ) => { return createOrderFromTemplate(tid, request) .then((res) => onOrderCreated(res.data.order_id)) diff --git a/packages/merchant-backoffice-ui/src/paths/instance/token/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/token/index.tsx index d7bf7a6d5..50e7d500d 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/token/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/token/index.tsx @@ -13,20 +13,19 @@ You should have received a copy of the GNU General Public License along with GNU Taler; see the file COPYING. If not, see */ -import { HttpStatusCode } from "@gnu-taler/taler-util"; +import { HttpStatusCode, TalerErrorDetail } from "@gnu-taler/taler-util"; import { ErrorType, HttpError, useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../components/exception/loading.js"; import { NotificationCard } from "../../../components/menu/index.js"; -import { MerchantBackend } from "../../../declaration.js"; import { useInstanceAPI, useInstanceDetails } from "../../../hooks/instance.js"; import { Notification } from "../../../utils/types.js"; import { DetailPage } from "./DetailPage.js"; interface Props { onUnauthorized: () => VNode; - onLoadError: (error: HttpError) => VNode; + onLoadError: (error: HttpError) => VNode; onChange: () => void; onNotFound: () => VNode; onCancel: () => void; @@ -60,7 +59,7 @@ export default function Token({ return onLoadError(result); } - const hasToken = result.data.auth.method === "token" + const hasToken = result.data.auth.type === "token" return ( diff --git a/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/CreatePage.tsx index 576c21cd2..91aabe58e 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/CreatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/CreatePage.tsx @@ -19,6 +19,7 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { AmountString, TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { VNode, h } from "preact"; import { useState } from "preact/hooks"; @@ -30,13 +31,12 @@ import { import { Input } from "../../../../components/form/Input.js"; import { InputCurrency } from "../../../../components/form/InputCurrency.js"; import { InputSelector } from "../../../../components/form/InputSelector.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { CROCKFORD_BASE32_REGEX, URL_REGEX, } from "../../../../utils/constants.js"; -type Entity = MerchantBackend.Transfers.TransferInformation; +type Entity = TalerMerchantApi.TransferInformation; interface Props { onCreate: (d: Entity) => Promise; @@ -51,7 +51,7 @@ export function CreatePage({ accounts, onCreate, onBack }: Props): VNode { wtid: "", // payto_uri: , // exchange_url: 'http://exchange.taler:8081/', - credit_amount: ``, + credit_amount: `` as AmountString, }); const errors: FormErrors = { diff --git a/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/index.tsx index 77a8c65fb..e640e47f6 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/index.tsx @@ -19,18 +19,17 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend } from "../../../../declaration.js"; -import { useInstanceDetails } from "../../../../hooks/instance.js"; +import { useInstanceBankAccounts } from "../../../../hooks/bank.js"; import { useTransferAPI } from "../../../../hooks/transfer.js"; import { Notification } from "../../../../utils/types.js"; import { CreatePage } from "./CreatePage.js"; -import { useBankAccountDetails, useInstanceBankAccounts } from "../../../../hooks/bank.js"; -export type Entity = MerchantBackend.Transfers.TransferInformation; +export type Entity = TalerMerchantApi.TransferInformation; interface Props { onBack?: () => void; onConfirm: () => void; @@ -51,7 +50,7 @@ export default function CreateTransfer({ onConfirm, onBack }: Props): VNode { { + onCreate={(request: TalerMerchantApi.TransferInformation) => { return informTransfer(request) .then(() => onConfirm()) .catch((error) => { diff --git a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/List.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/List.stories.tsx index ba22cb7d5..def03fe27 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/List.stories.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/List.stories.tsx @@ -19,7 +19,8 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { h, VNode, FunctionalComponent } from "preact"; +import { AmountString, PaytoString } from "@gnu-taler/taler-util"; +import { FunctionalComponent, h } from "preact"; import { ListPage as TestedComponent } from "./ListPage.js"; export default { @@ -50,8 +51,8 @@ export const Example = createExample(TestedComponent, { transfers: [ { exchange_url: "http://exchange.url/", - credit_amount: "TESTKUDOS:10", - payto_uri: "payto//x-taler-bank/bank:8080/account", + credit_amount: "TESTKUDOS:10" as AmountString, + payto_uri: "payto//x-taler-bank/bank:8080/account" as PaytoString, transfer_serial_id: 123123123, wtid: "!@KJELQKWEJ!L@K#!J@", confirmed: true, @@ -62,8 +63,8 @@ export const Example = createExample(TestedComponent, { }, { exchange_url: "http://exchange.url/", - credit_amount: "TESTKUDOS:10", - payto_uri: "payto//x-taler-bank/bank:8080/account", + credit_amount: "TESTKUDOS:10" as AmountString, + payto_uri: "payto//x-taler-bank/bank:8080/account" as PaytoString, transfer_serial_id: 123123123, wtid: "!@KJELQKWEJ!L@K#!J@", confirmed: true, @@ -74,8 +75,8 @@ export const Example = createExample(TestedComponent, { }, { exchange_url: "http://exchange.url/", - credit_amount: "TESTKUDOS:10", - payto_uri: "payto//x-taler-bank/bank:8080/account", + credit_amount: "TESTKUDOS:10" as AmountString, + payto_uri: "payto//x-taler-bank/bank:8080/account" as PaytoString, transfer_serial_id: 123123123, wtid: "!@KJELQKWEJ!L@K#!J@", confirmed: true, diff --git a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/ListPage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/ListPage.tsx index 794d37fe6..7b54dc5ed 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/ListPage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/ListPage.tsx @@ -23,11 +23,11 @@ import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { h, VNode } from "preact"; import { FormProvider } from "../../../../components/form/FormProvider.js"; import { InputSelector } from "../../../../components/form/InputSelector.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { CardTable } from "./Table.js"; +import { TalerMerchantApi } from "@gnu-taler/taler-util"; export interface Props { - transfers: MerchantBackend.Transfers.TransferDetails[]; + transfers: TalerMerchantApi.TransferDetails[]; onLoadMoreBefore?: () => void; onLoadMoreAfter?: () => void; onShowAll: () => void; diff --git a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/Table.tsx b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/Table.tsx index 3792db9b0..cf7ebe922 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/Table.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/Table.tsx @@ -19,14 +19,14 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { format } from "date-fns"; import { h, VNode } from "preact"; import { StateUpdater, useState } from "preact/hooks"; -import { MerchantBackend, WithId } from "../../../../declaration.js"; import { datetimeFormatForSettings, usePreference } from "../../../../hooks/preference.js"; -type Entity = MerchantBackend.Transfers.TransferDetails & WithId; +type Entity = TalerMerchantApi.TransferDetails & WithId; interface Props { transfers: Entity[]; @@ -108,11 +108,6 @@ interface TableProps { onLoadMoreAfter?: () => void; } -function toggleSelected(id: T): (prev: T[]) => T[] { - return (prev: T[]): T[] => - prev.indexOf(id) == -1 ? [...prev, id] : prev.filter((e) => e != id); -} - function Table({ instances, onLoadMoreAfter, diff --git a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/index.tsx index 1402df4c1..15706b4c5 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/index.tsx @@ -19,20 +19,18 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { HttpStatusCode, TalerErrorDetail } from "@gnu-taler/taler-util"; import { ErrorType, HttpError } from "@gnu-taler/web-util/browser"; -import { h, VNode } from "preact"; +import { VNode, h } from "preact"; import { useEffect, useState } from "preact/hooks"; import { Loading } from "../../../../components/exception/loading.js"; -import { MerchantBackend } from "../../../../declaration.js"; -import { useInstanceDetails } from "../../../../hooks/instance.js"; +import { useInstanceBankAccounts } from "../../../../hooks/bank.js"; import { useInstanceTransfers } from "../../../../hooks/transfer.js"; import { ListPage } from "./ListPage.js"; -import { HttpStatusCode } from "@gnu-taler/taler-util"; -import { useInstanceBankAccounts } from "../../../../hooks/bank.js"; interface Props { onUnauthorized: () => VNode; - onLoadError: (error: HttpError) => VNode; + onLoadError: (error: HttpError) => VNode; onNotFound: () => VNode; onCreate: () => void; } diff --git a/packages/merchant-backoffice-ui/src/paths/instance/update/Update.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/update/Update.stories.tsx index 2accb7685..5514b68d9 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/update/Update.stories.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/update/Update.stories.tsx @@ -19,7 +19,7 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { h, VNode, FunctionalComponent } from "preact"; +import { FunctionalComponent, h } from "preact"; import { UpdatePage as TestedComponent } from "./UpdatePage.js"; export default { @@ -43,7 +43,7 @@ function createExample( export const Example = createExample(TestedComponent, { selected: { name: "name", - auth: { method: "external" }, + auth: { type: "external" }, address: {}, user_type: "business", use_stefan: true, diff --git a/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx index f0f0bfac9..cde58967f 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx @@ -19,9 +19,9 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { Duration } from "@gnu-taler/taler-util"; +import { Duration, TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; -import { h, VNode } from "preact"; +import { VNode, h } from "preact"; import { useState } from "preact/hooks"; import { AsyncButton } from "../../../components/exception/AsyncButton.js"; import { @@ -29,25 +29,24 @@ import { FormProvider, } from "../../../components/form/FormProvider.js"; import { DefaultInstanceFormFields } from "../../../components/instance/DefaultInstanceFormFields.js"; -import { MerchantBackend } from "../../../declaration.js"; -import { undefinedIfEmpty } from "../../../utils/table.js"; import { useSessionContext } from "../../../context/session.js"; +import { undefinedIfEmpty } from "../../../utils/table.js"; -export type Entity = Omit, "default_wire_transfer_delay"> & { +export type Entity = Omit, "default_wire_transfer_delay"> & { default_pay_delay: Duration, default_wire_transfer_delay: Duration, }; -//MerchantBackend.Instances.InstanceAuthConfigurationMessage +//TalerMerchantApi.InstanceAuthConfigurationMessage interface Props { - onUpdate: (d: MerchantBackend.Instances.InstanceReconfigurationMessage) => void; - selected: MerchantBackend.Instances.QueryInstancesResponse; + onUpdate: (d: TalerMerchantApi.InstanceReconfigurationMessage) => void; + selected: TalerMerchantApi.QueryInstancesResponse; isLoading: boolean; onBack: () => void; } function convert( - from: MerchantBackend.Instances.QueryInstancesResponse, + from: TalerMerchantApi.QueryInstancesResponse, ): Entity { const { default_pay_delay, default_wire_transfer_delay, ...rest } = from; @@ -107,7 +106,7 @@ export function UpdatePage({ const submit = async (): Promise => { const { default_pay_delay, default_wire_transfer_delay, ...rest } = value as Required; - const result: MerchantBackend.Instances.InstanceReconfigurationMessage = { + const result: TalerMerchantApi.InstanceReconfigurationMessage = { default_pay_delay: Duration.toTalerProtocolDuration(default_pay_delay), default_wire_transfer_delay: Duration.toTalerProtocolDuration(default_wire_transfer_delay), ...rest, diff --git a/packages/merchant-backoffice-ui/src/paths/instance/update/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/update/index.tsx index de1371974..d28ca0555 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/update/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/update/index.tsx @@ -13,7 +13,7 @@ You should have received a copy of the GNU General Public License along with GNU Taler; see the file COPYING. If not, see */ -import { HttpStatusCode } from "@gnu-taler/taler-util"; +import { HttpStatusCode, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; import { ErrorType, HttpError, @@ -24,7 +24,6 @@ import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../components/exception/loading.js"; import { NotificationCard } from "../../../components/menu/index.js"; -import { MerchantBackend } from "../../../declaration.js"; import { useInstanceAPI, useInstanceDetails, @@ -40,8 +39,8 @@ export interface Props { onUnauthorized: () => VNode; onNotFound: () => VNode; - onLoadError: (e: HttpError) => VNode; - onUpdateError: (e: HttpError) => void; + onLoadError: (e: HttpError) => VNode; + onUpdateError: (e: HttpError) => void; } export default function Update(props: Props): VNode { @@ -67,8 +66,8 @@ function CommonUpdate( onUnauthorized, }: Props, result: HttpResponse< - MerchantBackend.Instances.QueryInstancesResponse, - MerchantBackend.ErrorDetail + TalerMerchantApi.QueryInstancesResponse, + TalerErrorDetail >, updateInstance: any, ): VNode { @@ -98,7 +97,7 @@ function CommonUpdate( isLoading={false} selected={result.data} onUpdate={( - d: MerchantBackend.Instances.InstanceReconfigurationMessage, + d: TalerMerchantApi.InstanceReconfigurationMessage, ): Promise => { return updateInstance(d) .then(onConfirm) diff --git a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/create/CreatePage.tsx index 83604711e..8792aabea 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/create/CreatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/create/CreatePage.tsx @@ -29,9 +29,9 @@ import { } from "../../../../components/form/FormProvider.js"; import { Input } from "../../../../components/form/Input.js"; import { InputSelector } from "../../../../components/form/InputSelector.js"; -import { MerchantBackend } from "../../../../declaration.js"; +import { TalerMerchantApi } from "@gnu-taler/taler-util"; -type Entity = MerchantBackend.Webhooks.WebhookAddDetails; +type Entity = TalerMerchantApi.WebhookAddDetails; interface Props { onCreate: (d: Entity) => Promise; diff --git a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/create/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/create/index.tsx index e1b8aa88e..42a432cf0 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/create/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/create/index.tsx @@ -23,12 +23,12 @@ import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { useWebhookAPI } from "../../../../hooks/webhooks.js"; import { Notification } from "../../../../utils/types.js"; import { CreatePage } from "./CreatePage.js"; +import { TalerMerchantApi } from "@gnu-taler/taler-util"; -export type Entity = MerchantBackend.Webhooks.WebhookAddDetails; +export type Entity = TalerMerchantApi.WebhookAddDetails; interface Props { onBack?: () => void; onConfirm: () => void; @@ -44,7 +44,7 @@ export default function CreateWebhook({ onConfirm, onBack }: Props): VNode { { + onCreate={(request: TalerMerchantApi.WebhookAddDetails) => { return createWebhook(request) .then(() => onConfirm()) .catch((error) => { diff --git a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/list/ListPage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/list/ListPage.tsx index be7c575a0..98bd61d8f 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/list/ListPage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/list/ListPage.tsx @@ -20,17 +20,17 @@ */ import { h, VNode } from "preact"; -import { MerchantBackend } from "../../../../declaration.js"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { CardTable } from "./Table.js"; +import { TalerMerchantApi } from "@gnu-taler/taler-util"; export interface Props { - webhooks: MerchantBackend.Webhooks.WebhookEntry[]; + webhooks: TalerMerchantApi.WebhookEntry[]; onLoadMoreBefore?: () => void; onLoadMoreAfter?: () => void; onCreate: () => void; - onDelete: (e: MerchantBackend.Webhooks.WebhookEntry) => void; - onSelect: (e: MerchantBackend.Webhooks.WebhookEntry) => void; + onDelete: (e: TalerMerchantApi.WebhookEntry) => void; + onSelect: (e: TalerMerchantApi.WebhookEntry) => void; } export function ListPage({ diff --git a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/list/Table.tsx b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/list/Table.tsx index debbd850b..2cafc7f9a 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/list/Table.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/list/Table.tsx @@ -19,12 +19,12 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { h, VNode } from "preact"; import { StateUpdater, useState } from "preact/hooks"; -import { MerchantBackend } from "../../../../declaration.js"; -type Entity = MerchantBackend.Webhooks.WebhookEntry; +type Entity = TalerMerchantApi.WebhookEntry; interface Props { webhooks: Entity[]; @@ -109,11 +109,6 @@ interface TableProps { onLoadMoreAfter?: () => void; } -function toggleSelected(id: T): (prev: T[]) => T[] { - return (prev: T[]): T[] => - prev.indexOf(id) == -1 ? [...prev, id] : prev.filter((e) => e != id); -} - function Table({ instances, onLoadMoreAfter, diff --git a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/list/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/list/index.tsx index c4b773669..17e767337 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/list/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/list/index.tsx @@ -28,18 +28,17 @@ import { Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../../components/exception/loading.js"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend } from "../../../../declaration.js"; import { useInstanceWebhooks, useWebhookAPI, } from "../../../../hooks/webhooks.js"; import { Notification } from "../../../../utils/types.js"; import { ListPage } from "./ListPage.js"; -import { HttpStatusCode } from "@gnu-taler/taler-util"; +import { HttpStatusCode, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; interface Props { onUnauthorized: () => VNode; - onLoadError: (error: HttpError) => VNode; + onLoadError: (error: HttpError) => VNode; onNotFound: () => VNode; onCreate: () => void; onSelect: (id: string) => void; @@ -87,7 +86,7 @@ export default function ListWebhooks({ onSelect={(e) => { onSelect(e.webhook_id); }} - onDelete={(e: MerchantBackend.Webhooks.WebhookEntry) => + onDelete={(e: TalerMerchantApi.WebhookEntry) => deleteWebhook(e.webhook_id) .then(() => setNotif({ diff --git a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/update/UpdatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/update/UpdatePage.tsx index be21629d5..6aca62582 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/update/UpdatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/update/UpdatePage.tsx @@ -28,9 +28,9 @@ import { FormProvider, } from "../../../../components/form/FormProvider.js"; import { Input } from "../../../../components/form/Input.js"; -import { MerchantBackend, WithId } from "../../../../declaration.js"; +import { TalerMerchantApi } from "@gnu-taler/taler-util"; -type Entity = MerchantBackend.Webhooks.WebhookPatchDetails & WithId; +type Entity = TalerMerchantApi.WebhookPatchDetails & WithId; interface Props { onUpdate: (d: Entity) => Promise; diff --git a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/update/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/update/index.tsx index 12374d82a..97b4f44ba 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/update/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/update/index.tsx @@ -28,23 +28,22 @@ import { Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; import { Loading } from "../../../../components/exception/loading.js"; import { NotificationCard } from "../../../../components/menu/index.js"; -import { MerchantBackend, WithId } from "../../../../declaration.js"; import { useWebhookAPI, useWebhookDetails, } from "../../../../hooks/webhooks.js"; import { Notification } from "../../../../utils/types.js"; import { UpdatePage } from "./UpdatePage.js"; -import { HttpStatusCode } from "@gnu-taler/taler-util"; +import { HttpStatusCode, TalerErrorDetail, TalerMerchantApi } from "@gnu-taler/taler-util"; -export type Entity = MerchantBackend.Webhooks.WebhookPatchDetails & WithId; +export type Entity = TalerMerchantApi.WebhookPatchDetails & WithId; interface Props { onBack?: () => void; onConfirm: () => void; onUnauthorized: () => VNode; onNotFound: () => VNode; - onLoadError: (e: HttpError) => VNode; + onLoadError: (e: HttpError) => VNode; tid: string; } export default function UpdateWebhook({ diff --git a/packages/merchant-backoffice-ui/src/paths/login/index.tsx b/packages/merchant-backoffice-ui/src/paths/login/index.tsx index 1c0b915bd..14322f079 100644 --- a/packages/merchant-backoffice-ui/src/paths/login/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/login/index.tsx @@ -20,9 +20,7 @@ */ import { - AccessToken, - HttpStatusCode, - TalerAuthentication, + HttpStatusCode } from "@gnu-taler/taler-util"; import { useMerchantApiContext, @@ -32,8 +30,7 @@ import { ComponentChildren, Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { NotificationCard } from "../../components/menu/index.js"; import { - DEFAULT_ADMIN_USERNAME, - useSessionContext, + useSessionContext } from "../../context/session.js"; import { Notification } from "../../utils/types.js"; diff --git a/packages/merchant-backoffice-ui/src/schemas/index.ts b/packages/merchant-backoffice-ui/src/schemas/index.ts index dc4517e16..693894ae0 100644 --- a/packages/merchant-backoffice-ui/src/schemas/index.ts +++ b/packages/merchant-backoffice-ui/src/schemas/index.ts @@ -19,10 +19,10 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { Amounts } from "@gnu-taler/taler-util"; import { isAfter, isFuture } from "date-fns"; import * as yup from "yup"; -import { AMOUNT_REGEX, PAYTO_REGEX } from "../utils/constants.js"; -import { Amounts } from "@gnu-taler/taler-util"; +import { PAYTO_REGEX } from "../utils/constants.js"; yup.setLocale({ mixed: { diff --git a/packages/merchant-backoffice-ui/src/utils/amount.ts b/packages/merchant-backoffice-ui/src/utils/amount.ts index fda997619..c94101b4b 100644 --- a/packages/merchant-backoffice-ui/src/utils/amount.ts +++ b/packages/merchant-backoffice-ui/src/utils/amount.ts @@ -17,8 +17,8 @@ import { amountFractionalBase, AmountJson, Amounts, + TalerMerchantApi, } from "@gnu-taler/taler-util"; -import { MerchantBackend } from "../declaration.js"; /** * merge refund with the same description and a difference less than one minute @@ -27,9 +27,9 @@ import { MerchantBackend } from "../declaration.js"; * @returns list with the new refund, may be merged with the last */ export function mergeRefunds( - prev: MerchantBackend.Orders.RefundDetails[], - cur: MerchantBackend.Orders.RefundDetails, -): MerchantBackend.Orders.RefundDetails[] { + prev: TalerMerchantApi.RefundDetails[], + cur: TalerMerchantApi.RefundDetails, +): TalerMerchantApi.RefundDetails[] { let tail; if ( diff --git a/packages/merchant-backoffice-ui/src/utils/table.ts b/packages/merchant-backoffice-ui/src/utils/table.ts index 306328aa1..982b68e5e 100644 --- a/packages/merchant-backoffice-ui/src/utils/table.ts +++ b/packages/merchant-backoffice-ui/src/utils/table.ts @@ -14,7 +14,6 @@ GNU Taler; see the file COPYING. If not, see */ -import { WithId } from "../declaration.js"; /** * diff --git a/packages/merchant-backoffice-ui/src/utils/types.ts b/packages/merchant-backoffice-ui/src/utils/types.ts index f96606a16..9ce6da4d1 100644 --- a/packages/merchant-backoffice-ui/src/utils/types.ts +++ b/packages/merchant-backoffice-ui/src/utils/types.ts @@ -23,7 +23,7 @@ export interface KeyValue { export interface Notification { message: string; description?: string | VNode; - details?: string | VNode; + details?: string | VNode | string; type: MessageType; } diff --git a/packages/taler-util/src/http-client/merchant.ts b/packages/taler-util/src/http-client/merchant.ts index 688e80c29..3a2b7117d 100644 --- a/packages/taler-util/src/http-client/merchant.ts +++ b/packages/taler-util/src/http-client/merchant.ts @@ -128,15 +128,12 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#post-[-instances-$INSTANCE]-orders-$ORDER_ID-claim */ - async claimOrder(token: AccessToken, orderId: string, body: TalerMerchantApi.ClaimRequest) { + async claimOrder(orderId: string, body: TalerMerchantApi.ClaimRequest) { const url = new URL(`orders/${orderId}/claim`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "POST", body, - headers: { - Authorization: makeBearerTokenAuthHeader(token), - } }); switch (resp.status) { @@ -341,6 +338,7 @@ export class TalerMerchantInstanceHttpClient { * https://docs.taler.net/core/api-merchant.html#post-[-instances-$INSTANCE]-private-auth */ async updateCurrentInstanceAuthentication( + token: AccessToken, body: TalerMerchantApi.InstanceAuthConfigurationMessage, ) { const url = new URL(`private/auth`, this.baseUrl); @@ -348,6 +346,9 @@ export class TalerMerchantInstanceHttpClient { const resp = await this.httpLib.fetch(url.href, { method: "POST", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); // @@ -365,6 +366,7 @@ export class TalerMerchantInstanceHttpClient { * https://docs.taler.net/core/api-merchant.html#patch-[-instances-$INSTANCE]-private */ async updateCurrentInstance( + token: AccessToken, body: TalerMerchantApi.InstanceReconfigurationMessage, ) { const url = new URL(`private`, this.baseUrl); @@ -372,6 +374,9 @@ export class TalerMerchantInstanceHttpClient { const resp = await this.httpLib.fetch(url.href, { method: "PATCH", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { case HttpStatusCode.Ok: @@ -387,11 +392,14 @@ export class TalerMerchantInstanceHttpClient { * https://docs.taler.net/core/api-merchant.html#get-[-instances-$INSTANCE]-private * */ - async getCurrentInstance() { + async getCurrentInstance(token: AccessToken) { const url = new URL(`private`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -405,7 +413,7 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#delete-[-instances-$INSTANCE]-private */ - async deleteCurrentInstance(params: { purge?: boolean }) { + async deleteCurrentInstance(token: AccessToken, params: { purge?: boolean }) { const url = new URL(`private`, this.baseUrl); if (params.purge) { @@ -414,6 +422,9 @@ export class TalerMerchantInstanceHttpClient { const resp = await this.httpLib.fetch(url.href, { method: "DELETE", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -434,6 +445,7 @@ export class TalerMerchantInstanceHttpClient { * https://docs.taler.net/core/api-merchant.html#get--instances-$INSTANCE-private-kyc */ async getCurrentIntanceKycStatus( + token: AccessToken, params: TalerMerchantApi.GetKycStatusRequestParams, ) { const url = new URL(`private/kyc`, this.baseUrl); @@ -450,6 +462,9 @@ export class TalerMerchantInstanceHttpClient { const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -475,12 +490,15 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#post-[-instances-$INSTANCE]-private-accounts */ - async addAccount(body: TalerMerchantApi.AccountAddDetails) { + async addAccount(token: AccessToken,body: TalerMerchantApi.AccountAddDetails) { const url = new URL(`private/accounts`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "POST", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -499,6 +517,7 @@ export class TalerMerchantInstanceHttpClient { * https://docs.taler.net/core/api-merchant.html#patch-[-instances-$INSTANCE]-private-accounts-$H_WIRE */ async updateAccount( + token: AccessToken, wireAccount: string, body: TalerMerchantApi.AccountPatchDetails, ) { @@ -507,6 +526,9 @@ export class TalerMerchantInstanceHttpClient { const resp = await this.httpLib.fetch(url.href, { method: "PATCH", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { case HttpStatusCode.NoContent: @@ -544,11 +566,14 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#get-[-instances-$INSTANCE]-private-accounts-$H_WIRE */ - async getAccount(wireAccount: string) { + async getAccount(token: AccessToken,wireAccount: string) { const url = new URL(`private/accounts/${wireAccount}`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + }, }); switch (resp.status) { @@ -564,11 +589,14 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#delete-[-instances-$INSTANCE]-private-accounts-$H_WIRE */ - async deleteAccount(wireAccount: string) { + async deleteAccount(token: AccessToken,wireAccount: string) { const url = new URL(`private/accounts/${wireAccount}`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "DELETE", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + }, }); switch (resp.status) { @@ -588,12 +616,15 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#post-[-instances-$INSTANCE]-private-products */ - async addProduct(body: TalerMerchantApi.ProductAddDetail) { + async addProduct(token: AccessToken,body: TalerMerchantApi.ProductAddDetail) { const url = new URL(`private/products`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "POST", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -610,6 +641,7 @@ export class TalerMerchantInstanceHttpClient { * https://docs.taler.net/core/api-merchant.html#patch-[-instances-$INSTANCE]-private-products-$PRODUCT_ID */ async updateProduct( + token: AccessToken, productId: string, body: TalerMerchantApi.ProductAddDetail, ) { @@ -618,6 +650,9 @@ export class TalerMerchantInstanceHttpClient { const resp = await this.httpLib.fetch(url.href, { method: "PATCH", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -635,13 +670,16 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#get-[-instances-$INSTANCE]-private-products */ - async listProducts(params?: PaginationParams) { + async listProducts(token: AccessToken,params?: PaginationParams) { const url = new URL(`private/products`, this.baseUrl); addMerchantPaginationParams(url, params); const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -657,11 +695,14 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#get-[-instances-$INSTANCE]-private-products-$PRODUCT_ID */ - async getProduct(productId: string) { + async getProduct(token: AccessToken,productId: string) { const url = new URL(`private/products/${productId}`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -677,11 +718,15 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#reserving-inventory */ - async lockProduct(productId: string) { + async lockProduct(token: AccessToken, productId: string, body: TalerMerchantApi.LockRequest) { const url = new URL(`private/products/${productId}/lock`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "POST", + body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -699,11 +744,14 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#removing-products-from-inventory */ - async removeProduct(productId: string) { + async removeProduct(token: AccessToken,productId: string) { const url = new URL(`private/products/${productId}`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "DELETE", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -725,12 +773,15 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#post-[-instances-$INSTANCE]-private-orders */ - async createOrder(body: TalerMerchantApi.PostOrderRequest) { + async createOrder(token: AccessToken,body: TalerMerchantApi.PostOrderRequest) { const url = new URL(`private/orders`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "POST", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); return this.procesOrderCreationResponse(resp) } @@ -759,7 +810,7 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#inspecting-orders */ - async listOrders(params: TalerMerchantApi.ListOrdersRequestParams = {}) { + async listOrders(token: AccessToken,params: TalerMerchantApi.ListOrdersRequestParams = {}) { const url = new URL(`private/orders`, this.baseUrl); if (params.date) { @@ -787,6 +838,9 @@ export class TalerMerchantInstanceHttpClient { const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -801,6 +855,7 @@ export class TalerMerchantInstanceHttpClient { * https://docs.taler.net/core/api-merchant.html#get-[-instances-$INSTANCE]-private-orders-$ORDER_ID */ async getOrder( + token: AccessToken, orderId: string, params: TalerMerchantApi.GetOrderRequestParams = {}, ) { @@ -818,6 +873,9 @@ export class TalerMerchantInstanceHttpClient { const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -844,12 +902,15 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#private-order-data-cleanup */ - async forgetOrder(orderId: string, body: TalerMerchantApi.ForgetRequest) { + async forgetOrder(token: AccessToken,orderId: string, body: TalerMerchantApi.ForgetRequest) { const url = new URL(`private/orders/${orderId}/forget`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "PATCH", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -871,11 +932,14 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#delete-[-instances-$INSTANCE]-private-orders-$ORDER_ID */ - async deleteOrder(orderId: string) { + async deleteOrder(token: AccessToken,orderId: string) { const url = new URL(`private/orders/${orderId}`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "DELETE", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -897,12 +961,15 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#post-[-instances-$INSTANCE]-private-orders-$ORDER_ID-refund */ - async addRefund(orderId: string, body: TalerMerchantApi.RefundRequest) { + async addRefund(token: AccessToken,orderId: string, body: TalerMerchantApi.RefundRequest) { const url = new URL(`private/orders/${orderId}/refund`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "POST", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -928,12 +995,15 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#post-[-instances-$INSTANCE]-private-transfers */ - async informWireTransfer(body: TalerMerchantApi.TransferInformation) { + async informWireTransfer(token: AccessToken,body: TalerMerchantApi.TransferInformation) { const url = new URL(`private/transfers`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "POST", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -952,6 +1022,7 @@ export class TalerMerchantInstanceHttpClient { * https://docs.taler.net/core/api-merchant.html#get-[-instances-$INSTANCE]-private-transfers */ async listWireTransfers( + token: AccessToken, params: TalerMerchantApi.ListWireTransferRequestParams = {}, ) { const url = new URL(`private/transfers`, this.baseUrl); @@ -972,6 +1043,9 @@ export class TalerMerchantInstanceHttpClient { const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -985,11 +1059,14 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#delete-[-instances-$INSTANCE]-private-transfers-$TID */ - async deleteWireTransfer(transferId: string) { + async deleteWireTransfer(token: AccessToken,transferId: string) { const url = new URL(`private/transfers/${transferId}`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "DELETE", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -1011,12 +1088,15 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#post-[-instances-$INSTANCE]-private-otp-devices */ - async addOtpDevice(body: TalerMerchantApi.OtpDeviceAddDetails) { + async addOtpDevice(token: AccessToken,body: TalerMerchantApi.OtpDeviceAddDetails) { const url = new URL(`private/otp-devices`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "POST", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -1033,6 +1113,7 @@ export class TalerMerchantInstanceHttpClient { * https://docs.taler.net/core/api-merchant.html#patch-[-instances-$INSTANCE]-private-otp-devices-$DEVICE_ID */ async updateOtpDevice( + token: AccessToken, deviceId: string, body: TalerMerchantApi.OtpDevicePatchDetails, ) { @@ -1041,6 +1122,9 @@ export class TalerMerchantInstanceHttpClient { const resp = await this.httpLib.fetch(url.href, { method: "PATCH", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { case HttpStatusCode.NoContent: @@ -1057,11 +1141,14 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#get-[-instances-$INSTANCE]-private-otp-devices */ - async listOtpDevices() { + async listOtpDevices(token: AccessToken,) { const url = new URL(`private/otp-devices`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { case HttpStatusCode.Ok: @@ -1077,6 +1164,7 @@ export class TalerMerchantInstanceHttpClient { * https://docs.taler.net/core/api-merchant.html#get-[-instances-$INSTANCE]-private-otp-devices-$DEVICE_ID */ async getOtpDevice( + token: AccessToken, deviceId: string, params: TalerMerchantApi.GetOtpDeviceRequestParams = {}, ) { @@ -1090,6 +1178,9 @@ export class TalerMerchantInstanceHttpClient { } const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -1105,11 +1196,14 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#delete-[-instances-$INSTANCE]-private-otp-devices-$DEVICE_ID */ - async deleteOtpDevice(deviceId: string) { + async deleteOtpDevice(token: AccessToken,deviceId: string) { const url = new URL(`private/otp-devices/${deviceId}`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "DELETE", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { case HttpStatusCode.NoContent: @@ -1128,12 +1222,15 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#post-[-instances-$INSTANCE]-private-templates */ - async addTemplate(body: TalerMerchantApi.TemplateAddDetails) { + async addTemplate(token: AccessToken,body: TalerMerchantApi.TemplateAddDetails) { const url = new URL(`private/templates`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "POST", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { case HttpStatusCode.NoContent: @@ -1149,6 +1246,7 @@ export class TalerMerchantInstanceHttpClient { * https://docs.taler.net/core/api-merchant.html#patch-[-instances-$INSTANCE]-private-templates-$TEMPLATE_ID */ async updateTemplate( + token: AccessToken, templateId: string, body: TalerMerchantApi.TemplatePatchDetails, ) { @@ -1157,6 +1255,9 @@ export class TalerMerchantInstanceHttpClient { const resp = await this.httpLib.fetch(url.href, { method: "PATCH", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { case HttpStatusCode.NoContent: @@ -1173,11 +1274,14 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#inspecting-template */ - async listTemplates() { + async listTemplates(token: AccessToken,) { const url = new URL(`private/templates`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { case HttpStatusCode.Ok: @@ -1192,11 +1296,14 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#get-[-instances-$INSTANCE]-private-templates-$TEMPLATE_ID */ - async getTemplate(templateId: string) { + async getTemplate(token: AccessToken,templateId: string) { const url = new URL(`private/templates/${templateId}`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { case HttpStatusCode.Ok: @@ -1211,11 +1318,14 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#delete-[-instances-$INSTANCE]-private-templates-$TEMPLATE_ID */ - async deleteTemplate(templateId: string) { + async deleteTemplate(token: AccessToken,templateId: string) { const url = new URL(`private/templates/${templateId}`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "DELETE", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { case HttpStatusCode.NoContent: @@ -1270,12 +1380,15 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#post-[-instances-$INSTANCES]-private-webhooks */ - async addWebhook(body: TalerMerchantApi.WebhookAddDetails) { + async addWebhook(token: AccessToken,body: TalerMerchantApi.WebhookAddDetails) { const url = new URL(`private/webhooks`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "POST", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -1292,6 +1405,7 @@ export class TalerMerchantInstanceHttpClient { * https://docs.taler.net/core/api-merchant.html#patch-[-instances-$INSTANCES]-private-webhooks-$WEBHOOK_ID */ async updateWebhook( + token: AccessToken, webhookId: string, body: TalerMerchantApi.WebhookPatchDetails, ) { @@ -1300,6 +1414,9 @@ export class TalerMerchantInstanceHttpClient { const resp = await this.httpLib.fetch(url.href, { method: "PATCH", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -1317,11 +1434,14 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#get-[-instances-$INSTANCES]-private-webhooks */ - async listWebhooks() { + async listWebhooks(token: AccessToken,) { const url = new URL(`private/webhooks`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -1337,11 +1457,14 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#get-[-instances-$INSTANCES]-private-webhooks-$WEBHOOK_ID */ - async getWebhook(webhookId: string) { + async getWebhook(token: AccessToken,webhookId: string) { const url = new URL(`private/webhooks/${webhookId}`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { case HttpStatusCode.NoContent: @@ -1356,11 +1479,14 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#delete-[-instances-$INSTANCES]-private-webhooks-$WEBHOOK_ID */ - async removeWebhook(webhookId: string) { + async removeWebhook(token: AccessToken,webhookId: string) { const url = new URL(`private/webhooks/${webhookId}`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "DELETE", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { case HttpStatusCode.NoContent: @@ -1379,12 +1505,15 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#post-[-instances-$INSTANCES]-private-tokenfamilies */ - async createTokenFamily(body: TalerMerchantApi.TokenFamilyCreateRequest) { + async createTokenFamily(token: AccessToken,body: TalerMerchantApi.TokenFamilyCreateRequest) { const url = new URL(`private/tokenfamilies`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "POST", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -1401,6 +1530,7 @@ export class TalerMerchantInstanceHttpClient { * https://docs.taler.net/core/api-merchant.html#patch-[-instances-$INSTANCES]-private-tokenfamilies-$TOKEN_FAMILY_SLUG */ async updateTokenFamily( + token: AccessToken, tokenSlug: string, body: TalerMerchantApi.TokenFamilyUpdateRequest, ) { @@ -1409,6 +1539,9 @@ export class TalerMerchantInstanceHttpClient { const resp = await this.httpLib.fetch(url.href, { method: "POST", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { case HttpStatusCode.Ok: @@ -1423,11 +1556,14 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#get-[-instances-$INSTANCES]-private-tokenfamilies */ - async listTokenFamilies() { + async listTokenFamilies(token: AccessToken,) { const url = new URL(`private/tokenfamilies`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -1443,11 +1579,14 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#get-[-instances-$INSTANCES]-private-tokenfamilies-$TOKEN_FAMILY_SLUG */ - async getTokenFamily(tokenSlug: string) { + async getTokenFamily(token: AccessToken,tokenSlug: string) { const url = new URL(`private/tokenfamilies/${tokenSlug}`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -1463,11 +1602,14 @@ export class TalerMerchantInstanceHttpClient { /** * https://docs.taler.net/core/api-merchant.html#delete-[-instances-$INSTANCES]-private-tokenfamilies-$TOKEN_FAMILY_SLUG */ - async deleteTokenFamily(tokenSlug: string) { + async deleteTokenFamily(token: AccessToken,tokenSlug: string) { const url = new URL(`private/tokenfamilies/${tokenSlug}`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "DELETE", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { case HttpStatusCode.NoContent: @@ -1514,12 +1656,15 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp /** * https://docs.taler.net/core/api-merchant.html#post--management-instances */ - async createInstance(body: TalerMerchantApi.InstanceConfigurationMessage) { + async createInstance(token: AccessToken,body: TalerMerchantApi.InstanceConfigurationMessage) { const url = new URL(`management/instances`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "POST", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); @@ -1539,6 +1684,7 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp * https://docs.taler.net/core/api-merchant.html#post--management-instances-$INSTANCE-auth */ async updateInstanceAuthentication( + token: AccessToken, body: TalerMerchantApi.InstanceAuthConfigurationMessage, ) { const url = new URL(`management/instances`, this.baseUrl); @@ -1546,6 +1692,9 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp const resp = await this.httpLib.fetch(url.href, { method: "POST", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -1562,6 +1711,7 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp * https://docs.taler.net/core/api-merchant.html#patch--management-instances-$INSTANCE */ async updateInstance( + token: AccessToken, instanceId: string, body: TalerMerchantApi.InstanceReconfigurationMessage, ) { @@ -1570,6 +1720,9 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp const resp = await this.httpLib.fetch(url.href, { method: "PATCH", body, + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { case HttpStatusCode.NoContent: @@ -1584,11 +1737,14 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp /** * https://docs.taler.net/core/api-merchant.html#get--management-instances */ - async listInstances() { + async listInstances(token: AccessToken,) { const url = new URL(`management/instances`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -1603,11 +1759,14 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp * https://docs.taler.net/core/api-merchant.html#get--management-instances-$INSTANCE * */ - async getInstance(instanceId: string) { + async getInstance(token: AccessToken,instanceId: string) { const url = new URL(`management/instances/${instanceId}`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { @@ -1621,7 +1780,7 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp /** * https://docs.taler.net/core/api-merchant.html#delete--management-instances-$INSTANCE */ - async deleteInstance(instanceId: string, params: { purge?: boolean } = {}) { + async deleteInstance(token: AccessToken,instanceId: string, params: { purge?: boolean } = {}) { const url = new URL(`management/instances/${instanceId}`, this.baseUrl); if (params.purge) { @@ -1630,6 +1789,9 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp const resp = await this.httpLib.fetch(url.href, { method: "DELETE", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { case HttpStatusCode.NoContent: @@ -1649,6 +1811,7 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp * https://docs.taler.net/core/api-merchant.html#get--management-instances-$INSTANCE-kyc */ async getIntanceKycStatus( + token: AccessToken, instanceId: string, params: TalerMerchantApi.GetKycStatusRequestParams, ) { @@ -1666,6 +1829,9 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp const resp = await this.httpLib.fetch(url.href, { method: "GET", + headers: { + Authorization: makeBearerTokenAuthHeader(token), + } }); switch (resp.status) { case HttpStatusCode.Accepted: diff --git a/packages/taler-util/src/http-client/types.ts b/packages/taler-util/src/http-client/types.ts index 7f97f9ff1..8578eecd4 100644 --- a/packages/taler-util/src/http-client/types.ts +++ b/packages/taler-util/src/http-client/types.ts @@ -3933,7 +3933,7 @@ export namespace TalerMerchantApi { // Minimum age buyer must have (in years). minimum_age?: Integer; } - interface LockRequest { + export interface LockRequest { // UUID that identifies the frontend performing the lock // Must be unique for the lifetime of the lock. lock_uuid: string; @@ -3973,7 +3973,7 @@ export namespace TalerMerchantApi { // be used in case different UUIDs were used for different // products (i.e. in case the user started with multiple // shopping sessions that were combined during checkout). - lock_uuids: string[]; + lock_uuids?: string[]; // Should a token for claiming the order be generated? // False can make sense if the ORDER_ID is sufficiently @@ -5005,7 +5005,7 @@ export namespace TalerMerchantApi { } // Delivery location, loosely modeled as a subset of // ISO20022's PostalAddress25. - interface Location { + export interface Location { // Nation with its own government. country?: string; -- cgit v1.2.3