diff --git a/.ddev/addon-metadata/ddev-vite-sidecar/manifest.yaml b/.ddev/addon-metadata/ddev-vite-sidecar/manifest.yaml index 2034326e..45b337aa 100644 --- a/.ddev/addon-metadata/ddev-vite-sidecar/manifest.yaml +++ b/.ddev/addon-metadata/ddev-vite-sidecar/manifest.yaml @@ -3,11 +3,11 @@ repository: s2b/ddev-vite-sidecar version: 1.1.0 install_date: "2024-10-02T19:02:43+02:00" project_files: - - commands/web/vite - - apache/vite.conf - - nginx_full/vite.conf - - vite/vite-server-not-running.html - - config.vite.yaml - - web-build/Dockerfile.vite + - commands/web/vite + - apache/vite.conf + - nginx_full/vite.conf + - vite/vite-server-not-running.html + - config.vite.yaml + - web-build/Dockerfile.vite global_files: [] removal_actions: [] diff --git a/.ddev/vite/vite-server-not-running.html b/.ddev/vite/vite-server-not-running.html index ff0105d2..1319db40 100644 --- a/.ddev/vite/vite-server-not-running.html +++ b/.ddev/vite/vite-server-not-running.html @@ -1,49 +1,65 @@ - + vite not running - - + +
-

vite not running

-

Apparently, you tried to access resources from the vite development server. However, the server is currently not running.

-

You can start the server by running the following command in your terminal:

- ddev vite +

vite not running

+

+ Apparently, you tried to access resources from the vite development server. However, the server is currently not + running. +

+

You can start the server by running the following command in your terminal:

+ ddev vite
- - \ No newline at end of file + + diff --git a/.vscode/settings.json b/.vscode/settings.json index 2de5077c..c74c3c3b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,6 +8,7 @@ "defini", "deplie", "Ecoute", + "emet", "ENTETE", "etats", "ETATS", diff --git a/eslint.config.js b/eslint.config.js index 524d1486..d051337d 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -37,6 +37,11 @@ export default tseslint.config( "ignoreArrowShorthand": true, "ignoreVoidOperator": false, }], + /* Cette règle empêche l'usage de génériques précisant les types de retour de fonctions. */ + "@typescript-eslint/no-unnecessary-type-parameters": "off", + "@typescript-eslint/no-unused-expressions": ["error", { + "allowTernary": true, + }], /* Cette règle est doublon avec les règles noUnused* de TypeScript. */ "@typescript-eslint/no-unused-vars": "off", /* Cette règle empêche de lever des erreurs génériques (p.ex. `E extends Error`). */ diff --git a/web/app/themes/haiku-atelier-2024/assets/js/.vite/manifest.json b/web/app/themes/haiku-atelier-2024/assets/js/.vite/manifest.json index f850f19e..0e613838 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/.vite/manifest.json +++ b/web/app/themes/haiku-atelier-2024/assets/js/.vite/manifest.json @@ -9,21 +9,29 @@ "name": "chunk-7BKSRZNG", "integrity": "sha512-anrnk3Aeg5QzrGrQSN13d9vtJoAghYnQnliQ2g5EedXKkd7Soljn6qW7LPbuKU5EjwikIGr+seO7qfNLu1iY7w==" }, + "_chunk-RU7WR4KH.D5j7HXCF.js": { + "file": "chunk-RU7WR4KH.D5j7HXCF.js", + "name": "chunk-RU7WR4KH", + "imports": [ + "web/app/themes/haiku-atelier-2024/src/scripts/lib/utils.ts" + ], + "integrity": "sha512-BrOGLIo6Hd2bL9MbCd5YcISzpVZjfEBeq9PVKcKIWza4ycU1qmwPIyE2D/z4wLgps5iNAtHsGUI0JE0FzkdqCw==" + }, "_exports.DNZBdkMD.js": { "file": "exports.DNZBdkMD.js", "name": "exports", "integrity": "sha512-aYGtBzQ/fess8aZnfmsI/TdNNom1Dd1BfM2g/AXaeZdTjhzD2Ul5kLl1RuXv1nM1/k2HWy0eFaasBtiz5l8YHA==" }, + "_index.CeK6pfoJ.js": { + "file": "index.CeK6pfoJ.js", + "name": "index", + "integrity": "sha512-cxTw0sKKut2H95JwMgiKgEVLyZ0QswK/HydKTapcqcs3w6xHIHNUpYBLdRzEYdeRfHKUsA0kvPNBXBk/QeazjQ==" + }, "_index.DD7qm8S6.js": { "file": "index.DD7qm8S6.js", "name": "index", "integrity": "sha512-dZ1dcfuB5XOKbN4ien9D6aGQ6O9ghxM4BXEuBnrAX4/oG2pkzPt+/S1hXGkkJk7HNcq+w6Eul+vn19rj+sjA1w==" }, - "_index.y02cst4L.js": { - "file": "index.y02cst4L.js", - "name": "index", - "integrity": "sha512-o9wA9YQlHsY4C1xPeqh8EkKHXWmS+2vT32YYJ1FXthFt862OI7Qwr5Y0HGkf3C81sjgRcARaurFKSqeKNHVoFg==" - }, "web/app/themes/haiku-atelier-2024/src/scripts/constantes/api.ts": { "file": "api2.js", "name": "api", @@ -43,7 +51,7 @@ "name": "dom", "src": "web/app/themes/haiku-atelier-2024/src/scripts/constantes/dom.ts", "isEntry": true, - "integrity": "sha512-L8mxbF9f2n5cYtdQQyo4B3gwIRnoPtiC2KFSWpKcot7YgSQW6JR96pSGhOmjHbr579//9UwtjoCi0ZCAZi3VwQ==" + "integrity": "sha512-g5Of6R9ri+kdLCyHR4tX7pb/JnEhcnJfPqRLLRvs8lHGeRHRzDI4ekFgPR7+7MnRWPxbYlSnXmjq7SM+SV4QZg==" }, "web/app/themes/haiku-atelier-2024/src/scripts/constantes/messages.ts": { "file": "messages3.js", @@ -96,7 +104,7 @@ "imports": [ "_exports.DNZBdkMD.js" ], - "integrity": "sha512-tVMlAurSgVwpsKmwm4ec8QM+faI+bs+YFbP+g3qaIQozCOCuYOuwboygxSz1ajQDrI4V+ECFoqa77jOnQIbptQ==" + "integrity": "sha512-ykMBUQPjclsVL4qWGXkiq+tqGW52l1MSRhIWNvdsYtEzvzi1Re3NjJGIpY7a+lWjRN16X+/4aJv51RseE5QJLA==" }, "web/app/themes/haiku-atelier-2024/src/scripts/lib/gardes.ts": { "file": "gardes.js", @@ -123,15 +131,15 @@ "isEntry": true, "imports": [ "_index.DD7qm8S6.js", + "web/app/themes/haiku-atelier-2024/src/scripts/constantes/messages.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/messages.ts", "_Either.wHNxn7Os.js", "_exports.DNZBdkMD.js", - "web/app/themes/haiku-atelier-2024/src/scripts/constantes/messages.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart.ts", "web/app/themes/haiku-atelier-2024/src/scripts/constantes/cart.ts" ], - "integrity": "sha512-O8W53Nt7AVJywhODKFp5YKrDFfYwYE0W71UMGRCDZoq4g6JQUhFyu5FwKjjE2RfNNH8LVVeCuoSPxjBBwgLrTg==" + "integrity": "sha512-fbxkHJ+dD78V3jJxNI22q9vRA/87xL/1csLbOPh/vGSeFSqL868iQllvYrrvBYYS8BHU/zuFie8FKU8ViOI4pg==" }, "web/app/themes/haiku-atelier-2024/src/scripts/lib/reseau.ts": { "file": "reseau.js", @@ -139,9 +147,15 @@ "src": "web/app/themes/haiku-atelier-2024/src/scripts/lib/reseau.ts", "isEntry": true, "imports": [ - "web/app/themes/haiku-atelier-2024/src/scripts/constantes/api.ts" + "_chunk-7BKSRZNG.C39W3Wne.js", + "_index.CeK6pfoJ.js", + "_index.DD7qm8S6.js", + "web/app/themes/haiku-atelier-2024/src/scripts/constantes/api.ts", + "web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts", + "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/erreurs.ts", + "_exports.DNZBdkMD.js" ], - "integrity": "sha512-nMhRswO45OQHAsc0QtgVDlXpv5ytRhb4VjVl7K6mxz5cteVMMqmNu6Jx2jYXRFQxYKXhGxMWjLTLczPzhpDlJQ==" + "integrity": "sha512-rYJVfAjK4yjdel1Hj/dSSjrMmmohoh3ZgxV8axshZRzWCRx+kHXdlSdbCQkjkVf2gBogyxR2XdPA1FeggbBRwA==" }, "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart-add-item.ts": { "file": "cart-add-item.js", @@ -182,7 +196,7 @@ "_index.DD7qm8S6.js", "web/app/themes/haiku-atelier-2024/src/scripts/constantes/cart.ts" ], - "integrity": "sha512-Plqlr1vvCpeqBp5n4nLaXI37IkKx3XoW0Pni1XGFYfSu7vbfAkeFMcOQbzETBGWsrEil7QF7kpK505UInNQ3Pg==" + "integrity": "sha512-MQsu03fXIuryciKJ8JleDihgKPWeBCpwnlfe8gd9eInUVHNhFKQ0mm9d+y4YzqSgOqzyJBWPJPDuNE/rgh+oFw==" }, "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/erreurs.ts": { "file": "erreurs2.js", @@ -205,7 +219,7 @@ "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart.ts", "web/app/themes/haiku-atelier-2024/src/scripts/constantes/cart.ts" ], - "integrity": "sha512-3VF2Yi9bJU3Gm/NN3L+KkrsEP0fawRw+j1OmEC6/WTy39q6HRP12HEa7Z1F9ny0t12YIWOT/2vfnSXfBhmRvUw==" + "integrity": "sha512-yH1YmpJ/akKOxNm2jJ8St8ogWDg0BzW6PHFoxnJUKPFUS9s8Po5n1d7mta5H36RW+YPWi5HBKwwPwpHKTi5x2g==" }, "web/app/themes/haiku-atelier-2024/src/scripts/lib/utils.ts": { "file": "utils.js", @@ -214,12 +228,12 @@ "isEntry": true, "imports": [ "web/app/themes/haiku-atelier-2024/src/scripts/lib/dom.ts", - "_chunk-7BKSRZNG.C39W3Wne.js", "web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts", - "_exports.DNZBdkMD.js", - "_Either.wHNxn7Os.js" + "_Either.wHNxn7Os.js", + "_chunk-7BKSRZNG.C39W3Wne.js", + "_exports.DNZBdkMD.js" ], - "integrity": "sha512-i4uspvXHfW//gmEw3Z5PRVKHA8LpzBiaiK2djkgxH71LCo0YHlxROvKEjES66FzivjWCk3DOT9XX7HMgyrqctg==" + "integrity": "sha512-Esz8GswJlts6K+9frxi4+X4VLqIIUg32rBo3uHKZemX6I4B8nwV/lQfoEUmVTfv+XriXpDBB4MAcH2FoS5LHuA==" }, "web/app/themes/haiku-atelier-2024/src/scripts/scripts-bouton-panier.ts": { "file": "scripts-bouton-panier.js", @@ -241,7 +255,7 @@ "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart.ts", "web/app/themes/haiku-atelier-2024/src/scripts/constantes/cart.ts" ], - "integrity": "sha512-nPmgcq2Zg6mj3/8wEV7JYjpoGRyD0PDatWRghJaFhlYL3qaZB2T6YuRTyJFfnMxncTCrCveyvPNdW3m8pVKnSQ==" + "integrity": "sha512-jtkypPcc0juXoJRSdseHumcbNvkrCPOckgzxhtvo5R40QKZU5yrMZw7Zx7s98AgRF8tu9MOX2Ffc/3m+zVPrxQ==" }, "web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-panier.ts": { "file": "scripts-page-panier.js", @@ -249,7 +263,8 @@ "src": "web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-panier.ts", "isEntry": true, "imports": [ - "_index.y02cst4L.js", + "_chunk-RU7WR4KH.D5j7HXCF.js", + "web/app/themes/haiku-atelier-2024/src/scripts/lib/utils.ts", "_chunk-7BKSRZNG.C39W3Wne.js", "_index.DD7qm8S6.js", "web/app/themes/haiku-atelier-2024/src/scripts/constantes/api.ts", @@ -263,14 +278,14 @@ "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart-remove-item.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart-update-item.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart.ts", - "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/erreurs.ts", - "web/app/themes/haiku-atelier-2024/src/scripts/lib/utils.ts", "_Either.wHNxn7Os.js", "_exports.DNZBdkMD.js", "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/messages.ts", + "_index.CeK6pfoJ.js", + "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/erreurs.ts", "web/app/themes/haiku-atelier-2024/src/scripts/constantes/cart.ts" ], - "integrity": "sha512-2q6FNf/gPxKEeYnS/ETOUMUiFopYflti5OCPgsjba1riIg+PxS6rW99ja00nISXwsHdDuvLum4gYXkqd6yX3fg==" + "integrity": "sha512-1b76Uu/mQmAiuYRm8ABDYTWd1OBkR/ndy+AI6QXv2etYAt9yM6n2g7pJQrqXa5Jf+aWNUaYFffyBsec6R9M48w==" }, "web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-produit.ts": { "file": "scripts-page-produit.js", @@ -278,23 +293,26 @@ "src": "web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-produit.ts", "isEntry": true, "imports": [ - "_index.y02cst4L.js", + "_chunk-RU7WR4KH.D5j7HXCF.js", + "web/app/themes/haiku-atelier-2024/src/scripts/lib/utils.ts", "_chunk-7BKSRZNG.C39W3Wne.js", + "_index.CeK6pfoJ.js", "_index.DD7qm8S6.js", "web/app/themes/haiku-atelier-2024/src/scripts/constantes/api.ts", "web/app/themes/haiku-atelier-2024/src/scripts/constantes/dom.ts", - "web/app/themes/haiku-atelier-2024/src/scripts/constantes/messages.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/dom.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/gardes.ts", + "web/app/themes/haiku-atelier-2024/src/scripts/lib/messages.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart-add-item.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart.ts", "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/erreurs.ts", - "web/app/themes/haiku-atelier-2024/src/scripts/lib/utils.ts", "_Either.wHNxn7Os.js", "_exports.DNZBdkMD.js", + "web/app/themes/haiku-atelier-2024/src/scripts/constantes/messages.ts", + "web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/messages.ts", "web/app/themes/haiku-atelier-2024/src/scripts/constantes/cart.ts" ], - "integrity": "sha512-bv6BRll5MJeydJ8deu0p1NjcwGZTRhDeKDgbZSnb3YLSk96UZ3uDHjPEb9CjTLRPywQWTnZoZ85U04QaUdji3g==" + "integrity": "sha512-yg9MYQDB+arRyL7GeJr/W0NFNSvYVsRor8WQzEeNAM6etWm+QqqNr1n3BfqG0o7eOZrx2ak6He1SaWpflLjtxw==" } } \ No newline at end of file diff --git a/web/app/themes/haiku-atelier-2024/assets/js/cart.js b/web/app/themes/haiku-atelier-2024/assets/js/cart.js index 00a39387..4610d1fc 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/cart.js +++ b/web/app/themes/haiku-atelier-2024/assets/js/cart.js @@ -36,6 +36,26 @@ const WCStoreCartItemSchema = object({ "type": string(), "variation": array(unknown()) }); +const WCStoreCartTotalsSchema = object({ + "currency_code": string(), + "currency_decimal_separator": string(), + "currency_minor_unit": number(), + "currency_prefix": string(), + "currency_suffix": string(), + "currency_symbol": string(), + "currency_thousand_separator": string(), + "tax_lines": array(unknown()), + "total_discount": string(), + "total_discount_tax": string(), + "total_fees": string(), + "total_fees_tax": string(), + "total_items": string(), + "total_items_tax": string(), + "total_price": string(), + "total_shipping": union([string(), null_()]), + "total_shipping_tax": union([string(), null_()]), + "total_tax": string() +}); const WCStoreCartSchema = object({ billing_address: unknown(), coupons: unknown(), @@ -53,7 +73,7 @@ const WCStoreCartSchema = object({ payment_requirements: unknown(), shipping_address: unknown(), shipping_rates: unknown(), - totals: unknown() + totals: WCStoreCartTotalsSchema }); export { WCStoreCartSchema as W, diff --git a/web/app/themes/haiku-atelier-2024/assets/js/cart.js.map b/web/app/themes/haiku-atelier-2024/assets/js/cart.js.map index 889a9496..b73676b3 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/cart.js.map +++ b/web/app/themes/haiku-atelier-2024/assets/js/cart.js.map @@ -1 +1 @@ -{"version":3,"file":"cart.js","sources":["../../src/scripts/lib/schemas/cart.ts"],"sourcesContent":["import * as v from \"valibot\";\n\nimport { CATALOG_VISIBILITIES } from \"../../constantes/cart.ts\";\n\nexport const WCStoreCartItemTotalsSchema = v.object({\n \"currency_code\": v.string(),\n \"currency_decimal_separator\": v.string(),\n \"currency_minor_unit\": v.number(),\n \"currency_prefix\": v.string(),\n \"currency_suffix\": v.string(),\n \"currency_symbol\": v.string(),\n \"currency_thousand_separator\": v.string(),\n \"line_subtotal\": v.string(),\n \"line_subtotal_tax\": v.string(),\n \"line_total\": v.string(),\n \"line_total_tax\": v.string(),\n});\n\nexport const WCStoreCartItemSchema = v.object({\n \"backorders_allowed\": v.boolean(),\n \"catalog_visibility\": v.enum(CATALOG_VISIBILITIES),\n \"description\": v.string(),\n \"extensions\": v.unknown(),\n \"id\": v.number(),\n \"images\": v.array(v.unknown()),\n \"item_data\": v.array(v.unknown()),\n \"key\": v.string(),\n \"low_stock_remaining\": v.union([v.null()]),\n \"name\": v.string(),\n \"permalink\": v.pipe(v.string(), v.url()),\n \"prices\": v.unknown(),\n \"quantity\": v.number(),\n \"quantity_limits\": v.unknown(),\n \"short_description\": v.string(),\n \"show_backorder_badge\": v.boolean(),\n \"sku\": v.string(),\n \"sold_individually\": v.boolean(),\n \"totals\": WCStoreCartItemTotalsSchema,\n \"type\": v.string(),\n \"variation\": v.array(v.unknown()),\n});\n\nexport const WCStoreCartSchema = v.object({\n billing_address: v.unknown(),\n coupons: v.unknown(),\n cross_sells: v.unknown(),\n errors: v.unknown(),\n extensions: v.unknown(),\n fees: v.unknown(),\n has_calculated_shipping: v.unknown(),\n items: v.array(WCStoreCartItemSchema),\n items_count: v.pipe(v.number(), v.integer()),\n items_weight: v.unknown(),\n needs_payment: v.unknown(),\n needs_shipping: v.unknown(),\n payment_methods: v.unknown(),\n payment_requirements: v.unknown(),\n shipping_address: v.unknown(),\n shipping_rates: v.unknown(),\n totals: v.unknown(),\n});\n"],"names":["v.object","v.string","v.number","v.boolean","v.enum","v.unknown","v.array","v.union","v.null","v.pipe","v.url","v.integer"],"mappings":";;AAIa,MAAA,8BAA8BA,OAAS;AAAA,EAClD,iBAAiBC,OAAS;AAAA,EAC1B,8BAA8BA,OAAS;AAAA,EACvC,uBAAuBC,OAAS;AAAA,EAChC,mBAAmBD,OAAS;AAAA,EAC5B,mBAAmBA,OAAS;AAAA,EAC5B,mBAAmBA,OAAS;AAAA,EAC5B,+BAA+BA,OAAS;AAAA,EACxC,iBAAiBA,OAAS;AAAA,EAC1B,qBAAqBA,OAAS;AAAA,EAC9B,cAAcA,OAAS;AAAA,EACvB,kBAAkBA,OAAS;AAC7B,CAAC;AAEY,MAAA,wBAAwBD,OAAS;AAAA,EAC5C,sBAAsBG,QAAU;AAAA,EAChC,sBAAsBC,MAAO,oBAAoB;AAAA,EACjD,eAAeH,OAAS;AAAA,EACxB,cAAcI,QAAU;AAAA,EACxB,MAAMH,OAAS;AAAA,EACf,UAAUI,MAAQD,SAAW;AAAA,EAC7B,aAAaC,MAAQD,SAAW;AAAA,EAChC,OAAOJ,OAAS;AAAA,EAChB,uBAAuBM,MAAQ,CAACC,MAAE,CAAM,CAAC;AAAA,EACzC,QAAQP,OAAS;AAAA,EACjB,aAAaQ,KAAOR,OAAY,GAAAS,KAAO;AAAA,EACvC,UAAUL,QAAU;AAAA,EACpB,YAAYH,OAAS;AAAA,EACrB,mBAAmBG,QAAU;AAAA,EAC7B,qBAAqBJ,OAAS;AAAA,EAC9B,wBAAwBE,QAAU;AAAA,EAClC,OAAOF,OAAS;AAAA,EAChB,qBAAqBE,QAAU;AAAA,EAC/B,UAAU;AAAA,EACV,QAAQF,OAAS;AAAA,EACjB,aAAaK,MAAQD,SAAW;AAClC,CAAC;AAEY,MAAA,oBAAoBL,OAAS;AAAA,EACxC,iBAAiBK,QAAU;AAAA,EAC3B,SAASA,QAAU;AAAA,EACnB,aAAaA,QAAU;AAAA,EACvB,QAAQA,QAAU;AAAA,EAClB,YAAYA,QAAU;AAAA,EACtB,MAAMA,QAAU;AAAA,EAChB,yBAAyBA,QAAU;AAAA,EACnC,OAAOC,MAAQ,qBAAqB;AAAA,EACpC,aAAaG,KAAOP,OAAY,GAAAS,SAAW;AAAA,EAC3C,cAAcN,QAAU;AAAA,EACxB,eAAeA,QAAU;AAAA,EACzB,gBAAgBA,QAAU;AAAA,EAC1B,iBAAiBA,QAAU;AAAA,EAC3B,sBAAsBA,QAAU;AAAA,EAChC,kBAAkBA,QAAU;AAAA,EAC5B,gBAAgBA,QAAU;AAAA,EAC1B,QAAQA,QAAU;AACpB,CAAC;"} \ No newline at end of file +{"version":3,"file":"cart.js","sources":["../../src/scripts/lib/schemas/cart.ts"],"sourcesContent":["import * as v from \"valibot\";\n\nimport { CATALOG_VISIBILITIES } from \"../../constantes/cart.ts\";\n\nexport const WCStoreCartItemTotalsSchema = v.object({\n \"currency_code\": v.string(),\n \"currency_decimal_separator\": v.string(),\n \"currency_minor_unit\": v.number(),\n \"currency_prefix\": v.string(),\n \"currency_suffix\": v.string(),\n \"currency_symbol\": v.string(),\n \"currency_thousand_separator\": v.string(),\n \"line_subtotal\": v.string(),\n \"line_subtotal_tax\": v.string(),\n \"line_total\": v.string(),\n \"line_total_tax\": v.string(),\n});\n\nexport const WCStoreCartItemSchema = v.object({\n \"backorders_allowed\": v.boolean(),\n \"catalog_visibility\": v.enum(CATALOG_VISIBILITIES),\n \"description\": v.string(),\n \"extensions\": v.unknown(),\n \"id\": v.number(),\n \"images\": v.array(v.unknown()),\n \"item_data\": v.array(v.unknown()),\n \"key\": v.string(),\n \"low_stock_remaining\": v.union([v.null()]),\n \"name\": v.string(),\n \"permalink\": v.pipe(v.string(), v.url()),\n \"prices\": v.unknown(),\n \"quantity\": v.number(),\n \"quantity_limits\": v.unknown(),\n \"short_description\": v.string(),\n \"show_backorder_badge\": v.boolean(),\n \"sku\": v.string(),\n \"sold_individually\": v.boolean(),\n \"totals\": WCStoreCartItemTotalsSchema,\n \"type\": v.string(),\n \"variation\": v.array(v.unknown()),\n});\n\nexport const WCStoreCartTotalsSchema = v.object({\n \"currency_code\": v.string(),\n \"currency_decimal_separator\": v.string(),\n \"currency_minor_unit\": v.number(),\n \"currency_prefix\": v.string(),\n \"currency_suffix\": v.string(),\n \"currency_symbol\": v.string(),\n \"currency_thousand_separator\": v.string(),\n \"tax_lines\": v.array(v.unknown()),\n \"total_discount\": v.string(),\n \"total_discount_tax\": v.string(),\n \"total_fees\": v.string(),\n \"total_fees_tax\": v.string(),\n \"total_items\": v.string(),\n \"total_items_tax\": v.string(),\n \"total_price\": v.string(),\n \"total_shipping\": v.union([v.string(), v.null()]),\n \"total_shipping_tax\": v.union([v.string(), v.null()]),\n \"total_tax\": v.string(),\n});\n\nexport const WCStoreCartSchema = v.object({\n billing_address: v.unknown(),\n coupons: v.unknown(),\n cross_sells: v.unknown(),\n errors: v.unknown(),\n extensions: v.unknown(),\n fees: v.unknown(),\n has_calculated_shipping: v.unknown(),\n items: v.array(WCStoreCartItemSchema),\n items_count: v.pipe(v.number(), v.integer()),\n items_weight: v.unknown(),\n needs_payment: v.unknown(),\n needs_shipping: v.unknown(),\n payment_methods: v.unknown(),\n payment_requirements: v.unknown(),\n shipping_address: v.unknown(),\n shipping_rates: v.unknown(),\n totals: WCStoreCartTotalsSchema,\n});\n"],"names":["v.object","v.string","v.number","v.boolean","v.enum","v.unknown","v.array","v.union","v.null","v.pipe","v.url","v.integer"],"mappings":";;AAIa,MAAA,8BAA8BA,OAAS;AAAA,EAClD,iBAAiBC,OAAS;AAAA,EAC1B,8BAA8BA,OAAS;AAAA,EACvC,uBAAuBC,OAAS;AAAA,EAChC,mBAAmBD,OAAS;AAAA,EAC5B,mBAAmBA,OAAS;AAAA,EAC5B,mBAAmBA,OAAS;AAAA,EAC5B,+BAA+BA,OAAS;AAAA,EACxC,iBAAiBA,OAAS;AAAA,EAC1B,qBAAqBA,OAAS;AAAA,EAC9B,cAAcA,OAAS;AAAA,EACvB,kBAAkBA,OAAS;AAC7B,CAAC;AAEY,MAAA,wBAAwBD,OAAS;AAAA,EAC5C,sBAAsBG,QAAU;AAAA,EAChC,sBAAsBC,MAAO,oBAAoB;AAAA,EACjD,eAAeH,OAAS;AAAA,EACxB,cAAcI,QAAU;AAAA,EACxB,MAAMH,OAAS;AAAA,EACf,UAAUI,MAAQD,SAAW;AAAA,EAC7B,aAAaC,MAAQD,SAAW;AAAA,EAChC,OAAOJ,OAAS;AAAA,EAChB,uBAAuBM,MAAQ,CAACC,MAAE,CAAM,CAAC;AAAA,EACzC,QAAQP,OAAS;AAAA,EACjB,aAAaQ,KAAOR,OAAY,GAAAS,KAAO;AAAA,EACvC,UAAUL,QAAU;AAAA,EACpB,YAAYH,OAAS;AAAA,EACrB,mBAAmBG,QAAU;AAAA,EAC7B,qBAAqBJ,OAAS;AAAA,EAC9B,wBAAwBE,QAAU;AAAA,EAClC,OAAOF,OAAS;AAAA,EAChB,qBAAqBE,QAAU;AAAA,EAC/B,UAAU;AAAA,EACV,QAAQF,OAAS;AAAA,EACjB,aAAaK,MAAQD,SAAW;AAClC,CAAC;AAEY,MAAA,0BAA0BL,OAAS;AAAA,EAC9C,iBAAiBC,OAAS;AAAA,EAC1B,8BAA8BA,OAAS;AAAA,EACvC,uBAAuBC,OAAS;AAAA,EAChC,mBAAmBD,OAAS;AAAA,EAC5B,mBAAmBA,OAAS;AAAA,EAC5B,mBAAmBA,OAAS;AAAA,EAC5B,+BAA+BA,OAAS;AAAA,EACxC,aAAaK,MAAQD,SAAW;AAAA,EAChC,kBAAkBJ,OAAS;AAAA,EAC3B,sBAAsBA,OAAS;AAAA,EAC/B,cAAcA,OAAS;AAAA,EACvB,kBAAkBA,OAAS;AAAA,EAC3B,eAAeA,OAAS;AAAA,EACxB,mBAAmBA,OAAS;AAAA,EAC5B,eAAeA,OAAS;AAAA,EACxB,kBAAkBM,MAAQ,CAACN,UAAYO,MAAQ,CAAA,CAAC;AAAA,EAChD,sBAAsBD,MAAQ,CAACN,UAAYO,MAAQ,CAAA,CAAC;AAAA,EACpD,aAAaP,OAAS;AACxB,CAAC;AAEY,MAAA,oBAAoBD,OAAS;AAAA,EACxC,iBAAiBK,QAAU;AAAA,EAC3B,SAASA,QAAU;AAAA,EACnB,aAAaA,QAAU;AAAA,EACvB,QAAQA,QAAU;AAAA,EAClB,YAAYA,QAAU;AAAA,EACtB,MAAMA,QAAU;AAAA,EAChB,yBAAyBA,QAAU;AAAA,EACnC,OAAOC,MAAQ,qBAAqB;AAAA,EACpC,aAAaG,KAAOP,OAAY,GAAAS,SAAW;AAAA,EAC3C,cAAcN,QAAU;AAAA,EACxB,eAAeA,QAAU;AAAA,EACzB,gBAAgBA,QAAU;AAAA,EAC1B,iBAAiBA,QAAU;AAAA,EAC3B,sBAAsBA,QAAU;AAAA,EAChC,kBAAkBA,QAAU;AAAA,EAC5B,gBAAgBA,QAAU;AAAA,EAC1B,QAAQ;AACV,CAAC;"} \ No newline at end of file diff --git a/web/app/themes/haiku-atelier-2024/assets/js/chunk-RU7WR4KH.D5j7HXCF.js b/web/app/themes/haiku-atelier-2024/assets/js/chunk-RU7WR4KH.D5j7HXCF.js new file mode 100644 index 00000000..23d7da2d --- /dev/null +++ b/web/app/themes/haiku-atelier-2024/assets/js/chunk-RU7WR4KH.D5j7HXCF.js @@ -0,0 +1,11 @@ +import { u } from "./utils.js"; +function r(...n) { + return u(e, n); +} +function e(n, o) { + return o(n), n; +} +export { + r +}; +//# sourceMappingURL=chunk-RU7WR4KH.D5j7HXCF.js.map diff --git a/web/app/themes/haiku-atelier-2024/assets/js/chunk-RU7WR4KH.D5j7HXCF.js.map b/web/app/themes/haiku-atelier-2024/assets/js/chunk-RU7WR4KH.D5j7HXCF.js.map new file mode 100644 index 00000000..53781ace --- /dev/null +++ b/web/app/themes/haiku-atelier-2024/assets/js/chunk-RU7WR4KH.D5j7HXCF.js.map @@ -0,0 +1 @@ +{"version":3,"file":"chunk-RU7WR4KH.D5j7HXCF.js","sources":["../../../../../../node_modules/.pnpm/remeda@2.14.0/node_modules/remeda/dist/chunk-RU7WR4KH.js"],"sourcesContent":["import{a as t}from\"./chunk-RAAYCPUM.js\";function r(...n){return t(e,n)}function e(n,o){return o(n),n}export{r as a};\n"],"names":["t"],"mappings":";AAAwC,SAAS,KAAK,GAAE;AAAC,SAAOA,EAAE,GAAE,CAAC;AAAC;AAAC,SAAS,EAAE,GAAE,GAAE;AAAC,SAAO,EAAE,CAAC,GAAE;AAAC;","x_google_ignoreList":[0]} \ No newline at end of file diff --git a/web/app/themes/haiku-atelier-2024/assets/js/dom.js b/web/app/themes/haiku-atelier-2024/assets/js/dom.js index a145c365..8ca10ef5 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/dom.js +++ b/web/app/themes/haiku-atelier-2024/assets/js/dom.js @@ -15,25 +15,27 @@ const SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE = "button.detail-produit__actions__ const SELECTEUR_BOUTON_ADDITION_QUANTITE = "button.detail-produit__actions__addition"; const SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER = "input"; const SELECTEUR_PRIX_LIGNE_PANIER = ".detail-produit__nom-prix span"; +const SELECTEUR_SOUS_TOTAL_PANIER = "#panneau-panier .panneau__sous-totaux__ligne strong"; const SELECTEUR_TOTAL_PANIER = "#panneau-panier .panneau__pied-de-page p span"; export { ATTRIBUT_CONTIENT_ARTICLES as A, SELECTEUR_BOUTON_PANIER as S, SELECTEUR_ENTREES_PANIER as a, SELECTEUR_CONTENEUR_PANIER as b, - SELECTEUR_TOTAL_PANIER as c, - ATTRIBUT_CLE_PANIER as d, - SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE as e, - SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER as f, - SELECTEUR_BOUTON_ADDITION_QUANTITE as g, - SELECTEUR_BOUTON_SUPPRESSION_PANIER as h, - SELECTEUR_PRIX_LIGNE_PANIER as i, - SELECTEUR_BOUTON_AJOUT_PANIER as j, - SELECTEUR_SELECTEUR_QUANTITE as k, - SELECTEUR_LIENS_ONGLETS as l, - SELECTEUR_SECTIONS_CONTENUS as m, - ATTRIBUT_ARIA_SELECTED as n, - ATTRIBUT_HIDDEN as o, - ATTRIBUT_DESACTIVE as p + SELECTEUR_SOUS_TOTAL_PANIER as c, + SELECTEUR_TOTAL_PANIER as d, + ATTRIBUT_CLE_PANIER as e, + SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE as f, + SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER as g, + SELECTEUR_BOUTON_ADDITION_QUANTITE as h, + SELECTEUR_BOUTON_SUPPRESSION_PANIER as i, + SELECTEUR_PRIX_LIGNE_PANIER as j, + ATTRIBUT_DESACTIVE as k, + SELECTEUR_BOUTON_AJOUT_PANIER as l, + SELECTEUR_SELECTEUR_QUANTITE as m, + SELECTEUR_LIENS_ONGLETS as n, + SELECTEUR_SECTIONS_CONTENUS as o, + ATTRIBUT_ARIA_SELECTED as p, + ATTRIBUT_HIDDEN as q }; //# sourceMappingURL=dom.js.map diff --git a/web/app/themes/haiku-atelier-2024/assets/js/dom.js.map b/web/app/themes/haiku-atelier-2024/assets/js/dom.js.map index eda10a1d..89339625 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/dom.js.map +++ b/web/app/themes/haiku-atelier-2024/assets/js/dom.js.map @@ -1 +1 @@ -{"version":3,"file":"dom.js","sources":["../../src/scripts/constantes/dom.ts"],"sourcesContent":["/** Constantes de valeurs pour la manipulation du DOM : sélecteurs et attributs. */\n\nexport const ATTRIBUT_ARIA_SELECTED = \"aria-selected\";\nexport const ATTRIBUT_ARIA_HIDDEN = \"aria-hidden\";\nexport const ATTRIBUT_HIDDEN = \"hidden\";\nexport const ATTRIBUT_CONTIENT_ARTICLES = \"data-contient-articles\";\nexport const ATTRIBUT_DESACTIVE = \"disabled\";\nexport const ATTRIBUT_CLE_PANIER = \"data-cle-panier\";\n\nexport const SELECTEUR_CONTENEUR_PANIER = \"#page-panier\";\nexport const SELECTEUR_BOUTON_PANIER = \".compte-panier a[rel='cart']\";\nexport const SELECTEUR_SELECTEUR_QUANTITE = \"#selecteur-variation\";\nexport const SELECTEUR_BOUTON_AJOUT_PANIER = \"#bouton-ajout-panier\";\nexport const SELECTEUR_LIENS_ONGLETS = \"a[role='tab']\";\nexport const SELECTEUR_SECTIONS_CONTENUS = \"section[role='tabpanel']\";\n\n// Panier\nexport const SELECTEUR_ENTREES_PANIER = \"article\";\nexport const SELECTEUR_BOUTON_SUPPRESSION_PANIER = \"button.detail-produit__actions__suppression\";\nexport const SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE = \"button.detail-produit__actions__soustraction\";\nexport const SELECTEUR_BOUTON_ADDITION_QUANTITE = \"button.detail-produit__actions__addition\";\nexport const SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER = \"input\";\nexport const SELECTEUR_PRIX_LIGNE_PANIER = \".detail-produit__nom-prix span\";\nexport const SELECTEUR_TOTAL_PANIER = \"#panneau-panier .panneau__pied-de-page p span\";\n"],"names":[],"mappings":"AAEO,MAAM,yBAAyB;AAE/B,MAAM,kBAAkB;AACxB,MAAM,6BAA6B;AACnC,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;AAE5B,MAAM,6BAA6B;AACnC,MAAM,0BAA0B;AAChC,MAAM,+BAA+B;AACrC,MAAM,gCAAgC;AACtC,MAAM,0BAA0B;AAChC,MAAM,8BAA8B;AAGpC,MAAM,2BAA2B;AACjC,MAAM,sCAAsC;AAC5C,MAAM,yCAAyC;AAC/C,MAAM,qCAAqC;AAC3C,MAAM,wCAAwC;AAC9C,MAAM,8BAA8B;AACpC,MAAM,yBAAyB;"} \ No newline at end of file +{"version":3,"file":"dom.js","sources":["../../src/scripts/constantes/dom.ts"],"sourcesContent":["/** Constantes de valeurs pour la manipulation du DOM : sélecteurs et attributs. */\n\nexport const ATTRIBUT_ARIA_SELECTED = \"aria-selected\";\nexport const ATTRIBUT_ARIA_HIDDEN = \"aria-hidden\";\nexport const ATTRIBUT_HIDDEN = \"hidden\";\nexport const ATTRIBUT_CONTIENT_ARTICLES = \"data-contient-articles\";\nexport const ATTRIBUT_DESACTIVE = \"disabled\";\nexport const ATTRIBUT_CLE_PANIER = \"data-cle-panier\";\n\nexport const SELECTEUR_CONTENEUR_PANIER = \"#page-panier\";\nexport const SELECTEUR_BOUTON_PANIER = \".compte-panier a[rel='cart']\";\nexport const SELECTEUR_SELECTEUR_QUANTITE = \"#selecteur-variation\";\nexport const SELECTEUR_BOUTON_AJOUT_PANIER = \"#bouton-ajout-panier\";\nexport const SELECTEUR_LIENS_ONGLETS = \"a[role='tab']\";\nexport const SELECTEUR_SECTIONS_CONTENUS = \"section[role='tabpanel']\";\n\n// Panier\nexport const SELECTEUR_ENTREES_PANIER = \"article\";\nexport const SELECTEUR_BOUTON_SUPPRESSION_PANIER = \"button.detail-produit__actions__suppression\";\nexport const SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE = \"button.detail-produit__actions__soustraction\";\nexport const SELECTEUR_BOUTON_ADDITION_QUANTITE = \"button.detail-produit__actions__addition\";\nexport const SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER = \"input\";\nexport const SELECTEUR_PRIX_LIGNE_PANIER = \".detail-produit__nom-prix span\";\nexport const SELECTEUR_SOUS_TOTAL_PANIER = \"#panneau-panier .panneau__sous-totaux__ligne strong\";\nexport const SELECTEUR_TOTAL_PANIER = \"#panneau-panier .panneau__pied-de-page p span\";\n"],"names":[],"mappings":"AAEO,MAAM,yBAAyB;AAE/B,MAAM,kBAAkB;AACxB,MAAM,6BAA6B;AACnC,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;AAE5B,MAAM,6BAA6B;AACnC,MAAM,0BAA0B;AAChC,MAAM,+BAA+B;AACrC,MAAM,gCAAgC;AACtC,MAAM,0BAA0B;AAChC,MAAM,8BAA8B;AAGpC,MAAM,2BAA2B;AACjC,MAAM,sCAAsC;AAC5C,MAAM,yCAAyC;AAC/C,MAAM,qCAAqC;AAC3C,MAAM,wCAAwC;AAC9C,MAAM,8BAA8B;AACpC,MAAM,8BAA8B;AACpC,MAAM,yBAAyB;"} \ No newline at end of file diff --git a/web/app/themes/haiku-atelier-2024/assets/js/erreurs.js b/web/app/themes/haiku-atelier-2024/assets/js/erreurs.js index 3d5b3203..bbba2690 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/erreurs.js +++ b/web/app/themes/haiku-atelier-2024/assets/js/erreurs.js @@ -32,6 +32,12 @@ class UnknownError extends Error { this.name = "UnknownError"; } } +class CleNonTrouveError extends Error { + constructor(message) { + super(JSON.stringify(message)); + this.name = "CleNonTrouveError"; + } +} const ErreurInconnue = (erreur) => new UnknownError(erreur); const leveErreur = (erreur) => { throw erreur; @@ -57,6 +63,7 @@ const reporteEtLeveErreur = (erreur) => { throw erreur; }; export { + CleNonTrouveError as C, ErreurInconnue as E, leveBadRequestError as a, leveUnauthorizedError as b, diff --git a/web/app/themes/haiku-atelier-2024/assets/js/erreurs.js.map b/web/app/themes/haiku-atelier-2024/assets/js/erreurs.js.map index 0324118a..f9ba8d1f 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/erreurs.js.map +++ b/web/app/themes/haiku-atelier-2024/assets/js/erreurs.js.map @@ -1 +1 @@ -{"version":3,"file":"erreurs.js","sources":["../../src/scripts/lib/erreurs.ts"],"sourcesContent":["/**\n * Fonctions pour la création d'Erreurs.\n */\n\nimport { captureException } from \"@sentry/browser\";\n\nimport type { WCErrorBody } from \"./types/api/erreurs\";\n\n/* Messages d'erreur */\nexport const ERREUR_SYNTAXE_INVALIDE = (selecteur: string): string => `Le selecteur \"${selecteur}\" est invalide`;\nexport const ERREUR_SELECTEUR_INEXISTANT = (selecteur: string): string =>\n `La requête \"${selecteur}\" n'a retourné aucun Élément.`;\n\n/* Création d'erreurs */\nexport const creeSyntaxError = (message: string): SyntaxError => new SyntaxError(message);\n\n/* Types d'erreurs */\nexport class BadRequestError extends Error {\n constructor(message = \"400 BadRequestError\") {\n super(message);\n this.name = \"BadRequestError\";\n }\n}\nexport class UnauthorizedError extends Error {\n constructor(message = \"401 UnauthorizedError\") {\n super(message);\n this.name = \"UnauthorizedError\";\n }\n}\nexport class NotFoundError extends Error {\n constructor(message = \"404 NotFoundError\") {\n super(message);\n this.name = \"NotFoundError\";\n }\n}\nexport class ServerError extends Error {\n constructor(message = \"500 ServerError\") {\n super(message);\n this.name = \"ServerError\";\n }\n}\nexport class UnknownError extends Error {\n constructor(message: unknown) {\n super(JSON.stringify(message));\n this.name = \"UnknownError\";\n }\n}\nexport class DOMElementAbsentError extends Error {\n constructor(message: unknown) {\n super(JSON.stringify(message));\n this.name = \"DOMElementAbsentError\";\n }\n}\n\n/* Fonction utilitaire pour créer ou lever des Erreurs */\nexport const Erreur = (message: string): Error => new Error(message);\nexport const ErreurInconnue = (erreur: unknown): UnknownError => new UnknownError(erreur);\n\n/* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Permet d'indiquer\nle type d'Erreur à l'appel de la fonction. */\nexport const leveErreur = (erreur: E): never => {\n throw erreur;\n};\nexport const leveBadRequestError = (erreur: WCErrorBody): never => {\n throw new BadRequestError(`(${erreur.code}) ${erreur.message}`);\n};\nexport const leveUnauthorizedError = (erreur: WCErrorBody): never => {\n throw new UnauthorizedError(`(${erreur.code}) ${erreur.message}`);\n};\nexport const leveNotFoundError = (erreur: WCErrorBody): never => {\n throw new NotFoundError(`(${erreur.code}) ${erreur.message}`);\n};\nexport const leveServerError = (message: string): never => {\n throw new ServerError(message);\n};\nexport const leveUnknownError = (erreur: unknown): never => {\n throw new UnknownError(erreur);\n};\n\n/**\n * Reporte une Erreur, sous forme d'erreur console et au service GlitchTip.\n *\n * @param erreur\n * @returns L'ID Sentry de l'évènement capturé.\n */\n/* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Permet d'indiquer\nle type d'Erreur à l'appel de la fonction. */\nexport const reporteErreur = (erreur: E): string => {\n console.error(erreur);\n return captureException(erreur);\n};\n\n/**\n * Reporte une Erreur, sous forme d'erreur console et au service GlitchTip, puis la lève sous forme\n * d'Exception.\n *\n * @param erreur\n * @returns never Lève une Erreur et ne retourne donc rien.\n */\n/* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Permet d'indiquer\nle type d'Erreur à l'appel de la fonction. */\nexport const reporteEtLeveErreur = (erreur: E): never => {\n reporteErreur(erreur);\n throw erreur;\n};\n"],"names":[],"mappings":";AASO,MAAM,0BAA0B,CAAC,cAA8B,iBAAiB,SAAS;AACzF,MAAM,8BAA8B,CAAC,cAC1C,eAAe,SAAS;AAGnB,MAAM,kBAAkB,CAAC,YAAiC,IAAI,YAAY,OAAO;AAGjF,MAAM,wBAAwB,MAAM;AAAA,EACzC,YAAY,UAAU,uBAAuB;AAC3C,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AACO,MAAM,0BAA0B,MAAM;AAAA,EAC3C,YAAY,UAAU,yBAAyB;AAC7C,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AACO,MAAM,sBAAsB,MAAM;AAAA,EACvC,YAAY,UAAU,qBAAqB;AACzC,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AACO,MAAM,oBAAoB,MAAM;AAAA,EACrC,YAAY,UAAU,mBAAmB;AACvC,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AACO,MAAM,qBAAqB,MAAM;AAAA,EACtC,YAAY,SAAkB;AACtB,UAAA,KAAK,UAAU,OAAO,CAAC;AAC7B,SAAK,OAAO;AAAA,EACd;AACF;AAUO,MAAM,iBAAiB,CAAC,WAAkC,IAAI,aAAa,MAAM;AAI3E,MAAA,aAAa,CAA0B,WAAqB;AACjE,QAAA;AACR;AACa,MAAA,sBAAsB,CAAC,WAA+B;AAC3D,QAAA,IAAI,gBAAgB,IAAI,OAAO,IAAI,KAAK,OAAO,OAAO,EAAE;AAChE;AACa,MAAA,wBAAwB,CAAC,WAA+B;AAC7D,QAAA,IAAI,kBAAkB,IAAI,OAAO,IAAI,KAAK,OAAO,OAAO,EAAE;AAClE;AACa,MAAA,oBAAoB,CAAC,WAA+B;AACzD,QAAA,IAAI,cAAc,IAAI,OAAO,IAAI,KAAK,OAAO,OAAO,EAAE;AAC9D;AACa,MAAA,kBAAkB,CAAC,YAA2B;AACnD,QAAA,IAAI,YAAY,OAAO;AAC/B;AAaa,MAAA,gBAAgB,CAAkB,WAAsB;AACnE,UAAQ,MAAM,MAAM;AACpB,SAAO,iBAAiB,MAAM;AAChC;AAWa,MAAA,sBAAsB,CAAkB,WAAqB;AACxE,gBAAiB,MAAM;AACjB,QAAA;AACR;"} \ No newline at end of file +{"version":3,"file":"erreurs.js","sources":["../../src/scripts/lib/erreurs.ts"],"sourcesContent":["/**\n * Fonctions pour la création d'Erreurs.\n */\n\nimport { captureException } from \"@sentry/browser\";\nimport { pipe } from \"remeda\";\n\nimport type { WCErrorBody } from \"./types/api/erreurs\";\n\n/* Messages d'erreur */\nexport const ERREUR_SYNTAXE_INVALIDE = (selecteur: string): string => `Le selecteur \"${selecteur}\" est invalide`;\nexport const ERREUR_SELECTEUR_INEXISTANT = (selecteur: string): string =>\n `La requête \"${selecteur}\" n'a retourné aucun Élément.`;\n\n/* Création d'erreurs */\nexport const creeSyntaxError = (message: string): SyntaxError => new SyntaxError(message);\n\n/* Types d'erreurs */\nexport class BadRequestError extends Error {\n constructor(message = \"400 BadRequestError\") {\n super(message);\n this.name = \"BadRequestError\";\n }\n}\nexport class UnauthorizedError extends Error {\n constructor(message = \"401 UnauthorizedError\") {\n super(message);\n this.name = \"UnauthorizedError\";\n }\n}\nexport class NotFoundError extends Error {\n constructor(message = \"404 NotFoundError\") {\n super(message);\n this.name = \"NotFoundError\";\n }\n}\nexport class ServerError extends Error {\n constructor(message = \"500 ServerError\") {\n super(message);\n this.name = \"ServerError\";\n }\n}\nexport class UnknownError extends Error {\n constructor(message: unknown) {\n super(JSON.stringify(message));\n this.name = \"UnknownError\";\n }\n}\nexport class DOMElementAbsentError extends Error {\n constructor(message: unknown) {\n super(JSON.stringify(message));\n this.name = \"DOMElementAbsentError\";\n }\n}\nexport class CleNonTrouveError extends Error {\n constructor(message: unknown) {\n super(JSON.stringify(message));\n this.name = \"CleNonTrouveError\";\n }\n}\n\n/* Fonction utilitaire pour créer ou lever des Erreurs */\nexport const Erreur = (message: string): Error => new Error(message);\nexport const ErreurInconnue = (erreur: unknown): UnknownError => new UnknownError(erreur);\n\nexport const leveErreur = (erreur: E): never => {\n throw erreur;\n};\nexport const leveBadRequestError = (erreur: WCErrorBody): never => {\n throw new BadRequestError(`(${erreur.code}) ${erreur.message}`);\n};\nexport const leveUnauthorizedError = (erreur: WCErrorBody): never => {\n throw new UnauthorizedError(`(${erreur.code}) ${erreur.message}`);\n};\nexport const leveNotFoundError = (erreur: WCErrorBody): never => {\n throw new NotFoundError(`(${erreur.code}) ${erreur.message}`);\n};\nexport const leveServerError = (message: string): never => {\n throw new ServerError(message);\n};\nexport const leveUnknownError = (erreur: unknown): never => {\n throw new UnknownError(erreur);\n};\n\n/**\n * Reporte une Erreur, sous forme d'erreur console et au service GlitchTip.\n *\n * @param erreur\n * @returns L'ID Sentry de l'évènement capturé.\n */\n\nexport const reporteErreur = (erreur: E): string => {\n console.error(erreur);\n return captureException(erreur);\n};\n\n/**\n * Reporte une Erreur, sous forme d'erreur console et au service GlitchTip, puis la lève sous forme\n * d'Exception.\n *\n * @param erreur\n * @returns never Lève une Erreur et ne retourne donc rien.\n */\n\nexport const reporteEtLeveErreur = (erreur: E): never => {\n reporteErreur(erreur);\n throw erreur;\n};\n/**\n * Fonction utilitaire pour rapidement créer et reporter une Erreur DOMElementAbsent.\n *\n * @param message\n * @returns L'ID Sentry de l'évènement capturé.\n */\nexport const reporteErreurDOMElementAbsent = (message: string): string =>\n pipe(\n new DOMElementAbsentError(message),\n reporteErreur,\n );\n"],"names":[],"mappings":";AAUO,MAAM,0BAA0B,CAAC,cAA8B,iBAAiB,SAAS;AACzF,MAAM,8BAA8B,CAAC,cAC1C,eAAe,SAAS;AAGnB,MAAM,kBAAkB,CAAC,YAAiC,IAAI,YAAY,OAAO;AAGjF,MAAM,wBAAwB,MAAM;AAAA,EACzC,YAAY,UAAU,uBAAuB;AAC3C,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AACO,MAAM,0BAA0B,MAAM;AAAA,EAC3C,YAAY,UAAU,yBAAyB;AAC7C,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AACO,MAAM,sBAAsB,MAAM;AAAA,EACvC,YAAY,UAAU,qBAAqB;AACzC,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AACO,MAAM,oBAAoB,MAAM;AAAA,EACrC,YAAY,UAAU,mBAAmB;AACvC,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AACO,MAAM,qBAAqB,MAAM;AAAA,EACtC,YAAY,SAAkB;AACtB,UAAA,KAAK,UAAU,OAAO,CAAC;AAC7B,SAAK,OAAO;AAAA,EACd;AACF;AAOO,MAAM,0BAA0B,MAAM;AAAA,EAC3C,YAAY,SAAkB;AACtB,UAAA,KAAK,UAAU,OAAO,CAAC;AAC7B,SAAK,OAAO;AAAA,EACd;AACF;AAIO,MAAM,iBAAiB,CAAC,WAAkC,IAAI,aAAa,MAAM;AAE3E,MAAA,aAAa,CAA0B,WAAqB;AACjE,QAAA;AACR;AACa,MAAA,sBAAsB,CAAC,WAA+B;AAC3D,QAAA,IAAI,gBAAgB,IAAI,OAAO,IAAI,KAAK,OAAO,OAAO,EAAE;AAChE;AACa,MAAA,wBAAwB,CAAC,WAA+B;AAC7D,QAAA,IAAI,kBAAkB,IAAI,OAAO,IAAI,KAAK,OAAO,OAAO,EAAE;AAClE;AACa,MAAA,oBAAoB,CAAC,WAA+B;AACzD,QAAA,IAAI,cAAc,IAAI,OAAO,IAAI,KAAK,OAAO,OAAO,EAAE;AAC9D;AACa,MAAA,kBAAkB,CAAC,YAA2B;AACnD,QAAA,IAAI,YAAY,OAAO;AAC/B;AAYa,MAAA,gBAAgB,CAAkB,WAAsB;AACnE,UAAQ,MAAM,MAAM;AACpB,SAAO,iBAAiB,MAAM;AAChC;AAUa,MAAA,sBAAsB,CAAkB,WAAqB;AACxE,gBAAiB,MAAM;AACjB,QAAA;AACR;"} \ No newline at end of file diff --git a/web/app/themes/haiku-atelier-2024/assets/js/index.y02cst4L.js b/web/app/themes/haiku-atelier-2024/assets/js/index.CeK6pfoJ.js similarity index 94% rename from web/app/themes/haiku-atelier-2024/assets/js/index.y02cst4L.js rename to web/app/themes/haiku-atelier-2024/assets/js/index.CeK6pfoJ.js index 4e8f7207..157c1457 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/index.y02cst4L.js +++ b/web/app/themes/haiku-atelier-2024/assets/js/index.CeK6pfoJ.js @@ -1,23 +1,3 @@ -function u$2(t2, n2, a2) { - let o2 = (r2) => t2(r2, ...n2); - return a2 === void 0 ? o2 : Object.assign(o2, { lazy: a2, lazyArgs: n2 }); -} -function u$1(r2, n2, a2) { - let o2 = r2.length - n2.length; - if (o2 === 0) return r2(...n2); - if (o2 === 1) return u$2(r2, n2, a2); - throw new Error("Wrong number of arguments"); -} -function r$1(...n2) { - return u$1(e$1, n2); -} -function e$1(n2, o2) { - return o2(n2), n2; -} -function p$1(...o2) { - return u$1(t$1, o2); -} -var t$1 = (o2, e2) => o2[e2]; const t = Symbol.for("@ts-pattern/matcher"), e = Symbol.for("@ts-pattern/isVariadic"), n = "@ts-pattern/anonymous-select-key", r = (t2) => Boolean(t2 && "object" == typeof t2), i = (e2) => e2 && !!e2[t], s = (n2, o2, c2) => { if (i(n2)) { const e2 = n2[t](), { matched: r2, selections: i2 } = e2.match(o2); @@ -258,8 +238,6 @@ class I { } export { N, - p$1 as p, - r$1 as r, z }; -//# sourceMappingURL=index.y02cst4L.js.map +//# sourceMappingURL=index.CeK6pfoJ.js.map diff --git a/web/app/themes/haiku-atelier-2024/assets/js/index.CeK6pfoJ.js.map b/web/app/themes/haiku-atelier-2024/assets/js/index.CeK6pfoJ.js.map new file mode 100644 index 00000000..b8e3a19a --- /dev/null +++ b/web/app/themes/haiku-atelier-2024/assets/js/index.CeK6pfoJ.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.CeK6pfoJ.js","sources":["../../../../../../node_modules/.pnpm/ts-pattern@5.4.0/node_modules/ts-pattern/dist/index.js"],"sourcesContent":["const t=Symbol.for(\"@ts-pattern/matcher\"),e=Symbol.for(\"@ts-pattern/isVariadic\"),n=\"@ts-pattern/anonymous-select-key\",r=t=>Boolean(t&&\"object\"==typeof t),i=e=>e&&!!e[t],s=(n,o,c)=>{if(i(n)){const e=n[t](),{matched:r,selections:i}=e.match(o);return r&&i&&Object.keys(i).forEach(t=>c(t,i[t])),r}if(r(n)){if(!r(o))return!1;if(Array.isArray(n)){if(!Array.isArray(o))return!1;let t=[],r=[],a=[];for(const s of n.keys()){const o=n[s];i(o)&&o[e]?a.push(o):a.length?r.push(o):t.push(o)}if(a.length){if(a.length>1)throw new Error(\"Pattern error: Using `...P.array(...)` several times in a single pattern is not allowed.\");if(o.lengths(t,e[n],c))&&r.every((t,e)=>s(t,n[e],c))&&(0===a.length||s(a[0],i,c))}return n.length===o.length&&n.every((t,e)=>s(t,o[e],c))}return Reflect.ownKeys(n).every(e=>{const r=n[e];return(e in o||i(a=r)&&\"optional\"===a[t]().matcherType)&&s(r,o[e],c);var a})}return Object.is(o,n)},o=e=>{var n,s,a;return r(e)?i(e)?null!=(n=null==(s=(a=e[t]()).getSelectionKeys)?void 0:s.call(a))?n:[]:Array.isArray(e)?c(e,o):c(Object.values(e),o):[]},c=(t,e)=>t.reduce((t,n)=>t.concat(e(n)),[]);function a(...t){if(1===t.length){const[e]=t;return t=>s(e,t,()=>{})}if(2===t.length){const[e,n]=t;return s(e,n,()=>{})}throw new Error(`isMatching wasn't given the right number of arguments: expected 1 or 2, received ${t.length}.`)}function u(t){return Object.assign(t,{optional:()=>h(t),and:e=>m(t,e),or:e=>d(t,e),select:e=>void 0===e?y(t):y(e,t)})}function l(t){return Object.assign((t=>Object.assign(t,{[Symbol.iterator](){let n=0;const r=[{value:Object.assign(t,{[e]:!0}),done:!1},{done:!0,value:void 0}];return{next:()=>{var t;return null!=(t=r[n++])?t:r.at(-1)}}}}))(t),{optional:()=>l(h(t)),select:e=>l(void 0===e?y(t):y(e,t))})}function h(e){return u({[t]:()=>({match:t=>{let n={};const r=(t,e)=>{n[t]=e};return void 0===t?(o(e).forEach(t=>r(t,void 0)),{matched:!0,selections:n}):{matched:s(e,t,r),selections:n}},getSelectionKeys:()=>o(e),matcherType:\"optional\"})})}const f=(t,e)=>{for(const n of t)if(!e(n))return!1;return!0},g=(t,e)=>{for(const[n,r]of t.entries())if(!e(r,n))return!1;return!0};function m(...e){return u({[t]:()=>({match:t=>{let n={};const r=(t,e)=>{n[t]=e};return{matched:e.every(e=>s(e,t,r)),selections:n}},getSelectionKeys:()=>c(e,o),matcherType:\"and\"})})}function d(...e){return u({[t]:()=>({match:t=>{let n={};const r=(t,e)=>{n[t]=e};return c(e,o).forEach(t=>r(t,void 0)),{matched:e.some(e=>s(e,t,r)),selections:n}},getSelectionKeys:()=>c(e,o),matcherType:\"or\"})})}function p(e){return{[t]:()=>({match:t=>({matched:Boolean(e(t))})})}}function y(...e){const r=\"string\"==typeof e[0]?e[0]:void 0,i=2===e.length?e[1]:\"string\"==typeof e[0]?void 0:e[0];return u({[t]:()=>({match:t=>{let e={[null!=r?r:n]:t};return{matched:void 0===i||s(i,t,(t,n)=>{e[t]=n}),selections:e}},getSelectionKeys:()=>[null!=r?r:n].concat(void 0===i?[]:o(i))})})}function v(t){return\"number\"==typeof t}function b(t){return\"string\"==typeof t}function w(t){return\"bigint\"==typeof t}const S=u(p(function(t){return!0})),O=S,j=t=>Object.assign(u(t),{startsWith:e=>{return j(m(t,(n=e,p(t=>b(t)&&t.startsWith(n)))));var n},endsWith:e=>{return j(m(t,(n=e,p(t=>b(t)&&t.endsWith(n)))));var n},minLength:e=>j(m(t,(t=>p(e=>b(e)&&e.length>=t))(e))),length:e=>j(m(t,(t=>p(e=>b(e)&&e.length===t))(e))),maxLength:e=>j(m(t,(t=>p(e=>b(e)&&e.length<=t))(e))),includes:e=>{return j(m(t,(n=e,p(t=>b(t)&&t.includes(n)))));var n},regex:e=>{return j(m(t,(n=e,p(t=>b(t)&&Boolean(t.match(n))))));var n}}),K=j(p(b)),x=t=>Object.assign(u(t),{between:(e,n)=>x(m(t,((t,e)=>p(n=>v(n)&&t<=n&&e>=n))(e,n))),lt:e=>x(m(t,(t=>p(e=>v(e)&&ex(m(t,(t=>p(e=>v(e)&&e>t))(e))),lte:e=>x(m(t,(t=>p(e=>v(e)&&e<=t))(e))),gte:e=>x(m(t,(t=>p(e=>v(e)&&e>=t))(e))),int:()=>x(m(t,p(t=>v(t)&&Number.isInteger(t)))),finite:()=>x(m(t,p(t=>v(t)&&Number.isFinite(t)))),positive:()=>x(m(t,p(t=>v(t)&&t>0))),negative:()=>x(m(t,p(t=>v(t)&&t<0)))}),E=x(p(v)),A=t=>Object.assign(u(t),{between:(e,n)=>A(m(t,((t,e)=>p(n=>w(n)&&t<=n&&e>=n))(e,n))),lt:e=>A(m(t,(t=>p(e=>w(e)&&eA(m(t,(t=>p(e=>w(e)&&e>t))(e))),lte:e=>A(m(t,(t=>p(e=>w(e)&&e<=t))(e))),gte:e=>A(m(t,(t=>p(e=>w(e)&&e>=t))(e))),positive:()=>A(m(t,p(t=>w(t)&&t>0))),negative:()=>A(m(t,p(t=>w(t)&&t<0)))}),P=A(p(w)),T=u(p(function(t){return\"boolean\"==typeof t})),B=u(p(function(t){return\"symbol\"==typeof t})),_=u(p(function(t){return null==t})),k=u(p(function(t){return null!=t}));var N={__proto__:null,matcher:t,optional:h,array:function(...e){return l({[t]:()=>({match:t=>{if(!Array.isArray(t))return{matched:!1};if(0===e.length)return{matched:!0};const n=e[0];let r={};if(0===t.length)return o(n).forEach(t=>{r[t]=[]}),{matched:!0,selections:r};const i=(t,e)=>{r[t]=(r[t]||[]).concat([e])};return{matched:t.every(t=>s(n,t,i)),selections:r}},getSelectionKeys:()=>0===e.length?[]:o(e[0])})})},set:function(...e){return u({[t]:()=>({match:t=>{if(!(t instanceof Set))return{matched:!1};let n={};if(0===t.size)return{matched:!0,selections:n};if(0===e.length)return{matched:!0};const r=(t,e)=>{n[t]=(n[t]||[]).concat([e])},i=e[0];return{matched:f(t,t=>s(i,t,r)),selections:n}},getSelectionKeys:()=>0===e.length?[]:o(e[0])})})},map:function(...e){return u({[t]:()=>({match:t=>{if(!(t instanceof Map))return{matched:!1};let n={};if(0===t.size)return{matched:!0,selections:n};const r=(t,e)=>{n[t]=(n[t]||[]).concat([e])};if(0===e.length)return{matched:!0};var i;if(1===e.length)throw new Error(`\\`P.map\\` wasn't given enough arguments. Expected (key, value), received ${null==(i=e[0])?void 0:i.toString()}`);const[o,c]=e;return{matched:g(t,(t,e)=>{const n=s(o,e,r),i=s(c,t,r);return n&&i}),selections:n}},getSelectionKeys:()=>0===e.length?[]:[...o(e[0]),...o(e[1])]})})},intersection:m,union:d,not:function(e){return u({[t]:()=>({match:t=>({matched:!s(e,t,()=>{})}),getSelectionKeys:()=>[],matcherType:\"not\"})})},when:p,select:y,any:S,_:O,string:K,number:E,bigint:P,boolean:T,symbol:B,nullish:_,nonNullable:k,instanceOf:function(t){return u(p(function(t){return e=>e instanceof t}(t)))},shape:function(t){return u(p(a(t)))}};class W extends Error{constructor(t){let e;try{e=JSON.stringify(t)}catch(n){e=t}super(`Pattern matching error: no pattern matches value ${e}`),this.input=void 0,this.input=t}}const $={matched:!1,value:void 0};function z(t){return new I(t,$)}class I{constructor(t,e){this.input=void 0,this.state=void 0,this.input=t,this.state=e}with(...t){if(this.state.matched)return this;const e=t[t.length-1],r=[t[0]];let i;3===t.length&&\"function\"==typeof t[1]?i=t[1]:t.length>2&&r.push(...t.slice(1,t.length-1));let o=!1,c={};const a=(t,e)=>{o=!0,c[t]=e},u=!r.some(t=>s(t,this.input,a))||i&&!Boolean(i(this.input))?$:{matched:!0,value:e(o?n in c?c[n]:c:this.input,this.input)};return new I(this.input,u)}when(t,e){if(this.state.matched)return this;const n=Boolean(t(this.input));return new I(this.input,n?{matched:!0,value:e(this.input,this.input)}:$)}otherwise(t){return this.state.matched?this.state.value:t(this.input)}exhaustive(){if(this.state.matched)return this.state.value;throw new W(this.input)}run(){return this.exhaustive()}returnType(){return this}}export{W as NonExhaustiveError,N as P,N as Pattern,a as isMatching,z as match};\n//# sourceMappingURL=index.js.map\n"],"names":["t","e","n","o","c","r","i","a","s","u"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file diff --git a/web/app/themes/haiku-atelier-2024/assets/js/index.y02cst4L.js.map b/web/app/themes/haiku-atelier-2024/assets/js/index.y02cst4L.js.map deleted file mode 100644 index 9e60d9ff..00000000 --- a/web/app/themes/haiku-atelier-2024/assets/js/index.y02cst4L.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.y02cst4L.js","sources":["../../../../../../node_modules/.pnpm/remeda@2.14.0/node_modules/remeda/dist/chunk-K26VP6CL.js","../../../../../../node_modules/.pnpm/remeda@2.14.0/node_modules/remeda/dist/chunk-RAAYCPUM.js","../../../../../../node_modules/.pnpm/remeda@2.14.0/node_modules/remeda/dist/chunk-RU7WR4KH.js","../../../../../../node_modules/.pnpm/remeda@2.14.0/node_modules/remeda/dist/chunk-VROY5Y5B.js","../../../../../../node_modules/.pnpm/ts-pattern@5.4.0/node_modules/ts-pattern/dist/index.js"],"sourcesContent":["function u(t,n,a){let o=r=>t(r,...n);return a===void 0?o:Object.assign(o,{lazy:a,lazyArgs:n})}export{u as a};\n","import{a as t}from\"./chunk-K26VP6CL.js\";function u(r,n,a){let o=r.length-n.length;if(o===0)return r(...n);if(o===1)return t(r,n,a);throw new Error(\"Wrong number of arguments\")}export{u as a};\n","import{a as t}from\"./chunk-RAAYCPUM.js\";function r(...n){return t(e,n)}function e(n,o){return o(n),n}export{r as a};\n","import{a as n}from\"./chunk-RAAYCPUM.js\";function p(...o){return n(t,o)}var t=(o,e)=>o[e];export{p as a,t as b};\n","const t=Symbol.for(\"@ts-pattern/matcher\"),e=Symbol.for(\"@ts-pattern/isVariadic\"),n=\"@ts-pattern/anonymous-select-key\",r=t=>Boolean(t&&\"object\"==typeof t),i=e=>e&&!!e[t],s=(n,o,c)=>{if(i(n)){const e=n[t](),{matched:r,selections:i}=e.match(o);return r&&i&&Object.keys(i).forEach(t=>c(t,i[t])),r}if(r(n)){if(!r(o))return!1;if(Array.isArray(n)){if(!Array.isArray(o))return!1;let t=[],r=[],a=[];for(const s of n.keys()){const o=n[s];i(o)&&o[e]?a.push(o):a.length?r.push(o):t.push(o)}if(a.length){if(a.length>1)throw new Error(\"Pattern error: Using `...P.array(...)` several times in a single pattern is not allowed.\");if(o.lengths(t,e[n],c))&&r.every((t,e)=>s(t,n[e],c))&&(0===a.length||s(a[0],i,c))}return n.length===o.length&&n.every((t,e)=>s(t,o[e],c))}return Reflect.ownKeys(n).every(e=>{const r=n[e];return(e in o||i(a=r)&&\"optional\"===a[t]().matcherType)&&s(r,o[e],c);var a})}return Object.is(o,n)},o=e=>{var n,s,a;return r(e)?i(e)?null!=(n=null==(s=(a=e[t]()).getSelectionKeys)?void 0:s.call(a))?n:[]:Array.isArray(e)?c(e,o):c(Object.values(e),o):[]},c=(t,e)=>t.reduce((t,n)=>t.concat(e(n)),[]);function a(...t){if(1===t.length){const[e]=t;return t=>s(e,t,()=>{})}if(2===t.length){const[e,n]=t;return s(e,n,()=>{})}throw new Error(`isMatching wasn't given the right number of arguments: expected 1 or 2, received ${t.length}.`)}function u(t){return Object.assign(t,{optional:()=>h(t),and:e=>m(t,e),or:e=>d(t,e),select:e=>void 0===e?y(t):y(e,t)})}function l(t){return Object.assign((t=>Object.assign(t,{[Symbol.iterator](){let n=0;const r=[{value:Object.assign(t,{[e]:!0}),done:!1},{done:!0,value:void 0}];return{next:()=>{var t;return null!=(t=r[n++])?t:r.at(-1)}}}}))(t),{optional:()=>l(h(t)),select:e=>l(void 0===e?y(t):y(e,t))})}function h(e){return u({[t]:()=>({match:t=>{let n={};const r=(t,e)=>{n[t]=e};return void 0===t?(o(e).forEach(t=>r(t,void 0)),{matched:!0,selections:n}):{matched:s(e,t,r),selections:n}},getSelectionKeys:()=>o(e),matcherType:\"optional\"})})}const f=(t,e)=>{for(const n of t)if(!e(n))return!1;return!0},g=(t,e)=>{for(const[n,r]of t.entries())if(!e(r,n))return!1;return!0};function m(...e){return u({[t]:()=>({match:t=>{let n={};const r=(t,e)=>{n[t]=e};return{matched:e.every(e=>s(e,t,r)),selections:n}},getSelectionKeys:()=>c(e,o),matcherType:\"and\"})})}function d(...e){return u({[t]:()=>({match:t=>{let n={};const r=(t,e)=>{n[t]=e};return c(e,o).forEach(t=>r(t,void 0)),{matched:e.some(e=>s(e,t,r)),selections:n}},getSelectionKeys:()=>c(e,o),matcherType:\"or\"})})}function p(e){return{[t]:()=>({match:t=>({matched:Boolean(e(t))})})}}function y(...e){const r=\"string\"==typeof e[0]?e[0]:void 0,i=2===e.length?e[1]:\"string\"==typeof e[0]?void 0:e[0];return u({[t]:()=>({match:t=>{let e={[null!=r?r:n]:t};return{matched:void 0===i||s(i,t,(t,n)=>{e[t]=n}),selections:e}},getSelectionKeys:()=>[null!=r?r:n].concat(void 0===i?[]:o(i))})})}function v(t){return\"number\"==typeof t}function b(t){return\"string\"==typeof t}function w(t){return\"bigint\"==typeof t}const S=u(p(function(t){return!0})),O=S,j=t=>Object.assign(u(t),{startsWith:e=>{return j(m(t,(n=e,p(t=>b(t)&&t.startsWith(n)))));var n},endsWith:e=>{return j(m(t,(n=e,p(t=>b(t)&&t.endsWith(n)))));var n},minLength:e=>j(m(t,(t=>p(e=>b(e)&&e.length>=t))(e))),length:e=>j(m(t,(t=>p(e=>b(e)&&e.length===t))(e))),maxLength:e=>j(m(t,(t=>p(e=>b(e)&&e.length<=t))(e))),includes:e=>{return j(m(t,(n=e,p(t=>b(t)&&t.includes(n)))));var n},regex:e=>{return j(m(t,(n=e,p(t=>b(t)&&Boolean(t.match(n))))));var n}}),K=j(p(b)),x=t=>Object.assign(u(t),{between:(e,n)=>x(m(t,((t,e)=>p(n=>v(n)&&t<=n&&e>=n))(e,n))),lt:e=>x(m(t,(t=>p(e=>v(e)&&ex(m(t,(t=>p(e=>v(e)&&e>t))(e))),lte:e=>x(m(t,(t=>p(e=>v(e)&&e<=t))(e))),gte:e=>x(m(t,(t=>p(e=>v(e)&&e>=t))(e))),int:()=>x(m(t,p(t=>v(t)&&Number.isInteger(t)))),finite:()=>x(m(t,p(t=>v(t)&&Number.isFinite(t)))),positive:()=>x(m(t,p(t=>v(t)&&t>0))),negative:()=>x(m(t,p(t=>v(t)&&t<0)))}),E=x(p(v)),A=t=>Object.assign(u(t),{between:(e,n)=>A(m(t,((t,e)=>p(n=>w(n)&&t<=n&&e>=n))(e,n))),lt:e=>A(m(t,(t=>p(e=>w(e)&&eA(m(t,(t=>p(e=>w(e)&&e>t))(e))),lte:e=>A(m(t,(t=>p(e=>w(e)&&e<=t))(e))),gte:e=>A(m(t,(t=>p(e=>w(e)&&e>=t))(e))),positive:()=>A(m(t,p(t=>w(t)&&t>0))),negative:()=>A(m(t,p(t=>w(t)&&t<0)))}),P=A(p(w)),T=u(p(function(t){return\"boolean\"==typeof t})),B=u(p(function(t){return\"symbol\"==typeof t})),_=u(p(function(t){return null==t})),k=u(p(function(t){return null!=t}));var N={__proto__:null,matcher:t,optional:h,array:function(...e){return l({[t]:()=>({match:t=>{if(!Array.isArray(t))return{matched:!1};if(0===e.length)return{matched:!0};const n=e[0];let r={};if(0===t.length)return o(n).forEach(t=>{r[t]=[]}),{matched:!0,selections:r};const i=(t,e)=>{r[t]=(r[t]||[]).concat([e])};return{matched:t.every(t=>s(n,t,i)),selections:r}},getSelectionKeys:()=>0===e.length?[]:o(e[0])})})},set:function(...e){return u({[t]:()=>({match:t=>{if(!(t instanceof Set))return{matched:!1};let n={};if(0===t.size)return{matched:!0,selections:n};if(0===e.length)return{matched:!0};const r=(t,e)=>{n[t]=(n[t]||[]).concat([e])},i=e[0];return{matched:f(t,t=>s(i,t,r)),selections:n}},getSelectionKeys:()=>0===e.length?[]:o(e[0])})})},map:function(...e){return u({[t]:()=>({match:t=>{if(!(t instanceof Map))return{matched:!1};let n={};if(0===t.size)return{matched:!0,selections:n};const r=(t,e)=>{n[t]=(n[t]||[]).concat([e])};if(0===e.length)return{matched:!0};var i;if(1===e.length)throw new Error(`\\`P.map\\` wasn't given enough arguments. Expected (key, value), received ${null==(i=e[0])?void 0:i.toString()}`);const[o,c]=e;return{matched:g(t,(t,e)=>{const n=s(o,e,r),i=s(c,t,r);return n&&i}),selections:n}},getSelectionKeys:()=>0===e.length?[]:[...o(e[0]),...o(e[1])]})})},intersection:m,union:d,not:function(e){return u({[t]:()=>({match:t=>({matched:!s(e,t,()=>{})}),getSelectionKeys:()=>[],matcherType:\"not\"})})},when:p,select:y,any:S,_:O,string:K,number:E,bigint:P,boolean:T,symbol:B,nullish:_,nonNullable:k,instanceOf:function(t){return u(p(function(t){return e=>e instanceof t}(t)))},shape:function(t){return u(p(a(t)))}};class W extends Error{constructor(t){let e;try{e=JSON.stringify(t)}catch(n){e=t}super(`Pattern matching error: no pattern matches value ${e}`),this.input=void 0,this.input=t}}const $={matched:!1,value:void 0};function z(t){return new I(t,$)}class I{constructor(t,e){this.input=void 0,this.state=void 0,this.input=t,this.state=e}with(...t){if(this.state.matched)return this;const e=t[t.length-1],r=[t[0]];let i;3===t.length&&\"function\"==typeof t[1]?i=t[1]:t.length>2&&r.push(...t.slice(1,t.length-1));let o=!1,c={};const a=(t,e)=>{o=!0,c[t]=e},u=!r.some(t=>s(t,this.input,a))||i&&!Boolean(i(this.input))?$:{matched:!0,value:e(o?n in c?c[n]:c:this.input,this.input)};return new I(this.input,u)}when(t,e){if(this.state.matched)return this;const n=Boolean(t(this.input));return new I(this.input,n?{matched:!0,value:e(this.input,this.input)}:$)}otherwise(t){return this.state.matched?this.state.value:t(this.input)}exhaustive(){if(this.state.matched)return this.state.value;throw new W(this.input)}run(){return this.exhaustive()}returnType(){return this}}export{W as NonExhaustiveError,N as P,N as Pattern,a as isMatching,z as match};\n//# sourceMappingURL=index.js.map\n"],"names":["u","t","n","a","o","r","e","p","c","i","s"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4]} \ No newline at end of file diff --git a/web/app/themes/haiku-atelier-2024/assets/js/messages.js b/web/app/themes/haiku-atelier-2024/assets/js/messages.js index 9c7666c3..2a0e884f 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/messages.js +++ b/web/app/themes/haiku-atelier-2024/assets/js/messages.js @@ -1,23 +1,37 @@ import { p as parse } from "./index.DD7qm8S6.js"; +import { N as NOM_CANAL_BOUTON_PANIER, T as TYPES_MESSAGES, a as NOM_CANAL_CONTENU_PANIER } from "./messages3.js"; import { r as reporteErreur } from "./erreurs.js"; import { M as MessageMajBoutonPanierSchema, a as MessageMajContenuPanierSchema } from "./messages2.js"; import { E as Either } from "./Either.wHNxn7Os.js"; import "./exports.DNZBdkMD.js"; -import "./messages3.js"; import "./cart.js"; import "./cart2.js"; +const emetMessageMajBoutonPanier = (args) => { + new BroadcastChannel(NOM_CANAL_BOUTON_PANIER).postMessage({ + donnees: { + quantiteProduits: args.quantiteProduits + }, + type: TYPES_MESSAGES.MajBoutonPanier + }); +}; +const emetMessageMajContenuPanier = (args) => new BroadcastChannel(NOM_CANAL_CONTENU_PANIER).postMessage({ + donnees: { + produits: args.produits, + sousTotalPanier: args.sousTotalPanier, + totalPanier: args.totalPanier + }, + type: TYPES_MESSAGES.MajContenuPanier +}); const valideMessageMajBoutonPanier = (evenementMessage) => Either.of( parse(MessageMajBoutonPanierSchema, evenementMessage.data) -).ifLeft((erreur) => { - reporteErreur(erreur); -}); +).ifLeft((erreur) => reporteErreur(erreur)); const valideMessageMajContenuPanier = (evenementMessage) => Either.of( parse(MessageMajContenuPanierSchema, evenementMessage.data) -).ifLeft((erreur) => { - reporteErreur(erreur); -}); +).ifLeft((erreur) => reporteErreur(erreur)); export { valideMessageMajContenuPanier as a, + emetMessageMajContenuPanier as b, + emetMessageMajBoutonPanier as e, valideMessageMajBoutonPanier as v }; //# sourceMappingURL=messages.js.map diff --git a/web/app/themes/haiku-atelier-2024/assets/js/messages.js.map b/web/app/themes/haiku-atelier-2024/assets/js/messages.js.map index 21fc95f4..9000008e 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/messages.js.map +++ b/web/app/themes/haiku-atelier-2024/assets/js/messages.js.map @@ -1 +1 @@ -{"version":3,"file":"messages.js","sources":["../../src/scripts/lib/messages.ts"],"sourcesContent":["import { Either } from \"purify-ts\";\nimport { parse, type ValiError } from \"valibot\";\n\nimport type { MessageMajBoutonPanier, MessageMajContenuPanier } from \"./types/messages\";\n\nimport { reporteErreur } from \"./erreurs.ts\";\nimport { MessageMajBoutonPanierSchema, MessageMajContenuPanierSchema } from \"./schemas/messages.ts\";\n\nexport const valideMessageMajBoutonPanier = (\n evenementMessage: MessageEvent,\n): Either, MessageMajBoutonPanier> =>\n Either\n .of, MessageMajBoutonPanier>(\n parse(MessageMajBoutonPanierSchema, evenementMessage.data),\n )\n .ifLeft(erreur => {\n reporteErreur(erreur);\n });\n\nexport const valideMessageMajContenuPanier = (\n evenementMessage: MessageEvent,\n): Either, MessageMajContenuPanier> =>\n Either\n .of, MessageMajContenuPanier>(\n parse(MessageMajContenuPanierSchema, evenementMessage.data),\n )\n .ifLeft(erreur => {\n reporteErreur(erreur);\n });\n"],"names":[],"mappings":";;;;;;;;AAQa,MAAA,+BAA+B,CAC1C,qBAEA,OACG;AAAA,EACC,MAAM,8BAA8B,iBAAiB,IAAI;AAC3D,EACC,OAAO,CAAU,WAAA;AAChB,gBAAc,MAAM;AACtB,CAAC;AAEQ,MAAA,gCAAgC,CAC3C,qBAEA,OACG;AAAA,EACC,MAAM,+BAA+B,iBAAiB,IAAI;AAC5D,EACC,OAAO,CAAU,WAAA;AAChB,gBAAc,MAAM;AACtB,CAAC;"} \ No newline at end of file +{"version":3,"file":"messages.js","sources":["../../src/scripts/lib/messages.ts"],"sourcesContent":["import { Either } from \"purify-ts\";\nimport { parse, type ValiError } from \"valibot\";\n\nimport type {\n MessageMajBoutonPanier,\n MessageMajBoutonPanierDonnees,\n MessageMajContenuPanier,\n MessageMajContenuPanierDonnees,\n} from \"./types/messages\";\n\nimport { NOM_CANAL_BOUTON_PANIER, NOM_CANAL_CONTENU_PANIER, TYPES_MESSAGES } from \"../constantes/messages.ts\";\nimport { reporteErreur } from \"./erreurs.ts\";\nimport { MessageMajBoutonPanierSchema, MessageMajContenuPanierSchema } from \"./schemas/messages.ts\";\n\n// Émissions\nexport const emetMessageMajBoutonPanier = (args: MessageMajBoutonPanierDonnees): void => {\n new BroadcastChannel(NOM_CANAL_BOUTON_PANIER).postMessage({\n donnees: {\n quantiteProduits: args.quantiteProduits,\n },\n type: TYPES_MESSAGES.MajBoutonPanier,\n } as MessageMajBoutonPanier);\n};\n\nexport const emetMessageMajContenuPanier = (args: MessageMajContenuPanierDonnees): void =>\n new BroadcastChannel(NOM_CANAL_CONTENU_PANIER).postMessage({\n donnees: {\n produits: args.produits,\n sousTotalPanier: args.sousTotalPanier,\n totalPanier: args.totalPanier,\n },\n type: TYPES_MESSAGES.MajContenuPanier,\n } as MessageMajContenuPanier);\n\n// Validations\nexport const valideMessageMajBoutonPanier = (\n evenementMessage: MessageEvent,\n): Either, MessageMajBoutonPanier> =>\n Either\n .of, MessageMajBoutonPanier>(\n parse(MessageMajBoutonPanierSchema, evenementMessage.data),\n )\n .ifLeft(erreur => reporteErreur(erreur));\n\nexport const valideMessageMajContenuPanier = (\n evenementMessage: MessageEvent,\n): Either, MessageMajContenuPanier> =>\n Either\n .of, MessageMajContenuPanier>(\n parse(MessageMajContenuPanierSchema, evenementMessage.data),\n )\n .ifLeft(erreur => reporteErreur(erreur));\n"],"names":[],"mappings":";;;;;;;;AAea,MAAA,6BAA6B,CAAC,SAA8C;AACnF,MAAA,iBAAiB,uBAAuB,EAAE,YAAY;AAAA,IACxD,SAAS;AAAA,MACP,kBAAkB,KAAK;AAAA,IACzB;AAAA,IACA,MAAM,eAAe;AAAA,EAAA,CACI;AAC7B;AAEO,MAAM,8BAA8B,CAAC,SAC1C,IAAI,iBAAiB,wBAAwB,EAAE,YAAY;AAAA,EACzD,SAAS;AAAA,IACP,UAAU,KAAK;AAAA,IACf,iBAAiB,KAAK;AAAA,IACtB,aAAa,KAAK;AAAA,EACpB;AAAA,EACA,MAAM,eAAe;AACvB,CAA4B;AAGjB,MAAA,+BAA+B,CAC1C,qBAEA,OACG;AAAA,EACC,MAAM,8BAA8B,iBAAiB,IAAI;AAC3D,EACC,OAAO,CAAA,WAAU,cAAc,MAAM,CAAC;AAE9B,MAAA,gCAAgC,CAC3C,qBAEA,OACG;AAAA,EACC,MAAM,+BAA+B,iBAAiB,IAAI;AAC5D,EACC,OAAO,CAAA,WAAU,cAAc,MAAM,CAAC;"} \ No newline at end of file diff --git a/web/app/themes/haiku-atelier-2024/assets/js/messages2.js b/web/app/themes/haiku-atelier-2024/assets/js/messages2.js index a6dc6624..c40038ec 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/messages2.js +++ b/web/app/themes/haiku-atelier-2024/assets/js/messages2.js @@ -1,14 +1,18 @@ -import { e as enum_, o as object, n as number, c as pipe, v as value, s as string, b as array } from "./index.DD7qm8S6.js"; +import { e as enum_, o as object, c as pipe, v as value, s as string, n as number, b as array } from "./index.DD7qm8S6.js"; import { T as TYPES_MESSAGES } from "./messages3.js"; import { a as WCStoreCartItemSchema } from "./cart.js"; import "./cart2.js"; enum_(TYPES_MESSAGES); +const MessageMajBoutonPanierDonneesSchema = object({ + quantiteProduits: number() +}); const MessageMajBoutonPanierSchema = object({ - donnees: number(), + donnees: MessageMajBoutonPanierDonneesSchema, type: pipe(string(), value(TYPES_MESSAGES.MajBoutonPanier)) }); const MessageMajContenuPanierDonneesSchema = object({ produits: array(WCStoreCartItemSchema), + sousTotalPanier: number(), totalPanier: number() }); const MessageMajContenuPanierSchema = object({ diff --git a/web/app/themes/haiku-atelier-2024/assets/js/messages2.js.map b/web/app/themes/haiku-atelier-2024/assets/js/messages2.js.map index 9ab96318..f45b23da 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/messages2.js.map +++ b/web/app/themes/haiku-atelier-2024/assets/js/messages2.js.map @@ -1 +1 @@ -{"version":3,"file":"messages2.js","sources":["../../src/scripts/lib/schemas/messages.ts"],"sourcesContent":["/**\n * Schémas des Messages passés avec BroadcastChannel.\n */\n\nimport * as v from \"valibot\";\n\nimport { TYPES_MESSAGES } from \"../../constantes/messages.ts\";\nimport { WCStoreCartItemSchema } from \"./cart.ts\";\n\nexport const TypesMessagesSchema = v.enum(TYPES_MESSAGES);\n\nexport const MessageMajBoutonPanierSchema = v.object({\n donnees: v.number(),\n type: v.pipe(v.string(), v.value(TYPES_MESSAGES.MajBoutonPanier)),\n});\n\nexport const MessageMajContenuPanierDonneesSchema = v.object({\n produits: v.array(WCStoreCartItemSchema),\n totalPanier: v.number(),\n});\n\nexport const MessageMajContenuPanierSchema = v.object({\n donnees: MessageMajContenuPanierDonneesSchema,\n type: v.pipe(v.string(), v.value(TYPES_MESSAGES.MajContenuPanier)),\n});\n"],"names":["v.enum","v.object","v.number","v.pipe","v.string","v.value","v.array"],"mappings":";;;;AASmCA,MAAO,cAAc;AAE3C,MAAA,+BAA+BC,OAAS;AAAA,EACnD,SAASC,OAAS;AAAA,EAClB,MAAMC,KAAOC,OAAE,GAAUC,MAAQ,eAAe,eAAe,CAAC;AAClE,CAAC;AAEY,MAAA,uCAAuCJ,OAAS;AAAA,EAC3D,UAAUK,MAAQ,qBAAqB;AAAA,EACvC,aAAaJ,OAAS;AACxB,CAAC;AAEY,MAAA,gCAAgCD,OAAS;AAAA,EACpD,SAAS;AAAA,EACT,MAAME,KAAOC,OAAE,GAAUC,MAAQ,eAAe,gBAAgB,CAAC;AACnE,CAAC;"} \ No newline at end of file +{"version":3,"file":"messages2.js","sources":["../../src/scripts/lib/schemas/messages.ts"],"sourcesContent":["/**\n * Schémas des Messages passés avec BroadcastChannel.\n */\n\nimport * as v from \"valibot\";\n\nimport { TYPES_MESSAGES } from \"../../constantes/messages.ts\";\nimport { WCStoreCartItemSchema } from \"./cart.ts\";\n\nexport const TypesMessagesSchema = v.enum(TYPES_MESSAGES);\n\nexport const MessageMajBoutonPanierDonneesSchema = v.object({\n quantiteProduits: v.number(),\n});\n\nexport const MessageMajBoutonPanierSchema = v.object({\n donnees: MessageMajBoutonPanierDonneesSchema,\n type: v.pipe(v.string(), v.value(TYPES_MESSAGES.MajBoutonPanier)),\n});\n\nexport const MessageMajContenuPanierDonneesSchema = v.object({\n produits: v.array(WCStoreCartItemSchema),\n sousTotalPanier: v.number(),\n totalPanier: v.number(),\n});\n\nexport const MessageMajContenuPanierSchema = v.object({\n donnees: MessageMajContenuPanierDonneesSchema,\n type: v.pipe(v.string(), v.value(TYPES_MESSAGES.MajContenuPanier)),\n});\n"],"names":["v.enum","v.object","v.number","v.pipe","v.string","v.value","v.array"],"mappings":";;;;AASmCA,MAAO,cAAc;AAE3C,MAAA,sCAAsCC,OAAS;AAAA,EAC1D,kBAAkBC,OAAS;AAC7B,CAAC;AAEY,MAAA,+BAA+BD,OAAS;AAAA,EACnD,SAAS;AAAA,EACT,MAAME,KAAOC,OAAE,GAAUC,MAAQ,eAAe,eAAe,CAAC;AAClE,CAAC;AAEY,MAAA,uCAAuCJ,OAAS;AAAA,EAC3D,UAAUK,MAAQ,qBAAqB;AAAA,EACvC,iBAAiBJ,OAAS;AAAA,EAC1B,aAAaA,OAAS;AACxB,CAAC;AAEY,MAAA,gCAAgCD,OAAS;AAAA,EACpD,SAAS;AAAA,EACT,MAAME,KAAOC,OAAE,GAAUC,MAAQ,eAAe,gBAAgB,CAAC;AACnE,CAAC;"} \ No newline at end of file diff --git a/web/app/themes/haiku-atelier-2024/assets/js/reseau.js b/web/app/themes/haiku-atelier-2024/assets/js/reseau.js index 39bc7bff..b143b5e2 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/reseau.js +++ b/web/app/themes/haiku-atelier-2024/assets/js/reseau.js @@ -1,5 +1,11 @@ +import { x } from "./chunk-7BKSRZNG.C39W3Wne.js"; +import { z, N } from "./index.CeK6pfoJ.js"; +import { p as parse } from "./index.DD7qm8S6.js"; import { d as ENTETE_WC_NONCE } from "./api2.js"; -const postBackendWC = (args) => fetch( +import { a as leveBadRequestError, b as leveUnauthorizedError, c as leveNotFoundError, d as leveErreur, E as ErreurInconnue } from "./erreurs.js"; +import { e as estWCError } from "./erreurs2.js"; +import "./exports.DNZBdkMD.js"; +const postBackend = (args) => fetch( args.route, { body: args.corps, @@ -14,7 +20,9 @@ const postBackendWC = (args) => fetch( signal: AbortSignal.timeout(5e3) } ); +const traiteReponseBackendWCSelonCodesHTTP = (corpsReponse, schemaReponse) => z(corpsReponse).with({ body: N.select(), status: 400 }, estWCError, leveBadRequestError).with({ body: N.select(), status: 401 }, estWCError, leveUnauthorizedError).with({ body: N.select(), status: 404 }, estWCError, leveNotFoundError).with(N._, (corpsOkInconnu) => parse(schemaReponse, corpsOkInconnu)).otherwise((e) => x(e, ErreurInconnue, leveErreur)); export { - postBackendWC as p + postBackend as p, + traiteReponseBackendWCSelonCodesHTTP as t }; //# sourceMappingURL=reseau.js.map diff --git a/web/app/themes/haiku-atelier-2024/assets/js/reseau.js.map b/web/app/themes/haiku-atelier-2024/assets/js/reseau.js.map index 8c03a518..0afa000b 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/reseau.js.map +++ b/web/app/themes/haiku-atelier-2024/assets/js/reseau.js.map @@ -1 +1 @@ -{"version":3,"file":"reseau.js","sources":["../../src/scripts/lib/reseau.ts"],"sourcesContent":["import { pipe } from \"remeda\";\nimport { match, P } from \"ts-pattern\";\nimport { type GenericSchema, parse } from \"valibot\";\n\nimport { ENTETE_WC_NONCE } from \"../constantes/api.ts\";\nimport {\n ErreurInconnue,\n leveBadRequestError,\n leveErreur,\n leveNotFoundError,\n leveUnauthorizedError,\n type UnknownError,\n} from \"./erreurs.ts\";\nimport { estWCError } from \"./schemas/erreurs.ts\";\n\ntype ArgumentsPostBackendWC = {\n corps: BodyInit;\n nonce: string;\n route: string;\n};\n\nexport const postBackendWC = (args: ArgumentsPostBackendWC) =>\n fetch(\n args.route,\n {\n body: args.corps,\n credentials: \"same-origin\",\n headers: {\n \"Accept\": \"application/json\",\n \"Content-Type\": \"application/json\",\n [ENTETE_WC_NONCE]: args.nonce,\n },\n method: \"POST\",\n mode: \"same-origin\",\n signal: AbortSignal.timeout(5000),\n },\n );\n\nexport const traiteReponseBackendWCSelonCodesHTTP = (corpsReponse: unknown, schemaReponse: GenericSchema) =>\n match(corpsReponse)\n // Réponses problématiques\n .with({ body: P.select(), status: 400 }, estWCError, leveBadRequestError)\n .with({ body: P.select(), status: 401 }, estWCError, leveUnauthorizedError)\n .with({ body: P.select(), status: 404 }, estWCError, leveNotFoundError)\n // Réponse OK (201)\n .with(P._, corpsOkInconnu => parse(schemaReponse, corpsOkInconnu))\n // Réponses inconnues\n .otherwise(e => pipe(e, ErreurInconnue, leveErreur));\n"],"names":[],"mappings":";AAqBa,MAAA,gBAAgB,CAAC,SAC5B;AAAA,EACE,KAAK;AAAA,EACL;AAAA,IACE,MAAM,KAAK;AAAA,IACX,aAAa;AAAA,IACb,SAAS;AAAA,MACP,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,CAAC,eAAe,GAAG,KAAK;AAAA,IAC1B;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ,YAAY,QAAQ,GAAI;AAAA,EAClC;AACF;"} \ No newline at end of file +{"version":3,"file":"reseau.js","sources":["../../src/scripts/lib/reseau.ts"],"sourcesContent":["import { pipe } from \"remeda\";\nimport { match, P } from \"ts-pattern\";\nimport { type GenericSchema, parse } from \"valibot\";\n\nimport { ENTETE_WC_NONCE } from \"../constantes/api.ts\";\nimport {\n ErreurInconnue,\n leveBadRequestError,\n leveErreur,\n leveNotFoundError,\n leveUnauthorizedError,\n type UnknownError,\n} from \"./erreurs.ts\";\nimport { estWCError } from \"./schemas/erreurs.ts\";\n\ntype ArgumentsPostBackendWC = {\n /** Le corps de la requête (ses arguments). */\n corps: BodyInit;\n /** Une chaîne de caractères généré par le backend et à joindre à chaque requête pour l'authentifier. */\n nonce: string;\n /** La route, ou chemin, de l'API à demander au backend. */\n route: string;\n};\n\nexport const postBackend = (args: ArgumentsPostBackendWC) =>\n fetch(\n args.route,\n {\n body: args.corps,\n credentials: \"same-origin\",\n headers: {\n \"Accept\": \"application/json\",\n \"Content-Type\": \"application/json\",\n [ENTETE_WC_NONCE]: args.nonce,\n },\n method: \"POST\",\n mode: \"same-origin\",\n signal: AbortSignal.timeout(5000),\n },\n );\n\nexport const traiteReponseBackendWCSelonCodesHTTP = >(\n corpsReponse: unknown,\n schemaReponse: S,\n): R =>\n match(corpsReponse)\n // Réponses problématiques\n .with({ body: P.select(), status: 400 }, estWCError, leveBadRequestError)\n .with({ body: P.select(), status: 401 }, estWCError, leveUnauthorizedError)\n .with({ body: P.select(), status: 404 }, estWCError, leveNotFoundError)\n // Réponse OK (201)\n .with(P._, corpsOkInconnu => parse(schemaReponse, corpsOkInconnu))\n // Réponses inconnues\n .otherwise(e => pipe(e, ErreurInconnue, leveErreur));\n"],"names":["match","P","pipe"],"mappings":";;;;;;;AAwBa,MAAA,cAAc,CAAC,SAC1B;AAAA,EACE,KAAK;AAAA,EACL;AAAA,IACE,MAAM,KAAK;AAAA,IACX,aAAa;AAAA,IACb,SAAS;AAAA,MACP,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,CAAC,eAAe,GAAG,KAAK;AAAA,IAC1B;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ,YAAY,QAAQ,GAAI;AAAA,EAClC;AACF;AAEW,MAAA,uCAAuC,CAClD,cACA,kBAEAA,EAAM,YAAY,EAEf,KAAK,EAAE,MAAMC,EAAE,OAAO,GAAG,QAAQ,IAAO,GAAA,YAAY,mBAAmB,EACvE,KAAK,EAAE,MAAMA,EAAE,UAAU,QAAQ,IAAA,GAAO,YAAY,qBAAqB,EACzE,KAAK,EAAE,MAAMA,EAAE,OAAA,GAAU,QAAQ,IAAI,GAAG,YAAY,iBAAiB,EAErE,KAAKA,EAAE,GAAG,CAAkB,mBAAA,MAAS,eAAe,cAAc,CAAC,EAEnE,UAAU,CAAA,MAAKC,EAAK,GAAG,gBAAgB,UAAwB,CAAC;"} \ No newline at end of file diff --git a/web/app/themes/haiku-atelier-2024/assets/js/scripts-bouton-panier.js b/web/app/themes/haiku-atelier-2024/assets/js/scripts-bouton-panier.js index b9d1e458..6feab79e 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/scripts-bouton-panier.js +++ b/web/app/themes/haiku-atelier-2024/assets/js/scripts-bouton-panier.js @@ -19,8 +19,8 @@ const initialiseBoutonPanier = () => { const CANAL_BOUTON_PANIER = new BroadcastChannel(NOM_CANAL_BOUTON_PANIER); CANAL_BOUTON_PANIER.onmessage = (evenementMessage) => { valideMessageMajBoutonPanier(evenementMessage).ifRight((message) => { - BOUTON_PANIER.textContent = `cart (${String(message.donnees)})`; - BOUTON_PANIER.setAttribute(ATTRIBUT_CONTIENT_ARTICLES, String(message.donnees > 0)); + BOUTON_PANIER.textContent = `cart (${String(message.donnees.quantiteProduits)})`; + BOUTON_PANIER.setAttribute(ATTRIBUT_CONTIENT_ARTICLES, String(message.donnees.quantiteProduits > 0)); }); }; }; diff --git a/web/app/themes/haiku-atelier-2024/assets/js/scripts-bouton-panier.js.map b/web/app/themes/haiku-atelier-2024/assets/js/scripts-bouton-panier.js.map index 3a2e758e..105c3960 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/scripts-bouton-panier.js.map +++ b/web/app/themes/haiku-atelier-2024/assets/js/scripts-bouton-panier.js.map @@ -1 +1 @@ -{"version":3,"file":"scripts-bouton-panier.js","sources":["../../src/scripts/scripts-bouton-panier.ts"],"sourcesContent":["/**\n * Scripts pour la mise à jour trans-fenêtres/trans-onglets du Bouton du Panier.\n */\n\nimport { pipe } from \"remeda\";\n\nimport type { MessageMajBoutonPanier } from \"./lib/types/messages\";\n\nimport { ATTRIBUT_CONTIENT_ARTICLES, SELECTEUR_BOUTON_PANIER } from \"./constantes/dom.ts\";\nimport { NOM_CANAL_BOUTON_PANIER } from \"./constantes/messages.ts\";\nimport { recupereElementOuLeve } from \"./lib/dom.ts\";\nimport { valideMessageMajBoutonPanier } from \"./lib/messages.ts\";\nimport { recupereElementDocumentEither } from \"./lib/utils.ts\";\n\nconst initialiseBoutonPanier = (): void => {\n /** Le « Bouton » vers le Panier dont le texte est un indicateur du nombre de Produits dedans. */\n const BOUTON_PANIER: HTMLAnchorElement = pipe(\n recupereElementDocumentEither(SELECTEUR_BOUTON_PANIER),\n recupereElementOuLeve,\n );\n const CANAL_BOUTON_PANIER: BroadcastChannel = new BroadcastChannel(NOM_CANAL_BOUTON_PANIER);\n\n CANAL_BOUTON_PANIER.onmessage = (evenementMessage: MessageEvent): void => {\n valideMessageMajBoutonPanier(evenementMessage)\n // Met à jour le Bouton du Panier\n .ifRight((message: MessageMajBoutonPanier) => {\n BOUTON_PANIER.textContent = `cart (${String(message.donnees)})`;\n BOUTON_PANIER.setAttribute(ATTRIBUT_CONTIENT_ARTICLES, String(message.donnees > 0));\n });\n };\n};\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n initialiseBoutonPanier();\n});\n"],"names":["pipe"],"mappings":";;;;;;;;;;;;;AAcA,MAAM,yBAAyB,MAAY;AAEzC,QAAM,gBAAmCA;AAAAA,IACvC,8BAAiD,uBAAuB;AAAA,IACxE;AAAA,EAAA;AAEI,QAAA,sBAAwC,IAAI,iBAAiB,uBAAuB;AAEtE,sBAAA,YAAY,CAAC,qBAAkD;AACjF,iCAA6B,gBAAgB,EAE1C,QAAQ,CAAC,YAAoC;AAC5C,oBAAc,cAAc,SAAS,OAAO,QAAQ,OAAO,CAAC;AAC5D,oBAAc,aAAa,4BAA4B,OAAO,QAAQ,UAAU,CAAC,CAAC;AAAA,IAAA,CACnF;AAAA,EAAA;AAEP;AAEA,SAAS,iBAAiB,oBAAoB,MAAM;AAC3B;AACzB,CAAC;"} \ No newline at end of file +{"version":3,"file":"scripts-bouton-panier.js","sources":["../../src/scripts/scripts-bouton-panier.ts"],"sourcesContent":["/**\n * Scripts pour la mise à jour trans-fenêtres/trans-onglets du Bouton du Panier.\n */\n\nimport { pipe } from \"remeda\";\n\nimport type { MessageMajBoutonPanier } from \"./lib/types/messages\";\n\nimport { ATTRIBUT_CONTIENT_ARTICLES, SELECTEUR_BOUTON_PANIER } from \"./constantes/dom.ts\";\nimport { NOM_CANAL_BOUTON_PANIER } from \"./constantes/messages.ts\";\nimport { recupereElementOuLeve } from \"./lib/dom.ts\";\nimport { valideMessageMajBoutonPanier } from \"./lib/messages.ts\";\nimport { recupereElementDocumentEither } from \"./lib/utils.ts\";\n\nconst initialiseBoutonPanier = (): void => {\n /** Le « Bouton » vers le Panier dont le texte est un indicateur du nombre de Produits dedans. */\n const BOUTON_PANIER: HTMLAnchorElement = pipe(\n recupereElementDocumentEither(SELECTEUR_BOUTON_PANIER),\n recupereElementOuLeve,\n );\n const CANAL_BOUTON_PANIER: BroadcastChannel = new BroadcastChannel(NOM_CANAL_BOUTON_PANIER);\n\n CANAL_BOUTON_PANIER.onmessage = (evenementMessage: MessageEvent): void => {\n valideMessageMajBoutonPanier(evenementMessage)\n // Met à jour le Bouton du Panier\n .ifRight((message: MessageMajBoutonPanier) => {\n BOUTON_PANIER.textContent = `cart (${String(message.donnees.quantiteProduits)})`;\n BOUTON_PANIER.setAttribute(ATTRIBUT_CONTIENT_ARTICLES, String(message.donnees.quantiteProduits > 0));\n });\n };\n};\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n initialiseBoutonPanier();\n});\n"],"names":["pipe"],"mappings":";;;;;;;;;;;;;AAcA,MAAM,yBAAyB,MAAY;AAEzC,QAAM,gBAAmCA;AAAAA,IACvC,8BAAiD,uBAAuB;AAAA,IACxE;AAAA,EAAA;AAEI,QAAA,sBAAwC,IAAI,iBAAiB,uBAAuB;AAEtE,sBAAA,YAAY,CAAC,qBAAkD;AACjF,iCAA6B,gBAAgB,EAE1C,QAAQ,CAAC,YAAoC;AAC5C,oBAAc,cAAc,SAAS,OAAO,QAAQ,QAAQ,gBAAgB,CAAC;AAC7E,oBAAc,aAAa,4BAA4B,OAAO,QAAQ,QAAQ,mBAAmB,CAAC,CAAC;AAAA,IAAA,CACpG;AAAA,EAAA;AAEP;AAEA,SAAS,iBAAiB,oBAAoB,MAAM;AAC3B;AACzB,CAAC;"} \ No newline at end of file diff --git a/web/app/themes/haiku-atelier-2024/assets/js/scripts-page-panier.js b/web/app/themes/haiku-atelier-2024/assets/js/scripts-page-panier.js index be9bed6a..b5050a22 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/scripts-page-panier.js +++ b/web/app/themes/haiku-atelier-2024/assets/js/scripts-page-panier.js @@ -1,22 +1,23 @@ -import { r, z, N, p } from "./index.y02cst4L.js"; +import { r } from "./chunk-RU7WR4KH.D5j7HXCF.js"; +import { a as recupereElementsDocumentEither, r as recupereElementDocumentEither, p, b as propEither } from "./utils.js"; import { x } from "./chunk-7BKSRZNG.C39W3Wne.js"; import { p as parse } from "./index.DD7qm8S6.js"; import { R as ROUTE_API_RETIRE_ARTICLE_PANIER, b as ROUTE_API_MAJ_ARTICLE_PANIER } from "./api2.js"; -import { a as SELECTEUR_ENTREES_PANIER, b as SELECTEUR_CONTENEUR_PANIER, c as SELECTEUR_TOTAL_PANIER, d as ATTRIBUT_CLE_PANIER, e as SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE, f as SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER, g as SELECTEUR_BOUTON_ADDITION_QUANTITE, h as SELECTEUR_BOUTON_SUPPRESSION_PANIER, A as ATTRIBUT_CONTIENT_ARTICLES, i as SELECTEUR_PRIX_LIGNE_PANIER } from "./dom.js"; -import { N as NOM_CANAL_BOUTON_PANIER, a as NOM_CANAL_CONTENU_PANIER, T as TYPES_MESSAGES } from "./messages3.js"; +import { a as SELECTEUR_ENTREES_PANIER, b as SELECTEUR_CONTENEUR_PANIER, c as SELECTEUR_SOUS_TOTAL_PANIER, d as SELECTEUR_TOTAL_PANIER, e as ATTRIBUT_CLE_PANIER, f as SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE, g as SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER, h as SELECTEUR_BOUTON_ADDITION_QUANTITE, i as SELECTEUR_BOUTON_SUPPRESSION_PANIER, A as ATTRIBUT_CONTIENT_ARTICLES, j as SELECTEUR_PRIX_LIGNE_PANIER, k as ATTRIBUT_DESACTIVE } from "./dom.js"; +import { N as NOM_CANAL_BOUTON_PANIER, a as NOM_CANAL_CONTENU_PANIER } from "./messages3.js"; import { r as recupereElementOuLeve, a as recupereElementAvecSelecteur } from "./dom2.js"; -import { l as leveServerError, a as leveBadRequestError, b as leveUnauthorizedError, c as leveNotFoundError, E as ErreurInconnue, d as leveErreur, r as reporteErreur } from "./erreurs.js"; +import { l as leveServerError, r as reporteErreur } from "./erreurs.js"; import { e as estReponse500, a as estError } from "./gardes.js"; -import { v as valideMessageMajBoutonPanier, a as valideMessageMajContenuPanier } from "./messages.js"; -import { p as postBackendWC } from "./reseau.js"; +import { v as valideMessageMajBoutonPanier, a as valideMessageMajContenuPanier, e as emetMessageMajBoutonPanier, b as emetMessageMajContenuPanier } from "./messages.js"; +import { p as postBackend, t as traiteReponseBackendWCSelonCodesHTTP } from "./reseau.js"; import { W as WCStoreCartRemoveItemArgsSchema } from "./cart-remove-item.js"; import { W as WCStoreCartUpdateItemArgsSchema } from "./cart-update-item.js"; import { W as WCStoreCartSchema } from "./cart.js"; -import { e as estWCError } from "./erreurs2.js"; -import { a as recupereElementsDocumentEither, r as recupereElementDocumentEither } from "./utils.js"; import { M as Maybe, E as Either } from "./Either.wHNxn7Os.js"; import "./exports.DNZBdkMD.js"; import "./messages2.js"; +import "./index.CeK6pfoJ.js"; +import "./erreurs2.js"; import "./cart2.js"; const ETATS_PAGE = _etats; const ENTREES_PANIER_EITHER = recupereElementsDocumentEither( @@ -26,21 +27,46 @@ const CONTENEUR_PANIER = x( recupereElementDocumentEither(SELECTEUR_CONTENEUR_PANIER), recupereElementOuLeve ); +const SOUS_TOTAL_PANIER = x( + recupereElementDocumentEither(SELECTEUR_SOUS_TOTAL_PANIER), + recupereElementOuLeve +); const TOTAL_PANIER = x( recupereElementDocumentEither(SELECTEUR_TOTAL_PANIER), recupereElementOuLeve ); -const recupereElementDansEntreePanierOuLeve = ( - /* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Nécessaire pour - documenter le type d'Element attendu */ - (entree) => (selecteur) => x( - recupereElementAvecSelecteur(entree)(selecteur), - recupereElementOuLeve - ) +const recupereElementDansEntreePanierOuLeve = (entree) => (selecteur) => x( + recupereElementAvecSelecteur(entree)(selecteur), + recupereElementOuLeve ); -const initialiseScriptsPagePanier = () => { - ENTREES_PANIER_EITHER.ifRight( - (entrees) => entrees.forEach((entree) => { +const desactiveBoutonsEntreesPanier = (entrees) => entrees.forEach((entree) => { + const recupereElementDansEntree = recupereElementDansEntreePanierOuLeve(entree); + const elements = { + boutonAddition: recupereElementDansEntree(SELECTEUR_BOUTON_ADDITION_QUANTITE), + boutonSoustraction: recupereElementDansEntree(SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE), + boutonSuppression: recupereElementDansEntree(SELECTEUR_BOUTON_SUPPRESSION_PANIER) + }; + elements.boutonSoustraction.setAttribute(ATTRIBUT_DESACTIVE, ""); + elements.boutonAddition.setAttribute(ATTRIBUT_DESACTIVE, ""); + elements.boutonSuppression.setAttribute(ATTRIBUT_DESACTIVE, ""); + elements.boutonSuppression.textContent = "C= C= C= C= C=┌(;・ω・)┘"; +}); +const majEtatsActivationBoutons = (entrees) => entrees.forEach((entree) => { + const recupereElementDansEntree = recupereElementDansEntreePanierOuLeve(entree); + const elements = { + boutonAddition: recupereElementDansEntree(SELECTEUR_BOUTON_ADDITION_QUANTITE), + boutonSoustraction: recupereElementDansEntree(SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE), + boutonSuppression: recupereElementDansEntree(SELECTEUR_BOUTON_SUPPRESSION_PANIER), + champQuantite: recupereElementDansEntree(SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER) + }; + Number(elements.champQuantite?.value) === 1 ? elements.boutonSoustraction.setAttribute(ATTRIBUT_DESACTIVE, "") : elements.boutonSoustraction.removeAttribute(ATTRIBUT_DESACTIVE); + elements.boutonAddition.removeAttribute(ATTRIBUT_DESACTIVE); + elements.boutonSuppression.removeAttribute(ATTRIBUT_DESACTIVE); + elements.boutonSuppression.textContent = "Remove"; +}); +const initialiseMajEntreesPanier = () => { + ENTREES_PANIER_EITHER.ifRight((entrees) => { + entrees.forEach((entree) => { const recupereElementDansEntree = recupereElementDansEntreePanierOuLeve(entree); const clePanier = Maybe.fromNullable(entree.getAttribute(ATTRIBUT_CLE_PANIER)).ifNothing(() => { entree.remove(); @@ -51,10 +77,12 @@ const initialiseScriptsPagePanier = () => { const boutonAddition = recupereElementDansEntree(SELECTEUR_BOUTON_ADDITION_QUANTITE); const boutonSuppression = recupereElementDansEntree(SELECTEUR_BOUTON_SUPPRESSION_PANIER); boutonSuppression.addEventListener("click", () => { - boutonSuppression.textContent = "C= C= C= C= C=┌(;・ω・)┘"; - Either.encase(() => parse(WCStoreCartRemoveItemArgsSchema, { key: clePanier })).map( - (args) => { - postBackendWC({ + Either.encase( + () => parse(WCStoreCartRemoveItemArgsSchema, { key: clePanier }) + ).map( + async (args) => { + desactiveBoutonsEntreesPanier(entrees); + await postBackend({ corps: JSON.stringify(args), nonce: ETATS_PAGE.nonce, route: ROUTE_API_RETIRE_ARTICLE_PANIER @@ -64,18 +92,17 @@ const initialiseScriptsPagePanier = () => { // Récupère la Réponse await reponse.json(), // Traite tous les codes HTTPs possibles - (corpsReponse) => z(corpsReponse).with({ body: N.select(), status: 400 }, estWCError, leveBadRequestError).with({ body: N.select(), status: 401 }, estWCError, leveUnauthorizedError).with({ body: N.select(), status: 404 }, estWCError, leveNotFoundError).with(N._, (corpsOkInconnu) => parse(WCStoreCartSchema, corpsOkInconnu)).otherwise((e) => x(e, ErreurInconnue, leveErreur)), + (corpsReponse) => traiteReponseBackendWCSelonCodesHTTP( + corpsReponse, + WCStoreCartSchema + ), + // Émets des Messages via BroadcastChannels pour la mise à jour de la page r((panier) => { - new BroadcastChannel(NOM_CANAL_CONTENU_PANIER).postMessage({ - donnees: { - produits: panier.items, - totalPanier: Number(panier.totals.total_items / 100) - }, - type: TYPES_MESSAGES.MajContenuPanier - }); - new BroadcastChannel(NOM_CANAL_BOUTON_PANIER).postMessage({ - donnees: panier.items_count, - type: TYPES_MESSAGES.MajBoutonPanier + emetMessageMajBoutonPanier({ quantiteProduits: panier.items_count }); + emetMessageMajContenuPanier({ + produits: panier.items, + sousTotalPanier: Number(panier.totals.total_price) / 100, + totalPanier: Number(panier.totals.total_items) / 100 }); entree.remove(); }) @@ -86,21 +113,19 @@ const initialiseScriptsPagePanier = () => { } else { console.error("e n'est pas une Erreur ?!", e); } + majEtatsActivationBoutons(entrees); }); } - ); + ).ifLeft((erreur) => reporteErreur(erreur)); }); boutonSoustraction.addEventListener("click", () => { Maybe.fromNullable(champQuantite.valueAsNumber).filter((valeur) => valeur > 1).ifJust((valeur) => { - boutonSuppression.textContent = "C= C= C= C= C=┌(;・ω・)┘"; - boutonSoustraction.toggleAttribute("disabled"); - boutonAddition.toggleAttribute("disabled"); - boutonSuppression.toggleAttribute("disabled"); Either.encase( () => parse(WCStoreCartUpdateItemArgsSchema, { key: clePanier, quantity: valeur - 1 }) ).map( - (args) => { - postBackendWC({ + async (args) => { + desactiveBoutonsEntreesPanier(entrees); + await postBackend({ corps: JSON.stringify(args), nonce: ETATS_PAGE.nonce, route: ROUTE_API_MAJ_ARTICLE_PANIER @@ -110,23 +135,17 @@ const initialiseScriptsPagePanier = () => { // Récupère la Réponse await reponse.json(), // Traite tous les codes HTTPs possibles - (corpsReponse) => z(corpsReponse).with({ body: N.select(), status: 400 }, estWCError, leveBadRequestError).with({ body: N.select(), status: 401 }, estWCError, leveUnauthorizedError).with({ body: N.select(), status: 404 }, estWCError, leveNotFoundError).with(N._, (corpsOkInconnu) => parse(WCStoreCartSchema, corpsOkInconnu)).otherwise((e) => x(e, ErreurInconnue, leveErreur)), + (corpsReponse) => traiteReponseBackendWCSelonCodesHTTP( + corpsReponse, + WCStoreCartSchema + ), r((panier) => { - new BroadcastChannel(NOM_CANAL_BOUTON_PANIER).postMessage({ - donnees: panier.items_count, - type: TYPES_MESSAGES.MajBoutonPanier + emetMessageMajBoutonPanier({ quantiteProduits: panier.items_count }); + emetMessageMajContenuPanier({ + produits: panier.items, + sousTotalPanier: Number(panier.totals.total_price) / 100, + totalPanier: Number(panier.totals.total_items) / 100 }); - new BroadcastChannel(NOM_CANAL_CONTENU_PANIER).postMessage({ - donnees: { - produits: panier.items, - totalPanier: Number(panier.totals.total_items / 100) - }, - type: TYPES_MESSAGES.MajContenuPanier - }); - boutonSoustraction.toggleAttribute("disabled"); - boutonAddition.toggleAttribute("disabled"); - boutonSuppression.toggleAttribute("disabled"); - boutonSuppression.textContent = "Remove"; }) ); }).catch((e) => { @@ -135,6 +154,7 @@ const initialiseScriptsPagePanier = () => { } else { console.error("e n'est pas une Erreur ?!", e); } + majEtatsActivationBoutons(entrees); }); } ); @@ -142,15 +162,12 @@ const initialiseScriptsPagePanier = () => { }); boutonAddition.addEventListener("click", () => { Maybe.fromNullable(champQuantite.valueAsNumber).ifJust((valeur) => { - boutonSuppression.textContent = "C= C= C= C= C=┌(;・ω・)┘"; - boutonSoustraction.toggleAttribute("disabled"); - boutonAddition.toggleAttribute("disabled"); - boutonSuppression.toggleAttribute("disabled"); + desactiveBoutonsEntreesPanier(entrees); Either.encase( () => parse(WCStoreCartUpdateItemArgsSchema, { key: clePanier, quantity: valeur + 1 }) ).map( - (args) => { - postBackendWC({ + async (args) => { + await postBackend({ corps: JSON.stringify(args), nonce: ETATS_PAGE.nonce, route: ROUTE_API_MAJ_ARTICLE_PANIER @@ -160,23 +177,17 @@ const initialiseScriptsPagePanier = () => { // Récupère la Réponse await reponse.json(), // Traite tous les codes HTTPs possibles - (corpsReponse) => z(corpsReponse).with({ body: N.select(), status: 400 }, estWCError, leveBadRequestError).with({ body: N.select(), status: 401 }, estWCError, leveUnauthorizedError).with({ body: N.select(), status: 404 }, estWCError, leveNotFoundError).with(N._, (corpsOkInconnu) => parse(WCStoreCartSchema, corpsOkInconnu)).otherwise((e) => x(e, ErreurInconnue, leveErreur)), + (corpsReponse) => traiteReponseBackendWCSelonCodesHTTP( + corpsReponse, + WCStoreCartSchema + ), r((panier) => { - new BroadcastChannel(NOM_CANAL_BOUTON_PANIER).postMessage({ - donnees: panier.items_count, - type: TYPES_MESSAGES.MajBoutonPanier + emetMessageMajBoutonPanier({ quantiteProduits: panier.items_count }); + emetMessageMajContenuPanier({ + produits: panier.items, + sousTotalPanier: Number(panier.totals.total_price) / 100, + totalPanier: Number(panier.totals.total_items) / 100 }); - new BroadcastChannel(NOM_CANAL_CONTENU_PANIER).postMessage({ - donnees: { - produits: panier.items, - totalPanier: Number(panier.totals.total_items / 100) - }, - type: TYPES_MESSAGES.MajContenuPanier - }); - boutonSoustraction.toggleAttribute("disabled"); - boutonAddition.toggleAttribute("disabled"); - boutonSuppression.toggleAttribute("disabled"); - boutonSuppression.textContent = "Remove"; }) ); }).catch((e) => { @@ -185,25 +196,25 @@ const initialiseScriptsPagePanier = () => { } else { console.error("e n'est pas une Erreur ?!", e); } + majEtatsActivationBoutons(entrees); }); } ); }); }); - }) - ); + }); + }); }; const initialiseMajConteneurPanier = () => { - const CANAL_BOUTON_PANIER = new BroadcastChannel(NOM_CANAL_BOUTON_PANIER); - CANAL_BOUTON_PANIER.onmessage = (evenementMessage) => { - valideMessageMajBoutonPanier(evenementMessage).ifRight((message) => { - CONTENEUR_PANIER.setAttribute(ATTRIBUT_CONTIENT_ARTICLES, String(message.donnees !== 0)); + new BroadcastChannel(NOM_CANAL_BOUTON_PANIER).onmessage = (evenementMessage) => { + valideMessageMajBoutonPanier(evenementMessage).map(p("donnees")).ifRight((donnees) => { + CONTENEUR_PANIER.setAttribute(ATTRIBUT_CONTIENT_ARTICLES, String(donnees.quantiteProduits !== 0)); }); }; }; -const initialiseEcouteCanalMajContenuPanier = () => { +const initialiseMajContenuPanier = () => { new BroadcastChannel(NOM_CANAL_CONTENU_PANIER).onmessage = (evenementMessage) => { - valideMessageMajContenuPanier(evenementMessage).map(p("donnees")).ifRight((donnees) => { + valideMessageMajContenuPanier(evenementMessage).chain(propEither("donnees")).ifRight((donnees) => { donnees.produits.forEach((ligne) => { ENTREES_PANIER_EITHER.ifRight((entrees) => { Maybe.fromNullable(entrees.find((entree) => entree.getAttribute(ATTRIBUT_CLE_PANIER) === ligne.key)).ifJust((entree) => { @@ -214,16 +225,21 @@ const initialiseEcouteCanalMajContenuPanier = () => { ); prixLigne.textContent = `${String(Number(ligne.totals.line_total) / 100)} €`; champQuantite.setAttribute("value", String(ligne.quantity)); - TOTAL_PANIER.textContent = `${donnees.totalPanier} €`; + majEtatsActivationBoutons(entrees); }); + SOUS_TOTAL_PANIER.textContent = `${String(donnees.totalPanier)} €`; + TOTAL_PANIER.textContent = `${String(donnees.totalPanier)} €`; }); }); + }).ifLeft((erreur) => { + reporteErreur(erreur); + ENTREES_PANIER_EITHER.ifRight((entrees) => majEtatsActivationBoutons(entrees)); }); }; }; document.addEventListener("DOMContentLoaded", () => { - initialiseScriptsPagePanier(); + initialiseMajEntreesPanier(); initialiseMajConteneurPanier(); - initialiseEcouteCanalMajContenuPanier(); + initialiseMajContenuPanier(); }); //# sourceMappingURL=scripts-page-panier.js.map diff --git a/web/app/themes/haiku-atelier-2024/assets/js/scripts-page-panier.js.map b/web/app/themes/haiku-atelier-2024/assets/js/scripts-page-panier.js.map index 2f515197..4d9d88b7 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/scripts-page-panier.js.map +++ b/web/app/themes/haiku-atelier-2024/assets/js/scripts-page-panier.js.map @@ -1 +1 @@ -{"version":3,"file":"scripts-page-panier.js","sources":["../../src/scripts/scripts-page-panier.ts"],"sourcesContent":["import { Either, Maybe } from \"purify-ts\";\nimport { pipe, prop, tap } from \"remeda\";\nimport { match, P } from \"ts-pattern\";\nimport { parse } from \"valibot\";\n\nimport type { WCStoreCart, WCStoreCartItem } from \"./lib/types/api/cart\";\nimport type { WCStoreCartRemoveItemArgs } from \"./lib/types/api/cart-remove-item\";\nimport type { WCStoreCartUpdateItemArgs } from \"./lib/types/api/cart-update-item\";\nimport type {\n MessageMajBoutonPanier,\n MessageMajContenuPanier,\n MessageMajContenuPanierDonnees,\n} from \"./lib/types/messages\";\n\nimport { ROUTE_API_MAJ_ARTICLE_PANIER, ROUTE_API_RETIRE_ARTICLE_PANIER } from \"./constantes/api.ts\";\nimport {\n ATTRIBUT_CLE_PANIER,\n ATTRIBUT_CONTIENT_ARTICLES,\n SELECTEUR_BOUTON_ADDITION_QUANTITE,\n SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE,\n SELECTEUR_BOUTON_SUPPRESSION_PANIER,\n SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER,\n SELECTEUR_CONTENEUR_PANIER,\n SELECTEUR_ENTREES_PANIER,\n SELECTEUR_PRIX_LIGNE_PANIER,\n SELECTEUR_TOTAL_PANIER,\n} from \"./constantes/dom.ts\";\nimport { NOM_CANAL_BOUTON_PANIER, NOM_CANAL_CONTENU_PANIER, TYPES_MESSAGES } from \"./constantes/messages.ts\";\nimport { recupereElementAvecSelecteur, recupereElementOuLeve } from \"./lib/dom.ts\";\nimport {\n DOMElementAbsentError,\n ErreurInconnue,\n leveBadRequestError,\n leveErreur,\n leveNotFoundError,\n leveServerError,\n leveUnauthorizedError,\n reporteErreur,\n type UnknownError,\n} from \"./lib/erreurs.ts\";\nimport { estError, estReponse500 } from \"./lib/gardes.ts\";\nimport { valideMessageMajBoutonPanier, valideMessageMajContenuPanier } from \"./lib/messages.ts\";\nimport { postBackendWC } from \"./lib/reseau.ts\";\nimport { WCStoreCartRemoveItemArgsSchema } from \"./lib/schemas/cart-remove-item.ts\";\nimport { WCStoreCartUpdateItemArgsSchema } from \"./lib/schemas/cart-update-item.ts\";\nimport { WCStoreCartSchema } from \"./lib/schemas/cart.ts\";\nimport { estWCError } from \"./lib/schemas/erreurs.ts\";\nimport { recupereElementDocumentEither, recupereElementsDocumentEither } from \"./lib/utils.ts\";\n\n/** États utiles pour les scripts de la page. */\ntype EtatsPage = {\n /** Un nonce pour l'authentification de requêtes API vers le backend WooCommerce. */\n nonce: string;\n};\n\n// @ts-expect-error -- États injectés par le modèle PHP\n// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- États injectés par le modèle PHP\nconst ETATS_PAGE: EtatsPage = _etats;\n\n/** */\nconst ENTREES_PANIER_EITHER: Either> = recupereElementsDocumentEither(\n SELECTEUR_ENTREES_PANIER,\n);\n\nconst CONTENEUR_PANIER: HTMLElement = pipe(\n recupereElementDocumentEither(SELECTEUR_CONTENEUR_PANIER),\n recupereElementOuLeve,\n);\n\nconst TOTAL_PANIER: HTMLParagraphElement = pipe(\n recupereElementDocumentEither(SELECTEUR_TOTAL_PANIER),\n recupereElementOuLeve,\n);\n\n/**\n * Fonction utilitaire pour rapidement créer et reporter une Erreur DOMElementAbsent.\n *\n * @param message\n * @returns L'ID Sentry de l'évènement capturé.\n */\nconst reporteErreurDOMElementAbsent = (message: string): string =>\n pipe(\n new DOMElementAbsentError(message),\n reporteErreur,\n );\n\nconst recupereElementDansEntreePanierOuLeve =\n /* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Nécessaire pour\n documenter le type d'Element attendu */\n (entree: HTMLElement) => (selecteur: string) =>\n pipe(\n recupereElementAvecSelecteur(entree)(selecteur),\n recupereElementOuLeve,\n );\n\nconst initialiseScriptsPagePanier = (): void => {\n ENTREES_PANIER_EITHER.ifRight((entrees: Array) =>\n entrees.forEach((entree: HTMLElement) => {\n const recupereElementDansEntree = recupereElementDansEntreePanierOuLeve(entree);\n\n // Retire l'entrée du DOM si la clé Panier n'existe pas et arrête précocement\n const clePanier: string = Maybe\n .fromNullable(entree.getAttribute(ATTRIBUT_CLE_PANIER))\n .ifNothing(() => {\n entree.remove();\n return;\n })\n .orDefault(\"CLE_PANIER_INEXISTANTE\");\n\n // Récupère les attributs et éléments utilisés dans le script\n const boutonSoustraction = recupereElementDansEntree(SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE);\n const champQuantite = recupereElementDansEntree(SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER);\n const boutonAddition = recupereElementDansEntree(SELECTEUR_BOUTON_ADDITION_QUANTITE);\n const boutonSuppression = recupereElementDansEntree(SELECTEUR_BOUTON_SUPPRESSION_PANIER);\n\n // Supprime la ligne du Panier au clic sur le bouton de suppression\n boutonSuppression.addEventListener(\"click\", (): void => {\n // TODO: Créer une boucle d'animation\n // Affiche un texte de chargement dans le Bouton\n boutonSuppression.textContent = \"C= C= C= C= C=┌(;・ω・)┘\";\n\n Either\n .encase(() => parse(WCStoreCartRemoveItemArgsSchema, { key: clePanier }))\n .map(\n (args: WCStoreCartRemoveItemArgs) => {\n postBackendWC({\n corps: JSON.stringify(args),\n nonce: ETATS_PAGE.nonce,\n route: ROUTE_API_RETIRE_ARTICLE_PANIER,\n })\n .then(async (reponse: Response) => {\n // Traite le cas d'erreur 500\n if (estReponse500(reponse)) leveServerError(\"500 Server Error\");\n\n pipe(\n // Récupère la Réponse\n await reponse.json(),\n // Traite tous les codes HTTPs possibles\n (corpsReponse: unknown) =>\n match(corpsReponse)\n // Réponses problématiques\n .with({ body: P.select(), status: 400 }, estWCError, leveBadRequestError)\n .with({ body: P.select(), status: 401 }, estWCError, leveUnauthorizedError)\n .with({ body: P.select(), status: 404 }, estWCError, leveNotFoundError)\n // Réponse OK (201)\n .with(P._, corpsOkInconnu => parse(WCStoreCartSchema, corpsOkInconnu))\n // Réponses inconnues\n .otherwise(e => pipe(e, ErreurInconnue, leveErreur)),\n tap((panier: WCStoreCart) => {\n // Émet un Message avec le nouveau contenu du Panier\n // TODO: Valider le Message avant de l'émettre\n new BroadcastChannel(NOM_CANAL_CONTENU_PANIER).postMessage({\n donnees: {\n produits: panier.items,\n totalPanier: Number(panier.totals.total_items / 100),\n },\n type: TYPES_MESSAGES.MajContenuPanier,\n } as MessageMajContenuPanier);\n // Émet un Message avec le nouveau nombre de Produits dans le Panier\n // TODO: Valider le Message avant de l'émettre\n new BroadcastChannel(NOM_CANAL_BOUTON_PANIER).postMessage({\n donnees: panier.items_count,\n type: TYPES_MESSAGES.MajBoutonPanier,\n });\n // Retire l'entrée du Panier du DOM\n entree.remove();\n }),\n );\n })\n .catch((e: unknown) => {\n if (estError(e)) {\n reporteErreur(e);\n } else {\n console.error(\"e n'est pas une Erreur ?!\", e);\n }\n });\n },\n );\n });\n\n // Retire une unité à une ligne du Panier au clic sur le bouton de soustraction\n boutonSoustraction.addEventListener(\"click\", () => {\n Maybe\n .fromNullable(champQuantite.valueAsNumber)\n .filter((valeur) => valeur > 1)\n .ifJust((valeur) => {\n // Modifie des éléments du DOM pour signaler la requête et empêcher des doubles exécutions\n boutonSuppression.textContent = \"C= C= C= C= C=┌(;・ω・)┘\";\n boutonSoustraction.toggleAttribute(\"disabled\");\n boutonAddition.toggleAttribute(\"disabled\");\n boutonSuppression.toggleAttribute(\"disabled\");\n\n Either\n // Valide les arguments de la requête\n .encase(() =>\n parse(WCStoreCartUpdateItemArgsSchema, { key: clePanier, quantity: valeur - 1 })\n )\n .map(\n (args: WCStoreCartUpdateItemArgs) => {\n // Réalise la requête\n postBackendWC({\n corps: JSON.stringify(args),\n nonce: ETATS_PAGE.nonce,\n route: ROUTE_API_MAJ_ARTICLE_PANIER,\n })\n .then(async (reponse: Response) => {\n // Traite le cas d'erreur 500\n if (estReponse500(reponse)) leveServerError(\"500 Server Error\");\n\n pipe(\n // Récupère la Réponse\n await reponse.json(),\n // Traite tous les codes HTTPs possibles\n (corpsReponse: unknown) =>\n match(corpsReponse)\n // Réponses problématiques\n .with({ body: P.select(), status: 400 }, estWCError, leveBadRequestError)\n .with({ body: P.select(), status: 401 }, estWCError, leveUnauthorizedError)\n .with({ body: P.select(), status: 404 }, estWCError, leveNotFoundError)\n // Réponse OK (201)\n .with(P._, corpsOkInconnu => parse(WCStoreCartSchema, corpsOkInconnu))\n // Réponses inconnues\n .otherwise(e => pipe(e, ErreurInconnue, leveErreur)),\n tap((panier: WCStoreCart) => {\n // Émet un message pour la mise à jour du bouton du Panier\n // TODO: Valider le Message avant de l'émettre\n new BroadcastChannel(NOM_CANAL_BOUTON_PANIER).postMessage({\n donnees: panier.items_count,\n type: TYPES_MESSAGES.MajBoutonPanier,\n });\n // Émet un Message avec le nouveau contenu du Panier\n // TODO: Valider le Message avant de l'émettre\n new BroadcastChannel(NOM_CANAL_CONTENU_PANIER).postMessage({\n donnees: {\n produits: panier.items,\n totalPanier: Number(panier.totals.total_items / 100),\n },\n type: TYPES_MESSAGES.MajContenuPanier,\n } as MessageMajContenuPanier);\n\n boutonSoustraction.toggleAttribute(\"disabled\");\n boutonAddition.toggleAttribute(\"disabled\");\n boutonSuppression.toggleAttribute(\"disabled\");\n boutonSuppression.textContent = \"Remove\";\n }),\n );\n })\n .catch((e: unknown) => {\n if (estError(e)) {\n reporteErreur(e);\n } else {\n console.error(\"e n'est pas une Erreur ?!\", e);\n }\n });\n },\n );\n });\n });\n\n // Ajoute une unité à une ligne du Panier au clic sur le bouton d'addition\n boutonAddition.addEventListener(\"click\", () => {\n Maybe\n .fromNullable(champQuantite.valueAsNumber)\n .ifJust((valeur) => {\n // Modifie des éléments du DOM pour signifier le traitement de la requête et empêcher des\n // doubles exécutions\n boutonSuppression.textContent = \"C= C= C= C= C=┌(;・ω・)┘\";\n boutonSoustraction.toggleAttribute(\"disabled\");\n boutonAddition.toggleAttribute(\"disabled\");\n boutonSuppression.toggleAttribute(\"disabled\");\n\n Either\n // Valide les arguments de la requête\n .encase(() =>\n parse(WCStoreCartUpdateItemArgsSchema, { key: clePanier, quantity: valeur + 1 })\n )\n .map(\n (args: WCStoreCartUpdateItemArgs) => {\n // Réalise la requête\n postBackendWC({\n corps: JSON.stringify(args),\n nonce: ETATS_PAGE.nonce,\n route: ROUTE_API_MAJ_ARTICLE_PANIER,\n })\n .then(async (reponse: Response) => {\n // Traite le cas d'erreur 500\n if (estReponse500(reponse)) leveServerError(\"500 Server Error\");\n\n pipe(\n // Récupère la Réponse\n await reponse.json(),\n // Traite tous les codes HTTPs possibles\n (corpsReponse: unknown) =>\n match(corpsReponse)\n // Réponses problématiques\n .with({ body: P.select(), status: 400 }, estWCError, leveBadRequestError)\n .with({ body: P.select(), status: 401 }, estWCError, leveUnauthorizedError)\n .with({ body: P.select(), status: 404 }, estWCError, leveNotFoundError)\n // Réponse OK (201)\n .with(P._, corpsOkInconnu => parse(WCStoreCartSchema, corpsOkInconnu))\n // Réponses inconnues\n .otherwise(e => pipe(e, ErreurInconnue, leveErreur)),\n tap((panier: WCStoreCart) => {\n // Émet un message pour la mise à jour du bouton du Panier\n // TODO: Valider le Message avant de l'émettre\n new BroadcastChannel(NOM_CANAL_BOUTON_PANIER).postMessage({\n donnees: panier.items_count,\n type: TYPES_MESSAGES.MajBoutonPanier,\n });\n // Émet un Message avec le nouveau contenu du Panier\n // TODO: Valider le Message avant de l'émettre\n new BroadcastChannel(NOM_CANAL_CONTENU_PANIER).postMessage({\n donnees: {\n produits: panier.items,\n totalPanier: Number(panier.totals.total_items / 100),\n },\n type: TYPES_MESSAGES.MajContenuPanier,\n } as MessageMajContenuPanier);\n\n boutonSoustraction.toggleAttribute(\"disabled\");\n boutonAddition.toggleAttribute(\"disabled\");\n boutonSuppression.toggleAttribute(\"disabled\");\n boutonSuppression.textContent = \"Remove\";\n }),\n );\n })\n .catch((e: unknown) => {\n if (estError(e)) {\n reporteErreur(e);\n } else {\n console.error(\"e n'est pas une Erreur ?!\", e);\n }\n });\n },\n );\n });\n });\n })\n );\n};\n\nconst initialiseMajConteneurPanier = (): void => {\n const CANAL_BOUTON_PANIER: BroadcastChannel = new BroadcastChannel(NOM_CANAL_BOUTON_PANIER);\n CANAL_BOUTON_PANIER.onmessage = (evenementMessage: MessageEvent): void => {\n valideMessageMajBoutonPanier(evenementMessage)\n // Met à jour le Bouton du Panier\n .ifRight((message: MessageMajBoutonPanier) => {\n CONTENEUR_PANIER.setAttribute(ATTRIBUT_CONTIENT_ARTICLES, String(message.donnees !== 0));\n });\n };\n};\n\nconst initialiseEcouteCanalMajContenuPanier = (): void => {\n new BroadcastChannel(NOM_CANAL_CONTENU_PANIER).onmessage = (evenementMessage: MessageEvent): void => {\n /**\n * À la réception d'un Événement (contenu le Panier), mettre à jour :\n * - les quantités ;\n * - les prix ;\n */\n valideMessageMajContenuPanier(evenementMessage)\n // Met à jour le contenu du Panier\n .map(prop(\"donnees\"))\n .ifRight((donnees: MessageMajContenuPanierDonnees) => {\n donnees.produits.forEach((ligne: WCStoreCartItem) => {\n ENTREES_PANIER_EITHER.ifRight((entrees: Array) => {\n Maybe\n .fromNullable(entrees.find((entree) => entree.getAttribute(ATTRIBUT_CLE_PANIER) === ligne.key))\n .ifJust((entree) => {\n // Fonction utilitaire\n const recupereElementDansEntree = recupereElementDansEntreePanierOuLeve(entree);\n\n const prixLigne = recupereElementDansEntree(SELECTEUR_PRIX_LIGNE_PANIER);\n const champQuantite = recupereElementDansEntree(\n SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER,\n );\n\n prixLigne.textContent = `${String(Number(ligne.totals.line_total) / 100)} €`;\n champQuantite.setAttribute(\"value\", String(ligne.quantity));\n TOTAL_PANIER.textContent = `${donnees.totalPanier} €`;\n });\n });\n });\n });\n };\n};\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n initialiseScriptsPagePanier();\n initialiseMajConteneurPanier();\n initialiseEcouteCanalMajContenuPanier();\n});\n"],"names":["pipe","match","P","tap","prop"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"scripts-page-panier.js","sources":["../../src/scripts/scripts-page-panier.ts"],"sourcesContent":["import { Either, Maybe } from \"purify-ts\";\nimport { pipe, prop, tap } from \"remeda\";\nimport { parse, type ValiError } from \"valibot\";\n\nimport type { MessageMajContenuPanierSchema } from \"./lib/schemas/messages.ts\";\nimport type { WCStoreCart, WCStoreCartItem } from \"./lib/types/api/cart\";\nimport type { WCStoreCartRemoveItemArgs } from \"./lib/types/api/cart-remove-item\";\nimport type { WCStoreCartUpdateItemArgs } from \"./lib/types/api/cart-update-item\";\nimport type { MessageMajBoutonPanierDonnees, MessageMajContenuPanierDonnees } from \"./lib/types/messages\";\n\nimport { ROUTE_API_MAJ_ARTICLE_PANIER, ROUTE_API_RETIRE_ARTICLE_PANIER } from \"./constantes/api.ts\";\nimport {\n ATTRIBUT_CLE_PANIER,\n ATTRIBUT_CONTIENT_ARTICLES,\n ATTRIBUT_DESACTIVE,\n SELECTEUR_BOUTON_ADDITION_QUANTITE,\n SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE,\n SELECTEUR_BOUTON_SUPPRESSION_PANIER,\n SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER,\n SELECTEUR_CONTENEUR_PANIER,\n SELECTEUR_ENTREES_PANIER,\n SELECTEUR_PRIX_LIGNE_PANIER,\n SELECTEUR_SOUS_TOTAL_PANIER,\n SELECTEUR_TOTAL_PANIER,\n} from \"./constantes/dom.ts\";\nimport { NOM_CANAL_BOUTON_PANIER, NOM_CANAL_CONTENU_PANIER } from \"./constantes/messages.ts\";\nimport { recupereElementAvecSelecteur, recupereElementOuLeve } from \"./lib/dom.ts\";\nimport { type CleNonTrouveError, leveServerError, reporteErreur } from \"./lib/erreurs.ts\";\nimport { estError, estReponse500 } from \"./lib/gardes.ts\";\nimport {\n emetMessageMajBoutonPanier,\n emetMessageMajContenuPanier,\n valideMessageMajBoutonPanier,\n valideMessageMajContenuPanier,\n} from \"./lib/messages.ts\";\nimport { postBackend, traiteReponseBackendWCSelonCodesHTTP } from \"./lib/reseau.ts\";\nimport { WCStoreCartRemoveItemArgsSchema } from \"./lib/schemas/cart-remove-item.ts\";\nimport { WCStoreCartUpdateItemArgsSchema } from \"./lib/schemas/cart-update-item.ts\";\nimport { WCStoreCartSchema } from \"./lib/schemas/cart.ts\";\nimport { propEither, recupereElementDocumentEither, recupereElementsDocumentEither } from \"./lib/utils.ts\";\n\n/** États utiles pour les scripts de la page. */\ntype EtatsPage = {\n /** Un nonce pour l'authentification de requêtes API vers le backend WooCommerce. */\n nonce: string;\n};\n\ntype ElementsEntreePanier = {\n boutonAddition: HTMLButtonElement;\n boutonSoustraction: HTMLButtonElement;\n boutonSuppression: HTMLButtonElement;\n champQuantite?: HTMLInputElement;\n};\n\n// @ts-expect-error -- États injectés par le modèle PHP\n// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- États injectés par le modèle PHP\nconst ETATS_PAGE: EtatsPage = _etats;\n\n/** */\nconst ENTREES_PANIER_EITHER: Either> = recupereElementsDocumentEither(\n SELECTEUR_ENTREES_PANIER,\n);\nconst CONTENEUR_PANIER: HTMLElement = pipe(\n recupereElementDocumentEither(SELECTEUR_CONTENEUR_PANIER),\n recupereElementOuLeve,\n);\nconst SOUS_TOTAL_PANIER: HTMLElement = pipe(\n recupereElementDocumentEither(SELECTEUR_SOUS_TOTAL_PANIER),\n recupereElementOuLeve,\n);\nconst TOTAL_PANIER: HTMLParagraphElement = pipe(\n recupereElementDocumentEither(SELECTEUR_TOTAL_PANIER),\n recupereElementOuLeve,\n);\n\n/**\n * Fonction utilitaire pour récupérer un Élément dans une ligne (entrée) du Panier, en levant une\n * Erreur s'il n'existe pas.\n *\n * @param entree L'entrée du Panier sous forme d'Élément dans le DOM.\n * @returns L'Élément demandé.\n * @throws Une SyntaxError si l'Élément n'est pas trouvé.\n */\nconst recupereElementDansEntreePanierOuLeve =\n (entree: HTMLElement) => (selecteur: string) =>\n pipe(\n recupereElementAvecSelecteur(entree)(selecteur),\n recupereElementOuLeve,\n );\n\nconst desactiveBoutonsEntreesPanier = (entrees: Array): void =>\n entrees.forEach((entree: HTMLElement) => {\n // Fonction utilitaire\n const recupereElementDansEntree = recupereElementDansEntreePanierOuLeve(entree);\n\n const elements: ElementsEntreePanier = {\n boutonAddition: recupereElementDansEntree(SELECTEUR_BOUTON_ADDITION_QUANTITE),\n boutonSoustraction: recupereElementDansEntree(SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE),\n boutonSuppression: recupereElementDansEntree(SELECTEUR_BOUTON_SUPPRESSION_PANIER),\n };\n\n elements.boutonSoustraction.setAttribute(ATTRIBUT_DESACTIVE, \"\");\n elements.boutonAddition.setAttribute(ATTRIBUT_DESACTIVE, \"\");\n elements.boutonSuppression.setAttribute(ATTRIBUT_DESACTIVE, \"\");\n elements.boutonSuppression.textContent = \"C= C= C= C= C=┌(;・ω・)┘\";\n });\n\nconst majEtatsActivationBoutons = (entrees: Array): void =>\n entrees.forEach((entree: HTMLElement) => {\n // Fonction utilitaire\n const recupereElementDansEntree = recupereElementDansEntreePanierOuLeve(entree);\n\n const elements: ElementsEntreePanier = {\n boutonAddition: recupereElementDansEntree(SELECTEUR_BOUTON_ADDITION_QUANTITE),\n boutonSoustraction: recupereElementDansEntree(SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE),\n boutonSuppression: recupereElementDansEntree(SELECTEUR_BOUTON_SUPPRESSION_PANIER),\n champQuantite: recupereElementDansEntree(SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER),\n };\n\n Number(elements.champQuantite?.value) === 1\n ? elements.boutonSoustraction.setAttribute(ATTRIBUT_DESACTIVE, \"\")\n : elements.boutonSoustraction.removeAttribute(ATTRIBUT_DESACTIVE);\n elements.boutonAddition.removeAttribute(ATTRIBUT_DESACTIVE);\n elements.boutonSuppression.removeAttribute(ATTRIBUT_DESACTIVE);\n elements.boutonSuppression.textContent = \"Remove\";\n });\n\nconst initialiseMajEntreesPanier = (): void => {\n ENTREES_PANIER_EITHER.ifRight((entrees: Array) => {\n entrees.forEach((entree: HTMLElement) => {\n const recupereElementDansEntree = recupereElementDansEntreePanierOuLeve(entree);\n\n // Retire l'entrée du DOM si la clé Panier n'existe pas et arrête précocement\n const clePanier: string = Maybe\n .fromNullable(entree.getAttribute(ATTRIBUT_CLE_PANIER))\n .ifNothing(() => {\n entree.remove();\n return;\n })\n .orDefault(\"CLE_PANIER_INEXISTANTE\");\n\n // Récupère les attributs et éléments utilisés dans le script\n const boutonSoustraction = recupereElementDansEntree(SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE);\n const champQuantite = recupereElementDansEntree(SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER);\n const boutonAddition = recupereElementDansEntree(SELECTEUR_BOUTON_ADDITION_QUANTITE);\n const boutonSuppression = recupereElementDansEntree(SELECTEUR_BOUTON_SUPPRESSION_PANIER);\n\n // Supprime la ligne du Panier au clic sur le bouton de suppression\n boutonSuppression.addEventListener(\"click\", (): void => {\n Either\n // Valide un corps de requête\n .encase, WCStoreCartRemoveItemArgs>(() =>\n parse(WCStoreCartRemoveItemArgsSchema, { key: clePanier })\n )\n .map(\n async (args: WCStoreCartRemoveItemArgs) => {\n // Modifie des éléments du DOM pour signaler la requête et empêcher des doubles exécutions\n desactiveBoutonsEntreesPanier(entrees);\n\n // Réalise la requête auprès du backend\n await postBackend({\n corps: JSON.stringify(args),\n nonce: ETATS_PAGE.nonce,\n route: ROUTE_API_RETIRE_ARTICLE_PANIER,\n })\n .then(async (reponse: Response) => {\n // Traite le cas d'erreur 500\n if (estReponse500(reponse)) leveServerError(\"500 Server Error\");\n\n pipe(\n // Récupère la Réponse\n await reponse.json(),\n // Traite tous les codes HTTPs possibles\n (corpsReponse: unknown) =>\n traiteReponseBackendWCSelonCodesHTTP(\n corpsReponse,\n WCStoreCartSchema,\n ),\n // Émets des Messages via BroadcastChannels pour la mise à jour de la page\n tap((panier: WCStoreCart) => {\n // Émet un Message avec le nouveau nombre de Produits dans le Panier\n emetMessageMajBoutonPanier({ quantiteProduits: panier.items_count });\n // Émet un Message avec le nouveau contenu du Panier\n emetMessageMajContenuPanier({\n produits: panier.items,\n sousTotalPanier: Number(panier.totals.total_price) / 100,\n totalPanier: Number(panier.totals.total_items) / 100,\n });\n // Retire l'entrée du Panier du DOM\n entree.remove();\n }),\n );\n })\n .catch((e: unknown) => {\n if (estError(e)) {\n reporteErreur(e);\n } else {\n console.error(\"e n'est pas une Erreur ?!\", e);\n }\n majEtatsActivationBoutons(entrees);\n });\n },\n )\n .ifLeft((erreur: ValiError) => reporteErreur(erreur));\n });\n\n // Retire une unité à une ligne du Panier au clic sur le bouton de soustraction\n boutonSoustraction.addEventListener(\"click\", (): void => {\n Maybe\n .fromNullable(champQuantite.valueAsNumber)\n .filter((valeur) => valeur > 1)\n .ifJust((valeur) => {\n Either\n // Valide les arguments de la requête\n .encase(() =>\n parse(WCStoreCartUpdateItemArgsSchema, { key: clePanier, quantity: valeur - 1 })\n )\n .map(\n async (args: WCStoreCartUpdateItemArgs) => {\n // Modifie des éléments du DOM pour signaler la requête et empêcher des doubles exécutions\n desactiveBoutonsEntreesPanier(entrees);\n\n // Réalise la requête\n await postBackend({\n corps: JSON.stringify(args),\n nonce: ETATS_PAGE.nonce,\n route: ROUTE_API_MAJ_ARTICLE_PANIER,\n })\n .then(async (reponse: Response) => {\n // Traite le cas d'erreur 500\n if (estReponse500(reponse)) leveServerError(\"500 Server Error\");\n\n pipe(\n // Récupère la Réponse\n await reponse.json(),\n // Traite tous les codes HTTPs possibles\n (corpsReponse: unknown) =>\n traiteReponseBackendWCSelonCodesHTTP(\n corpsReponse,\n WCStoreCartSchema,\n ),\n tap((panier: WCStoreCart) => {\n // Émet un Message avec le nouveau nombre de Produits dans le Panier\n emetMessageMajBoutonPanier({ quantiteProduits: panier.items_count });\n // Émet un Message avec le nouveau contenu du Panier\n emetMessageMajContenuPanier({\n produits: panier.items,\n sousTotalPanier: Number(panier.totals.total_price) / 100,\n totalPanier: Number(panier.totals.total_items) / 100,\n });\n }),\n );\n })\n .catch((e: unknown) => {\n if (estError(e)) {\n reporteErreur(e);\n } else {\n console.error(\"e n'est pas une Erreur ?!\", e);\n }\n\n majEtatsActivationBoutons(entrees);\n });\n },\n );\n });\n });\n\n // Ajoute une unité à une ligne du Panier au clic sur le bouton d'addition\n boutonAddition.addEventListener(\"click\", (): void => {\n Maybe\n .fromNullable(champQuantite.valueAsNumber)\n .ifJust((valeur) => {\n // Modifie des éléments du DOM pour signaler la requête et empêcher des doubles exécutions\n desactiveBoutonsEntreesPanier(entrees);\n\n Either\n // Valide les arguments de la requête\n .encase(() =>\n parse(WCStoreCartUpdateItemArgsSchema, { key: clePanier, quantity: valeur + 1 })\n )\n .map(\n async (args: WCStoreCartUpdateItemArgs) => {\n // Réalise la requête\n await postBackend({\n corps: JSON.stringify(args),\n nonce: ETATS_PAGE.nonce,\n route: ROUTE_API_MAJ_ARTICLE_PANIER,\n })\n .then(async (reponse: Response) => {\n // Traite le cas d'erreur 500\n if (estReponse500(reponse)) leveServerError(\"500 Server Error\");\n\n pipe(\n // Récupère la Réponse\n await reponse.json(),\n // Traite tous les codes HTTPs possibles\n (corpsReponse: unknown) =>\n traiteReponseBackendWCSelonCodesHTTP(\n corpsReponse,\n WCStoreCartSchema,\n ),\n tap((panier: WCStoreCart) => {\n // Émet un Message avec le nouveau nombre de Produits dans le Panier\n emetMessageMajBoutonPanier({ quantiteProduits: panier.items_count });\n // Émet un Message avec le nouveau contenu du Panier\n emetMessageMajContenuPanier({\n produits: panier.items,\n sousTotalPanier: Number(panier.totals.total_price) / 100,\n totalPanier: Number(panier.totals.total_items) / 100,\n });\n }),\n );\n })\n .catch((e: unknown) => {\n if (estError(e)) {\n reporteErreur(e);\n } else {\n console.error(\"e n'est pas une Erreur ?!\", e);\n }\n\n majEtatsActivationBoutons(entrees);\n });\n },\n );\n });\n });\n });\n });\n};\n\nconst initialiseMajConteneurPanier = (): void => {\n new BroadcastChannel(NOM_CANAL_BOUTON_PANIER).onmessage = (evenementMessage: MessageEvent): void => {\n valideMessageMajBoutonPanier(evenementMessage)\n .map(prop(\"donnees\"))\n // Met à jour le Bouton du Panier\n .ifRight((donnees: MessageMajBoutonPanierDonnees) => {\n CONTENEUR_PANIER.setAttribute(ATTRIBUT_CONTIENT_ARTICLES, String(donnees.quantiteProduits !== 0));\n });\n };\n};\n\nconst initialiseMajContenuPanier = (): void => {\n new BroadcastChannel(NOM_CANAL_CONTENU_PANIER).onmessage = (evenementMessage: MessageEvent): void => {\n valideMessageMajContenuPanier(evenementMessage)\n .chain(propEither(\"donnees\"))\n // Met à jour le contenu du Panier\n .ifRight((donnees: MessageMajContenuPanierDonnees) => {\n donnees.produits.forEach((ligne: WCStoreCartItem) => {\n // Met à jour les entrées du Panier\n ENTREES_PANIER_EITHER.ifRight((entrees: Array) => {\n Maybe\n .fromNullable(entrees.find((entree) => entree.getAttribute(ATTRIBUT_CLE_PANIER) === ligne.key))\n .ifJust((entree: HTMLElement) => {\n // Fonction utilitaire\n const recupereElementDansEntree = recupereElementDansEntreePanierOuLeve(entree);\n\n const prixLigne = recupereElementDansEntree(SELECTEUR_PRIX_LIGNE_PANIER);\n const champQuantite = recupereElementDansEntree(\n SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER,\n );\n\n prixLigne.textContent = `${String(Number(ligne.totals.line_total) / 100)} €`;\n champQuantite.setAttribute(\"value\", String(ligne.quantity));\n\n majEtatsActivationBoutons(entrees);\n });\n\n // Met à jour les totaux du Panier\n SOUS_TOTAL_PANIER.textContent = `${String(donnees.totalPanier)} €`;\n TOTAL_PANIER.textContent = `${String(donnees.totalPanier)} €`;\n });\n });\n })\n // Reporte tout Erreur et réactive les Boutons\n .ifLeft((erreur: CleNonTrouveError | ValiError) => {\n reporteErreur(erreur);\n ENTREES_PANIER_EITHER.ifRight(entrees => majEtatsActivationBoutons(entrees));\n });\n };\n};\n\ndocument.addEventListener(\"DOMContentLoaded\", (): void => {\n initialiseMajEntreesPanier();\n initialiseMajConteneurPanier();\n initialiseMajContenuPanier();\n});\n"],"names":["pipe","tap","prop"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAwDA,MAAM,aAAwB;AAG9B,MAAM,wBAAiE;AAAA,EACrE;AACF;AACA,MAAM,mBAAgCA;AAAAA,EACpC,8BAA2C,0BAA0B;AAAA,EACrE;AACF;AACA,MAAM,oBAAiCA;AAAAA,EACrC,8BAAoD,2BAA2B;AAAA,EAC/E;AACF;AACA,MAAM,eAAqCA;AAAAA,EACzC,8BAAoD,sBAAsB;AAAA,EAC1E;AACF;AAUA,MAAM,wCACJ,CAAC,WAAwB,CAA8B,cACrDA;AAAAA,EACE,6BAA6B,MAAM,EAAK,SAAS;AAAA,EACjD;AACF;AAEJ,MAAM,gCAAgC,CAAC,YACrC,QAAQ,QAAQ,CAAC,WAAwB;AAEjC,QAAA,4BAA4B,sCAAsC,MAAM;AAE9E,QAAM,WAAiC;AAAA,IACrC,gBAAgB,0BAA6C,kCAAkC;AAAA,IAC/F,oBAAoB,0BAA6C,sCAAsC;AAAA,IACvG,mBAAmB,0BAA6C,mCAAmC;AAAA,EAAA;AAG5F,WAAA,mBAAmB,aAAa,oBAAoB,EAAE;AACtD,WAAA,eAAe,aAAa,oBAAoB,EAAE;AAClD,WAAA,kBAAkB,aAAa,oBAAoB,EAAE;AAC9D,WAAS,kBAAkB,cAAc;AAC3C,CAAC;AAEH,MAAM,4BAA4B,CAAC,YACjC,QAAQ,QAAQ,CAAC,WAAwB;AAEjC,QAAA,4BAA4B,sCAAsC,MAAM;AAE9E,QAAM,WAAiC;AAAA,IACrC,gBAAgB,0BAA6C,kCAAkC;AAAA,IAC/F,oBAAoB,0BAA6C,sCAAsC;AAAA,IACvG,mBAAmB,0BAA6C,mCAAmC;AAAA,IACnG,eAAe,0BAA4C,qCAAqC;AAAA,EAAA;AAGlG,SAAO,SAAS,eAAe,KAAK,MAAM,IACtC,SAAS,mBAAmB,aAAa,oBAAoB,EAAE,IAC/D,SAAS,mBAAmB,gBAAgB,kBAAkB;AACzD,WAAA,eAAe,gBAAgB,kBAAkB;AACjD,WAAA,kBAAkB,gBAAgB,kBAAkB;AAC7D,WAAS,kBAAkB,cAAc;AAC3C,CAAC;AAEH,MAAM,6BAA6B,MAAY;AACvB,wBAAA,QAAQ,CAAC,YAAgC;AACrD,YAAA,QAAQ,CAAC,WAAwB;AACjC,YAAA,4BAA4B,sCAAsC,MAAM;AAGxE,YAAA,YAAoB,MACvB,aAAa,OAAO,aAAa,mBAAmB,CAAC,EACrD,UAAU,MAAM;AACf,eAAO,OAAO;AACd;AAAA,MAAA,CACD,EACA,UAAU,wBAAwB;AAG/B,YAAA,qBAAqB,0BAA6C,sCAAsC;AACxG,YAAA,gBAAgB,0BAA4C,qCAAqC;AACjG,YAAA,iBAAiB,0BAA6C,kCAAkC;AAChG,YAAA,oBAAoB,0BAA6C,mCAAmC;AAGxF,wBAAA,iBAAiB,SAAS,MAAY;AAGnD,eAAA;AAAA,UAAqF,MACpF,MAAM,iCAAiC,EAAE,KAAK,WAAW;AAAA,QAAA,EAE1D;AAAA,UACC,OAAO,SAAoC;AAEzC,0CAA8B,OAAO;AAGrC,kBAAM,YAAY;AAAA,cAChB,OAAO,KAAK,UAAU,IAAI;AAAA,cAC1B,OAAO,WAAW;AAAA,cAClB,OAAO;AAAA,YAAA,CACR,EACE,KAAK,OAAO,YAAsB;AAEjC,kBAAI,cAAc,OAAO,EAAG,iBAAgB,kBAAkB;AAE9DA;AAAAA;AAAAA,gBAEE,MAAM,QAAQ,KAAK;AAAA;AAAA,gBAEnB,CAAC,iBACC;AAAA,kBACE;AAAA,kBACA;AAAA,gBACF;AAAA;AAAA,gBAEFC,EAAI,CAAC,WAAwB;AAE3B,6CAA2B,EAAE,kBAAkB,OAAO,YAAa,CAAA;AAEvC,8CAAA;AAAA,oBAC1B,UAAU,OAAO;AAAA,oBACjB,iBAAiB,OAAO,OAAO,OAAO,WAAW,IAAI;AAAA,oBACrD,aAAa,OAAO,OAAO,OAAO,WAAW,IAAI;AAAA,kBAAA,CAClD;AAED,yBAAO,OAAO;AAAA,gBAAA,CACf;AAAA,cAAA;AAAA,YACH,CACD,EACA,MAAM,CAAC,MAAe;AACjB,kBAAA,SAAS,CAAC,GAAG;AACf,8BAAc,CAAC;AAAA,cAAA,OACV;AACG,wBAAA,MAAM,6BAA6B,CAAC;AAAA,cAC9C;AACA,wCAA0B,OAAO;AAAA,YAAA,CAClC;AAAA,UACL;AAAA,UAED,OAAO,CAAC,WAA8D,cAAc,MAAM,CAAC;AAAA,MAAA,CAC/F;AAGkB,yBAAA,iBAAiB,SAAS,MAAY;AACvD,cACG,aAAa,cAAc,aAAa,EACxC,OAAO,CAAC,WAAW,SAAS,CAAC,EAC7B,OAAO,CAAC,WAAW;AAGf,iBAAA;AAAA,YAAyC,MACxC,MAAM,iCAAiC,EAAE,KAAK,WAAW,UAAU,SAAS,GAAG;AAAA,UAAA,EAEhF;AAAA,YACC,OAAO,SAAoC;AAEzC,4CAA8B,OAAO;AAGrC,oBAAM,YAAY;AAAA,gBAChB,OAAO,KAAK,UAAU,IAAI;AAAA,gBAC1B,OAAO,WAAW;AAAA,gBAClB,OAAO;AAAA,cAAA,CACR,EACE,KAAK,OAAO,YAAsB;AAEjC,oBAAI,cAAc,OAAO,EAAG,iBAAgB,kBAAkB;AAE9DD;AAAAA;AAAAA,kBAEE,MAAM,QAAQ,KAAK;AAAA;AAAA,kBAEnB,CAAC,iBACC;AAAA,oBACE;AAAA,oBACA;AAAA,kBACF;AAAA,kBACFC,EAAI,CAAC,WAAwB;AAE3B,+CAA2B,EAAE,kBAAkB,OAAO,YAAa,CAAA;AAEvC,gDAAA;AAAA,sBAC1B,UAAU,OAAO;AAAA,sBACjB,iBAAiB,OAAO,OAAO,OAAO,WAAW,IAAI;AAAA,sBACrD,aAAa,OAAO,OAAO,OAAO,WAAW,IAAI;AAAA,oBAAA,CAClD;AAAA,kBAAA,CACF;AAAA,gBAAA;AAAA,cACH,CACD,EACA,MAAM,CAAC,MAAe;AACjB,oBAAA,SAAS,CAAC,GAAG;AACf,gCAAc,CAAC;AAAA,gBAAA,OACV;AACG,0BAAA,MAAM,6BAA6B,CAAC;AAAA,gBAC9C;AAEA,0CAA0B,OAAO;AAAA,cAAA,CAClC;AAAA,YACL;AAAA,UAAA;AAAA,QACF,CACH;AAAA,MAAA,CACJ;AAGc,qBAAA,iBAAiB,SAAS,MAAY;AACnD,cACG,aAAa,cAAc,aAAa,EACxC,OAAO,CAAC,WAAW;AAElB,wCAA8B,OAAO;AAIlC,iBAAA;AAAA,YAAyC,MACxC,MAAM,iCAAiC,EAAE,KAAK,WAAW,UAAU,SAAS,GAAG;AAAA,UAAA,EAEhF;AAAA,YACC,OAAO,SAAoC;AAEzC,oBAAM,YAAY;AAAA,gBAChB,OAAO,KAAK,UAAU,IAAI;AAAA,gBAC1B,OAAO,WAAW;AAAA,gBAClB,OAAO;AAAA,cAAA,CACR,EACE,KAAK,OAAO,YAAsB;AAEjC,oBAAI,cAAc,OAAO,EAAG,iBAAgB,kBAAkB;AAE9DD;AAAAA;AAAAA,kBAEE,MAAM,QAAQ,KAAK;AAAA;AAAA,kBAEnB,CAAC,iBACC;AAAA,oBACE;AAAA,oBACA;AAAA,kBACF;AAAA,kBACFC,EAAI,CAAC,WAAwB;AAE3B,+CAA2B,EAAE,kBAAkB,OAAO,YAAa,CAAA;AAEvC,gDAAA;AAAA,sBAC1B,UAAU,OAAO;AAAA,sBACjB,iBAAiB,OAAO,OAAO,OAAO,WAAW,IAAI;AAAA,sBACrD,aAAa,OAAO,OAAO,OAAO,WAAW,IAAI;AAAA,oBAAA,CAClD;AAAA,kBAAA,CACF;AAAA,gBAAA;AAAA,cACH,CACD,EACA,MAAM,CAAC,MAAe;AACjB,oBAAA,SAAS,CAAC,GAAG;AACf,gCAAc,CAAC;AAAA,gBAAA,OACV;AACG,0BAAA,MAAM,6BAA6B,CAAC;AAAA,gBAC9C;AAEA,0CAA0B,OAAO;AAAA,cAAA,CAClC;AAAA,YACL;AAAA,UAAA;AAAA,QACF,CACH;AAAA,MAAA,CACJ;AAAA,IAAA,CACF;AAAA,EAAA,CACF;AACH;AAEA,MAAM,+BAA+B,MAAY;AAC/C,MAAI,iBAAiB,uBAAuB,EAAE,YAAY,CAAC,qBAAkD;AAC9E,iCAAA,gBAAgB,EAC1C,IAAIC,EAAK,SAAS,CAAC,EAEnB,QAAQ,CAAC,YAA2C;AACnD,uBAAiB,aAAa,4BAA4B,OAAO,QAAQ,qBAAqB,CAAC,CAAC;AAAA,IAAA,CACjG;AAAA,EAAA;AAEP;AAEA,MAAM,6BAA6B,MAAY;AAC7C,MAAI,iBAAiB,wBAAwB,EAAE,YAAY,CAAC,qBAAkD;AAC9E,kCAAA,gBAAgB,EAC3C,MAAM,WAAW,SAAS,CAAC,EAE3B,QAAQ,CAAC,YAA4C;AAC5C,cAAA,SAAS,QAAQ,CAAC,UAA2B;AAE7B,8BAAA,QAAQ,CAAC,YAAgC;AAC7D,gBACG,aAAa,QAAQ,KAAK,CAAC,WAAW,OAAO,aAAa,mBAAmB,MAAM,MAAM,GAAG,CAAC,EAC7F,OAAO,CAAC,WAAwB;AAEzB,kBAAA,4BAA4B,sCAAsC,MAAM;AAExE,kBAAA,YAAY,0BAA2C,2BAA2B;AACxF,kBAAM,gBAAgB;AAAA,cACpB;AAAA,YAAA;AAGQ,sBAAA,cAAc,GAAG,OAAO,OAAO,MAAM,OAAO,UAAU,IAAI,GAAG,CAAC;AACxE,0BAAc,aAAa,SAAS,OAAO,MAAM,QAAQ,CAAC;AAE1D,sCAA0B,OAAO;AAAA,UAAA,CAClC;AAGH,4BAAkB,cAAc,GAAG,OAAO,QAAQ,WAAW,CAAC;AAC9D,uBAAa,cAAc,GAAG,OAAO,QAAQ,WAAW,CAAC;AAAA,QAAA,CAC1D;AAAA,MAAA,CACF;AAAA,IAAA,CACF,EAEA,OAAO,CAAC,WAAgF;AACvF,oBAAc,MAAM;AACpB,4BAAsB,QAAQ,CAAA,YAAW,0BAA0B,OAAO,CAAC;AAAA,IAAA,CAC5E;AAAA,EAAA;AAEP;AAEA,SAAS,iBAAiB,oBAAoB,MAAY;AAC7B;AACE;AACF;AAC7B,CAAC;"} \ No newline at end of file diff --git a/web/app/themes/haiku-atelier-2024/assets/js/scripts-page-produit.js b/web/app/themes/haiku-atelier-2024/assets/js/scripts-page-produit.js index c537ffe5..68c342ab 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/scripts-page-produit.js +++ b/web/app/themes/haiku-atelier-2024/assets/js/scripts-page-produit.js @@ -1,18 +1,21 @@ -import { r, p, z, N } from "./index.y02cst4L.js"; +import { r } from "./chunk-RU7WR4KH.D5j7HXCF.js"; +import { r as recupereElementDocumentEither, a as recupereElementsDocumentEither, p } from "./utils.js"; import { x } from "./chunk-7BKSRZNG.C39W3Wne.js"; +import { z, N } from "./index.CeK6pfoJ.js"; import { p as parse } from "./index.DD7qm8S6.js"; import { c as ROUTE_API_AJOUTE_ARTICLE_PANIER, d as ENTETE_WC_NONCE } from "./api2.js"; -import { j as SELECTEUR_BOUTON_AJOUT_PANIER, k as SELECTEUR_SELECTEUR_QUANTITE, l as SELECTEUR_LIENS_ONGLETS, m as SELECTEUR_SECTIONS_CONTENUS, n as ATTRIBUT_ARIA_SELECTED, o as ATTRIBUT_HIDDEN, p as ATTRIBUT_DESACTIVE } from "./dom.js"; -import { N as NOM_CANAL_BOUTON_PANIER, T as TYPES_MESSAGES } from "./messages3.js"; +import { l as SELECTEUR_BOUTON_AJOUT_PANIER, m as SELECTEUR_SELECTEUR_QUANTITE, n as SELECTEUR_LIENS_ONGLETS, o as SELECTEUR_SECTIONS_CONTENUS, p as ATTRIBUT_ARIA_SELECTED, q as ATTRIBUT_HIDDEN, k as ATTRIBUT_DESACTIVE } from "./dom.js"; import { r as recupereElementOuLeve, b as recupereElementsOuLeve } from "./dom2.js"; import { l as leveServerError, a as leveBadRequestError, b as leveUnauthorizedError, c as leveNotFoundError, E as ErreurInconnue, d as leveErreur, r as reporteErreur } from "./erreurs.js"; import { b as estHTMLSelectElement, e as estReponse500, a as estError } from "./gardes.js"; +import { e as emetMessageMajBoutonPanier } from "./messages.js"; import { p as parseWCStoreCartAddItemArgs } from "./cart-add-item.js"; import { W as WCStoreCartSchema } from "./cart.js"; import { e as estWCError } from "./erreurs2.js"; -import { r as recupereElementDocumentEither, a as recupereElementsDocumentEither } from "./utils.js"; import { M as Maybe, E as Either } from "./Either.wHNxn7Os.js"; import "./exports.DNZBdkMD.js"; +import "./messages3.js"; +import "./messages2.js"; import "./cart2.js"; const ETATS_PAGE = _etats; const deplieToutesSections = (ensembleLiensContenus) => { @@ -94,14 +97,13 @@ const ajouteProduitAuPanier = () => { await reponse.json(), // Traite tous les codes HTTPs possibles (corpsReponse) => z(corpsReponse).with({ body: N.select(), status: 400 }, estWCError, leveBadRequestError).with({ body: N.select(), status: 401 }, estWCError, leveUnauthorizedError).with({ body: N.select(), status: 404 }, estWCError, leveNotFoundError).with(N._, (corpsOkInconnu) => parse(WCStoreCartSchema, corpsOkInconnu)).otherwise((e) => x(e, ErreurInconnue, leveErreur)), - r((panier) => console.debug("Panier", panier)), + // tap((panier: WCStoreCart) => console.debug("Panier", panier)), // Récupère le nombre de Produits dans la Panier p("items_count"), // Déclenche les effets pour la mise à jour de l'IU r((nombreArticlesPanier) => { BOUTON_AJOUT_PANIER.textContent = "Added to cart!"; - const CANAL_BOUTON_PANIER = new BroadcastChannel(NOM_CANAL_BOUTON_PANIER); - CANAL_BOUTON_PANIER.postMessage({ donnees: nombreArticlesPanier, type: TYPES_MESSAGES.MajBoutonPanier }); + emetMessageMajBoutonPanier({ quantiteProduits: nombreArticlesPanier }); setTimeout(() => { SELECTEUR_VARIATION.value = SELECTEUR_VARIATION.options.item(0)?.value ?? "--"; BOUTON_AJOUT_PANIER.toggleAttribute(ATTRIBUT_DESACTIVE, true); diff --git a/web/app/themes/haiku-atelier-2024/assets/js/scripts-page-produit.js.map b/web/app/themes/haiku-atelier-2024/assets/js/scripts-page-produit.js.map index 3b25c177..8e4b9e4a 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/scripts-page-produit.js.map +++ b/web/app/themes/haiku-atelier-2024/assets/js/scripts-page-produit.js.map @@ -1 +1 @@ -{"version":3,"file":"scripts-page-produit.js","sources":["../../src/scripts/scripts-page-produit.ts"],"sourcesContent":["// Scripts pour la Page Produit\n\nimport { Either, Maybe } from \"purify-ts\";\nimport { pipe, prop, tap } from \"remeda\";\nimport { match, P } from \"ts-pattern\";\nimport { parse } from \"valibot\";\n\nimport type { WCStoreCart } from \"./lib/types/api/cart\";\nimport type { WCStoreCartAddItemArgs } from \"./lib/types/api/cart-add-item.ts\";\n\nimport { ENTETE_WC_NONCE, ROUTE_API_AJOUTE_ARTICLE_PANIER } from \"./constantes/api.ts\";\nimport {\n ATTRIBUT_ARIA_SELECTED,\n ATTRIBUT_DESACTIVE,\n ATTRIBUT_HIDDEN,\n SELECTEUR_BOUTON_AJOUT_PANIER,\n SELECTEUR_LIENS_ONGLETS,\n SELECTEUR_SECTIONS_CONTENUS,\n SELECTEUR_SELECTEUR_QUANTITE,\n} from \"./constantes/dom\";\nimport { NOM_CANAL_BOUTON_PANIER, TYPES_MESSAGES } from \"./constantes/messages.ts\";\nimport { recupereElementOuLeve, recupereElementsOuLeve } from \"./lib/dom.ts\";\nimport {\n ErreurInconnue,\n leveBadRequestError,\n leveErreur,\n leveNotFoundError,\n leveServerError,\n leveUnauthorizedError,\n reporteErreur,\n type UnknownError,\n} from \"./lib/erreurs.ts\";\nimport { estError, estHTMLSelectElement, estReponse500 } from \"./lib/gardes.ts\";\nimport { parseWCStoreCartAddItemArgs } from \"./lib/schemas/cart-add-item.ts\";\nimport { WCStoreCartSchema } from \"./lib/schemas/cart.ts\";\nimport { estWCError } from \"./lib/schemas/erreurs.ts\";\nimport { recupereElementDocumentEither, recupereElementsDocumentEither } from \"./lib/utils.ts\";\n\n/** États utiles pour les scripts de la page. */\ntype EtatsPage = {\n /** L'ID en base de données du Produit. */\n idProduit: number;\n /** Un nonce pour l'authentification de requêtes API vers le backend WooCommerce. */\n nonce: string;\n};\ntype EnsembleLienContenu = [HTMLAnchorElement, HTMLElement];\n\n// @ts-expect-error -- États injectés par le modèle PHP\n// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- États injectés par le modèle PHP\nconst ETATS_PAGE: EtatsPage = _etats;\n\n/**\n * Déplie toutes les sections de la Boîte des Informations Produit en ajustant les attributs\n * correspondants.\n */\nconst deplieToutesSections = (ensembleLiensContenus: Array): void => {\n ensembleLiensContenus.forEach(ensemble => {\n ensemble[0].setAttribute(ATTRIBUT_ARIA_SELECTED, \"false\");\n ensemble[1].setAttribute(ATTRIBUT_HIDDEN, \"true\");\n });\n};\n\n// Éléments d'intérêt\n/** Le Bouton permettant l'ajout d'un Produit dans le Panier. */\nconst BOUTON_AJOUT_PANIER: HTMLButtonElement = pipe(\n recupereElementDocumentEither(SELECTEUR_BOUTON_AJOUT_PANIER),\n recupereElementOuLeve,\n);\n/** Le Sélecteur de Variation de Produit. */\nconst SELECTEUR_VARIATION: HTMLSelectElement = pipe(\n recupereElementDocumentEither(SELECTEUR_SELECTEUR_QUANTITE),\n recupereElementOuLeve,\n);\n/** */\nconst LIENS_ONGLETS: Array = pipe(\n recupereElementsDocumentEither(SELECTEUR_LIENS_ONGLETS),\n recupereElementsOuLeve,\n);\n/** */\nconst SECTIONS_CONTENUS: Array = pipe(\n recupereElementsDocumentEither(SELECTEUR_SECTIONS_CONTENUS),\n recupereElementsOuLeve,\n);\n\n// const suitMutationsBoutonAjoutPanier = (boutonAjoutPanier: HTMLButtonElement): void => {\n// const mutationCallback: MutationCallback = (mutationsList: Array) => {\n// for (const mutation of mutationsList) {\n// if (mutation.type !== \"attributes\" || mutation.attributeName !== ATTRIBUT_DESACTIVE) return;\n\n// console.log(\"old:\", mutation.oldValue);\n// console.log(\"new:\", (mutation.target as HTMLButtonElement).getAttribute(ATTRIBUT_DESACTIVE));\n// }\n// };\n// const observer = new MutationObserver(mutationCallback);\n// observer.observe(boutonAjoutPanier, { attributes: true });\n// };\n\nconst gereBoiteInformationsProduit = () => {\n const onglets = new Map();\n\n /* Créé la Map avec les ensembles Lien-Contenu */\n LIENS_ONGLETS.forEach((lien, index) => {\n const idOnglet: null | string = lien.getAttribute(\"id\");\n const sectionCorrespondante: HTMLElement | undefined = SECTIONS_CONTENUS[index];\n\n if (!idOnglet) throw new Error(\"Le lien ne dispose pas d'ID !\");\n if (!sectionCorrespondante) throw new Error(\"Le lien ne dispose pas de section correspondante !\");\n\n onglets.set(idOnglet, [lien, sectionCorrespondante]);\n\n lien.addEventListener(\"click\", (e) => {\n /* Empêche la pollution de l'historique de navigation */\n e.preventDefault();\n\n /* Sauvegarde l'état d'ouverture de la section avant de toutes les fermer */\n const estAncienOngletCourant: boolean = lien.getAttribute(ATTRIBUT_ARIA_SELECTED) === \"true\";\n deplieToutesSections(pipe(onglets.values(), Array.from));\n\n /* Ne fais rien de plus si l'onglet sélectionné était le courant */\n if (estAncienOngletCourant) return;\n\n /* Ouvre le nouvel onglet sélectionné */\n lien.setAttribute(ATTRIBUT_ARIA_SELECTED, \"true\");\n sectionCorrespondante.removeAttribute(ATTRIBUT_HIDDEN);\n });\n });\n\n /* Ajout des Écouteurs d'Événements */\n SELECTEUR_VARIATION.addEventListener(\"change\", (evenement) => {\n pipe(\n evenement.target,\n Maybe.fromNullable,\n cibleEvenement => cibleEvenement.filter(estHTMLSelectElement),\n element => element.map(v => v.validity.valid),\n validite => validite.ifJust((v: boolean) => BOUTON_AJOUT_PANIER.toggleAttribute(ATTRIBUT_DESACTIVE, !v)),\n );\n });\n BOUTON_AJOUT_PANIER.addEventListener(\"click\", (_) => ajouteProduitAuPanier());\n};\n\n// TODO: Traiter le cas des Produits avec variations\nconst ajouteProduitAuPanier = () => {\n /* État de chargement */\n BOUTON_AJOUT_PANIER.textContent = \"Adding...\";\n\n // TODO: Rendre ça moins long\n // TODO: Créer une méthode pour fetch()\n // TODO: Créer une méthode pour traiter les codes HTTP\n /* Exécution de la requête */\n Either\n .encase(() =>\n parseWCStoreCartAddItemArgs({\n id: Number(SELECTEUR_VARIATION.value),\n quantity: 1,\n })\n )\n .map((args: WCStoreCartAddItemArgs) => {\n fetch(\n ROUTE_API_AJOUTE_ARTICLE_PANIER,\n {\n body: JSON.stringify(args),\n credentials: \"same-origin\",\n headers: {\n \"Accept\": \"application/json\",\n \"Content-Type\": \"application/json\",\n [ENTETE_WC_NONCE]: ETATS_PAGE.nonce,\n },\n method: \"POST\",\n mode: \"same-origin\",\n signal: AbortSignal.timeout(5000),\n },\n )\n .then(async (reponse: Response) => {\n // Traite le cas d'erreur 500\n if (estReponse500(reponse)) leveServerError(\"500 Server Error\");\n\n pipe(\n // Récupère la Réponse\n await reponse.json(),\n // Traite tous les codes HTTPs possibles\n (corpsReponse: unknown) =>\n match(corpsReponse)\n // Réponses problématiques\n .with({ body: P.select(), status: 400 }, estWCError, leveBadRequestError)\n .with({ body: P.select(), status: 401 }, estWCError, leveUnauthorizedError)\n .with({ body: P.select(), status: 404 }, estWCError, leveNotFoundError)\n // Réponse OK (201)\n .with(P._, corpsOkInconnu => parse(WCStoreCartSchema, corpsOkInconnu))\n // Réponses inconnues\n .otherwise(e => pipe(e, ErreurInconnue, leveErreur)),\n tap((panier: WCStoreCart) => console.debug(\"Panier\", panier)),\n // Récupère le nombre de Produits dans la Panier\n prop(\"items_count\"),\n // Déclenche les effets pour la mise à jour de l'IU\n tap((nombreArticlesPanier: number) => {\n /**\n * À la réception du nouveau Panier du backend :\n * 1. Met à jour la quantité de Produits dans le Bouton du Panier\n * 2. Met à jour le Bouton d'ajout au Panier avec un message de succès\n * 3. (3 secondes) Réinitialise le Sélecteur de Quantité et le Bouton d'Ajout au Panier\n */\n BOUTON_AJOUT_PANIER.textContent = \"Added to cart!\";\n const CANAL_BOUTON_PANIER: BroadcastChannel = new BroadcastChannel(NOM_CANAL_BOUTON_PANIER);\n CANAL_BOUTON_PANIER.postMessage({ donnees: nombreArticlesPanier, type: TYPES_MESSAGES.MajBoutonPanier });\n\n // TODO: Prévoir un cas où ce Timeout est annulé quand l'Utilisateur agit avant sur le Sélecteur\n setTimeout(() => {\n SELECTEUR_VARIATION.value = SELECTEUR_VARIATION.options.item(0)?.value ?? \"--\";\n BOUTON_AJOUT_PANIER.toggleAttribute(ATTRIBUT_DESACTIVE, true);\n BOUTON_AJOUT_PANIER.textContent = \"Add to cart\";\n }, 3000);\n }),\n );\n })\n .catch((e: unknown) => {\n if (estError(e)) {\n reporteErreur(e);\n console.error(e);\n } else {\n console.error(\"e n'est pas une Erreur ?!\", e);\n }\n BOUTON_AJOUT_PANIER.textContent = \"Add to cart\";\n });\n });\n};\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n gereBoiteInformationsProduit();\n});\n"],"names":["pipe","match","P","tap","prop"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"scripts-page-produit.js","sources":["../../src/scripts/scripts-page-produit.ts"],"sourcesContent":["// Scripts pour la Page Produit\n\nimport { Either, Maybe } from \"purify-ts\";\nimport { pipe, prop, tap } from \"remeda\";\nimport { match, P } from \"ts-pattern\";\nimport { parse } from \"valibot\";\n\nimport type { WCStoreCartAddItemArgs } from \"./lib/types/api/cart-add-item.ts\";\n\nimport { ENTETE_WC_NONCE, ROUTE_API_AJOUTE_ARTICLE_PANIER } from \"./constantes/api.ts\";\nimport {\n ATTRIBUT_ARIA_SELECTED,\n ATTRIBUT_DESACTIVE,\n ATTRIBUT_HIDDEN,\n SELECTEUR_BOUTON_AJOUT_PANIER,\n SELECTEUR_LIENS_ONGLETS,\n SELECTEUR_SECTIONS_CONTENUS,\n SELECTEUR_SELECTEUR_QUANTITE,\n} from \"./constantes/dom\";\nimport { recupereElementOuLeve, recupereElementsOuLeve } from \"./lib/dom.ts\";\nimport {\n ErreurInconnue,\n leveBadRequestError,\n leveErreur,\n leveNotFoundError,\n leveServerError,\n leveUnauthorizedError,\n reporteErreur,\n type UnknownError,\n} from \"./lib/erreurs.ts\";\nimport { estError, estHTMLSelectElement, estReponse500 } from \"./lib/gardes.ts\";\nimport { emetMessageMajBoutonPanier } from \"./lib/messages.ts\";\nimport { parseWCStoreCartAddItemArgs } from \"./lib/schemas/cart-add-item.ts\";\nimport { WCStoreCartSchema } from \"./lib/schemas/cart.ts\";\nimport { estWCError } from \"./lib/schemas/erreurs.ts\";\nimport { recupereElementDocumentEither, recupereElementsDocumentEither } from \"./lib/utils.ts\";\n\n/** États utiles pour les scripts de la page. */\ntype EtatsPage = {\n /** L'ID en base de données du Produit. */\n idProduit: number;\n /** Un nonce pour l'authentification de requêtes API vers le backend WooCommerce. */\n nonce: string;\n};\ntype EnsembleLienContenu = [HTMLAnchorElement, HTMLElement];\n\n// @ts-expect-error -- États injectés par le modèle PHP\n// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- États injectés par le modèle PHP\nconst ETATS_PAGE: EtatsPage = _etats;\n\n/**\n * Déplie toutes les sections de la Boîte des Informations Produit en ajustant les attributs\n * correspondants.\n */\nconst deplieToutesSections = (ensembleLiensContenus: Array): void => {\n ensembleLiensContenus.forEach(ensemble => {\n ensemble[0].setAttribute(ATTRIBUT_ARIA_SELECTED, \"false\");\n ensemble[1].setAttribute(ATTRIBUT_HIDDEN, \"true\");\n });\n};\n\n// Éléments d'intérêt\n/** Le Bouton permettant l'ajout d'un Produit dans le Panier. */\nconst BOUTON_AJOUT_PANIER: HTMLButtonElement = pipe(\n recupereElementDocumentEither(SELECTEUR_BOUTON_AJOUT_PANIER),\n recupereElementOuLeve,\n);\n/** Le Sélecteur de Variation de Produit. */\nconst SELECTEUR_VARIATION: HTMLSelectElement = pipe(\n recupereElementDocumentEither(SELECTEUR_SELECTEUR_QUANTITE),\n recupereElementOuLeve,\n);\n/** */\nconst LIENS_ONGLETS: Array = pipe(\n recupereElementsDocumentEither(SELECTEUR_LIENS_ONGLETS),\n recupereElementsOuLeve,\n);\n/** */\nconst SECTIONS_CONTENUS: Array = pipe(\n recupereElementsDocumentEither(SELECTEUR_SECTIONS_CONTENUS),\n recupereElementsOuLeve,\n);\n\n// const suitMutationsBoutonAjoutPanier = (boutonAjoutPanier: HTMLButtonElement): void => {\n// const mutationCallback: MutationCallback = (mutationsList: Array) => {\n// for (const mutation of mutationsList) {\n// if (mutation.type !== \"attributes\" || mutation.attributeName !== ATTRIBUT_DESACTIVE) return;\n\n// console.log(\"old:\", mutation.oldValue);\n// console.log(\"new:\", (mutation.target as HTMLButtonElement).getAttribute(ATTRIBUT_DESACTIVE));\n// }\n// };\n// const observer = new MutationObserver(mutationCallback);\n// observer.observe(boutonAjoutPanier, { attributes: true });\n// };\n\nconst gereBoiteInformationsProduit = () => {\n const onglets = new Map();\n\n /* Créé la Map avec les ensembles Lien-Contenu */\n LIENS_ONGLETS.forEach((lien, index) => {\n const idOnglet: null | string = lien.getAttribute(\"id\");\n const sectionCorrespondante: HTMLElement | undefined = SECTIONS_CONTENUS[index];\n\n if (!idOnglet) throw new Error(\"Le lien ne dispose pas d'ID !\");\n if (!sectionCorrespondante) throw new Error(\"Le lien ne dispose pas de section correspondante !\");\n\n onglets.set(idOnglet, [lien, sectionCorrespondante]);\n\n lien.addEventListener(\"click\", (e) => {\n /* Empêche la pollution de l'historique de navigation */\n e.preventDefault();\n\n /* Sauvegarde l'état d'ouverture de la section avant de toutes les fermer */\n const estAncienOngletCourant: boolean = lien.getAttribute(ATTRIBUT_ARIA_SELECTED) === \"true\";\n deplieToutesSections(pipe(onglets.values(), Array.from));\n\n /* Ne fais rien de plus si l'onglet sélectionné était le courant */\n if (estAncienOngletCourant) return;\n\n /* Ouvre le nouvel onglet sélectionné */\n lien.setAttribute(ATTRIBUT_ARIA_SELECTED, \"true\");\n sectionCorrespondante.removeAttribute(ATTRIBUT_HIDDEN);\n });\n });\n\n /* Ajout des Écouteurs d'Événements */\n SELECTEUR_VARIATION.addEventListener(\"change\", (evenement) => {\n pipe(\n evenement.target,\n Maybe.fromNullable,\n cibleEvenement => cibleEvenement.filter(estHTMLSelectElement),\n element => element.map(v => v.validity.valid),\n validite => validite.ifJust((v: boolean) => BOUTON_AJOUT_PANIER.toggleAttribute(ATTRIBUT_DESACTIVE, !v)),\n );\n });\n BOUTON_AJOUT_PANIER.addEventListener(\"click\", (_) => ajouteProduitAuPanier());\n};\n\n// TODO: Traiter le cas des Produits avec variations\nconst ajouteProduitAuPanier = () => {\n /* État de chargement */\n BOUTON_AJOUT_PANIER.textContent = \"Adding...\";\n\n // TODO: Rendre ça moins long\n // TODO: Créer une méthode pour fetch()\n // TODO: Créer une méthode pour traiter les codes HTTP\n /* Exécution de la requête */\n Either\n .encase(() =>\n parseWCStoreCartAddItemArgs({\n id: Number(SELECTEUR_VARIATION.value),\n quantity: 1,\n })\n )\n .map((args: WCStoreCartAddItemArgs) => {\n fetch(\n ROUTE_API_AJOUTE_ARTICLE_PANIER,\n {\n body: JSON.stringify(args),\n credentials: \"same-origin\",\n headers: {\n \"Accept\": \"application/json\",\n \"Content-Type\": \"application/json\",\n [ENTETE_WC_NONCE]: ETATS_PAGE.nonce,\n },\n method: \"POST\",\n mode: \"same-origin\",\n signal: AbortSignal.timeout(5000),\n },\n )\n .then(async (reponse: Response) => {\n // Traite le cas d'erreur 500\n if (estReponse500(reponse)) leveServerError(\"500 Server Error\");\n\n pipe(\n // Récupère la Réponse\n await reponse.json(),\n // Traite tous les codes HTTPs possibles\n (corpsReponse: unknown) =>\n match(corpsReponse)\n // Réponses problématiques\n .with({ body: P.select(), status: 400 }, estWCError, leveBadRequestError)\n .with({ body: P.select(), status: 401 }, estWCError, leveUnauthorizedError)\n .with({ body: P.select(), status: 404 }, estWCError, leveNotFoundError)\n // Réponse OK (201)\n .with(P._, corpsOkInconnu => parse(WCStoreCartSchema, corpsOkInconnu))\n // Réponses inconnues\n .otherwise(e => pipe(e, ErreurInconnue, leveErreur)),\n // tap((panier: WCStoreCart) => console.debug(\"Panier\", panier)),\n // Récupère le nombre de Produits dans la Panier\n prop(\"items_count\"),\n // Déclenche les effets pour la mise à jour de l'IU\n tap((nombreArticlesPanier: number) => {\n BOUTON_AJOUT_PANIER.textContent = \"Added to cart!\";\n emetMessageMajBoutonPanier({ quantiteProduits: nombreArticlesPanier });\n\n // TODO: Prévoir un cas où ce Timeout est annulé quand l'Utilisateur agit avant sur le Sélecteur\n setTimeout(() => {\n SELECTEUR_VARIATION.value = SELECTEUR_VARIATION.options.item(0)?.value ?? \"--\";\n BOUTON_AJOUT_PANIER.toggleAttribute(ATTRIBUT_DESACTIVE, true);\n BOUTON_AJOUT_PANIER.textContent = \"Add to cart\";\n }, 3000);\n }),\n );\n })\n .catch((e: unknown) => {\n if (estError(e)) {\n reporteErreur(e);\n console.error(e);\n } else {\n console.error(\"e n'est pas une Erreur ?!\", e);\n }\n BOUTON_AJOUT_PANIER.textContent = \"Add to cart\";\n });\n });\n};\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n gereBoiteInformationsProduit();\n});\n"],"names":["pipe","match","P","prop","tap"],"mappings":"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"} \ No newline at end of file diff --git a/web/app/themes/haiku-atelier-2024/assets/js/utils.js b/web/app/themes/haiku-atelier-2024/assets/js/utils.js index 677633ee..41ab9a74 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/utils.js +++ b/web/app/themes/haiku-atelier-2024/assets/js/utils.js @@ -1,12 +1,32 @@ import { c as recupereElementsAvecSelecteur, a as recupereElementAvecSelecteur } from "./dom2.js"; +import { C as CleNonTrouveError } from "./erreurs.js"; +import { M as Maybe } from "./Either.wHNxn7Os.js"; import "./chunk-7BKSRZNG.C39W3Wne.js"; -import "./erreurs.js"; import "./exports.DNZBdkMD.js"; -import "./Either.wHNxn7Os.js"; +function u$1(t2, n, a) { + let o = (r) => t2(r, ...n); + return a === void 0 ? o : Object.assign(o, { lazy: a, lazyArgs: n }); +} +function u(r, n, a) { + let o = r.length - n.length; + if (o === 0) return r(...n); + if (o === 1) return u$1(r, n, a); + throw new Error("Wrong number of arguments"); +} +function p(...o) { + return u(t, o); +} +var t = (o, e) => o[e]; const recupereElementsDocumentEither = recupereElementsAvecSelecteur(document); const recupereElementDocumentEither = recupereElementAvecSelecteur(document); +const propEither = (cle) => (donnees) => Maybe.fromNullable(p(donnees, cle)).toEither( + new CleNonTrouveError(`La clé « ${String(cle)} » n'a pas été trouvé dans l'objet.`, { objet: donnees }) +); export { recupereElementsDocumentEither as a, - recupereElementDocumentEither as r + propEither as b, + p, + recupereElementDocumentEither as r, + u }; //# sourceMappingURL=utils.js.map diff --git a/web/app/themes/haiku-atelier-2024/assets/js/utils.js.map b/web/app/themes/haiku-atelier-2024/assets/js/utils.js.map index 37b5a2c4..771aba16 100644 --- a/web/app/themes/haiku-atelier-2024/assets/js/utils.js.map +++ b/web/app/themes/haiku-atelier-2024/assets/js/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sources":["../../src/scripts/lib/utils.ts"],"sourcesContent":["import type { Either } from \"purify-ts\";\n\nimport { recupereElementAvecSelecteur, recupereElementsAvecSelecteur } from \"./dom.ts\";\n\nexport const recupereElementsDocumentEither: (\n selecteur: string,\n) => Either> = recupereElementsAvecSelecteur(document);\n\nexport const recupereElementDocumentEither: (selecteur: string) => Either =\n recupereElementAvecSelecteur(document);\n"],"names":[],"mappings":";;;;;AAIa,MAAA,iCAEwB,8BAA8B,QAAQ;AAE9D,MAAA,gCACX,6BAA6B,QAAQ;"} \ No newline at end of file +{"version":3,"file":"utils.js","sources":["../../../../../../node_modules/.pnpm/remeda@2.14.0/node_modules/remeda/dist/chunk-K26VP6CL.js","../../../../../../node_modules/.pnpm/remeda@2.14.0/node_modules/remeda/dist/chunk-RAAYCPUM.js","../../../../../../node_modules/.pnpm/remeda@2.14.0/node_modules/remeda/dist/chunk-VROY5Y5B.js","../../src/scripts/lib/utils.ts"],"sourcesContent":["function u(t,n,a){let o=r=>t(r,...n);return a===void 0?o:Object.assign(o,{lazy:a,lazyArgs:n})}export{u as a};\n","import{a as t}from\"./chunk-K26VP6CL.js\";function u(r,n,a){let o=r.length-n.length;if(o===0)return r(...n);if(o===1)return t(r,n,a);throw new Error(\"Wrong number of arguments\")}export{u as a};\n","import{a as n}from\"./chunk-RAAYCPUM.js\";function p(...o){return n(t,o)}var t=(o,e)=>o[e];export{p as a,t as b};\n","import { type Either, Maybe } from \"purify-ts\";\nimport { prop } from \"remeda\";\n\nimport { recupereElementAvecSelecteur, recupereElementsAvecSelecteur } from \"./dom.ts\";\nimport { CleNonTrouveError } from \"./erreurs.ts\";\n\nexport const recupereElementsDocumentEither: (\n selecteur: string,\n) => Either> = recupereElementsAvecSelecteur(document);\n\nexport const recupereElementDocumentEither: (selecteur: string) => Either =\n recupereElementAvecSelecteur(document);\n\nexport const propEither = (cle: K) => (donnees: T): Either =>\n Maybe\n .fromNullable(prop(donnees, cle))\n .toEither(\n new CleNonTrouveError(`La clé « ${String(cle)} » n'a pas été trouvé dans l'objet.`, { objet: donnees }),\n );\n"],"names":["u","t","n","prop"],"mappings":";;;;;AAAA,SAASA,IAAEC,IAAE,GAAE,GAAE;AAAC,MAAI,IAAE,OAAGA,GAAE,GAAE,GAAG,CAAC;AAAE,SAAO,MAAI,SAAO,IAAE,OAAO,OAAO,GAAE,EAAC,MAAK,GAAE,UAAS,EAAC,CAAC;AAAC;ACArD,SAAS,EAAE,GAAE,GAAE,GAAE;AAAC,MAAI,IAAE,EAAE,SAAO,EAAE;AAAO,MAAG,MAAI,EAAE,QAAO,EAAE,GAAG,CAAC;AAAE,MAAG,MAAI,EAAE,QAAOA,IAAE,GAAE,GAAE,CAAC;AAAE,QAAM,IAAI,MAAM,2BAA2B;AAAC;ACAvI,SAAS,KAAK,GAAE;AAAC,SAAOC,EAAE,GAAE,CAAC;AAAC;AAAC,IAAI,IAAE,CAAC,GAAE,MAAI,EAAE,CAAC;ACM1E,MAAA,iCAEwB,8BAA8B,QAAQ;AAE9D,MAAA,gCACX,6BAA6B,QAAQ;AAE1B,MAAA,aAAa,CAAuB,QAAW,CAAC,YAC3D,MACG,aAAaC,EAAK,SAAS,GAAG,CAAC,EAC/B;AAAA,EACC,IAAI,kBAAkB,YAAY,OAAO,GAAG,CAAC,uCAAuC,EAAE,OAAO,SAAS;AACxG;","x_google_ignoreList":[0,1,2]} \ No newline at end of file diff --git a/web/app/themes/haiku-atelier-2024/src/scripts/constantes/dom.ts b/web/app/themes/haiku-atelier-2024/src/scripts/constantes/dom.ts index 8b85e788..b2dccea0 100644 --- a/web/app/themes/haiku-atelier-2024/src/scripts/constantes/dom.ts +++ b/web/app/themes/haiku-atelier-2024/src/scripts/constantes/dom.ts @@ -21,4 +21,5 @@ export const SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE = "button.detail-produit__ac export const SELECTEUR_BOUTON_ADDITION_QUANTITE = "button.detail-produit__actions__addition"; export const SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER = "input"; export const SELECTEUR_PRIX_LIGNE_PANIER = ".detail-produit__nom-prix span"; +export const SELECTEUR_SOUS_TOTAL_PANIER = "#panneau-panier .panneau__sous-totaux__ligne strong"; export const SELECTEUR_TOTAL_PANIER = "#panneau-panier .panneau__pied-de-page p span"; diff --git a/web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts b/web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts index b9688b51..2fd8bffd 100644 --- a/web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts +++ b/web/app/themes/haiku-atelier-2024/src/scripts/lib/erreurs.ts @@ -3,6 +3,7 @@ */ import { captureException } from "@sentry/browser"; +import { pipe } from "remeda"; import type { WCErrorBody } from "./types/api/erreurs"; @@ -51,13 +52,17 @@ export class DOMElementAbsentError extends Error { this.name = "DOMElementAbsentError"; } } +export class CleNonTrouveError extends Error { + constructor(message: unknown) { + super(JSON.stringify(message)); + this.name = "CleNonTrouveError"; + } +} /* Fonction utilitaire pour créer ou lever des Erreurs */ export const Erreur = (message: string): Error => new Error(message); export const ErreurInconnue = (erreur: unknown): UnknownError => new UnknownError(erreur); -/* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Permet d'indiquer -le type d'Erreur à l'appel de la fonction. */ export const leveErreur = (erreur: E): never => { throw erreur; }; @@ -83,8 +88,7 @@ export const leveUnknownError = (erreur: unknown): never => { * @param erreur * @returns L'ID Sentry de l'évènement capturé. */ -/* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Permet d'indiquer -le type d'Erreur à l'appel de la fonction. */ + export const reporteErreur = (erreur: E): string => { console.error(erreur); return captureException(erreur); @@ -97,9 +101,19 @@ export const reporteErreur = (erreur: E): string => { * @param erreur * @returns never Lève une Erreur et ne retourne donc rien. */ -/* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Permet d'indiquer -le type d'Erreur à l'appel de la fonction. */ + export const reporteEtLeveErreur = (erreur: E): never => { reporteErreur(erreur); throw erreur; }; +/** + * Fonction utilitaire pour rapidement créer et reporter une Erreur DOMElementAbsent. + * + * @param message + * @returns L'ID Sentry de l'évènement capturé. + */ +export const reporteErreurDOMElementAbsent = (message: string): string => + pipe( + new DOMElementAbsentError(message), + reporteErreur, + ); diff --git a/web/app/themes/haiku-atelier-2024/src/scripts/lib/messages.ts b/web/app/themes/haiku-atelier-2024/src/scripts/lib/messages.ts index 21578752..b8512fe0 100644 --- a/web/app/themes/haiku-atelier-2024/src/scripts/lib/messages.ts +++ b/web/app/themes/haiku-atelier-2024/src/scripts/lib/messages.ts @@ -1,11 +1,38 @@ import { Either } from "purify-ts"; import { parse, type ValiError } from "valibot"; -import type { MessageMajBoutonPanier, MessageMajContenuPanier } from "./types/messages"; +import type { + MessageMajBoutonPanier, + MessageMajBoutonPanierDonnees, + MessageMajContenuPanier, + MessageMajContenuPanierDonnees, +} from "./types/messages"; +import { NOM_CANAL_BOUTON_PANIER, NOM_CANAL_CONTENU_PANIER, TYPES_MESSAGES } from "../constantes/messages.ts"; import { reporteErreur } from "./erreurs.ts"; import { MessageMajBoutonPanierSchema, MessageMajContenuPanierSchema } from "./schemas/messages.ts"; +// Émissions +export const emetMessageMajBoutonPanier = (args: MessageMajBoutonPanierDonnees): void => { + new BroadcastChannel(NOM_CANAL_BOUTON_PANIER).postMessage({ + donnees: { + quantiteProduits: args.quantiteProduits, + }, + type: TYPES_MESSAGES.MajBoutonPanier, + } as MessageMajBoutonPanier); +}; + +export const emetMessageMajContenuPanier = (args: MessageMajContenuPanierDonnees): void => + new BroadcastChannel(NOM_CANAL_CONTENU_PANIER).postMessage({ + donnees: { + produits: args.produits, + sousTotalPanier: args.sousTotalPanier, + totalPanier: args.totalPanier, + }, + type: TYPES_MESSAGES.MajContenuPanier, + } as MessageMajContenuPanier); + +// Validations export const valideMessageMajBoutonPanier = ( evenementMessage: MessageEvent, ): Either, MessageMajBoutonPanier> => @@ -13,9 +40,7 @@ export const valideMessageMajBoutonPanier = ( .of, MessageMajBoutonPanier>( parse(MessageMajBoutonPanierSchema, evenementMessage.data), ) - .ifLeft(erreur => { - reporteErreur(erreur); - }); + .ifLeft(erreur => reporteErreur(erreur)); export const valideMessageMajContenuPanier = ( evenementMessage: MessageEvent, @@ -24,6 +49,4 @@ export const valideMessageMajContenuPanier = ( .of, MessageMajContenuPanier>( parse(MessageMajContenuPanierSchema, evenementMessage.data), ) - .ifLeft(erreur => { - reporteErreur(erreur); - }); + .ifLeft(erreur => reporteErreur(erreur)); diff --git a/web/app/themes/haiku-atelier-2024/src/scripts/lib/reseau.ts b/web/app/themes/haiku-atelier-2024/src/scripts/lib/reseau.ts index eb980ee7..c4252d59 100644 --- a/web/app/themes/haiku-atelier-2024/src/scripts/lib/reseau.ts +++ b/web/app/themes/haiku-atelier-2024/src/scripts/lib/reseau.ts @@ -14,12 +14,15 @@ import { import { estWCError } from "./schemas/erreurs.ts"; type ArgumentsPostBackendWC = { + /** Le corps de la requête (ses arguments). */ corps: BodyInit; + /** Une chaîne de caractères généré par le backend et à joindre à chaque requête pour l'authentifier. */ nonce: string; + /** La route, ou chemin, de l'API à demander au backend. */ route: string; }; -export const postBackendWC = (args: ArgumentsPostBackendWC) => +export const postBackend = (args: ArgumentsPostBackendWC) => fetch( args.route, { @@ -36,13 +39,16 @@ export const postBackendWC = (args: ArgumentsPostBackendWC) => }, ); -export const traiteReponseBackendWCSelonCodesHTTP = (corpsReponse: unknown, schemaReponse: GenericSchema) => +export const traiteReponseBackendWCSelonCodesHTTP = >( + corpsReponse: unknown, + schemaReponse: S, +): R => match(corpsReponse) // Réponses problématiques .with({ body: P.select(), status: 400 }, estWCError, leveBadRequestError) .with({ body: P.select(), status: 401 }, estWCError, leveUnauthorizedError) .with({ body: P.select(), status: 404 }, estWCError, leveNotFoundError) // Réponse OK (201) - .with(P._, corpsOkInconnu => parse(schemaReponse, corpsOkInconnu)) + .with(P._, corpsOkInconnu => parse(schemaReponse, corpsOkInconnu)) // Réponses inconnues .otherwise(e => pipe(e, ErreurInconnue, leveErreur)); diff --git a/web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart.ts b/web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart.ts index b75e25da..2e1f85f3 100644 --- a/web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart.ts +++ b/web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/cart.ts @@ -40,6 +40,27 @@ export const WCStoreCartItemSchema = v.object({ "variation": v.array(v.unknown()), }); +export const WCStoreCartTotalsSchema = v.object({ + "currency_code": v.string(), + "currency_decimal_separator": v.string(), + "currency_minor_unit": v.number(), + "currency_prefix": v.string(), + "currency_suffix": v.string(), + "currency_symbol": v.string(), + "currency_thousand_separator": v.string(), + "tax_lines": v.array(v.unknown()), + "total_discount": v.string(), + "total_discount_tax": v.string(), + "total_fees": v.string(), + "total_fees_tax": v.string(), + "total_items": v.string(), + "total_items_tax": v.string(), + "total_price": v.string(), + "total_shipping": v.union([v.string(), v.null()]), + "total_shipping_tax": v.union([v.string(), v.null()]), + "total_tax": v.string(), +}); + export const WCStoreCartSchema = v.object({ billing_address: v.unknown(), coupons: v.unknown(), @@ -57,5 +78,5 @@ export const WCStoreCartSchema = v.object({ payment_requirements: v.unknown(), shipping_address: v.unknown(), shipping_rates: v.unknown(), - totals: v.unknown(), + totals: WCStoreCartTotalsSchema, }); diff --git a/web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/messages.ts b/web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/messages.ts index fd539188..42d849ea 100644 --- a/web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/messages.ts +++ b/web/app/themes/haiku-atelier-2024/src/scripts/lib/schemas/messages.ts @@ -9,13 +9,18 @@ import { WCStoreCartItemSchema } from "./cart.ts"; export const TypesMessagesSchema = v.enum(TYPES_MESSAGES); +export const MessageMajBoutonPanierDonneesSchema = v.object({ + quantiteProduits: v.number(), +}); + export const MessageMajBoutonPanierSchema = v.object({ - donnees: v.number(), + donnees: MessageMajBoutonPanierDonneesSchema, type: v.pipe(v.string(), v.value(TYPES_MESSAGES.MajBoutonPanier)), }); export const MessageMajContenuPanierDonneesSchema = v.object({ produits: v.array(WCStoreCartItemSchema), + sousTotalPanier: v.number(), totalPanier: v.number(), }); diff --git a/web/app/themes/haiku-atelier-2024/src/scripts/lib/types/messages.d.ts b/web/app/themes/haiku-atelier-2024/src/scripts/lib/types/messages.d.ts index 0bd3979b..1fa1297a 100644 --- a/web/app/themes/haiku-atelier-2024/src/scripts/lib/types/messages.d.ts +++ b/web/app/themes/haiku-atelier-2024/src/scripts/lib/types/messages.d.ts @@ -1,11 +1,14 @@ import type { InferOutput } from "valibot"; import type { + MessageMajBoutonPanierDonneesSchema, MessageMajBoutonPanierSchema, MessageMajContenuPanierDonneesSchema, MessageMajContenuPanierSchema, } from "../schemas/messages.ts"; +export type MessageMajBoutonPanierDonnees = InferOutput; + export type MessageMajBoutonPanier = InferOutput; export type MessageMajContenuPanierDonnees = InferOutput; export type MessageMajContenuPanier = InferOutput; diff --git a/web/app/themes/haiku-atelier-2024/src/scripts/lib/utils.ts b/web/app/themes/haiku-atelier-2024/src/scripts/lib/utils.ts index fbd211e0..47ee8608 100644 --- a/web/app/themes/haiku-atelier-2024/src/scripts/lib/utils.ts +++ b/web/app/themes/haiku-atelier-2024/src/scripts/lib/utils.ts @@ -1,6 +1,8 @@ -import type { Either } from "purify-ts"; +import { type Either, Maybe } from "purify-ts"; +import { prop } from "remeda"; import { recupereElementAvecSelecteur, recupereElementsAvecSelecteur } from "./dom.ts"; +import { CleNonTrouveError } from "./erreurs.ts"; export const recupereElementsDocumentEither: ( selecteur: string, @@ -8,3 +10,10 @@ export const recupereElementsDocumentEither: ( export const recupereElementDocumentEither: (selecteur: string) => Either = recupereElementAvecSelecteur(document); + +export const propEither = (cle: K) => (donnees: T): Either => + Maybe + .fromNullable(prop(donnees, cle)) + .toEither( + new CleNonTrouveError(`La clé « ${String(cle)} » n'a pas été trouvé dans l'objet.`, { objet: donnees }), + ); diff --git a/web/app/themes/haiku-atelier-2024/src/scripts/scripts-bouton-panier.ts b/web/app/themes/haiku-atelier-2024/src/scripts/scripts-bouton-panier.ts index c309477e..81dcb0af 100644 --- a/web/app/themes/haiku-atelier-2024/src/scripts/scripts-bouton-panier.ts +++ b/web/app/themes/haiku-atelier-2024/src/scripts/scripts-bouton-panier.ts @@ -24,8 +24,8 @@ const initialiseBoutonPanier = (): void => { valideMessageMajBoutonPanier(evenementMessage) // Met à jour le Bouton du Panier .ifRight((message: MessageMajBoutonPanier) => { - BOUTON_PANIER.textContent = `cart (${String(message.donnees)})`; - BOUTON_PANIER.setAttribute(ATTRIBUT_CONTIENT_ARTICLES, String(message.donnees > 0)); + BOUTON_PANIER.textContent = `cart (${String(message.donnees.quantiteProduits)})`; + BOUTON_PANIER.setAttribute(ATTRIBUT_CONTIENT_ARTICLES, String(message.donnees.quantiteProduits > 0)); }); }; }; diff --git a/web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-panier.ts b/web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-panier.ts index 7826d370..01b67b8d 100644 --- a/web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-panier.ts +++ b/web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-panier.ts @@ -1,21 +1,18 @@ import { Either, Maybe } from "purify-ts"; import { pipe, prop, tap } from "remeda"; -import { match, P } from "ts-pattern"; -import { parse } from "valibot"; +import { parse, type ValiError } from "valibot"; +import type { MessageMajContenuPanierSchema } from "./lib/schemas/messages.ts"; import type { WCStoreCart, WCStoreCartItem } from "./lib/types/api/cart"; import type { WCStoreCartRemoveItemArgs } from "./lib/types/api/cart-remove-item"; import type { WCStoreCartUpdateItemArgs } from "./lib/types/api/cart-update-item"; -import type { - MessageMajBoutonPanier, - MessageMajContenuPanier, - MessageMajContenuPanierDonnees, -} from "./lib/types/messages"; +import type { MessageMajBoutonPanierDonnees, MessageMajContenuPanierDonnees } from "./lib/types/messages"; import { ROUTE_API_MAJ_ARTICLE_PANIER, ROUTE_API_RETIRE_ARTICLE_PANIER } from "./constantes/api.ts"; import { ATTRIBUT_CLE_PANIER, ATTRIBUT_CONTIENT_ARTICLES, + ATTRIBUT_DESACTIVE, SELECTEUR_BOUTON_ADDITION_QUANTITE, SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE, SELECTEUR_BOUTON_SUPPRESSION_PANIER, @@ -23,29 +20,24 @@ import { SELECTEUR_CONTENEUR_PANIER, SELECTEUR_ENTREES_PANIER, SELECTEUR_PRIX_LIGNE_PANIER, + SELECTEUR_SOUS_TOTAL_PANIER, SELECTEUR_TOTAL_PANIER, } from "./constantes/dom.ts"; -import { NOM_CANAL_BOUTON_PANIER, NOM_CANAL_CONTENU_PANIER, TYPES_MESSAGES } from "./constantes/messages.ts"; +import { NOM_CANAL_BOUTON_PANIER, NOM_CANAL_CONTENU_PANIER } from "./constantes/messages.ts"; import { recupereElementAvecSelecteur, recupereElementOuLeve } from "./lib/dom.ts"; -import { - DOMElementAbsentError, - ErreurInconnue, - leveBadRequestError, - leveErreur, - leveNotFoundError, - leveServerError, - leveUnauthorizedError, - reporteErreur, - type UnknownError, -} from "./lib/erreurs.ts"; +import { type CleNonTrouveError, leveServerError, reporteErreur } from "./lib/erreurs.ts"; import { estError, estReponse500 } from "./lib/gardes.ts"; -import { valideMessageMajBoutonPanier, valideMessageMajContenuPanier } from "./lib/messages.ts"; -import { postBackendWC } from "./lib/reseau.ts"; +import { + emetMessageMajBoutonPanier, + emetMessageMajContenuPanier, + valideMessageMajBoutonPanier, + valideMessageMajContenuPanier, +} from "./lib/messages.ts"; +import { postBackend, traiteReponseBackendWCSelonCodesHTTP } from "./lib/reseau.ts"; import { WCStoreCartRemoveItemArgsSchema } from "./lib/schemas/cart-remove-item.ts"; import { WCStoreCartUpdateItemArgsSchema } from "./lib/schemas/cart-update-item.ts"; import { WCStoreCartSchema } from "./lib/schemas/cart.ts"; -import { estWCError } from "./lib/schemas/erreurs.ts"; -import { recupereElementDocumentEither, recupereElementsDocumentEither } from "./lib/utils.ts"; +import { propEither, recupereElementDocumentEither, recupereElementsDocumentEither } from "./lib/utils.ts"; /** États utiles pour les scripts de la page. */ type EtatsPage = { @@ -53,6 +45,13 @@ type EtatsPage = { nonce: string; }; +type ElementsEntreePanier = { + boutonAddition: HTMLButtonElement; + boutonSoustraction: HTMLButtonElement; + boutonSuppression: HTMLButtonElement; + champQuantite?: HTMLInputElement; +}; + // @ts-expect-error -- États injectés par le modèle PHP // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- États injectés par le modèle PHP const ETATS_PAGE: EtatsPage = _etats; @@ -61,40 +60,73 @@ const ETATS_PAGE: EtatsPage = _etats; const ENTREES_PANIER_EITHER: Either> = recupereElementsDocumentEither( SELECTEUR_ENTREES_PANIER, ); - const CONTENEUR_PANIER: HTMLElement = pipe( recupereElementDocumentEither(SELECTEUR_CONTENEUR_PANIER), recupereElementOuLeve, ); - +const SOUS_TOTAL_PANIER: HTMLElement = pipe( + recupereElementDocumentEither(SELECTEUR_SOUS_TOTAL_PANIER), + recupereElementOuLeve, +); const TOTAL_PANIER: HTMLParagraphElement = pipe( recupereElementDocumentEither(SELECTEUR_TOTAL_PANIER), recupereElementOuLeve, ); /** - * Fonction utilitaire pour rapidement créer et reporter une Erreur DOMElementAbsent. + * Fonction utilitaire pour récupérer un Élément dans une ligne (entrée) du Panier, en levant une + * Erreur s'il n'existe pas. * - * @param message - * @returns L'ID Sentry de l'évènement capturé. + * @param entree L'entrée du Panier sous forme d'Élément dans le DOM. + * @returns L'Élément demandé. + * @throws Une SyntaxError si l'Élément n'est pas trouvé. */ -const reporteErreurDOMElementAbsent = (message: string): string => - pipe( - new DOMElementAbsentError(message), - reporteErreur, - ); - const recupereElementDansEntreePanierOuLeve = - /* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Nécessaire pour - documenter le type d'Element attendu */ (entree: HTMLElement) => (selecteur: string) => pipe( recupereElementAvecSelecteur(entree)(selecteur), recupereElementOuLeve, ); -const initialiseScriptsPagePanier = (): void => { - ENTREES_PANIER_EITHER.ifRight((entrees: Array) => +const desactiveBoutonsEntreesPanier = (entrees: Array): void => + entrees.forEach((entree: HTMLElement) => { + // Fonction utilitaire + const recupereElementDansEntree = recupereElementDansEntreePanierOuLeve(entree); + + const elements: ElementsEntreePanier = { + boutonAddition: recupereElementDansEntree(SELECTEUR_BOUTON_ADDITION_QUANTITE), + boutonSoustraction: recupereElementDansEntree(SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE), + boutonSuppression: recupereElementDansEntree(SELECTEUR_BOUTON_SUPPRESSION_PANIER), + }; + + elements.boutonSoustraction.setAttribute(ATTRIBUT_DESACTIVE, ""); + elements.boutonAddition.setAttribute(ATTRIBUT_DESACTIVE, ""); + elements.boutonSuppression.setAttribute(ATTRIBUT_DESACTIVE, ""); + elements.boutonSuppression.textContent = "C= C= C= C= C=┌(;・ω・)┘"; + }); + +const majEtatsActivationBoutons = (entrees: Array): void => + entrees.forEach((entree: HTMLElement) => { + // Fonction utilitaire + const recupereElementDansEntree = recupereElementDansEntreePanierOuLeve(entree); + + const elements: ElementsEntreePanier = { + boutonAddition: recupereElementDansEntree(SELECTEUR_BOUTON_ADDITION_QUANTITE), + boutonSoustraction: recupereElementDansEntree(SELECTEUR_BOUTON_SOUSTRACTION_QUANTITE), + boutonSuppression: recupereElementDansEntree(SELECTEUR_BOUTON_SUPPRESSION_PANIER), + champQuantite: recupereElementDansEntree(SELECTEUR_CHAMP_QUANTITE_LIGNE_PANIER), + }; + + Number(elements.champQuantite?.value) === 1 + ? elements.boutonSoustraction.setAttribute(ATTRIBUT_DESACTIVE, "") + : elements.boutonSoustraction.removeAttribute(ATTRIBUT_DESACTIVE); + elements.boutonAddition.removeAttribute(ATTRIBUT_DESACTIVE); + elements.boutonSuppression.removeAttribute(ATTRIBUT_DESACTIVE); + elements.boutonSuppression.textContent = "Remove"; + }); + +const initialiseMajEntreesPanier = (): void => { + ENTREES_PANIER_EITHER.ifRight((entrees: Array) => { entrees.forEach((entree: HTMLElement) => { const recupereElementDansEntree = recupereElementDansEntreePanierOuLeve(entree); @@ -115,15 +147,18 @@ const initialiseScriptsPagePanier = (): void => { // Supprime la ligne du Panier au clic sur le bouton de suppression boutonSuppression.addEventListener("click", (): void => { - // TODO: Créer une boucle d'animation - // Affiche un texte de chargement dans le Bouton - boutonSuppression.textContent = "C= C= C= C= C=┌(;・ω・)┘"; - Either - .encase(() => parse(WCStoreCartRemoveItemArgsSchema, { key: clePanier })) + // Valide un corps de requête + .encase, WCStoreCartRemoveItemArgs>(() => + parse(WCStoreCartRemoveItemArgsSchema, { key: clePanier }) + ) .map( - (args: WCStoreCartRemoveItemArgs) => { - postBackendWC({ + async (args: WCStoreCartRemoveItemArgs) => { + // Modifie des éléments du DOM pour signaler la requête et empêcher des doubles exécutions + desactiveBoutonsEntreesPanier(entrees); + + // Réalise la requête auprès du backend + await postBackend({ corps: JSON.stringify(args), nonce: ETATS_PAGE.nonce, route: ROUTE_API_RETIRE_ARTICLE_PANIER, @@ -137,30 +172,19 @@ const initialiseScriptsPagePanier = (): void => { await reponse.json(), // Traite tous les codes HTTPs possibles (corpsReponse: unknown) => - match(corpsReponse) - // Réponses problématiques - .with({ body: P.select(), status: 400 }, estWCError, leveBadRequestError) - .with({ body: P.select(), status: 401 }, estWCError, leveUnauthorizedError) - .with({ body: P.select(), status: 404 }, estWCError, leveNotFoundError) - // Réponse OK (201) - .with(P._, corpsOkInconnu => parse(WCStoreCartSchema, corpsOkInconnu)) - // Réponses inconnues - .otherwise(e => pipe(e, ErreurInconnue, leveErreur)), + traiteReponseBackendWCSelonCodesHTTP( + corpsReponse, + WCStoreCartSchema, + ), + // Émets des Messages via BroadcastChannels pour la mise à jour de la page tap((panier: WCStoreCart) => { - // Émet un Message avec le nouveau contenu du Panier - // TODO: Valider le Message avant de l'émettre - new BroadcastChannel(NOM_CANAL_CONTENU_PANIER).postMessage({ - donnees: { - produits: panier.items, - totalPanier: Number(panier.totals.total_items / 100), - }, - type: TYPES_MESSAGES.MajContenuPanier, - } as MessageMajContenuPanier); // Émet un Message avec le nouveau nombre de Produits dans le Panier - // TODO: Valider le Message avant de l'émettre - new BroadcastChannel(NOM_CANAL_BOUTON_PANIER).postMessage({ - donnees: panier.items_count, - type: TYPES_MESSAGES.MajBoutonPanier, + emetMessageMajBoutonPanier({ quantiteProduits: panier.items_count }); + // Émet un Message avec le nouveau contenu du Panier + emetMessageMajContenuPanier({ + produits: panier.items, + sousTotalPanier: Number(panier.totals.total_price) / 100, + totalPanier: Number(panier.totals.total_items) / 100, }); // Retire l'entrée du Panier du DOM entree.remove(); @@ -173,32 +197,31 @@ const initialiseScriptsPagePanier = (): void => { } else { console.error("e n'est pas une Erreur ?!", e); } + majEtatsActivationBoutons(entrees); }); }, - ); + ) + .ifLeft((erreur: ValiError) => reporteErreur(erreur)); }); // Retire une unité à une ligne du Panier au clic sur le bouton de soustraction - boutonSoustraction.addEventListener("click", () => { + boutonSoustraction.addEventListener("click", (): void => { Maybe .fromNullable(champQuantite.valueAsNumber) .filter((valeur) => valeur > 1) .ifJust((valeur) => { - // Modifie des éléments du DOM pour signaler la requête et empêcher des doubles exécutions - boutonSuppression.textContent = "C= C= C= C= C=┌(;・ω・)┘"; - boutonSoustraction.toggleAttribute("disabled"); - boutonAddition.toggleAttribute("disabled"); - boutonSuppression.toggleAttribute("disabled"); - Either // Valide les arguments de la requête .encase(() => parse(WCStoreCartUpdateItemArgsSchema, { key: clePanier, quantity: valeur - 1 }) ) .map( - (args: WCStoreCartUpdateItemArgs) => { + async (args: WCStoreCartUpdateItemArgs) => { + // Modifie des éléments du DOM pour signaler la requête et empêcher des doubles exécutions + desactiveBoutonsEntreesPanier(entrees); + // Réalise la requête - postBackendWC({ + await postBackend({ corps: JSON.stringify(args), nonce: ETATS_PAGE.nonce, route: ROUTE_API_MAJ_ARTICLE_PANIER, @@ -212,36 +235,19 @@ const initialiseScriptsPagePanier = (): void => { await reponse.json(), // Traite tous les codes HTTPs possibles (corpsReponse: unknown) => - match(corpsReponse) - // Réponses problématiques - .with({ body: P.select(), status: 400 }, estWCError, leveBadRequestError) - .with({ body: P.select(), status: 401 }, estWCError, leveUnauthorizedError) - .with({ body: P.select(), status: 404 }, estWCError, leveNotFoundError) - // Réponse OK (201) - .with(P._, corpsOkInconnu => parse(WCStoreCartSchema, corpsOkInconnu)) - // Réponses inconnues - .otherwise(e => pipe(e, ErreurInconnue, leveErreur)), + traiteReponseBackendWCSelonCodesHTTP( + corpsReponse, + WCStoreCartSchema, + ), tap((panier: WCStoreCart) => { - // Émet un message pour la mise à jour du bouton du Panier - // TODO: Valider le Message avant de l'émettre - new BroadcastChannel(NOM_CANAL_BOUTON_PANIER).postMessage({ - donnees: panier.items_count, - type: TYPES_MESSAGES.MajBoutonPanier, - }); + // Émet un Message avec le nouveau nombre de Produits dans le Panier + emetMessageMajBoutonPanier({ quantiteProduits: panier.items_count }); // Émet un Message avec le nouveau contenu du Panier - // TODO: Valider le Message avant de l'émettre - new BroadcastChannel(NOM_CANAL_CONTENU_PANIER).postMessage({ - donnees: { - produits: panier.items, - totalPanier: Number(panier.totals.total_items / 100), - }, - type: TYPES_MESSAGES.MajContenuPanier, - } as MessageMajContenuPanier); - - boutonSoustraction.toggleAttribute("disabled"); - boutonAddition.toggleAttribute("disabled"); - boutonSuppression.toggleAttribute("disabled"); - boutonSuppression.textContent = "Remove"; + emetMessageMajContenuPanier({ + produits: panier.items, + sousTotalPanier: Number(panier.totals.total_price) / 100, + totalPanier: Number(panier.totals.total_items) / 100, + }); }), ); }) @@ -251,6 +257,8 @@ const initialiseScriptsPagePanier = (): void => { } else { console.error("e n'est pas une Erreur ?!", e); } + + majEtatsActivationBoutons(entrees); }); }, ); @@ -258,16 +266,12 @@ const initialiseScriptsPagePanier = (): void => { }); // Ajoute une unité à une ligne du Panier au clic sur le bouton d'addition - boutonAddition.addEventListener("click", () => { + boutonAddition.addEventListener("click", (): void => { Maybe .fromNullable(champQuantite.valueAsNumber) .ifJust((valeur) => { - // Modifie des éléments du DOM pour signifier le traitement de la requête et empêcher des - // doubles exécutions - boutonSuppression.textContent = "C= C= C= C= C=┌(;・ω・)┘"; - boutonSoustraction.toggleAttribute("disabled"); - boutonAddition.toggleAttribute("disabled"); - boutonSuppression.toggleAttribute("disabled"); + // Modifie des éléments du DOM pour signaler la requête et empêcher des doubles exécutions + desactiveBoutonsEntreesPanier(entrees); Either // Valide les arguments de la requête @@ -275,9 +279,9 @@ const initialiseScriptsPagePanier = (): void => { parse(WCStoreCartUpdateItemArgsSchema, { key: clePanier, quantity: valeur + 1 }) ) .map( - (args: WCStoreCartUpdateItemArgs) => { + async (args: WCStoreCartUpdateItemArgs) => { // Réalise la requête - postBackendWC({ + await postBackend({ corps: JSON.stringify(args), nonce: ETATS_PAGE.nonce, route: ROUTE_API_MAJ_ARTICLE_PANIER, @@ -291,36 +295,19 @@ const initialiseScriptsPagePanier = (): void => { await reponse.json(), // Traite tous les codes HTTPs possibles (corpsReponse: unknown) => - match(corpsReponse) - // Réponses problématiques - .with({ body: P.select(), status: 400 }, estWCError, leveBadRequestError) - .with({ body: P.select(), status: 401 }, estWCError, leveUnauthorizedError) - .with({ body: P.select(), status: 404 }, estWCError, leveNotFoundError) - // Réponse OK (201) - .with(P._, corpsOkInconnu => parse(WCStoreCartSchema, corpsOkInconnu)) - // Réponses inconnues - .otherwise(e => pipe(e, ErreurInconnue, leveErreur)), + traiteReponseBackendWCSelonCodesHTTP( + corpsReponse, + WCStoreCartSchema, + ), tap((panier: WCStoreCart) => { - // Émet un message pour la mise à jour du bouton du Panier - // TODO: Valider le Message avant de l'émettre - new BroadcastChannel(NOM_CANAL_BOUTON_PANIER).postMessage({ - donnees: panier.items_count, - type: TYPES_MESSAGES.MajBoutonPanier, - }); + // Émet un Message avec le nouveau nombre de Produits dans le Panier + emetMessageMajBoutonPanier({ quantiteProduits: panier.items_count }); // Émet un Message avec le nouveau contenu du Panier - // TODO: Valider le Message avant de l'émettre - new BroadcastChannel(NOM_CANAL_CONTENU_PANIER).postMessage({ - donnees: { - produits: panier.items, - totalPanier: Number(panier.totals.total_items / 100), - }, - type: TYPES_MESSAGES.MajContenuPanier, - } as MessageMajContenuPanier); - - boutonSoustraction.toggleAttribute("disabled"); - boutonAddition.toggleAttribute("disabled"); - boutonSuppression.toggleAttribute("disabled"); - boutonSuppression.textContent = "Remove"; + emetMessageMajContenuPanier({ + produits: panier.items, + sousTotalPanier: Number(panier.totals.total_price) / 100, + totalPanier: Number(panier.totals.total_items) / 100, + }); }), ); }) @@ -330,42 +317,40 @@ const initialiseScriptsPagePanier = (): void => { } else { console.error("e n'est pas une Erreur ?!", e); } + + majEtatsActivationBoutons(entrees); }); }, ); }); }); - }) - ); + }); + }); }; const initialiseMajConteneurPanier = (): void => { - const CANAL_BOUTON_PANIER: BroadcastChannel = new BroadcastChannel(NOM_CANAL_BOUTON_PANIER); - CANAL_BOUTON_PANIER.onmessage = (evenementMessage: MessageEvent): void => { + new BroadcastChannel(NOM_CANAL_BOUTON_PANIER).onmessage = (evenementMessage: MessageEvent): void => { valideMessageMajBoutonPanier(evenementMessage) + .map(prop("donnees")) // Met à jour le Bouton du Panier - .ifRight((message: MessageMajBoutonPanier) => { - CONTENEUR_PANIER.setAttribute(ATTRIBUT_CONTIENT_ARTICLES, String(message.donnees !== 0)); + .ifRight((donnees: MessageMajBoutonPanierDonnees) => { + CONTENEUR_PANIER.setAttribute(ATTRIBUT_CONTIENT_ARTICLES, String(donnees.quantiteProduits !== 0)); }); }; }; -const initialiseEcouteCanalMajContenuPanier = (): void => { +const initialiseMajContenuPanier = (): void => { new BroadcastChannel(NOM_CANAL_CONTENU_PANIER).onmessage = (evenementMessage: MessageEvent): void => { - /** - * À la réception d'un Événement (contenu le Panier), mettre à jour : - * - les quantités ; - * - les prix ; - */ valideMessageMajContenuPanier(evenementMessage) + .chain(propEither("donnees")) // Met à jour le contenu du Panier - .map(prop("donnees")) .ifRight((donnees: MessageMajContenuPanierDonnees) => { donnees.produits.forEach((ligne: WCStoreCartItem) => { + // Met à jour les entrées du Panier ENTREES_PANIER_EITHER.ifRight((entrees: Array) => { Maybe .fromNullable(entrees.find((entree) => entree.getAttribute(ATTRIBUT_CLE_PANIER) === ligne.key)) - .ifJust((entree) => { + .ifJust((entree: HTMLElement) => { // Fonction utilitaire const recupereElementDansEntree = recupereElementDansEntreePanierOuLeve(entree); @@ -376,16 +361,26 @@ const initialiseEcouteCanalMajContenuPanier = (): void => { prixLigne.textContent = `${String(Number(ligne.totals.line_total) / 100)} €`; champQuantite.setAttribute("value", String(ligne.quantity)); - TOTAL_PANIER.textContent = `${donnees.totalPanier} €`; + + majEtatsActivationBoutons(entrees); }); + + // Met à jour les totaux du Panier + SOUS_TOTAL_PANIER.textContent = `${String(donnees.totalPanier)} €`; + TOTAL_PANIER.textContent = `${String(donnees.totalPanier)} €`; }); }); + }) + // Reporte tout Erreur et réactive les Boutons + .ifLeft((erreur: CleNonTrouveError | ValiError) => { + reporteErreur(erreur); + ENTREES_PANIER_EITHER.ifRight(entrees => majEtatsActivationBoutons(entrees)); }); }; }; -document.addEventListener("DOMContentLoaded", () => { - initialiseScriptsPagePanier(); +document.addEventListener("DOMContentLoaded", (): void => { + initialiseMajEntreesPanier(); initialiseMajConteneurPanier(); - initialiseEcouteCanalMajContenuPanier(); + initialiseMajContenuPanier(); }); diff --git a/web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-produit.ts b/web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-produit.ts index f6b92b85..7bc8c67a 100644 --- a/web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-produit.ts +++ b/web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-produit.ts @@ -5,7 +5,6 @@ import { pipe, prop, tap } from "remeda"; import { match, P } from "ts-pattern"; import { parse } from "valibot"; -import type { WCStoreCart } from "./lib/types/api/cart"; import type { WCStoreCartAddItemArgs } from "./lib/types/api/cart-add-item.ts"; import { ENTETE_WC_NONCE, ROUTE_API_AJOUTE_ARTICLE_PANIER } from "./constantes/api.ts"; @@ -18,7 +17,6 @@ import { SELECTEUR_SECTIONS_CONTENUS, SELECTEUR_SELECTEUR_QUANTITE, } from "./constantes/dom"; -import { NOM_CANAL_BOUTON_PANIER, TYPES_MESSAGES } from "./constantes/messages.ts"; import { recupereElementOuLeve, recupereElementsOuLeve } from "./lib/dom.ts"; import { ErreurInconnue, @@ -31,6 +29,7 @@ import { type UnknownError, } from "./lib/erreurs.ts"; import { estError, estHTMLSelectElement, estReponse500 } from "./lib/gardes.ts"; +import { emetMessageMajBoutonPanier } from "./lib/messages.ts"; import { parseWCStoreCartAddItemArgs } from "./lib/schemas/cart-add-item.ts"; import { WCStoreCartSchema } from "./lib/schemas/cart.ts"; import { estWCError } from "./lib/schemas/erreurs.ts"; @@ -188,20 +187,13 @@ const ajouteProduitAuPanier = () => { .with(P._, corpsOkInconnu => parse(WCStoreCartSchema, corpsOkInconnu)) // Réponses inconnues .otherwise(e => pipe(e, ErreurInconnue, leveErreur)), - tap((panier: WCStoreCart) => console.debug("Panier", panier)), + // tap((panier: WCStoreCart) => console.debug("Panier", panier)), // Récupère le nombre de Produits dans la Panier prop("items_count"), // Déclenche les effets pour la mise à jour de l'IU tap((nombreArticlesPanier: number) => { - /** - * À la réception du nouveau Panier du backend : - * 1. Met à jour la quantité de Produits dans le Bouton du Panier - * 2. Met à jour le Bouton d'ajout au Panier avec un message de succès - * 3. (3 secondes) Réinitialise le Sélecteur de Quantité et le Bouton d'Ajout au Panier - */ BOUTON_AJOUT_PANIER.textContent = "Added to cart!"; - const CANAL_BOUTON_PANIER: BroadcastChannel = new BroadcastChannel(NOM_CANAL_BOUTON_PANIER); - CANAL_BOUTON_PANIER.postMessage({ donnees: nombreArticlesPanier, type: TYPES_MESSAGES.MajBoutonPanier }); + emetMessageMajBoutonPanier({ quantiteProduits: nombreArticlesPanier }); // TODO: Prévoir un cas où ce Timeout est annulé quand l'Utilisateur agit avant sur le Sélecteur setTimeout(() => {