From c59f9a2556731ad95ab8bd7eefe7fa8a41629834 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 20 Dec 2022 17:45:24 -0300 Subject: use translation context from web-utils, don't use match react-router since is broken --- packages/merchant-backoffice-ui/build.mjs | 3 +- packages/merchant-backoffice-ui/package.json | 24 +-- .../merchant-backoffice-ui/src/Application.tsx | 23 ++- .../src/ApplicationReadyRoutes.tsx | 32 +-- .../merchant-backoffice-ui/src/InstanceRoutes.tsx | 58 +++--- .../src/components/exception/AsyncButton.tsx | 6 +- .../src/components/exception/login.tsx | 12 +- .../src/components/form/InputArray.tsx | 10 +- .../src/components/form/InputCurrency.tsx | 9 +- .../src/components/form/InputDate.tsx | 14 +- .../src/components/form/InputDuration.tsx | 28 +-- .../src/components/form/InputImage.tsx | 10 +- .../src/components/form/InputLocation.tsx | 27 +-- .../src/components/form/InputPaytoForm.tsx | 98 +++++----- .../src/components/form/InputSearchProduct.tsx | 18 +- .../src/components/form/InputSecured.tsx | 17 +- .../src/components/form/InputStock.tsx | 46 ++--- .../src/components/form/InputTaxes.tsx | 25 +-- .../instance/DefaultInstanceFormFields.tsx | 56 +++--- .../src/components/menu/LangSelector.tsx | 4 +- .../src/components/menu/SideBar.tsx | 28 ++- .../src/components/menu/index.tsx | 99 +++++----- .../src/components/modal/index.tsx | 96 ++++----- .../src/components/picker/DurationPicker.tsx | 12 +- .../components/product/InventoryProductForm.tsx | 26 +-- .../components/product/NonInventoryProductForm.tsx | 44 ++--- .../src/components/product/ProductForm.tsx | 38 ++-- .../src/components/product/ProductList.tsx | 13 +- .../merchant-backoffice-ui/src/context/fetch.ts | 2 +- .../merchant-backoffice-ui/src/context/listener.ts | 35 ---- .../src/context/translation.ts | 66 ------- packages/merchant-backoffice-ui/src/i18n/index.tsx | 215 --------------------- .../src/paths/admin/create/Create.stories.tsx | 12 +- .../src/paths/admin/create/CreatePage.tsx | 53 ++--- .../src/paths/admin/create/index.tsx | 6 +- .../src/paths/admin/create/stories.ts | 48 ----- .../src/paths/admin/create/stories.tsx | 52 +++++ .../src/paths/admin/list/TableActive.tsx | 29 +-- .../src/paths/admin/list/View.tsx | 18 +- .../src/paths/admin/list/index.tsx | 12 +- .../src/paths/instance/details/DetailPage.tsx | 8 +- .../src/paths/instance/details/stories.tsx | 17 +- .../src/paths/instance/index.stories.ts | 1 - .../src/paths/instance/kyc/list/ListPage.tsx | 25 +-- .../paths/instance/orders/create/CreatePage.tsx | 132 ++++++------- .../orders/create/OrderCreatedSuccessfully.tsx | 12 +- .../paths/instance/orders/details/DetailPage.tsx | 151 ++++++++------- .../src/paths/instance/orders/details/index.tsx | 10 +- .../src/paths/instance/orders/list/ListPage.tsx | 33 ++-- .../src/paths/instance/orders/list/Table.tsx | 68 ++++--- .../src/paths/instance/orders/list/index.tsx | 20 +- .../paths/instance/products/create/CreatePage.tsx | 10 +- .../src/paths/instance/products/create/index.tsx | 6 +- .../src/paths/instance/products/list/Table.tsx | 79 ++++---- .../src/paths/instance/products/list/index.tsx | 12 +- .../paths/instance/products/update/UpdatePage.tsx | 14 +- .../src/paths/instance/products/update/index.tsx | 6 +- .../paths/instance/reserves/create/CreatePage.tsx | 55 +++--- .../reserves/create/CreatedSuccessfully.tsx | 14 +- .../src/paths/instance/reserves/create/index.tsx | 6 +- .../paths/instance/reserves/details/DetailPage.tsx | 53 ++--- .../instance/reserves/list/AutorizeTipModal.tsx | 18 +- .../src/paths/instance/reserves/list/Table.tsx | 44 +++-- .../src/paths/instance/reserves/list/index.tsx | 8 +- .../paths/instance/templates/create/CreatePage.tsx | 44 ++--- .../src/paths/instance/templates/create/index.tsx | 8 +- .../src/paths/instance/templates/list/ListPage.tsx | 4 +- .../src/paths/instance/templates/list/Table.tsx | 32 +-- .../src/paths/instance/templates/list/index.tsx | 8 +- .../paths/instance/templates/update/UpdatePage.tsx | 44 ++--- .../src/paths/instance/templates/update/index.tsx | 7 +- .../paths/instance/transfers/create/CreatePage.tsx | 42 ++-- .../src/paths/instance/transfers/create/index.tsx | 6 +- .../src/paths/instance/transfers/list/ListPage.tsx | 22 +-- .../src/paths/instance/transfers/list/Table.tsx | 50 ++--- .../src/paths/instance/update/UpdatePage.tsx | 53 ++--- .../src/paths/instance/update/index.tsx | 6 +- .../merchant-backoffice-ui/src/stories.test.ts | 13 +- .../tests/functions/regex.test.ts | 32 +-- .../merchant-backoffice-ui/tests/header.test.tsx | 18 +- packages/web-util/src/tests/hook.ts | 2 + 81 files changed, 1191 insertions(+), 1426 deletions(-) delete mode 100644 packages/merchant-backoffice-ui/src/context/listener.ts delete mode 100644 packages/merchant-backoffice-ui/src/context/translation.ts delete mode 100644 packages/merchant-backoffice-ui/src/i18n/index.tsx delete mode 100644 packages/merchant-backoffice-ui/src/paths/admin/create/stories.ts create mode 100644 packages/merchant-backoffice-ui/src/paths/admin/create/stories.tsx (limited to 'packages') diff --git a/packages/merchant-backoffice-ui/build.mjs b/packages/merchant-backoffice-ui/build.mjs index 611ef7044..4097e4e9a 100755 --- a/packages/merchant-backoffice-ui/build.mjs +++ b/packages/merchant-backoffice-ui/build.mjs @@ -64,8 +64,7 @@ function getFilesInDirectory(startPath, regex) { return result } -const allTestFiles = getFilesInDirectory(path.join(BASE, 'tests'), /.test.tsx?$/) - +const allTestFiles = getFilesInDirectory(path.join(BASE, 'src'), /.test.tsx?$/) const entryPoints = ["src/index.tsx", "src/stories.tsx", ...allTestFiles]; let GIT_ROOT = BASE; diff --git a/packages/merchant-backoffice-ui/package.json b/packages/merchant-backoffice-ui/package.json index 085f92d76..ca8923e05 100644 --- a/packages/merchant-backoffice-ui/package.json +++ b/packages/merchant-backoffice-ui/package.json @@ -3,12 +3,13 @@ "name": "@gnu-taler/merchant-backoffice", "version": "0.0.4", "license": "MIT", + "type": "module", "scripts": { "build": "./build.mjs", "check": "tsc", "compile": "tsc && ./build.mjs", "dev": "preact watch --port ${PORT:=8080} --no-sw --no-esm", - "test": "pnpm compile && mocha --require source-map-support/register '*.test.js' 'dist/**/test.js'", + "test": "pnpm compile && mocha --require source-map-support/register 'dist/**/*.test.js' 'dist/**/test.js'", "lint": "eslint 'src/**/*.{js,jsx,ts,tsx}'", "i18n:extract": "pogen extract", "i18n:merge": "pogen merge", @@ -38,7 +39,7 @@ "date-fns": "2.29.3", "history": "4.10.1", "jed": "1.1.1", - "preact": "10.6.5", + "preact": "10.11.3", "preact-router": "3.2.1", "qrcode-generator": "1.4.4", "swr": "1.3.0", @@ -79,22 +80,5 @@ "sass": "1.56.1", "typedoc": "^0.20.36", "typescript": "4.8.4" - }, - "jest": { - "preset": "jest-preset-preact", - "transformIgnorePatterns": [ - "node_modules/.pnpm/(?!(@gnu-taler\\+taler-util))", - "\\.pnp\\.[^\\/]+$" - ], - "setupFiles": [ - "/tests/__mocks__/browserMocks.ts", - "/tests/__mocks__/setupTests.ts" - ], - "moduleNameMapper": { - "\\.(css|less)$": "identity-obj-proxy" - }, - "transform": { - "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|po)$": "/tests/__mocks__/fileTransformer.js" - } } -} +} \ No newline at end of file diff --git a/packages/merchant-backoffice-ui/src/Application.tsx b/packages/merchant-backoffice-ui/src/Application.tsx index 0b92375c1..84536396d 100644 --- a/packages/merchant-backoffice-ui/src/Application.tsx +++ b/packages/merchant-backoffice-ui/src/Application.tsx @@ -19,6 +19,10 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { + TranslationProvider, + useTranslationContext, +} from "@gnu-taler/web-util/lib/index.browser"; import { h, VNode } from "preact"; import { route } from "preact-router"; import { useMemo } from "preact/hooks"; @@ -33,16 +37,15 @@ import { useBackendContext, } from "./context/backend.js"; import { ConfigContextProvider } from "./context/config.js"; -import { TranslationProvider } from "./context/translation.js"; import { useBackendConfig } from "./hooks/backend.js"; -import { useTranslator } from "./i18n/index.js"; +import { strings } from "./i18n/strings.js"; import LoginPage from "./paths/login/index.js"; export function Application(): VNode { return ( // - + @@ -53,7 +56,7 @@ export function Application(): VNode { function ApplicationStatusRoutes(): VNode { const { updateLoginStatus, triedToLog } = useBackendContext(); const result = useBackendConfig(); - const i18n = useTranslator(); + const { i18n } = useTranslationContext(); const updateLoginInfoAndGoToRoot = (url: string, token?: string) => { updateLoginStatus(url, token); @@ -88,7 +91,7 @@ function ApplicationStatusRoutes(): VNode { @@ -120,9 +123,9 @@ function ApplicationStatusRoutes(): VNode { @@ -130,7 +133,7 @@ function ApplicationStatusRoutes(): VNode { ); return ( -
+
diff --git a/packages/merchant-backoffice-ui/src/ApplicationReadyRoutes.tsx b/packages/merchant-backoffice-ui/src/ApplicationReadyRoutes.tsx index fe4493bff..4390ef877 100644 --- a/packages/merchant-backoffice-ui/src/ApplicationReadyRoutes.tsx +++ b/packages/merchant-backoffice-ui/src/ApplicationReadyRoutes.tsx @@ -18,23 +18,23 @@ * * @author Sebastian Javier Marchano (sebasjm) */ +import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser"; +import { createHashHistory } from "history"; import { Fragment, h, VNode } from "preact"; import Router, { Route, route } from "preact-router"; +import { useState } from "preact/hooks"; +import { + NotificationCard, + NotYetReadyAppMenu, +} from "./components/menu/index.js"; import { useBackendContext } from "./context/backend.js"; import { useBackendInstancesTestForAdmin } from "./hooks/backend.js"; import { InstanceRoutes } from "./InstanceRoutes.js"; import LoginPage from "./paths/login/index.js"; import { INSTANCE_ID_LOOKUP } from "./utils/constants.js"; -import { - NotYetReadyAppMenu, - NotificationCard, -} from "./components/menu/index.js"; -import { useTranslator } from "./i18n/index.js"; -import { createHashHistory } from "history"; -import { useState } from "preact/hooks"; export function ApplicationReadyRoutes(): VNode { - const i18n = useTranslator(); + const { i18n } = useTranslationContext(); const { url: backendURL, updateLoginStatus, @@ -54,8 +54,8 @@ export function ApplicationReadyRoutes(): VNode { @@ -81,8 +81,8 @@ export function ApplicationReadyRoutes(): VNode { @@ -108,7 +108,12 @@ export function ApplicationReadyRoutes(): VNode { ); } -function DefaultMainRoute({ instance, admin, instanceNameByBackendURL }: any) { +function DefaultMainRoute({ + instance, + admin, + instanceNameByBackendURL, + url, //from preact-router +}: any): VNode { const [instanceName, setInstanceName] = useState( instanceNameByBackendURL || instance || "default", ); @@ -116,6 +121,7 @@ function DefaultMainRoute({ instance, admin, instanceNameByBackendURL }: any) { return ( diff --git a/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx b/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx index 817de5f7b..8ac5c698b 100644 --- a/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx +++ b/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx @@ -19,6 +19,8 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser"; +import { format } from "date-fns"; import { Fragment, FunctionComponent, h, VNode } from "preact"; import { Route, route, Router } from "preact-router"; import { useCallback, useEffect, useMemo, useState } from "preact/hooks"; @@ -26,39 +28,37 @@ import { Loading } from "./components/exception/loading.js"; import { Menu, NotificationCard } from "./components/menu/index.js"; import { useBackendContext } from "./context/backend.js"; import { InstanceContextProvider } from "./context/instance.js"; +import { HttpError } from "./hooks/backend.js"; import { useBackendDefaultToken, useBackendInstanceToken, useLocalStorage, } from "./hooks/index.js"; -import { HttpError } from "./hooks/backend.js"; -import { Translate, useTranslator } from "./i18n/index.js"; +import { useInstanceKYCDetails } from "./hooks/instance.js"; import InstanceCreatePage from "./paths/admin/create/index.js"; import InstanceListPage from "./paths/admin/list/index.js"; +import ListKYCPage from "./paths/instance/kyc/list/index.js"; import OrderCreatePage from "./paths/instance/orders/create/index.js"; import OrderDetailsPage from "./paths/instance/orders/details/index.js"; import OrderListPage from "./paths/instance/orders/list/index.js"; import ProductCreatePage from "./paths/instance/products/create/index.js"; import ProductListPage from "./paths/instance/products/list/index.js"; import ProductUpdatePage from "./paths/instance/products/update/index.js"; -import TransferListPage from "./paths/instance/transfers/list/index.js"; -import TransferCreatePage from "./paths/instance/transfers/create/index.js"; -import TemplateListPage from "./paths/instance/templates/list/index.js"; -import TemplateUpdatePage from "./paths/instance/templates/update/index.js"; -import TemplateCreatePage from "./paths/instance/templates/create/index.js"; import ReservesCreatePage from "./paths/instance/reserves/create/index.js"; import ReservesDetailsPage from "./paths/instance/reserves/details/index.js"; import ReservesListPage from "./paths/instance/reserves/list/index.js"; -import ListKYCPage from "./paths/instance/kyc/list/index.js"; +import TemplateCreatePage from "./paths/instance/templates/create/index.js"; +import TemplateListPage from "./paths/instance/templates/list/index.js"; +import TemplateUpdatePage from "./paths/instance/templates/update/index.js"; +import TransferCreatePage from "./paths/instance/transfers/create/index.js"; +import TransferListPage from "./paths/instance/transfers/list/index.js"; import InstanceUpdatePage, { - Props as InstanceUpdatePageProps, AdminUpdate as InstanceAdminUpdatePage, + Props as InstanceUpdatePageProps, } from "./paths/instance/update/index.js"; import LoginPage from "./paths/login/index.js"; import NotFoundPage from "./paths/notfound/index.js"; import { Notification } from "./utils/types.js"; -import { useInstanceKYCDetails } from "./hooks/instance.js"; -import { format } from "date-fns"; export enum InstancePaths { // details = '/', @@ -99,10 +99,16 @@ export enum AdminPaths { export interface Props { id: string; admin?: boolean; + path: string; setInstanceName: (s: string) => void; } -export function InstanceRoutes({ id, admin, setInstanceName }: Props): VNode { +export function InstanceRoutes({ + id, + admin, + path, + setInstanceName, +}: Props): VNode { const [_, updateDefaultToken] = useBackendDefaultToken(); const [token, updateToken] = useBackendInstanceToken(id); const { @@ -113,7 +119,7 @@ export function InstanceRoutes({ id, admin, setInstanceName }: Props): VNode { const cleaner = useCallback(() => { updateToken(undefined); }, [id]); - const i18n = useTranslator(); + const { i18n } = useTranslationContext(); type GlobalNotifState = (Notification & { to: string }) | undefined; const [globalNotification, setGlobalNotification] = @@ -144,8 +150,8 @@ export function InstanceRoutes({ id, admin, setInstanceName }: Props): VNode { function ServerErrorRedirectTo(to: InstancePaths | AdminPaths) { return function ServerErrorRedirectToImpl(error: HttpError) { setGlobalNotification({ - message: i18n`The backend reported a problem: HTTP status #${error.status}`, - description: i18n`Diagnostic from ${error.info?.url} is "${error.message}"`, + message: i18n.str`The backend reported a problem: HTTP status #${error.status}`, + description: i18n.str`Diagnostic from ${error.info?.url} is "${error.message}"`, details: error.clientError || error.serverError ? error.error?.detail @@ -161,8 +167,8 @@ export function InstanceRoutes({ id, admin, setInstanceName }: Props): VNode { @@ -177,8 +183,8 @@ export function InstanceRoutes({ id, admin, setInstanceName }: Props): VNode { @@ -208,6 +214,7 @@ export function InstanceRoutes({ id, admin, setInstanceName }: Props): VNode { @@ -488,7 +495,7 @@ function AdminInstanceUpdatePage({ () => ({ id, token, admin: true, changeToken }), [id, token], ); - const i18n = useTranslator(); + const { i18n } = useTranslationContext(); return ( @@ -500,8 +507,8 @@ function AdminInstanceUpdatePage({ @@ -534,6 +541,7 @@ function AdminInstanceUpdatePage({ function KycBanner(): VNode { const kycStatus = useInstanceKYCDetails(); + const { i18n } = useTranslationContext(); const today = format(new Date(), "yyyy-MM-dd"); const [lastHide, setLastHide] = useLocalStorage("kyc-last-hide"); const hasBeenHidden = today === lastHide; @@ -552,7 +560,7 @@ function KycBanner(): VNode {

diff --git a/packages/merchant-backoffice-ui/src/components/exception/AsyncButton.tsx b/packages/merchant-backoffice-ui/src/components/exception/AsyncButton.tsx index 510bc29b8..aa50dfa91 100644 --- a/packages/merchant-backoffice-ui/src/components/exception/AsyncButton.tsx +++ b/packages/merchant-backoffice-ui/src/components/exception/AsyncButton.tsx @@ -22,7 +22,7 @@ import { ComponentChildren, h } from "preact"; import { LoadingModal } from "../modal/index.js"; import { useAsync } from "../../hooks/async.js"; -import { Translate } from "../../i18n/index.js"; +import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser"; type Props = { children: ComponentChildren; @@ -33,14 +33,14 @@ type Props = { export function AsyncButton({ onClick, disabled, children, ...rest }: Props) { const { isSlow, isLoading, request, cancel } = useAsync(onClick); - + const { i18n } = useTranslationContext(); if (isSlow) { return ; } if (isLoading) { return ( ); } diff --git a/packages/merchant-backoffice-ui/src/components/exception/login.tsx b/packages/merchant-backoffice-ui/src/components/exception/login.tsx index d1898915d..552e76ed6 100644 --- a/packages/merchant-backoffice-ui/src/components/exception/login.tsx +++ b/packages/merchant-backoffice-ui/src/components/exception/login.tsx @@ -19,11 +19,11 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser"; import { h, VNode } from "preact"; import { useState } from "preact/hooks"; import { useBackendContext } from "../../context/backend.js"; import { useInstanceContext } from "../../context/instance.js"; -import { Translate, useTranslator } from "../../i18n/index.js"; import { Notification } from "../../utils/types.js"; interface Props { @@ -51,7 +51,7 @@ export function LoginModal({ onConfirm, withMessage }: Props): VNode { const [token, setToken] = useState(currentToken); const [url, setURL] = useState(backendUrl); - const i18n = useTranslator(); + const { i18n } = useTranslationContext(); return (
@@ -61,13 +61,13 @@ export function LoginModal({ onConfirm, withMessage }: Props): VNode { class="modal-card-head" style={{ border: "1px solid", borderBottom: 0 }} > - +
@@ -365,11 +375,11 @@ export function InputPaytoForm({
)} diff --git a/packages/merchant-backoffice-ui/src/components/form/InputSearchProduct.tsx b/packages/merchant-backoffice-ui/src/components/form/InputSearchProduct.tsx index fceee9d56..7f65fb8ae 100644 --- a/packages/merchant-backoffice-ui/src/components/form/InputSearchProduct.tsx +++ b/packages/merchant-backoffice-ui/src/components/form/InputSearchProduct.tsx @@ -18,11 +18,11 @@ * * @author Sebastian Javier Marchano (sebasjm) */ +import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser"; import { h, VNode } from "preact"; import { useState } from "preact/hooks"; import emptyImage from "../../assets/empty.png"; import { MerchantBackend, WithId } from "../../declaration.js"; -import { Translate, useTranslator } from "../../i18n/index.js"; import { FormErrors, FormProvider } from "./FormProvider.js"; import { InputWithAddon } from "./InputWithAddon.js"; @@ -50,7 +50,7 @@ export function InputSearchProduct({ const errors: FormErrors = { name: undefined, }; - const i18n = useTranslator(); + const { i18n } = useTranslationContext(); if (selected) { return ( @@ -63,10 +63,11 @@ export function InputSearchProduct({

- Product id: {selected.id} + Product id: {selected.id}

- Description: {selected.description} + Description:{" "} + {selected.description}

@@ -125,7 +126,7 @@ export function InputSecured({
- Update + Update
@@ -154,7 +155,7 @@ export function InputSecured({
- Remove + Remove @@ -171,7 +172,7 @@ export function InputSecured({ - Cancel + Cancel diff --git a/packages/merchant-backoffice-ui/src/components/form/InputStock.tsx b/packages/merchant-backoffice-ui/src/components/form/InputStock.tsx index 57aa5968d..1052aaaae 100644 --- a/packages/merchant-backoffice-ui/src/components/form/InputStock.tsx +++ b/packages/merchant-backoffice-ui/src/components/form/InputStock.tsx @@ -18,17 +18,16 @@ * * @author Sebastian Javier Marchano (sebasjm) */ +import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser"; import { Fragment, h } from "preact"; -import { MerchantBackend, Timestamp } from "../../declaration.js"; -import { InputProps, useField } from "./useField.js"; -import { FormProvider, FormErrors } from "./FormProvider.js"; import { useLayoutEffect, useState } from "preact/hooks"; -import { Input } from "./Input.js"; -import { InputGroup } from "./InputGroup.js"; -import { InputNumber } from "./InputNumber.js"; +import { MerchantBackend, Timestamp } from "../../declaration.js"; +import { FormErrors, FormProvider } from "./FormProvider.js"; import { InputDate } from "./InputDate.js"; -import { Translate, useTranslator } from "../../i18n/index.js"; +import { InputGroup } from "./InputGroup.js"; import { InputLocation } from "./InputLocation.js"; +import { InputNumber } from "./InputNumber.js"; +import { InputProps, useField } from "./useField.js"; export interface Props extends InputProps { alreadyExist?: boolean; @@ -64,7 +63,7 @@ export function InputStock({ incoming: 0, lost: 0, }); - const i18n = useTranslator(); + const { i18n } = useTranslationContext(); useLayoutEffect(() => { if (!formValue) { @@ -97,7 +96,7 @@ export function InputStock({ {!alreadyExist ? ( ) : ( )} @@ -134,7 +133,7 @@ export function InputStock({ const stockAddedErrors: FormErrors = { lost: currentStock + addedStock.incoming < addedStock.lost - ? i18n`lost cannot be greater than current and incoming (max ${ + ? i18n.str`lost cannot be greater than current and incoming (max ${ currentStock + addedStock.incoming })` : undefined, @@ -142,8 +141,8 @@ export function InputStock({ // const stockUpdateDescription = stockAddedErrors.lost ? '' : ( // !!addedStock.incoming || !!addedStock.lost ? - // i18n`current stock will change from ${currentStock} to ${currentStock + addedStock.incoming - addedStock.lost}` : - // i18n`current stock will stay at ${currentStock}` + // i18n.str`current stock will change from ${currentStock} to ${currentStock + addedStock.incoming - addedStock.lost}` : + // i18n.str`current stock will stay at ${currentStock}` // ) return ( @@ -174,8 +173,8 @@ export function InputStock({ object={addedStock} valueHandler={setAddedStock as any} > - - + + {/*
@@ -190,17 +189,17 @@ export function InputStock({ ) : ( name="current" - label={i18n`Current`} + label={i18n.str`Current`} side={ } @@ -209,11 +208,14 @@ export function InputStock({ name="nextRestock" - label={i18n`Next restock`} + label={i18n.str`Next restock`} withTimestampSupport /> - name="address" label={i18n`Delivery address`}> + + name="address" + label={i18n.str`Delivery address`} + > diff --git a/packages/merchant-backoffice-ui/src/components/form/InputTaxes.tsx b/packages/merchant-backoffice-ui/src/components/form/InputTaxes.tsx index d95463790..552ee73e2 100644 --- a/packages/merchant-backoffice-ui/src/components/form/InputTaxes.tsx +++ b/packages/merchant-backoffice-ui/src/components/form/InputTaxes.tsx @@ -18,11 +18,11 @@ * * @author Sebastian Javier Marchano (sebasjm) */ +import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser"; import { h, VNode } from "preact"; import { useCallback, useState } from "preact/hooks"; import * as yup from "yup"; import { MerchantBackend } from "../../declaration.js"; -import { Translate, useTranslator } from "../../i18n/index.js"; import { TaxSchema as schema } from "../../schemas/index.js"; import { FormErrors, FormProvider } from "./FormProvider.js"; import { Input } from "./Input.js"; @@ -67,7 +67,7 @@ export function InputTaxes({ valueHandler({}); }, [value]); - const i18n = useTranslator(); + const { i18n } = useTranslationContext(); //FIXME: translating plural singular return ( @@ -110,34 +110,35 @@ export function InputTaxes({ />
))} - {!taxes.length && i18n`No taxes configured for this product.`} + {!taxes.length && i18n.str`No taxes configured for this product.`} name="tax" - label={i18n`Amount`} - tooltip={i18n`Taxes can be in currencies that differ from the main currency used by the merchant.`} + label={i18n.str`Amount`} + tooltip={i18n.str`Taxes can be in currencies that differ from the main currency used by the merchant.`} > - - Enter currency and value separated with a colon, e.g. "USD:2.3". - + + Enter currency and value separated with a colon, e.g. + "USD:2.3". + name="name" - label={i18n`Description`} - tooltip={i18n`Legal name of the tax, e.g. VAT or import duties.`} + label={i18n.str`Description`} + tooltip={i18n.str`Legal name of the tax, e.g. VAT or import duties.`} />
diff --git a/packages/merchant-backoffice-ui/src/components/instance/DefaultInstanceFormFields.tsx b/packages/merchant-backoffice-ui/src/components/instance/DefaultInstanceFormFields.tsx index 9dfa33840..c497773d9 100644 --- a/packages/merchant-backoffice-ui/src/components/instance/DefaultInstanceFormFields.tsx +++ b/packages/merchant-backoffice-ui/src/components/instance/DefaultInstanceFormFields.tsx @@ -19,9 +19,9 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser"; import { Fragment, h, VNode } from "preact"; import { useBackendContext } from "../../context/backend.js"; -import { useTranslator } from "../../i18n/index.js"; import { Entity } from "../../paths/admin/create/CreatePage.js"; import { Input } from "../form/Input.js"; import { InputCurrency } from "../form/InputCurrency.js"; @@ -39,7 +39,7 @@ export function DefaultInstanceFormFields({ readonlyId?: boolean; showId: boolean; }): VNode { - const i18n = useTranslator(); + const { i18n } = useTranslationContext(); const backend = useBackendContext(); return ( @@ -48,86 +48,86 @@ export function DefaultInstanceFormFields({ name="id" addonBefore={`${backend.url}/instances/`} readonly={readonlyId} - label={i18n`Identifier`} - tooltip={i18n`Name of the instance in URLs. The 'default' instance is special in that it is used to administer other instances.`} + label={i18n.str`Identifier`} + tooltip={i18n.str`Name of the instance in URLs. The 'default' instance is special in that it is used to administer other instances.`} /> )} name="name" - label={i18n`Business name`} - tooltip={i18n`Legal name of the business represented by this instance.`} + label={i18n.str`Business name`} + tooltip={i18n.str`Legal name of the business represented by this instance.`} /> name="email" - label={i18n`Email`} - tooltip={i18n`Contact email`} + label={i18n.str`Email`} + tooltip={i18n.str`Contact email`} /> name="website" - label={i18n`Website URL`} - tooltip={i18n`URL.`} + label={i18n.str`Website URL`} + tooltip={i18n.str`URL.`} /> name="logo" - label={i18n`Logo`} - tooltip={i18n`Logo image.`} + label={i18n.str`Logo`} + tooltip={i18n.str`Logo image.`} /> name="payto_uris" - label={i18n`Bank account`} - tooltip={i18n`URI specifying bank account for crediting revenue.`} + label={i18n.str`Bank account`} + tooltip={i18n.str`URI specifying bank account for crediting revenue.`} /> name="default_max_deposit_fee" - label={i18n`Default max deposit fee`} - tooltip={i18n`Maximum deposit fees this merchant is willing to pay per order by default.`} + label={i18n.str`Default max deposit fee`} + tooltip={i18n.str`Maximum deposit fees this merchant is willing to pay per order by default.`} /> name="default_max_wire_fee" - label={i18n`Default max wire fee`} - tooltip={i18n`Maximum wire fees this merchant is willing to pay per wire transfer by default.`} + label={i18n.str`Default max wire fee`} + tooltip={i18n.str`Maximum wire fees this merchant is willing to pay per wire transfer by default.`} /> name="default_wire_fee_amortization" - label={i18n`Default wire fee amortization`} - tooltip={i18n`Number of orders excess wire transfer fees will be divided by to compute per order surcharge.`} + label={i18n.str`Default wire fee amortization`} + tooltip={i18n.str`Number of orders excess wire transfer fees will be divided by to compute per order surcharge.`} /> name="default_pay_delay" - label={i18n`Default payment delay`} + label={i18n.str`Default payment delay`} withForever - tooltip={i18n`Time customers have to pay an order before the offer expires by default.`} + tooltip={i18n.str`Time customers have to pay an order before the offer expires by default.`} /> name="default_wire_transfer_delay" - label={i18n`Default wire transfer delay`} - tooltip={i18n`Maximum time an exchange is allowed to delay wiring funds to the merchant, enabling it to aggregate smaller payments into larger wire transfers and reducing wire fees.`} + label={i18n.str`Default wire transfer delay`} + tooltip={i18n.str`Maximum time an exchange is allowed to delay wiring funds to the merchant, enabling it to aggregate smaller payments into larger wire transfers and reducing wire fees.`} withForever /> diff --git a/packages/merchant-backoffice-ui/src/components/menu/LangSelector.tsx b/packages/merchant-backoffice-ui/src/components/menu/LangSelector.tsx index d618d6480..a1de8541e 100644 --- a/packages/merchant-backoffice-ui/src/components/menu/LangSelector.tsx +++ b/packages/merchant-backoffice-ui/src/components/menu/LangSelector.tsx @@ -19,11 +19,11 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser"; import { h, VNode } from "preact"; import { useState } from "preact/hooks"; import langIcon from "../../assets/icons/languageicon.svg"; -import { useTranslationContext } from "../../context/translation.js"; -import { strings as messages } from "../../i18n/strings"; +import { strings as messages } from "../../i18n/strings.js"; type LangsNames = { [P in keyof typeof messages]: string; diff --git a/packages/merchant-backoffice-ui/src/components/menu/SideBar.tsx b/packages/merchant-backoffice-ui/src/components/menu/SideBar.tsx index ea49be99a..92d144b1a 100644 --- a/packages/merchant-backoffice-ui/src/components/menu/SideBar.tsx +++ b/packages/merchant-backoffice-ui/src/components/menu/SideBar.tsx @@ -19,13 +19,11 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser"; import { Fragment, h, VNode } from "preact"; -import { useCallback } from "preact/hooks"; import { useBackendContext } from "../../context/backend.js"; import { useConfigContext } from "../../context/config.js"; -import { useInstanceContext } from "../../context/instance.js"; import { useInstanceKYCDetails } from "../../hooks/instance.js"; -import { Translate } from "../../i18n/index.js"; import { LangSelector } from "./LangSelector.js"; const GIT_HASH = typeof __GIT_HASH__ !== "undefined" ? __GIT_HASH__ : undefined; @@ -48,7 +46,7 @@ export function Sidebar({ }: Props): VNode { const config = useConfigContext(); const backend = useBackendContext(); - + const { i18n } = useTranslationContext(); const kycStatus = useInstanceKYCDetails(); const needKYC = kycStatus.ok && kycStatus.data.type === "redirect"; @@ -81,7 +79,7 @@ export function Sidebar({ {instance ? (