diff options
| author | Sebastian <sebasjm@gmail.com> | 2023-01-27 12:35:10 -0300 | 
|---|---|---|
| committer | Sebastian <sebasjm@gmail.com> | 2023-01-27 15:08:24 -0300 | 
| commit | 1b2b5d62de5888eae895db69cf6ae51dbfddb32b (patch) | |
| tree | b705f9692fcbf7bb207d6c3e5734ec1dab678450 /packages | |
| parent | 7a3717125f9ed76719167d3a17b86a7e0502ee33 (diff) | |
add use-template button
Diffstat (limited to 'packages')
18 files changed, 312 insertions, 28 deletions
| diff --git a/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx b/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx index 1c55572bb..3be793ada 100644 --- a/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx +++ b/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx @@ -48,6 +48,7 @@ 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 TemplateCreatePage from "./paths/instance/templates/create/index.js"; +import TemplateUsePage from "./paths/instance/templates/use/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"; @@ -85,6 +86,7 @@ export enum InstancePaths {    templates_list = "/templates",    templates_update = "/templates/:tid/update",    templates_new = "/templates/new", +  templates_use = "/templates/:tid/use",  }  // eslint-disable-next-line @typescript-eslint/no-empty-function @@ -399,6 +401,9 @@ export function InstanceRoutes({            onCreate={() => {              route(InstancePaths.templates_new);            }} +          onNewOrder={(id: string) => { +            route(InstancePaths.templates_use.replace(":tid", id)); +          }}            onSelect={(id: string) => {              route(InstancePaths.templates_update.replace(":tid", id));            }} @@ -426,6 +431,19 @@ export function InstanceRoutes({              route(InstancePaths.templates_list);            }}          /> +        <Route +          path={InstancePaths.templates_use} +          component={TemplateUsePage} +          onOrderCreated={(id: string) => { +            route(InstancePaths.order_details.replace(":oid", id)); +          }} +          onUnauthorized={LoginPageAccessDenied} +          onLoadError={ServerErrorRedirectTo(InstancePaths.templates_list)} +          onNotFound={IfAdminCreateDefaultOr(NotFoundPage)} +          onBack={() => { +            route(InstancePaths.templates_list); +          }} +        />          {/**           * reserves pages diff --git a/packages/merchant-backoffice-ui/src/components/form/Input.tsx b/packages/merchant-backoffice-ui/src/components/form/Input.tsx index 54140ba4d..c1ddcb064 100644 --- a/packages/merchant-backoffice-ui/src/components/form/Input.tsx +++ b/packages/merchant-backoffice-ui/src/components/form/Input.tsx @@ -92,6 +92,7 @@ export function Input<T>({                inputType={inputType}                placeholder={placeholder}                readonly={readonly} +              disabled={readonly}                name={String(name)}                value={toStr(value)}                onChange={(e: h.JSX.TargetedEvent<HTMLInputElement>): void => diff --git a/packages/merchant-backoffice-ui/src/components/form/InputWithAddon.tsx b/packages/merchant-backoffice-ui/src/components/form/InputWithAddon.tsx index 620922584..e5118c722 100644 --- a/packages/merchant-backoffice-ui/src/components/form/InputWithAddon.tsx +++ b/packages/merchant-backoffice-ui/src/components/form/InputWithAddon.tsx @@ -86,6 +86,7 @@ export function InputWithAddon<T>({                  type={inputType}                  placeholder={placeholder}                  readonly={readonly} +                disabled={readonly}                  name={String(name)}                  value={toStr(value)}                  onChange={(e): void => onChange(fromStr(e.currentTarget.value))} diff --git a/packages/merchant-backoffice-ui/src/declaration.d.ts b/packages/merchant-backoffice-ui/src/declaration.d.ts index 25b66bdea..b0621c13c 100644 --- a/packages/merchant-backoffice-ui/src/declaration.d.ts +++ b/packages/merchant-backoffice-ui/src/declaration.d.ts @@ -1347,7 +1347,7 @@ export namespace MerchantBackend {      interface UsingTemplateDetails {        // Subject of the template -      subject?: string; +      summary?: string;        // The amount entered by the customer.        amount?: Amount; @@ -1355,7 +1355,8 @@ export namespace MerchantBackend {      interface UsingTemplateResponse {        // After enter the request. The user will be pay with a taler URL. -      taler_url: string; +      order_id: string, +      token: string,      }    } diff --git a/packages/merchant-backoffice-ui/src/hooks/templates.ts b/packages/merchant-backoffice-ui/src/hooks/templates.ts index 672eaf792..3a28b903d 100644 --- a/packages/merchant-backoffice-ui/src/hooks/templates.ts +++ b/packages/merchant-backoffice-ui/src/hooks/templates.ts @@ -62,14 +62,14 @@ export function useTemplateAPI(): TemplateAPI {      return res;    }; -  const createOrder = async ( +  const createOrderFromTemplate = async (      templateId: string,      data: MerchantBackend.Template.UsingTemplateDetails,    ): Promise<      HttpResponseOk<MerchantBackend.Template.UsingTemplateResponse>    > => {      const res = await request<MerchantBackend.Template.UsingTemplateResponse>( -      `/private/templates/${templateId}`, +      `/templates/${templateId}`,        {          method: "POST",          data, @@ -79,7 +79,7 @@ export function useTemplateAPI(): TemplateAPI {      return res;    }; -  return { createTemplate, updateTemplate, deleteTemplate, createOrder }; +  return { createTemplate, updateTemplate, deleteTemplate, createOrderFromTemplate };  }  export interface TemplateAPI { @@ -91,7 +91,7 @@ export interface TemplateAPI {      data: MerchantBackend.Template.TemplatePatchDetails,    ) => Promise<HttpResponseOk<void>>;    deleteTemplate: (id: string) => Promise<HttpResponseOk<void>>; -  createOrder: ( +  createOrderFromTemplate: (      id: string,      data: MerchantBackend.Template.UsingTemplateDetails,    ) => Promise<HttpResponseOk<MerchantBackend.Template.UsingTemplateResponse>>; @@ -174,10 +174,9 @@ export function useInstanceTemplates(        if (afterData.data.templates.length < MAX_RESULT_SIZE) {          setPageAfter(pageAfter + 1);        } else { -        const from = `${ -          afterData.data.templates[afterData.data.templates.length - 1] -            .template_id -        }`; +        const from = `${afterData.data.templates[afterData.data.templates.length - 1] +          .template_id +          }`;          if (from && updatePosition) updatePosition(from);        }      }, 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 4ab415e85..9a35b0797 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/details/DetailPage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/details/DetailPage.tsx @@ -40,8 +40,8 @@ function convert(    const payto_uris = accounts.filter((a) => a.active).map((a) => a.payto_uri);    const defaults = {      default_wire_fee_amortization: 1, -    default_pay_delay: { d_us: 1000 * 60 * 60 }, //one hour -    default_wire_transfer_delay: { d_us: 1000 * 60 * 60 * 2 }, //two hours +    default_pay_delay: { d_us: 1000 * 60 * 60 * 1000 }, //one hour +    default_wire_transfer_delay: { d_us: 1000 * 60 * 60 * 2 * 1000 }, //two hours    };    return { ...defaults, ...rest, payto_uris };  } 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 cdbe732a4..3a6e0fbfe 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/details/stories.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/details/stories.tsx @@ -59,11 +59,11 @@ export const Example = createExample(TestedComponent, {      default_max_deposit_fee: "TESTKUDOS:2",      default_max_wire_fee: "TESTKUDOS:1",      default_pay_delay: { -      d_us: 1000000, +      d_us: 1000 * 1000, //one second      },      default_wire_fee_amortization: 1,      default_wire_transfer_delay: { -      d_us: 100000, +      d_us: 1000 * 1000, //one second      },      merchant_pub: "ASDWQEKASJDKSADJ",    }, diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/Create.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/Create.stories.tsx index 5f8dbbdd9..fcf611c3c 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/Create.stories.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/Create.stories.tsx @@ -45,7 +45,7 @@ export const Example = createExample(TestedComponent, {      default_max_deposit_fee: "",      default_max_wire_fee: "",      default_pay_delay: { -      d_us: 1000 * 60 * 60, +      d_us: 1000 * 1000 * 60 * 60, //one hour      },      default_wire_fee_amortization: 1,    }, 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 0c2e92418..f4a82f377 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 @@ -61,7 +61,9 @@ function with_defaults(config: InstanceConfig): Partial<Entity> {    const defaultPayDeadline =      !config.default_pay_delay || config.default_pay_delay.d_us === "forever"        ? undefined -      : add(new Date(), { seconds: config.default_pay_delay.d_us / 1000 }); +      : add(new Date(), { +          seconds: config.default_pay_delay.d_us / (1000 * 1000), +        });    return {      inventoryProducts: {}, 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 2a47c22a0..2b8d718fb 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 @@ -72,7 +72,7 @@ export function CreatePage({ onCreate, onBack }: Props): VNode {              ? i18n.str`can't be empty`              : state.template_contract.pay_duration.d_us === "forever"              ? undefined -            : state.template_contract.pay_duration.d_us < 1000 +            : state.template_contract.pay_duration.d_us < 1000 * 1000 //less than one second              ? i18n.str`to short`              : undefined,          }), 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 9d289e957..8482f7f52 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 @@ -31,6 +31,7 @@ export interface Props {    onCreate: () => void;    onDelete: (e: MerchantBackend.Template.TemplateEntry) => void;    onSelect: (e: MerchantBackend.Template.TemplateEntry) => void; +  onNewOrder: (e: MerchantBackend.Template.TemplateEntry) => void;  }  export function ListPage({ @@ -38,6 +39,7 @@ export function ListPage({    onCreate,    onDelete,    onSelect, +  onNewOrder,    onLoadMoreBefore,    onLoadMoreAfter,  }: Props): VNode { @@ -54,6 +56,7 @@ export function ListPage({          onCreate={onCreate}          onDelete={onDelete}          onSelect={onSelect} +        onNewOrder={onNewOrder}          onLoadMoreBefore={onLoadMoreBefore}          hasMoreBefore={!onLoadMoreBefore}          onLoadMoreAfter={onLoadMoreAfter} 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 fd6ea5f6f..6635d6c55 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 @@ -30,6 +30,7 @@ interface Props {    templates: Entity[];    onDelete: (e: Entity) => void;    onSelect: (e: Entity) => void; +  onNewOrder: (e: Entity) => void;    onCreate: () => void;    onLoadMoreBefore?: () => void;    hasMoreBefore?: boolean; @@ -42,6 +43,7 @@ export function CardTable({    onCreate,    onDelete,    onSelect, +  onNewOrder,    onLoadMoreAfter,    onLoadMoreBefore,    hasMoreAfter, @@ -81,6 +83,7 @@ export function CardTable({                  instances={templates}                  onDelete={onDelete}                  onSelect={onSelect} +                onNewOrder={onNewOrder}                  rowSelection={rowSelection}                  rowSelectionHandler={rowSelectionHandler}                  onLoadMoreAfter={onLoadMoreAfter} @@ -101,6 +104,7 @@ interface TableProps {    rowSelection: string[];    instances: Entity[];    onDelete: (e: Entity) => void; +  onNewOrder: (e: Entity) => void;    onSelect: (e: Entity) => void;    rowSelectionHandler: StateUpdater<string[]>;    onLoadMoreBefore?: () => void; @@ -118,6 +122,7 @@ function Table({    instances,    onLoadMoreAfter,    onDelete, +  onNewOrder,    onSelect,    onLoadMoreBefore,    hasMoreAfter, @@ -164,14 +169,23 @@ function Table({                  >                    {i.template_description}                  </td> -                <td> -                  <button -                    class="button is-danger is-small has-tooltip-left" -                    data-tooltip={i18n.str`delete selected templates from the database`} -                    onClick={() => onDelete(i)} -                  > -                    Delete -                  </button> +                <td class="is-actions-cell right-sticky"> +                  <div class="buttons is-right"> +                    <button +                      class="button is-danger is-small has-tooltip-left" +                      data-tooltip={i18n.str`delete selected templates from the database`} +                      onClick={() => onDelete(i)} +                    > +                      Delete +                    </button> +                    <button +                      class="button is-info is-small has-tooltip-left" +                      data-tooltip={i18n.str`delete selected templates from the database`} +                      onClick={() => onNewOrder(i)} +                    > +                      New order +                    </button> +                  </div>                  </td>                </tr>              ); 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 e1a2d019e..5fce3a819 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 @@ -39,6 +39,7 @@ interface Props {    onNotFound: () => VNode;    onCreate: () => void;    onSelect: (id: string) => void; +  onNewOrder: (id: string) => void;  }  export default function ListTemplates({ @@ -46,6 +47,7 @@ export default function ListTemplates({    onLoadError,    onCreate,    onSelect, +  onNewOrder,    onNotFound,  }: Props): VNode {    const [position, setPosition] = useState<string | undefined>(undefined); @@ -73,6 +75,9 @@ export default function ListTemplates({          onSelect={(e) => {            onSelect(e.template_id);          }} +        onNewOrder={(e) => { +          onNewOrder(e.template_id); +        }}          onDelete={(e: MerchantBackend.Template.TemplateEntry) =>            deleteTemplate(e.template_id)              .then(() => 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 a49e8000b..718a67ae0 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 @@ -65,7 +65,7 @@ export function UpdatePage({ template, onUpdate, onBack }: Props): VNode {              ? i18n.str`can't be empty`              : state.template_contract.pay_duration.d_us === "forever"              ? undefined -            : state.template_contract.pay_duration.d_us < 1000 +            : state.template_contract.pay_duration.d_us < 1000 * 1000 // less than one second              ? i18n.str`to short`              : undefined,          }), diff --git a/packages/merchant-backoffice-ui/src/paths/instance/templates/use/Use.stories.tsx b/packages/merchant-backoffice-ui/src/paths/instance/templates/use/Use.stories.tsx new file mode 100644 index 000000000..f073b4235 --- /dev/null +++ b/packages/merchant-backoffice-ui/src/paths/instance/templates/use/Use.stories.tsx @@ -0,0 +1,28 @@ +/* + This file is part of GNU Taler + (C) 2021-2023 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 <http://www.gnu.org/licenses/> + */ + +/** + * + * @author Sebastian Javier Marchano (sebasjm) + */ + +import { h, VNode, FunctionalComponent } from "preact"; +import { CreatePage as TestedComponent } from "./UsePage.js"; + +export default { +  title: "Pages/Templates/Create", +  component: TestedComponent, +}; 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 new file mode 100644 index 000000000..a63469763 --- /dev/null +++ b/packages/merchant-backoffice-ui/src/paths/instance/templates/use/UsePage.tsx @@ -0,0 +1,126 @@ +/* + This file is part of GNU Taler + (C) 2021-2023 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 <http://www.gnu.org/licenses/> + */ + +/** + * + * @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 { AsyncButton } from "../../../../components/exception/AsyncButton.js"; +import { +  FormErrors, +  FormProvider, +} 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; + +interface Props { +  template: MerchantBackend.Template.TemplateDetails; +  onCreateOrder: (d: Entity) => Promise<void>; +  onBack?: () => void; +} + +export function UsePage({ template, onCreateOrder, onBack }: Props): VNode { +  const { i18n } = useTranslationContext(); + +  const [state, setState] = useState<Partial<Entity>>({ +    amount: template.template_contract.amount, +    summary: template.template_contract.summary, +  }); + +  const errors: FormErrors<Entity> = { +    amount: +      !template.template_contract.amount && !state.amount +        ? i18n.str`Amount is required` +        : undefined, +    summary: +      !template.template_contract.summary && !state.summary +        ? i18n.str`Order summary is required` +        : undefined, +  }; + +  const hasErrors = Object.keys(errors).some( +    (k) => (errors as any)[k] !== undefined, +  ); + +  const submitForm = () => { +    if (hasErrors) return Promise.reject(); +    if (template.template_contract.amount) { +      delete state.amount; +    } +    if (template.template_contract.summary) { +      delete state.summary; +    } +    return onCreateOrder(state as any); +  }; + +  return ( +    <div> +      <section class="section is-main-section"> +        <div class="columns"> +          <div class="column" /> +          <div class="column is-four-fifths"> +            <FormProvider +              object={state} +              valueHandler={setState} +              errors={errors} +            > +              <InputCurrency<Entity> +                name="amount" +                label={i18n.str`Amount`} +                readonly={!!template.template_contract.amount} +                tooltip={i18n.str`Amount of the order`} +              /> +              <Input<Entity> +                name="summary" +                inputType="multiline" +                label={i18n.str`Order summary`} +                readonly={!!template.template_contract.summary} +                tooltip={i18n.str`Title of the order to be shown to the customer`} +              /> +            </FormProvider> + +            <div class="buttons is-right mt-5"> +              {onBack && ( +                <button class="button" onClick={onBack}> +                  <i18n.Translate>Cancel</i18n.Translate> +                </button> +              )} +              <AsyncButton +                disabled={hasErrors} +                data-tooltip={ +                  hasErrors +                    ? i18n.str`Need to complete marked fields` +                    : "confirm operation" +                } +                onClick={submitForm} +              > +                <i18n.Translate>Confirm</i18n.Translate> +              </AsyncButton> +            </div> +          </div> +          <div class="column" /> +        </div> +      </section> +    </div> +  ); +} 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 new file mode 100644 index 000000000..fa9a98c6d --- /dev/null +++ b/packages/merchant-backoffice-ui/src/paths/instance/templates/use/index.tsx @@ -0,0 +1,86 @@ +/* + This file is part of GNU Taler + (C) 2021-2023 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 <http://www.gnu.org/licenses/> + */ + +/** + * + * @author Sebastian Javier Marchano (sebasjm) + */ + +import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser"; +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 { +  useTemplateAPI, +  useTemplateDetails, +} from "../../../../hooks/templates.js"; +import { HttpError } from "../../../../utils/request.js"; +import { Notification } from "../../../../utils/types.js"; +import { UsePage } from "./UsePage.js"; + +export type Entity = MerchantBackend.Transfers.TransferInformation; +interface Props { +  onBack?: () => void; +  onOrderCreated: (id: string) => void; +  onUnauthorized: () => VNode; +  onNotFound: () => VNode; +  onLoadError: (e: HttpError) => VNode; +  tid: string; +} + +export default function TemplateUsePage({ +  tid, +  onOrderCreated, +  onBack, +  onLoadError, +  onNotFound, +  onUnauthorized, +}: Props): VNode { +  const { createOrderFromTemplate } = useTemplateAPI(); +  const result = useTemplateDetails(tid); +  const [notif, setNotif] = useState<Notification | undefined>(undefined); +  const { i18n } = useTranslationContext(); + +  if (result.clientError && result.isUnauthorized) return onUnauthorized(); +  if (result.clientError && result.isNotfound) return onNotFound(); +  if (result.loading) return <Loading />; +  if (!result.ok) return onLoadError(result); + +  return ( +    <> +      <NotificationCard notification={notif} /> +      <UsePage +        template={result.data} +        onBack={onBack} +        onCreateOrder={( +          request: MerchantBackend.Template.UsingTemplateDetails, +        ) => { +          return createOrderFromTemplate(tid, request) +            .then((res) => onOrderCreated(res.data.order_id)) +            .catch((error) => { +              setNotif({ +                message: i18n.str`could not create order from template`, +                type: "ERROR", +                description: error.message, +              }); +            }); +        }} +      /> +    </> +  ); +} 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 58b8d87ea..045c96c2c 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 @@ -50,11 +50,11 @@ export const Example = createExample(TestedComponent, {      default_max_deposit_fee: "TESTKUDOS:2",      default_max_wire_fee: "TESTKUDOS:1",      default_pay_delay: { -      d_us: 1000000, +      d_us: 1000 * 1000, //one second      },      default_wire_fee_amortization: 1,      default_wire_transfer_delay: { -      d_us: 100000, +      d_us: 1000 * 1000, //one second      },      merchant_pub: "ASDWQEKASJDKSADJ",    }, | 
