gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-core] branch master updated: wip #8839


From: gnunet
Subject: [taler-wallet-core] branch master updated: wip #8839
Date: Fri, 02 Aug 2024 11:44:51 +0200

This is an automated email from the git hooks/post-receive script.

sebasjm pushed a commit to branch master
in repository wallet-core.

The following commit(s) were added to refs/heads/master by this push:
     new c2a0525c6 wip #8839
c2a0525c6 is described below

commit c2a0525c627ff01f166afeb4e6c0f04dc6955e32
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Fri Aug 2 06:44:43 2024 -0300

    wip #8839
---
 .../src/components/product/ProductForm.tsx         |  9 +--
 .../merchant-backoffice-ui/src/hooks/product.ts    | 28 +++++++--
 .../instance/categories/update/UpdatePage.tsx      | 70 ++++++++++++++++++++--
 .../src/paths/instance/categories/update/index.tsx | 23 ++++++-
 .../src/paths/instance/orders/create/index.tsx     |  4 +-
 5 files changed, 116 insertions(+), 18 deletions(-)

diff --git 
a/packages/merchant-backoffice-ui/src/components/product/ProductForm.tsx 
b/packages/merchant-backoffice-ui/src/components/product/ProductForm.tsx
index 9bf97f8db..b618ecda4 100644
--- a/packages/merchant-backoffice-ui/src/components/product/ProductForm.tsx
+++ b/packages/merchant-backoffice-ui/src/components/product/ProductForm.tsx
@@ -76,10 +76,6 @@ export function ProductForm({ onSubscribe, initial, 
alreadyExist }: Props) {
           },
   });
 
-  function notEmpty<TValue>(value: TValue | null | undefined): value is TValue 
{
-    return value !== null && value !== undefined;
-  }
-
   useEffect(() => {
     if (!initial || !initial?.categories) return;
 
@@ -218,6 +214,7 @@ export function ProductForm({ onSubscribe, initial, 
alreadyExist }: Props) {
               return { description: cat.name, id: String(cat.category_id) };
             });
           }}
+          help={i18n.str`Search by category description or id`}
           tooltip={i18n.str`Categories where this product will be listed on.`}
           unique
         />
@@ -225,3 +222,7 @@ export function ProductForm({ onSubscribe, initial, 
alreadyExist }: Props) {
     </div>
   );
 }
+
+function notEmpty<TValue>(value: TValue | null | undefined): value is TValue {
+  return value !== null && value !== undefined;
+}
diff --git a/packages/merchant-backoffice-ui/src/hooks/product.ts 
b/packages/merchant-backoffice-ui/src/hooks/product.ts
index 50e8adc9f..71b5e5045 100644
--- a/packages/merchant-backoffice-ui/src/hooks/product.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/product.ts
@@ -15,7 +15,15 @@
  */
 
 // FIX default import https://github.com/microsoft/TypeScript/issues/49189
-import { AccessToken, OperationOk, TalerHttpError, TalerMerchantApi, 
TalerMerchantManagementErrorsByMethod, TalerMerchantManagementResultByMethod, 
opFixedSuccess } from "@gnu-taler/taler-util";
+import {
+  AccessToken,
+  OperationOk,
+  TalerHttpError,
+  TalerMerchantApi,
+  TalerMerchantManagementErrorsByMethod,
+  TalerMerchantManagementResultByMethod,
+  opFixedSuccess,
+} from "@gnu-taler/taler-util";
 import { useState } from "preact/hooks";
 import _useSWR, { SWRHook, mutate } from "swr";
 import { useSessionContext } from "../context/session.js";
@@ -23,7 +31,10 @@ import { PAGINATED_LIST_REQUEST } from 
"../utils/constants.js";
 import { buildPaginatedResult } from "./webhooks.js";
 const useSWR = _useSWR as unknown as SWRHook;
 
-type ProductWithId = TalerMerchantApi.ProductDetail & { id: string, serial: 
number };
+export type ProductWithId = TalerMerchantApi.ProductDetail & {
+  id: string;
+  serial: number;
+};
 function notUndefined(c: ProductWithId | undefined): c is ProductWithId {
   return c !== undefined;
 }
@@ -43,7 +54,7 @@ export function useInstanceProducts() {
   async function fetcher([token, bid]: [AccessToken, number]) {
     const list = await lib.instance.listProducts(token, {
       limit: PAGINATED_LIST_REQUEST,
-      offset: bid === undefined ? undefined: String(bid),
+      offset: bid === undefined ? undefined : String(bid),
       order: "dec",
     });
     if (list.type !== "ok") {
@@ -64,8 +75,8 @@ export function useInstanceProducts() {
   }
 
   const { data, error } = useSWR<
-    OperationOk<{ products: ProductWithId[] }> |
-    TalerMerchantManagementErrorsByMethod<"listProducts">,
+    | OperationOk<{ products: ProductWithId[] }>
+    | TalerMerchantManagementErrorsByMethod<"listProducts">,
     TalerHttpError
   >([state.token, offset, "listProductsWithId"], fetcher);
 
@@ -73,7 +84,12 @@ export function useInstanceProducts() {
   if (data === undefined) return undefined;
   if (data.type !== "ok") return data;
 
-  return buildPaginatedResult(data.body.products, offset, setOffset, (d) => 
d.serial)
+  return buildPaginatedResult(
+    data.body.products,
+    offset,
+    setOffset,
+    (d) => d.serial,
+  );
 }
 
 export function revalidateProductDetails() {
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/categories/update/UpdatePage.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/categories/update/UpdatePage.tsx
index ee0d87280..15bca0df6 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/categories/update/UpdatePage.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/categories/update/UpdatePage.tsx
@@ -19,16 +19,17 @@
  * @author Sebastian Javier Marchano (sebasjm)
  */
 
-import {
-  TalerMerchantApi
-} from "@gnu-taler/taler-util";
+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 { useEffect, useState } from "preact/hooks";
 import { AsyncButton } from "../../../../components/exception/AsyncButton.js";
 import { FormProvider } from "../../../../components/form/FormProvider.js";
 import { Input } from "../../../../components/form/Input.js";
 import { WithId } from "../../../../declaration.js";
+import { InputArray } from "../../../../components/form/InputArray.js";
+import { useSessionContext } from "../../../../context/session.js";
+import { ProductWithId } from "../../../../hooks/product.js";
 
 type Entity = TalerMerchantApi.CategoryProductList & WithId;
 
@@ -36,13 +37,52 @@ interface Props {
   onUpdate: (d: Entity) => Promise<void>;
   onBack?: () => void;
   category: Entity;
+  instanceInventory: ProductWithId[];
 }
-export function UpdatePage({category, onUpdate, onBack }: Props): VNode {
+export function UpdatePage({
+  category,
+  instanceInventory,
+  onUpdate,
+  onBack,
+}: Props): VNode {
   const { i18n } = useTranslationContext();
+  const {
+    state: { token },
+    lib,
+  } = useSessionContext();
 
-  const [state, setState] = useState<Partial<Entity>>(category);
+  const [state, setState] = useState<
+    Partial<Entity & { product_map: { id: string; description: string }[] }>
+  >({
+    ...category,
+    product_map: [],
+  });
+
+  useEffect(() => {
+    if (!category || !category?.products) return;
+    console.log(category.products);
+    const ps = category.products.map((prod) => {
+      return lib.instance
+        .getProductDetails(token, String(prod.product_id))
+        .then((res) => {
+          return res.type === "fail"
+            ? undefined
+            : { id: String(prod), description: res.body.description };
+        });
+    });
+    Promise.all(ps).then((all) => {
+      const product_map = all.filter(notEmpty);
+      console.log(product_map);
+      setState({ ...state, product_map });
+    });
+  }, []);
 
   const submitForm = () => {
+    const pids = state.product_map?.map((p) => {
+      return { product_id: p.id };
+    });
+    state.products = pids;
+    delete state.product_map;
     return onUpdate(state as Entity);
   };
 
@@ -75,6 +115,21 @@ export function UpdatePage({category, onUpdate, onBack }: 
Props): VNode {
                   label={i18n.str`Name`}
                   tooltip={i18n.str`Name of the category`}
                 />
+                <InputArray
+                  name="product_map"
+                  label={i18n.str`Products`}
+                  getSuggestion={async () => {
+                    return instanceInventory.map((prod) => {
+                      return {
+                        description: prod.description,
+                        id: prod.id,
+                      };
+                    });
+                  }}
+                  help={i18n.str`Search by product description or id`}
+                  tooltip={i18n.str`Products that this category will list.`}
+                  unique
+                />
               </FormProvider>
 
               <div class="buttons is-right mt-5">
@@ -98,3 +153,6 @@ export function UpdatePage({category, onUpdate, onBack }: 
Props): VNode {
     </div>
   );
 }
+function notEmpty<TValue>(value: TValue | null | undefined): value is TValue {
+  return value !== null && value !== undefined;
+}
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/categories/update/index.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/categories/update/index.tsx
index 9e4fb6546..6b1fcf8e7 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/categories/update/index.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/categories/update/index.tsx
@@ -22,7 +22,7 @@
 import {
   HttpStatusCode,
   TalerError,
-  assertUnreachable
+  assertUnreachable,
 } from "@gnu-taler/taler-util";
 import { useTranslationContext } from "@gnu-taler/web-util/browser";
 import { Fragment, VNode, h } from "preact";
@@ -36,6 +36,7 @@ import { Notification } from "../../../../utils/types.js";
 import { LoginPage } from "../../../login/index.js";
 import { NotFoundPageOrAdminCreate } from "../../../notfound/index.js";
 import { UpdatePage } from "./UpdatePage.js";
+import { useInstanceProducts } from "../../../../hooks/product.js";
 
 interface Props {
   onBack?: () => void;
@@ -48,6 +49,8 @@ export default function UpdateCategory({
   onBack,
 }: Props): VNode {
   const result = useCategoryDetails(cid);
+  // FIXME: if the product list is big the will bring a lot of info
+  const inventoryResult = useInstanceProducts();
   const [notif, setNotif] = useState<Notification | undefined>(undefined);
   const { state, lib } = useSessionContext();
 
@@ -70,6 +73,23 @@ export default function UpdateCategory({
       }
     }
   }
+  if (!inventoryResult) return <Loading />;
+  if (inventoryResult instanceof TalerError) {
+    return <ErrorLoadingMerchant error={inventoryResult} />;
+  }
+  if (inventoryResult.type === "fail") {
+    switch (inventoryResult.case) {
+      case HttpStatusCode.NotFound: {
+        return <NotFoundPageOrAdminCreate />;
+      }
+      case HttpStatusCode.Unauthorized: {
+        return <LoginPage />;
+      }
+      default: {
+        assertUnreachable(inventoryResult);
+      }
+    }
+  }
 
   return (
     <Fragment>
@@ -79,6 +99,7 @@ export default function UpdateCategory({
           ...result.body,
           id: cid,
         }}
+        instanceInventory={inventoryResult.body}
         onBack={onBack}
         onUpdate={async (newInfo) => {
           return lib.instance
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 147c9e99c..37cb4ffdc 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
@@ -51,6 +51,7 @@ export default function OrderCreate({ onConfirm, onBack }: 
Props): VNode {
   const { state, lib } = useSessionContext();
   const [notif, setNotif] = useState<Notification | undefined>(undefined);
   const detailsResult = useInstanceDetails();
+  // FIXME: if the product list is big the will bring a lot of info
   const inventoryResult = useInstanceProducts();
   const { i18n } = useTranslationContext();
 
@@ -116,7 +117,8 @@ export default function OrderCreate({ onConfirm, onBack }: 
Props): VNode {
               setNotif({
                 message: i18n.str`Could not create order`,
                 type: "ERROR",
-                description: error instanceof Error ? error.message : 
String(error),
+                description:
+                  error instanceof Error ? error.message : String(error),
               });
             });
         }}

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]