@salla.sa/twilight-theme-engine 1.0.64 → 1.0.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/dist/{AddToCartForm-QDOLIEJQ.js → AddToCartForm-FBOCPHYE.js} +3 -3
  2. package/dist/{AddToCartForm-QDOLIEJQ.js.map → AddToCartForm-FBOCPHYE.js.map} +1 -1
  3. package/dist/{BlogAuthorPage-3PXTTKD2.js → BlogAuthorPage-6OCNXDGE.js} +9 -9
  4. package/dist/{BlogAuthorPage-3PXTTKD2.js.map → BlogAuthorPage-6OCNXDGE.js.map} +1 -1
  5. package/dist/{BlogCategoryPage-ELIZ66NZ.js → BlogCategoryPage-2NOU3U2B.js} +9 -9
  6. package/dist/{BlogCategoryPage-ELIZ66NZ.js.map → BlogCategoryPage-2NOU3U2B.js.map} +1 -1
  7. package/dist/{BlogPage-QP5FYB6W.js → BlogPage-AHGOVL33.js} +7 -7
  8. package/dist/{BlogPage-QP5FYB6W.js.map → BlogPage-AHGOVL33.js.map} +1 -1
  9. package/dist/{BlogSinglePage-WML62TEH.js → BlogSinglePage-2WQ5WMBS.js} +7 -7
  10. package/dist/{BlogSinglePage-WML62TEH.js.map → BlogSinglePage-2WQ5WMBS.js.map} +1 -1
  11. package/dist/{BlogTagPage-UYB62N2A.js → BlogTagPage-22T3T3J7.js} +9 -9
  12. package/dist/{BlogTagPage-UYB62N2A.js.map → BlogTagPage-22T3T3J7.js.map} +1 -1
  13. package/dist/{BrandsPage-I7TW2URN.js → BrandsPage-OJGIDWOI.js} +8 -8
  14. package/dist/{BrandsPage-I7TW2URN.js.map → BrandsPage-OJGIDWOI.js.map} +1 -1
  15. package/dist/{Breadcrumb-EH55PVNJ.js → Breadcrumb-OBDTZGBO.js} +7 -7
  16. package/dist/{Breadcrumb-EH55PVNJ.js.map → Breadcrumb-OBDTZGBO.js.map} +1 -1
  17. package/dist/{CartItem-N4XSKQTB.js → CartItem-IQAFNIF7.js} +7 -7
  18. package/dist/{CartItem-N4XSKQTB.js.map → CartItem-IQAFNIF7.js.map} +1 -1
  19. package/dist/{CartSummary-OM4X2NLC.js → CartSummary-ABCNPCLJ.js} +12 -7
  20. package/dist/CartSummary-ABCNPCLJ.js.map +1 -0
  21. package/dist/{Copyright-XE5XNMYG.js → Copyright-RX7MCIAB.js} +3 -3
  22. package/dist/{Copyright-XE5XNMYG.js.map → Copyright-RX7MCIAB.js.map} +1 -1
  23. package/dist/{CustomerLayout-HQAWJ4CV.js → CustomerLayout-EDYELWPZ.js} +10 -10
  24. package/dist/CustomerLayout-EDYELWPZ.js.map +1 -0
  25. package/dist/{Footer-4KM2TX4Q.js → Footer-G422RTAG.js} +7 -7
  26. package/dist/{Footer-4KM2TX4Q.js.map → Footer-G422RTAG.js.map} +1 -1
  27. package/dist/{Header-NNACXS5F.js → Header-DKAN4AO3.js} +5 -5
  28. package/dist/{Header-NNACXS5F.js.map → Header-DKAN4AO3.js.map} +1 -1
  29. package/dist/{LoyaltyPage-DIU7FAEL.js → LoyaltyPage-KOEX7M6D.js} +7 -7
  30. package/dist/{LoyaltyPage-DIU7FAEL.js.map → LoyaltyPage-KOEX7M6D.js.map} +1 -1
  31. package/dist/{LoyaltyPointsPage-EMJEFBLA.js → LoyaltyPointsPage-UDQQZUHW.js} +3 -3
  32. package/dist/{LoyaltyPointsPage-EMJEFBLA.js.map → LoyaltyPointsPage-UDQQZUHW.js.map} +1 -1
  33. package/dist/{MainMenu-7W5ENSPK.js → MainMenu-6R2BSYZ7.js} +3 -3
  34. package/dist/{MainMenu-7W5ENSPK.js.map → MainMenu-6R2BSYZ7.js.map} +1 -1
  35. package/dist/{MasterLayout-QCCMRBYA.js → MasterLayout-S6WET6LB.js} +7 -7
  36. package/dist/{MasterLayout-QCCMRBYA.js.map → MasterLayout-S6WET6LB.js.map} +1 -1
  37. package/dist/{MobileMenu-QFOL5UPI.js → MobileMenu-O53L42ZQ.js} +7 -7
  38. package/dist/{MobileMenu-QFOL5UPI.js.map → MobileMenu-O53L42ZQ.js.map} +1 -1
  39. package/dist/{NotificationsPage-VOUFKNUQ.js → NotificationsPage-YF5LFRMV.js} +7 -7
  40. package/dist/{NotificationsPage-VOUFKNUQ.js.map → NotificationsPage-YF5LFRMV.js.map} +1 -1
  41. package/dist/{OrderSinglePage-WYNWGJ6N.js → OrderSinglePage-XWYUSA5B.js} +8 -8
  42. package/dist/{OrderSinglePage-WYNWGJ6N.js.map → OrderSinglePage-XWYUSA5B.js.map} +1 -1
  43. package/dist/{OrdersPage-BAPUFN4I.js → OrdersPage-DL7ZIFEW.js} +7 -7
  44. package/dist/{OrdersPage-BAPUFN4I.js.map → OrdersPage-DL7ZIFEW.js.map} +1 -1
  45. package/dist/{PageSingle-WPU4OJF4.js → PageSingle-RYKAKEQU.js} +3 -3
  46. package/dist/{PageSingle-WPU4OJF4.js.map → PageSingle-RYKAKEQU.js.map} +1 -1
  47. package/dist/{ProductDetails-NKNCR5QX.js → ProductDetails-OF23A6NG.js} +3 -3
  48. package/dist/{ProductDetails-NKNCR5QX.js.map → ProductDetails-OF23A6NG.js.map} +1 -1
  49. package/dist/{ProfilePage-ENSVDCJI.js → ProfilePage-6F344VGH.js} +7 -7
  50. package/dist/{ProfilePage-ENSVDCJI.js.map → ProfilePage-6F344VGH.js.map} +1 -1
  51. package/dist/{SeoCartWidget-H7IY2ZR4.js → SeoCartWidget-IVKEPKTF.js} +7 -7
  52. package/dist/{SeoCartWidget-H7IY2ZR4.js.map → SeoCartWidget-IVKEPKTF.js.map} +1 -1
  53. package/dist/{SettingsPage-HEWBMFUI.js → SettingsPage-TEYR763G.js} +7 -7
  54. package/dist/{SettingsPage-HEWBMFUI.js.map → SettingsPage-TEYR763G.js.map} +1 -1
  55. package/dist/{StoreClosedNotification-VIS7RAEH.js → StoreClosedNotification-3YEI6TUD.js} +8 -8
  56. package/dist/{StoreClosedNotification-VIS7RAEH.js.map → StoreClosedNotification-3YEI6TUD.js.map} +1 -1
  57. package/dist/{TestimonialsPage-TNL7CM6X.js → TestimonialsPage-26UHWIT7.js} +3 -3
  58. package/dist/{TestimonialsPage-TNL7CM6X.js.map → TestimonialsPage-26UHWIT7.js.map} +1 -1
  59. package/dist/{ThankYouPage-VFVXLL6Q.js → ThankYouPage-YV656LI2.js} +7 -7
  60. package/dist/{ThankYouPage-VFVXLL6Q.js.map → ThankYouPage-YV656LI2.js.map} +1 -1
  61. package/dist/{WalletPage-CINZCGTU.js → WalletPage-4EUICYZJ.js} +7 -7
  62. package/dist/{WalletPage-CINZCGTU.js.map → WalletPage-4EUICYZJ.js.map} +1 -1
  63. package/dist/{WishlistPage-M37MPJBY.js → WishlistPage-7UHPPRYC.js} +9 -9
  64. package/dist/{WishlistPage-M37MPJBY.js.map → WishlistPage-7UHPPRYC.js.map} +1 -1
  65. package/dist/api/brands.js +2 -2
  66. package/dist/api/cart.d.ts +5 -0
  67. package/dist/api/cart.d.ts.map +1 -1
  68. package/dist/api/cart.js +2 -2
  69. package/dist/api/category.js +2 -2
  70. package/dist/api/loyalty.js +2 -2
  71. package/dist/api/order.js +2 -2
  72. package/dist/api/page.js +2 -2
  73. package/dist/api/product.js +2 -2
  74. package/dist/api/wishlist.js +3 -3
  75. package/dist/chunk-3L5VG2X4.js +47 -0
  76. package/dist/chunk-3L5VG2X4.js.map +1 -0
  77. package/dist/{chunk-Q5UYV2EN.js → chunk-4YWBXQV5.js} +12 -4
  78. package/dist/chunk-4YWBXQV5.js.map +1 -0
  79. package/dist/{chunk-N6TNEM5G.js → chunk-6IRWFBGU.js} +3 -3
  80. package/dist/{chunk-N6TNEM5G.js.map → chunk-6IRWFBGU.js.map} +1 -1
  81. package/dist/{chunk-6J33ZJB6.js → chunk-7WPZBVCZ.js} +44 -22
  82. package/dist/chunk-7WPZBVCZ.js.map +1 -0
  83. package/dist/chunk-DGC7MLUQ.js +14 -0
  84. package/dist/{chunk-YZHHK5IP.js.map → chunk-DGC7MLUQ.js.map} +1 -1
  85. package/dist/{chunk-S3CC2YGF.js → chunk-EFMAB636.js} +3 -3
  86. package/dist/{chunk-S3CC2YGF.js.map → chunk-EFMAB636.js.map} +1 -1
  87. package/dist/{chunk-XCS3HZNM.js → chunk-EOSR62OX.js} +27 -13
  88. package/dist/chunk-EOSR62OX.js.map +1 -0
  89. package/dist/{chunk-KHRIGLYL.js → chunk-EYFMLMMF.js} +3 -3
  90. package/dist/{chunk-KHRIGLYL.js.map → chunk-EYFMLMMF.js.map} +1 -1
  91. package/dist/{chunk-IC7YN4OQ.js → chunk-GNH3W6T4.js} +4 -4
  92. package/dist/chunk-GNH3W6T4.js.map +1 -0
  93. package/dist/{chunk-VKY5OTIN.js → chunk-GNQQCLLZ.js} +3 -3
  94. package/dist/{chunk-VKY5OTIN.js.map → chunk-GNQQCLLZ.js.map} +1 -1
  95. package/dist/{chunk-LJ525OCU.js → chunk-GWARGGIA.js} +4 -4
  96. package/dist/{chunk-LJ525OCU.js.map → chunk-GWARGGIA.js.map} +1 -1
  97. package/dist/{chunk-PE3LLBNR.js → chunk-GYXT7T2Z.js} +3 -3
  98. package/dist/{chunk-PE3LLBNR.js.map → chunk-GYXT7T2Z.js.map} +1 -1
  99. package/dist/{chunk-W66OHTSM.js → chunk-HDO37URJ.js} +3 -3
  100. package/dist/{chunk-W66OHTSM.js.map → chunk-HDO37URJ.js.map} +1 -1
  101. package/dist/{chunk-PDDMAWWF.js → chunk-KGSQ6IGZ.js} +3 -3
  102. package/dist/{chunk-PDDMAWWF.js.map → chunk-KGSQ6IGZ.js.map} +1 -1
  103. package/dist/{chunk-EHEXX43T.js → chunk-N7L4GWNO.js} +7 -7
  104. package/dist/{chunk-EHEXX43T.js.map → chunk-N7L4GWNO.js.map} +1 -1
  105. package/dist/{chunk-3A4ZJP5S.js → chunk-PMGCYSGH.js} +4 -4
  106. package/dist/{chunk-3A4ZJP5S.js.map → chunk-PMGCYSGH.js.map} +1 -1
  107. package/dist/{chunk-VLBQPVHM.js → chunk-RH5VLLTG.js} +3 -3
  108. package/dist/{chunk-VLBQPVHM.js.map → chunk-RH5VLLTG.js.map} +1 -1
  109. package/dist/{chunk-T6YSHLAI.js → chunk-SPVOBWPK.js} +6 -6
  110. package/dist/{chunk-T6YSHLAI.js.map → chunk-SPVOBWPK.js.map} +1 -1
  111. package/dist/{chunk-I62RENKM.js → chunk-SSPAMQRV.js} +14 -2
  112. package/dist/chunk-SSPAMQRV.js.map +1 -0
  113. package/dist/{chunk-OBSAH7K6.js → chunk-SVPXQCOA.js} +12 -4
  114. package/dist/chunk-SVPXQCOA.js.map +1 -0
  115. package/dist/{chunk-7ZYIBWZM.js → chunk-SY3GJQKC.js} +7 -7
  116. package/dist/chunk-SY3GJQKC.js.map +1 -0
  117. package/dist/{chunk-KWHCKGLL.js → chunk-TOPFB6FL.js} +3 -3
  118. package/dist/{chunk-KWHCKGLL.js.map → chunk-TOPFB6FL.js.map} +1 -1
  119. package/dist/{chunk-NPEI4SAZ.js → chunk-VKB5AQUS.js} +3 -3
  120. package/dist/{chunk-NPEI4SAZ.js.map → chunk-VKB5AQUS.js.map} +1 -1
  121. package/dist/{chunk-ABOMCRUW.js → chunk-XFIPETMC.js} +6 -6
  122. package/dist/{chunk-ABOMCRUW.js.map → chunk-XFIPETMC.js.map} +1 -1
  123. package/dist/{chunk-ZJ5KWIEB.js → chunk-YCZTCRF3.js} +5 -5
  124. package/dist/{chunk-ZJ5KWIEB.js.map → chunk-YCZTCRF3.js.map} +1 -1
  125. package/dist/components/cart/CartSummary.d.ts.map +1 -1
  126. package/dist/components/cart/index.js +1 -1
  127. package/dist/components/common/index.js +1 -1
  128. package/dist/components/drawer/index.js +5 -5
  129. package/dist/components/home/index.js +8 -8
  130. package/dist/components/layout/CustomerLayout.d.ts.map +1 -1
  131. package/dist/components/layout/index.js +1 -1
  132. package/dist/components/product/index.js +6 -6
  133. package/dist/components/store/index.js +7 -7
  134. package/dist/components/toast/Toaster.d.ts.map +1 -1
  135. package/dist/components/toast/index.js +1 -1
  136. package/dist/{document-class-37KI2E52.js → document-class-JQ762WUL.js} +5 -5
  137. package/dist/{document-class-37KI2E52.js.map → document-class-JQ762WUL.js.map} +1 -1
  138. package/dist/dom/edge.d.ts +3 -0
  139. package/dist/dom/edge.d.ts.map +1 -0
  140. package/dist/dom/index.d.ts +1 -0
  141. package/dist/dom/index.d.ts.map +1 -1
  142. package/dist/dom.js +8 -1
  143. package/dist/dom.js.map +1 -1
  144. package/dist/hooks/index.js +5 -5
  145. package/dist/hooks/useGtm.js +5 -5
  146. package/dist/hooks/useMoney.js +5 -5
  147. package/dist/hooks/useStore.js +5 -5
  148. package/dist/index.js +5 -5
  149. package/dist/{navigation-YKRXGGSL.js → navigation-CJHPA74M.js} +3 -3
  150. package/dist/{navigation-YKRXGGSL.js.map → navigation-CJHPA74M.js.map} +1 -1
  151. package/dist/{navigation-ESPAHRXM.js → navigation-F2TD5X2P.js} +4 -4
  152. package/dist/{navigation-ESPAHRXM.js.map → navigation-F2TD5X2P.js.map} +1 -1
  153. package/dist/{not-found-UXBV4766.js → not-found-LXTJBYJY.js} +8 -8
  154. package/dist/{not-found-UXBV4766.js.map → not-found-LXTJBYJY.js.map} +1 -1
  155. package/dist/providers/NavigationProvider.d.ts +8 -9
  156. package/dist/providers/NavigationProvider.d.ts.map +1 -1
  157. package/dist/providers/index.js +5 -5
  158. package/dist/providers/twilight-init.d.ts.map +1 -1
  159. package/dist/routes/account/notifications/loader.d.ts.map +1 -1
  160. package/dist/routes/account/orders.js +3 -3
  161. package/dist/routes/account/profile/loader.d.ts.map +1 -1
  162. package/dist/routes/account/settings/loader.d.ts.map +1 -1
  163. package/dist/routes/account/wallet/loader.d.ts.map +1 -1
  164. package/dist/routes/account/wishlist/loader.d.ts.map +1 -1
  165. package/dist/routes/account.js +16 -15
  166. package/dist/routes/account.js.map +1 -1
  167. package/dist/routes/blog.js +7 -7
  168. package/dist/routes/brands.js +3 -3
  169. package/dist/routes/cart/CartPage.d.ts.map +1 -1
  170. package/dist/routes/cart.js +14 -18
  171. package/dist/routes/cart.js.map +1 -1
  172. package/dist/routes/home.js +9 -9
  173. package/dist/routes/index.js +2 -2
  174. package/dist/routes/loyalty.js +4 -4
  175. package/dist/routes/page.js +3 -3
  176. package/dist/routes/product-listing.js +12 -11
  177. package/dist/routes/product-listing.js.map +1 -1
  178. package/dist/routes/product.js +8 -8
  179. package/dist/routes/seo-redirects.d.ts +11 -0
  180. package/dist/routes/seo-redirects.d.ts.map +1 -1
  181. package/dist/routes/seo-redirects.js +2 -2
  182. package/dist/routes/testimonials.js +1 -1
  183. package/dist/routes/thank-you.js +3 -3
  184. package/dist/skeleton.js +9 -9
  185. package/dist/tanstack/document-class.d.ts.map +1 -1
  186. package/dist/tanstack/router.d.ts.map +1 -1
  187. package/dist/tanstack/search.d.ts +3 -0
  188. package/dist/tanstack/search.d.ts.map +1 -0
  189. package/dist/tanstack/templates/locale-wrapper.d.ts.map +1 -1
  190. package/dist/tanstack.js +6 -6
  191. package/dist/types/index.d.ts +2 -0
  192. package/dist/types/index.d.ts.map +1 -1
  193. package/dist/types/salla-sdk.d.ts +1 -1
  194. package/dist/types/salla-sdk.d.ts.map +1 -1
  195. package/dist/vite/adapters/tanstack.adapter.d.ts.map +1 -1
  196. package/dist/vite/index.js +74 -5
  197. package/dist/vite/index.js.map +1 -1
  198. package/package.json +1 -1
  199. package/dist/CartSummary-OM4X2NLC.js.map +0 -1
  200. package/dist/CustomerLayout-HQAWJ4CV.js.map +0 -1
  201. package/dist/chunk-6J33ZJB6.js.map +0 -1
  202. package/dist/chunk-7ZYIBWZM.js.map +0 -1
  203. package/dist/chunk-I62RENKM.js.map +0 -1
  204. package/dist/chunk-IC7YN4OQ.js.map +0 -1
  205. package/dist/chunk-IIYK56TI.js +0 -29
  206. package/dist/chunk-IIYK56TI.js.map +0 -1
  207. package/dist/chunk-OBSAH7K6.js.map +0 -1
  208. package/dist/chunk-Q5UYV2EN.js.map +0 -1
  209. package/dist/chunk-XCS3HZNM.js.map +0 -1
  210. package/dist/chunk-YZHHK5IP.js +0 -14
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/routes/account/wishlist/WishlistShare.tsx","../src/routes/account/wishlist/WishlistPage.tsx"],"names":["SallaSocialShare","useEffect","jsxs","jsx","SallaButton","useRef","useState","useCallback","items"],"mappings":"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","file":"WishlistPage-M37MPJBY.js","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\n// The eager (non-deferred) export: the share dialog is opened imperatively through a ref, and the\n// deferred wrapper doesn't attach it until it has hydrated — a click before that would do nothing.\nimport { SallaSocialShareCore as SallaSocialShare } from '@salla.sa/twilight-components-react/social-share';\nimport { useTranslation } from '../../../providers/I18nProvider';\n\ntype ShareResponse = { data?: { url?: string }; url?: string } | undefined;\ntype SocialShareElement = HTMLElement & {\n url?: string;\n refresh?: () => Promise<void>;\n open?: () => Promise<void>;\n close?: () => Promise<void>;\n};\n\n/**\n * Share state for the wishlist page: the \"Share\" dropdown (share the whole list / share\n * specific items), the selection used by \"specific items\", and the share request itself.\n * Mirrors what the SDK's `<salla-wishlist-actions>` does, but drives the page's own React\n * list — that component needs a sibling `<salla-products-list>`, which this page doesn't render.\n */\nexport function useWishlistShare() {\n const [menuOpen, setMenuOpen] = useState(false);\n const [selecting, setSelecting] = useState(false);\n const [selectedIds, setSelectedIds] = useState<number[]>([]);\n const [sharing, setSharing] = useState(false);\n const [shareUrl, setShareUrl] = useState('');\n /** Ids of every product currently rendered (later cursor pages included), for \"select all\". */\n const loadedIdsRef = useRef<number[]>([]);\n const socialShareRef = useRef<SocialShareElement | null>(null);\n\n const share = useCallback(async (ids: number[], selectAll: boolean) => {\n if (!window.salla?.wishlist?.share) return;\n setSharing(true);\n try {\n const response = (await window.salla.wishlist.share(ids, selectAll)) as ShareResponse;\n const url = response?.data?.url || response?.url || '';\n if (!url) return;\n setShareUrl(url);\n const element = socialShareRef.current;\n if (element) {\n element.url = url;\n await element.refresh?.();\n await element.open?.();\n }\n } catch {\n // The SDK reports a failed share itself (notification); nothing to recover here.\n } finally {\n setSharing(false);\n }\n }, []);\n\n const shareAll = useCallback(() => {\n setMenuOpen(false);\n void share([], true);\n }, [share]);\n\n const shareSelected = useCallback(() => {\n if (selectedIds.length) void share(selectedIds, false);\n }, [share, selectedIds]);\n\n const startSelecting = useCallback(() => {\n setMenuOpen(false);\n setSelecting(true);\n }, []);\n\n const cancelSelecting = useCallback(() => {\n setSelecting(false);\n setSelectedIds([]);\n setShareUrl('');\n void socialShareRef.current?.close?.();\n }, []);\n\n const toggleSelected = useCallback((id: number) => {\n setShareUrl('');\n setSelectedIds((current) =>\n current.includes(id) ? current.filter((existing) => existing !== id) : [...current, id]\n );\n }, []);\n\n const selectedIdsRef = useRef(selectedIds);\n useEffect(() => {\n selectedIdsRef.current = selectedIds;\n }, [selectedIds]);\n\n const deselect = useCallback((id: number) => {\n if (!selectedIdsRef.current.includes(id)) return;\n // A link built for the old selection would still offer the removed product.\n setShareUrl('');\n const element = socialShareRef.current;\n if (element) {\n element.url = undefined;\n void element.close?.();\n }\n setSelectedIds((current) => current.filter((existing) => existing !== id));\n }, []);\n\n const toggleAll = useCallback(() => {\n setShareUrl('');\n setSelectedIds((current) =>\n current.length && current.length === loadedIdsRef.current.length\n ? []\n : [...loadedIdsRef.current]\n );\n }, []);\n\n return {\n menuOpen,\n setMenuOpen,\n selecting,\n selectedIds,\n sharing,\n shareUrl,\n loadedIdsRef,\n socialShareRef,\n shareAll,\n shareSelected,\n startSelecting,\n cancelSelecting,\n toggleSelected,\n toggleAll,\n deselect,\n };\n}\n\nexport type WishlistShareState = ReturnType<typeof useWishlistShare>;\n\n/** The bar above the wishlist: the \"Share\" dropdown, or — while picking products — the selection controls. */\nexport function WishlistShareBar({\n state,\n hasProducts,\n}: {\n state: WishlistShareState;\n hasProducts: boolean;\n}) {\n const { t } = useTranslation();\n const rootRef = useRef<HTMLDivElement>(null);\n const { menuOpen, setMenuOpen } = state;\n\n // Close the dropdown on an outside click or Escape.\n useEffect(() => {\n if (!menuOpen) return;\n const onPointerDown = (event: MouseEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setMenuOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setMenuOpen(false);\n };\n document.addEventListener('mousedown', onPointerDown);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('mousedown', onPointerDown);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [menuOpen, setMenuOpen]);\n\n const selectedCount = state.selectedIds.length;\n const allSelected = selectedCount > 0 && selectedCount === state.loadedIdsRef.current.length;\n\n return (\n <div ref={rootRef} className=\"s-wishlist-actions\">\n <div className=\"s-wishlist-actions-bar flex items-center justify-end gap-3 mb-3\">\n {state.selecting ? (\n <div className=\"s-wishlist-actions-selection flex items-center gap-3\">\n <label className=\"s-wishlist-actions-select-all inline-flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={allSelected}\n ref={(input) => {\n if (input) input.indeterminate = selectedCount > 0 && !allSelected;\n }}\n onChange={state.toggleAll}\n />\n {t('pages.wishlist.select_all', 'Select all')}\n </label>\n <SallaButton\n color=\"primary\"\n disabled={selectedCount === 0 || state.sharing}\n onClick={state.shareSelected}\n >\n {t('pages.wishlist.share', 'Share')}\n {selectedCount > 0 ? ` (${selectedCount})` : ''}\n </SallaButton>\n <SallaButton fill=\"outline\" color=\"light\" onClick={state.cancelSelecting}>\n {t('common.elements.cancel', 'Cancel')}\n </SallaButton>\n </div>\n ) : (\n <div className=\"s-wishlist-actions-dropdown relative\">\n <SallaButton\n color=\"primary\"\n fill=\"outline\"\n disabled={!hasProducts || state.sharing}\n aria-haspopup=\"true\"\n aria-expanded={menuOpen}\n onClick={() => setMenuOpen(!menuOpen)}\n >\n <span className=\"flex items-center justify-center gap-2\">\n <i className=\"sicon-share-alt\" aria-hidden=\"true\" />\n {t('pages.wishlist.share', 'Share')}\n <i className=\"sicon-keyboard_arrow_down\" aria-hidden=\"true\" />\n </span>\n </SallaButton>\n {menuOpen && (\n <ul\n role=\"menu\"\n className=\"s-wishlist-actions-menu absolute z-10 mt-2 min-w-48 rounded-md bg-white py-2 shadow-default rtl:right-0 ltr:left-0\"\n >\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"s-wishlist-actions-item block w-full px-4 py-2 text-start text-sm text-gray-700 hover:bg-gray-50\"\n onClick={state.shareAll}\n >\n {t('pages.wishlist.share_all', 'Share the list')}\n </button>\n </li>\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"s-wishlist-actions-item block w-full px-4 py-2 text-start text-sm text-gray-700 hover:bg-gray-50\"\n onClick={state.startSelecting}\n >\n {t('pages.wishlist.share_specific', 'Share specific items')}\n </button>\n </li>\n </ul>\n )}\n </div>\n )}\n </div>\n {/* Same setup as the SDK's <salla-wishlist-actions>: the centered modal variant, opened by the\n dropdown rather than by the component's own round share button, so the default\n `widget` slot (that button) is replaced by an empty anchor. */}\n <SallaSocialShare\n ref={state.socialShareRef as never}\n url={state.shareUrl || undefined}\n mode=\"modal\"\n modalTitle={t('pages.wishlist.share_list_title', 'Share wishlist')}\n className=\"s-wishlist-actions-social\"\n >\n <span slot=\"widget\" className=\"s-wishlist-actions-social-anchor\" aria-hidden=\"true\" />\n </SallaSocialShare>\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type CSSProperties } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { ItemsList } from '@salla.sa/twilight-components-react';\nimport { SallaAddProductButton } from '@salla.sa/twilight-components-react/add-product-button';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { wishlist } from '../../../api/wishlist';\nimport type { Product } from '../../../types';\nimport { HookSlot, useWishlist, useMoney } from '../../../hooks';\nimport { useTranslation } from '../../../providers/I18nProvider';\nimport type { WishlistPageProps } from './types';\nimport { WishlistShareBar, useWishlistShare } from './WishlistShare';\nimport { NoContent, Image } from '../../../components/common';\nimport { useLocation } from '../../../providers/NavigationProvider';\n\ninterface WishlistCardSelection {\n /** \"Share specific items\" mode: the card shows a checkbox and toggles on click. */\n selecting: boolean;\n selected: boolean;\n onToggle: (id: number) => void;\n}\n\n// The loaded component copies host attributes (not properties) onto its inner salla-button.\nconst setAddButtonAttributes = (el: HTMLElement | null) => {\n el?.setAttribute('loader-position', 'center');\n el?.setAttribute('fill', 'outline');\n};\n\nconst REMOVING_MS = 300;\n\nconst REMOVING_STYLE: CSSProperties = {\n opacity: 0,\n transform: 'scale(0.95)',\n transition: `opacity ${REMOVING_MS}ms ease-in-out, transform ${REMOVING_MS}ms ease-in-out`,\n};\n\nfunction WishlistCard({\n product: prod,\n selection,\n removing,\n onRemoved,\n}: {\n product: Product;\n selection?: WishlistCardSelection;\n /** Fades the card out, then calls `onRemoved` once the fade ends. */\n removing?: boolean;\n onRemoved?: (id: number) => void;\n}) {\n const { remove } = useWishlist();\n const { format } = useMoney();\n\n // Drops the card even when `transitionend` never fires (hidden tab, overridden styles).\n useEffect(() => {\n if (!removing) return;\n const timer = setTimeout(() => onRemoved?.(Number(prod.id)), REMOVING_MS + 50);\n return () => clearTimeout(timer);\n }, [removing, onRemoved, prod.id]);\n\n const handleRemove = () => {\n if (prod.id) {\n remove(Number(prod.id));\n }\n };\n\n const displayPrice = prod.sale_price ?? prod.price;\n const regularPrice = prod.regular_price;\n\n return (\n <div\n id={`wishlist-product-${prod.id}`}\n className={`product-entry product-entry--wishlist${selection?.selected ? ' is-selected' : ''}`}\n style={removing ? REMOVING_STYLE : undefined}\n onTransitionEnd={(event) => {\n if (removing && event.target === event.currentTarget && event.propertyName === 'opacity') {\n onRemoved?.(Number(prod.id));\n }\n }}\n >\n {selection?.selecting && (\n <input\n type=\"checkbox\"\n className=\"s-wishlist-select shrink-0 rtl:ml-4 ltr:mr-4\"\n aria-label={prod.name}\n checked={selection.selected}\n onChange={() => selection.onToggle(Number(prod.id))}\n />\n )}\n <div className=\"flex items-center mb-4 sm:mb-0\">\n <a href={prod.url} className=\"product-entry__image\">\n <Image\n className=\"object-cover w-full h-full\"\n src={prod.image?.url}\n alt={prod.image?.alt ?? prod.name}\n aspectRatio=\"1/1\"\n />\n </a>\n <div className=\"flex-1 rtl:pr-5 ltr:pl-5\">\n <h3 className=\"text-sm text-gray-800 leading-6 mb-1.5 rtl:pl-5 ltr:pr-5 rtl:md:pl-8 ltr:md:pr-8 line-clamp-1\">\n <a href={prod.url}>{prod.name}</a>\n </h3>\n <div className=\"w-full center-between\">\n {prod.is_on_sale && regularPrice ? (\n <div className=\"space-x-1 rtl:space-x-reverse\">\n <h4 className=\"inline-block text-sm font-bold text-red-400\">\n {format(displayPrice)}\n </h4>\n <span className=\"text-sm text-gray-500 line-through\">{format(regularPrice)}</span>\n </div>\n ) : (\n <h4 className=\"text-sm font-bold\">{format(displayPrice)}</h4>\n )}\n </div>\n </div>\n </div>\n <div className=\"flex items-center space-x-4 rtl:space-x-reverse\">\n <SallaAddProductButton\n ref={setAddButtonAttributes}\n productStatus={prod.status}\n productId={prod.id}\n productType={prod.type}\n loaderPosition=\"center\"\n fill=\"outline\"\n className=\"flex-grow w-full sm:grow-0 md:w-40\"\n />\n <SallaButton\n loaderPosition=\"center\"\n shape=\"icon\"\n size=\"small\"\n color=\"danger\"\n className=\"btn--delete\"\n onClick={handleRemove}\n >\n <i className=\"sicon-cancel\" />\n </SallaButton>\n </div>\n </div>\n );\n}\n\n/** The loaded wishlist pages, reloaded from the server once every loaded card is removed (like Twig). */\nfunction useWishlistItems(\n { query, products, pagination }: WishlistPageProps,\n onRemoved: (id: number) => void\n) {\n const queryClient = useQueryClient();\n // Track the next page to load (starts at page 2 since page 1 is SSR)\n const nextPageRef = useRef(query.page + 1);\n const [removedIds, setRemovedIds] = useState<ReadonlySet<number>>(() => new Set());\n const [removingIds, setRemovingIds] = useState<ReadonlySet<number>>(() => new Set());\n const [reloaded, setReloaded] = useState<{\n items: Product[];\n next: string | null;\n generation: number;\n } | null>(null);\n const loadedRef = useRef({\n ids: products.map((prod) => Number(prod.id)),\n hasMore: !!pagination?.next,\n });\n\n // A `?page=` navigation keeps this instance, so drop what the previous page removed or reloaded.\n const [loadedProducts, setLoadedProducts] = useState(products);\n if (loadedProducts !== products) {\n setLoadedProducts(products);\n setRemovedIds(new Set());\n setRemovingIds(new Set());\n setReloaded(null);\n }\n\n useEffect(() => {\n nextPageRef.current = query.page + 1;\n loadedRef.current = {\n ids: products.map((prod) => Number(prod.id)),\n hasMore: !!pagination?.next,\n };\n }, [products, query.page, pagination?.next]);\n\n useEffect(() => {\n const salla = window.salla;\n if (!salla?.event) return;\n\n const handleRemoved = (_response: unknown, id: unknown) => {\n const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n (reduceMotion ? setRemovedIds : setRemovingIds)((current) =>\n new Set(current).add(Number(id))\n );\n onRemoved(Number(id));\n };\n\n salla.event.on('wishlist::removed', handleRemoved);\n return () => {\n salla.event.off('wishlist::removed', handleRemoved);\n };\n }, [onRemoved]);\n\n useEffect(() => {\n const { ids, hasMore } = loadedRef.current;\n if (!ids.length || !ids.every((id) => removedIds.has(id))) return;\n\n const reset = (items: Product[], next: string | null) => {\n nextPageRef.current = query.page + 1;\n loadedRef.current = { ids: items.map((prod) => Number(prod.id)), hasMore: !!next };\n setRemovedIds(new Set());\n setRemovingIds(new Set());\n setReloaded((current) => ({ items, next, generation: (current?.generation ?? 0) + 1 }));\n };\n\n if (!hasMore) {\n reset([], null);\n return;\n }\n\n let cancelled = false;\n queryClient\n .fetchQuery({ ...wishlist.queries.list({ page: query.page }), staleTime: 0 })\n .then((result) => {\n if (!cancelled) reset(result.items, result.next);\n })\n // A failed reload keeps the list as it is; later pages still load on scroll.\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [removedIds, query.page, products, queryClient]);\n\n const loader = async () => {\n const pageToLoad = nextPageRef.current;\n const result = await wishlist.list({ page: pageToLoad });\n\n nextPageRef.current = pageToLoad + 1;\n loadedRef.current = {\n ids: [...loadedRef.current.ids, ...result.items.map((prod) => Number(prod.id))],\n hasMore: !!result.next,\n };\n\n return {\n items: result.items,\n next: result.next,\n };\n };\n\n const finishRemoving = useCallback((id: number) => {\n setRemovedIds((current) => (current.has(id) ? current : new Set(current).add(id)));\n }, []);\n\n return {\n items: reloaded ? reloaded.items : products,\n next: reloaded ? reloaded.next : pagination?.next,\n generation: reloaded?.generation ?? 0,\n removedIds,\n removingIds,\n finishRemoving,\n loader,\n };\n}\n\nexport function WishlistPage(props: WishlistPageProps) {\n const { t } = useTranslation();\n const { pathname, searchStr } = useLocation();\n const shareState = useWishlistShare();\n const selectedIdSet = useMemo(() => new Set(shareState.selectedIds), [shareState.selectedIds]);\n const { items, next, generation, removedIds, removingIds, finishRemoving, loader } =\n useWishlistItems(props, shareState.deselect);\n const hasRemaining = items.some((prod) => !removedIds.has(Number(prod.id)));\n\n return (\n <div className=\"space-y-5\" id=\"wishlist\">\n <HookSlot name=\"customer:wishlist.items.start\" />\n <WishlistShareBar state={shareState} hasProducts={hasRemaining || !!next} />\n <ItemsList<Product>\n key={generation}\n items={items}\n loader={loader}\n mode={next ? 'infinite' : 'static'}\n pageUrl={pathname + searchStr}\n className=\"s-products-list\"\n itemsClassName=\"s-products-list-wrapper s-products-list-row-cards\"\n empty={\n <div className=\"text-center py-16\">\n <NoContent\n icon=\"sicon-heart\"\n message={t('common.errors.no_wishlist', \"You don't have any wishes\")}\n actionLabel={t('pages.offer.continue_shopping', 'Continue shopping')}\n actionUrl=\"/\"\n />\n </div>\n }\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) => {\n const remaining = items.filter((item) => !removedIds.has(Number(item.id)));\n shareState.loadedIdsRef.current = remaining.map((item) => Number(item.id));\n return remaining.map((prod) => (\n <WishlistCard\n key={prod.id}\n product={prod}\n removing={removingIds.has(Number(prod.id))}\n onRemoved={finishRemoving}\n selection={{\n selecting: shareState.selecting,\n selected: selectedIdSet.has(Number(prod.id)),\n onToggle: shareState.toggleSelected,\n }}\n />\n ));\n }}\n </ItemsList>\n <HookSlot name=\"customer:wishlist.items.end\" />\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/routes/account/wishlist/WishlistShare.tsx","../src/routes/account/wishlist/WishlistPage.tsx"],"names":["SallaSocialShare","useEffect","jsxs","jsx","SallaButton","useRef","useState","useCallback","items"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBO,SAAS,gBAAA,GAAmB;AACjC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA,CAAmB,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,EAAE,CAAA;AAE3C,EAAA,MAAM,YAAA,GAAe,MAAA,CAAiB,EAAE,CAAA;AACxC,EAAA,MAAM,cAAA,GAAiB,OAAkC,IAAI,CAAA;AAE7D,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,OAAO,GAAA,EAAe,SAAA,KAAuB;AACrE,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO;AACpC,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,WAAY,MAAM,MAAA,CAAO,MAAM,QAAA,CAAS,KAAA,CAAM,KAAK,SAAS,CAAA;AAClE,MAAA,MAAM,GAAA,GAAM,QAAA,EAAU,IAAA,EAAM,GAAA,IAAO,UAAU,GAAA,IAAO,EAAA;AACpD,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,WAAA,CAAY,GAAG,CAAA;AACf,MAAA,MAAM,UAAU,cAAA,CAAe,OAAA;AAC/B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,GAAA,GAAM,GAAA;AACd,QAAA,MAAM,QAAQ,OAAA,IAAU;AACxB,QAAA,MAAM,QAAQ,IAAA,IAAO;AAAA,MACvB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAW,YAAY,MAAM;AACjC,IAAA,WAAA,CAAY,KAAK,CAAA;AACjB,IAAA,KAAK,KAAA,CAAM,EAAC,EAAG,IAAI,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,IAAI,WAAA,CAAY,MAAA,EAAQ,KAAK,KAAA,CAAM,aAAa,KAAK,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,KAAA,EAAO,WAAW,CAAC,CAAA;AAEvB,EAAA,MAAM,cAAA,GAAiB,YAAY,MAAM;AACvC,IAAA,WAAA,CAAY,KAAK,CAAA;AACjB,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAM;AACxC,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,cAAA,CAAe,EAAE,CAAA;AACjB,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,KAAK,cAAA,CAAe,SAAS,KAAA,IAAQ;AAAA,EACvC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,CAAC,EAAA,KAAe;AACjD,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,cAAA;AAAA,MAAe,CAAC,OAAA,KACd,OAAA,CAAQ,QAAA,CAAS,EAAE,IAAI,OAAA,CAAQ,MAAA,CAAO,CAAC,QAAA,KAAa,aAAa,EAAE,CAAA,GAAI,CAAC,GAAG,SAAS,EAAE;AAAA,KACxF;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiB,OAAO,WAAW,CAAA;AACzC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,cAAA,CAAe,OAAA,GAAU,WAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAC,EAAA,KAAe;AAC3C,IAAA,IAAI,CAAC,cAAA,CAAe,OAAA,CAAQ,QAAA,CAAS,EAAE,CAAA,EAAG;AAE1C,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,MAAM,UAAU,cAAA,CAAe,OAAA;AAC/B,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,GAAA,GAAM,MAAA;AACd,MAAA,KAAK,QAAQ,KAAA,IAAQ;AAAA,IACvB;AACA,IAAA,cAAA,CAAe,CAAC,YAAY,OAAA,CAAQ,MAAA,CAAO,CAAC,QAAA,KAAa,QAAA,KAAa,EAAE,CAAC,CAAA;AAAA,EAC3E,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAY,YAAY,MAAM;AAClC,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,cAAA;AAAA,MAAe,CAAC,OAAA,KACd,OAAA,CAAQ,MAAA,IAAU,QAAQ,MAAA,KAAW,YAAA,CAAa,OAAA,CAAQ,MAAA,GACtD,EAAC,GACD,CAAC,GAAG,aAAa,OAAO;AAAA,KAC9B;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,KAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,OAAA,GAAU,OAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAY,GAAI,KAAA;AAGlC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAsB;AAC3C,MAAA,IAAI,CAAC,QAAQ,OAAA,EAAS,QAAA,CAAS,MAAM,MAAc,CAAA,cAAe,KAAK,CAAA;AAAA,IACzE,CAAA;AACA,IAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAyB;AAC1C,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU,WAAA,CAAY,KAAK,CAAA;AAAA,IAC/C,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,aAAa,CAAA;AACpD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,aAAa,CAAA;AACvD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,IACnD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,WAAW,CAAC,CAAA;AAE1B,EAAA,MAAM,aAAA,GAAgB,MAAM,WAAA,CAAY,MAAA;AACxC,EAAA,MAAM,cAAc,aAAA,GAAgB,CAAA,IAAK,aAAA,KAAkB,KAAA,CAAM,aAAa,OAAA,CAAQ,MAAA;AAEtF,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,OAAA,EAAS,WAAU,oBAAA,EAC3B,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iEAAA,EACZ,QAAA,EAAA,KAAA,CAAM,4BACL,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sDAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,OAAA,EAAA,EAAM,WAAU,sEAAA,EACf,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,UAAA;AAAA,YACL,OAAA,EAAS,WAAA;AAAA,YACT,GAAA,EAAK,CAAC,KAAA,KAAU;AACd,cAAA,IAAI,KAAA,EAAO,KAAA,CAAM,aAAA,GAAgB,aAAA,GAAgB,KAAK,CAAC,WAAA;AAAA,YACzD,CAAA;AAAA,YACA,UAAU,KAAA,CAAM;AAAA;AAAA,SAClB;AAAA,QACC,CAAA,CAAE,6BAA6B,YAAY;AAAA,OAAA,EAC9C,CAAA;AAAA,sBACA,IAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,SAAA;AAAA,UACN,QAAA,EAAU,aAAA,KAAkB,CAAA,IAAK,KAAA,CAAM,OAAA;AAAA,UACvC,SAAS,KAAA,CAAM,aAAA;AAAA,UAEd,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,wBAAwB,OAAO,CAAA;AAAA,YACjC,aAAA,GAAgB,CAAA,GAAI,CAAA,EAAA,EAAK,aAAa,CAAA,CAAA,CAAA,GAAM;AAAA;AAAA;AAAA,OAC/C;AAAA,sBACA,GAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAK,SAAA,EAAU,KAAA,EAAM,OAAA,EAAQ,OAAA,EAAS,KAAA,CAAM,eAAA,EACtD,QAAA,EAAA,CAAA,CAAE,wBAAA,EAA0B,QAAQ,CAAA,EACvC;AAAA,KAAA,EACF,CAAA,mBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAK,SAAA;AAAA,UACL,QAAA,EAAU,CAAC,WAAA,IAAe,KAAA,CAAM,OAAA;AAAA,UAChC,eAAA,EAAc,MAAA;AAAA,UACd,eAAA,EAAe,QAAA;AAAA,UACf,OAAA,EAAS,MAAM,WAAA,CAAY,CAAC,QAAQ,CAAA;AAAA,UAEpC,QAAA,kBAAA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EACd,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iBAAA,EAAkB,aAAA,EAAY,MAAA,EAAO,CAAA;AAAA,YACjD,CAAA,CAAE,wBAAwB,OAAO,CAAA;AAAA,4BAClC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2BAAA,EAA4B,eAAY,MAAA,EAAO;AAAA,WAAA,EAC9D;AAAA;AAAA,OACF;AAAA,MACC,QAAA,oBACC,IAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,SAAA,EAAU,oHAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,MAAK,MAAA,EACP,QAAA,kBAAA,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAK,UAAA;AAAA,gBACL,SAAA,EAAU,kGAAA;AAAA,gBACV,SAAS,KAAA,CAAM,QAAA;AAAA,gBAEd,QAAA,EAAA,CAAA,CAAE,4BAA4B,gBAAgB;AAAA;AAAA,aACjD,EACF,CAAA;AAAA,4BACA,GAAA,CAAC,IAAA,EAAA,EAAG,IAAA,EAAK,MAAA,EACP,QAAA,kBAAA,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAK,UAAA;AAAA,gBACL,SAAA,EAAU,kGAAA;AAAA,gBACV,SAAS,KAAA,CAAM,cAAA;AAAA,gBAEd,QAAA,EAAA,CAAA,CAAE,iCAAiC,sBAAsB;AAAA;AAAA,aAC5D,EACF;AAAA;AAAA;AAAA;AACF,KAAA,EAEJ,CAAA,EAEJ,CAAA;AAAA,oBAIA,GAAA;AAAA,MAACA,oBAAA;AAAA,MAAA;AAAA,QACC,KAAK,KAAA,CAAM,cAAA;AAAA,QACX,GAAA,EAAK,MAAM,QAAA,IAAY,MAAA;AAAA,QACvB,IAAA,EAAK,OAAA;AAAA,QACL,UAAA,EAAY,CAAA,CAAE,iCAAA,EAAmC,gBAAgB,CAAA;AAAA,QACjE,SAAA,EAAU,2BAAA;AAAA,QAEV,8BAAC,MAAA,EAAA,EAAK,IAAA,EAAK,UAAS,SAAA,EAAU,kCAAA,EAAmC,eAAY,MAAA,EAAO;AAAA;AAAA;AACtF,GAAA,EACF,CAAA;AAEJ;ACjOA,IAAM,sBAAA,GAAyB,CAAC,EAAA,KAA2B;AACzD,EAAA,EAAA,EAAI,YAAA,CAAa,mBAAmB,QAAQ,CAAA;AAC5C,EAAA,EAAA,EAAI,YAAA,CAAa,QAAQ,SAAS,CAAA;AACpC,CAAA;AAEA,IAAM,WAAA,GAAc,GAAA;AAEpB,IAAM,cAAA,GAAgC;AAAA,EACpC,OAAA,EAAS,CAAA;AAAA,EACT,SAAA,EAAW,aAAA;AAAA,EACX,UAAA,EAAY,CAAA,QAAA,EAAW,WAAW,CAAA,0BAAA,EAA6B,WAAW,CAAA,cAAA;AAC5E,CAAA;AAEA,SAAS,YAAA,CAAa;AAAA,EACpB,OAAA,EAAS,IAAA;AAAA,EACT,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,WAAA,EAAY;AAC/B,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,QAAA,EAAS;AAG5B,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,MAAM,SAAA,GAAY,MAAA,CAAO,KAAK,EAAE,CAAC,CAAA,EAAG,WAAA,GAAc,EAAE,CAAA;AAC7E,IAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,EACjC,GAAG,CAAC,QAAA,EAAU,SAAA,EAAW,IAAA,CAAK,EAAE,CAAC,CAAA;AAEjC,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IACxB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,KAAA;AAC7C,EAAA,MAAM,eAAe,IAAA,CAAK,aAAA;AAE1B,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,CAAA,iBAAA,EAAoB,IAAA,CAAK,EAAE,CAAA,CAAA;AAAA,MAC/B,SAAA,EAAW,CAAA,qCAAA,EAAwC,SAAA,EAAW,QAAA,GAAW,iBAAiB,EAAE,CAAA,CAAA;AAAA,MAC5F,KAAA,EAAO,WAAW,cAAA,GAAiB,MAAA;AAAA,MACnC,eAAA,EAAiB,CAAC,KAAA,KAAU;AAC1B,QAAA,IAAI,YAAY,KAAA,CAAM,MAAA,KAAW,MAAM,aAAA,IAAiB,KAAA,CAAM,iBAAiB,SAAA,EAAW;AACxF,UAAA,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,QAC7B;AAAA,MACF,CAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,SAAA,EAAW,6BACVC,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,UAAA;AAAA,YACL,SAAA,EAAU,8CAAA;AAAA,YACV,cAAY,IAAA,CAAK,IAAA;AAAA,YACjB,SAAS,SAAA,CAAU,QAAA;AAAA,YACnB,UAAU,MAAM,SAAA,CAAU,SAAS,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA,SACpD;AAAA,wBAEFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,IAAC,GAAA,EAAA,EAAE,IAAA,EAAM,KAAK,GAAA,EAAK,SAAA,EAAU,wBAC3B,QAAA,kBAAAA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,4BAAA;AAAA,cACV,GAAA,EAAK,KAAK,KAAA,EAAO,GAAA;AAAA,cACjB,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,GAAA,IAAO,IAAA,CAAK,IAAA;AAAA,cAC7B,WAAA,EAAY;AAAA;AAAA,WACd,EACF,CAAA;AAAA,0BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+FAAA,EACZ,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,IAAA,CAAK,GAAA,EAAM,QAAA,EAAA,IAAA,CAAK,IAAA,EAAK,CAAA,EAChC,CAAA;AAAA,4BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACZ,QAAA,EAAA,IAAA,CAAK,UAAA,IAAc,YAAA,mBAClBD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6CAAA,EACX,QAAA,EAAA,MAAA,CAAO,YAAY,CAAA,EACtB,CAAA;AAAA,8BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oCAAA,EAAsC,QAAA,EAAA,MAAA,CAAO,YAAY,CAAA,EAAE;AAAA,aAAA,EAC7E,CAAA,mBAEAA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,mBAAA,EAAqB,QAAA,EAAA,MAAA,CAAO,YAAY,CAAA,EAAE,CAAA,EAE5D;AAAA,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,qBAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,sBAAA;AAAA,cACL,eAAe,IAAA,CAAK,MAAA;AAAA,cACpB,WAAW,IAAA,CAAK,EAAA;AAAA,cAChB,aAAa,IAAA,CAAK,IAAA;AAAA,cAClB,cAAA,EAAe,QAAA;AAAA,cACf,IAAA,EAAK,SAAA;AAAA,cACL,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAA,GAAAA;AAAA,YAACC,WAAAA;AAAA,YAAA;AAAA,cACC,cAAA,EAAe,QAAA;AAAA,cACf,KAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAK,OAAA;AAAA,cACL,KAAA,EAAM,QAAA;AAAA,cACN,SAAA,EAAU,aAAA;AAAA,cACV,OAAA,EAAS,YAAA;AAAA,cAET,QAAA,kBAAAD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,cAAA,EAAe;AAAA;AAAA;AAC9B,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAGA,SAAS,iBACP,EAAE,KAAA,EAAO,QAAA,EAAU,UAAA,IACnB,SAAA,EACA;AACA,EAAA,MAAM,cAAc,cAAA,EAAe;AAEnC,EAAA,MAAM,WAAA,GAAcE,MAAAA,CAAO,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA;AACzC,EAAA,MAAM,CAAC,YAAY,aAAa,CAAA,GAAIC,SAA8B,sBAAM,IAAI,KAAK,CAAA;AACjF,EAAA,MAAM,CAAC,aAAa,cAAc,CAAA,GAAIA,SAA8B,sBAAM,IAAI,KAAK,CAAA;AACnF,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAItB,IAAI,CAAA;AACd,EAAA,MAAM,YAAYD,MAAAA,CAAO;AAAA,IACvB,GAAA,EAAK,SAAS,GAAA,CAAI,CAAC,SAAS,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IAC3C,OAAA,EAAS,CAAC,CAAC,UAAA,EAAY;AAAA,GACxB,CAAA;AAGD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIC,SAAS,QAAQ,CAAA;AAC7D,EAAA,IAAI,mBAAmB,QAAA,EAAU;AAC/B,IAAA,iBAAA,CAAkB,QAAQ,CAAA;AAC1B,IAAA,aAAA,iBAAc,IAAI,KAAK,CAAA;AACvB,IAAA,cAAA,iBAAe,IAAI,KAAK,CAAA;AACxB,IAAA,WAAA,CAAY,IAAI,CAAA;AAAA,EAClB;AAEA,EAAAL,UAAU,MAAM;AACd,IAAA,WAAA,CAAY,OAAA,GAAU,MAAM,IAAA,GAAO,CAAA;AACnC,IAAA,SAAA,CAAU,OAAA,GAAU;AAAA,MAClB,GAAA,EAAK,SAAS,GAAA,CAAI,CAAC,SAAS,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,MAC3C,OAAA,EAAS,CAAC,CAAC,UAAA,EAAY;AAAA,KACzB;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,MAAM,IAAA,EAAM,UAAA,EAAY,IAAI,CAAC,CAAA;AAE3C,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AAEnB,IAAA,MAAM,aAAA,GAAgB,CAAC,SAAA,EAAoB,EAAA,KAAgB;AACzD,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA,CAAE,OAAA;AAC3E,MAAA,CAAC,eAAe,aAAA,GAAgB,cAAA;AAAA,QAAgB,CAAC,YAC/C,IAAI,GAAA,CAAI,OAAO,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC;AAAA,OACjC;AACA,MAAA,SAAA,CAAU,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,IACtB,CAAA;AAEA,IAAA,KAAA,CAAM,KAAA,CAAM,EAAA,CAAG,mBAAA,EAAqB,aAAa,CAAA;AACjD,IAAA,OAAO,MAAM;AACX,MAAA,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,mBAAA,EAAqB,aAAa,CAAA;AAAA,IACpD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,SAAA,CAAU,OAAA;AACnC,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,IAAU,CAAC,GAAA,CAAI,KAAA,CAAM,CAAC,EAAA,KAAO,UAAA,CAAW,GAAA,CAAI,EAAE,CAAC,CAAA,EAAG;AAE3D,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,EAAkB,IAAA,KAAwB;AACvD,MAAA,WAAA,CAAY,OAAA,GAAU,MAAM,IAAA,GAAO,CAAA;AACnC,MAAA,SAAA,CAAU,OAAA,GAAU,EAAE,GAAA,EAAK,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA,EAAG,OAAA,EAAS,CAAC,CAAC,IAAA,EAAK;AACjF,MAAA,aAAA,iBAAc,IAAI,KAAK,CAAA;AACvB,MAAA,cAAA,iBAAe,IAAI,KAAK,CAAA;AACxB,MAAA,WAAA,CAAY,CAAC,OAAA,MAAa,EAAE,KAAA,EAAO,IAAA,EAAM,aAAa,OAAA,EAAS,UAAA,IAAc,CAAA,IAAK,CAAA,EAAE,CAAE,CAAA;AAAA,IACxF,CAAA;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,WAAA,CACG,WAAW,EAAE,GAAG,SAAS,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,GAAG,SAAA,EAAW,CAAA,EAAG,CAAA,CAC3E,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,MAAA,IAAI,CAAC,SAAA,EAAW,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,OAAO,IAAI,CAAA;AAAA,IACjD,CAAC,CAAA,CAEA,KAAA,CAAM,MAAM,MAAS,CAAA;AACxB,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,GAAG,CAAC,UAAA,EAAY,MAAM,IAAA,EAAM,QAAA,EAAU,WAAW,CAAC,CAAA;AAElD,EAAA,MAAM,SAAS,YAAY;AACzB,IAAA,MAAM,aAAa,WAAA,CAAY,OAAA;AAC/B,IAAA,MAAM,SAAS,MAAM,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,YAAY,CAAA;AAEvD,IAAA,WAAA,CAAY,UAAU,UAAA,GAAa,CAAA;AACnC,IAAA,SAAA,CAAU,OAAA,GAAU;AAAA,MAClB,KAAK,CAAC,GAAG,SAAA,CAAU,OAAA,CAAQ,KAAK,GAAG,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AAAA,MAC9E,OAAA,EAAS,CAAC,CAAC,MAAA,CAAO;AAAA,KACpB;AAEA,IAAA,OAAO;AAAA,MACL,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,MAAM,MAAA,CAAO;AAAA,KACf;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiBM,WAAAA,CAAY,CAAC,EAAA,KAAe;AACjD,IAAA,aAAA,CAAc,CAAC,OAAA,KAAa,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,GAAI,OAAA,GAAU,IAAI,GAAA,CAAI,OAAO,CAAA,CAAE,GAAA,CAAI,EAAE,CAAE,CAAA;AAAA,EACnF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,QAAA,GAAW,QAAA,CAAS,KAAA,GAAQ,QAAA;AAAA,IACnC,IAAA,EAAM,QAAA,GAAW,QAAA,CAAS,IAAA,GAAO,UAAA,EAAY,IAAA;AAAA,IAC7C,UAAA,EAAY,UAAU,UAAA,IAAc,CAAA;AAAA,IACpC,UAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,aAAa,KAAA,EAA0B;AACrD,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAU,GAAI,WAAA,EAAY;AAC5C,EAAA,MAAM,aAAa,gBAAA,EAAiB;AACpC,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,MAAM,IAAI,GAAA,CAAI,UAAA,CAAW,WAAW,CAAA,EAAG,CAAC,UAAA,CAAW,WAAW,CAAC,CAAA;AAC7F,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,UAAA,EAAY,UAAA,EAAY,WAAA,EAAa,cAAA,EAAgB,MAAA,EAAO,GAC/E,gBAAA,CAAiB,KAAA,EAAO,UAAA,CAAW,QAAQ,CAAA;AAC7C,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,CAAC,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AAE1E,EAAA,uBACEL,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAY,IAAG,UAAA,EAC5B,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,+BAAA,EAAgC,CAAA;AAAA,oBAC/CA,IAAC,gBAAA,EAAA,EAAiB,KAAA,EAAO,YAAY,WAAA,EAAa,YAAA,IAAgB,CAAC,CAAC,IAAA,EAAM,CAAA;AAAA,oBAC1EA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QAEC,KAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA,EAAM,OAAO,UAAA,GAAa,QAAA;AAAA,QAC1B,SAAS,QAAA,GAAW,SAAA;AAAA,QACpB,SAAA,EAAU,iBAAA;AAAA,QACV,cAAA,EAAe,mDAAA;AAAA,QACf,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,aAAA;AAAA,YACL,OAAA,EAAS,CAAA,CAAE,2BAAA,EAA6B,2BAA2B,CAAA;AAAA,YACnE,WAAA,EAAa,CAAA,CAAE,+BAAA,EAAiC,mBAAmB,CAAA;AAAA,YACnE,SAAA,EAAU;AAAA;AAAA,SACZ,EACF,CAAA;AAAA,QAEF,GAAG,CAAC,GAAA,EAAK,aAAa,CAAA,CAAE,GAAA,EAAK,YAAY,GAAG,CAAA;AAAA,QAE3C,WAACK,MAAAA,KAAU;AACV,UAAA,MAAM,SAAA,GAAYA,MAAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AACzE,UAAA,UAAA,CAAW,YAAA,CAAa,UAAU,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,KAAS,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AACzE,UAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,qBACpBL,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cAEC,OAAA,EAAS,IAAA;AAAA,cACT,UAAU,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,cACzC,SAAA,EAAW,cAAA;AAAA,cACX,SAAA,EAAW;AAAA,gBACT,WAAW,UAAA,CAAW,SAAA;AAAA,gBACtB,UAAU,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,gBAC3C,UAAU,UAAA,CAAW;AAAA;AACvB,aAAA;AAAA,YARK,IAAA,CAAK;AAAA,WAUb,CAAA;AAAA,QACH;AAAA,OAAA;AAAA,MAnCK;AAAA,KAoCP;AAAA,oBACAA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,6BAAA,EAA8B;AAAA,GAAA,EAC/C,CAAA;AAEJ","file":"WishlistPage-7UHPPRYC.js","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\n// The eager (non-deferred) export: the share dialog is opened imperatively through a ref, and the\n// deferred wrapper doesn't attach it until it has hydrated — a click before that would do nothing.\nimport { SallaSocialShareCore as SallaSocialShare } from '@salla.sa/twilight-components-react/social-share';\nimport { useTranslation } from '../../../providers/I18nProvider';\n\ntype ShareResponse = { data?: { url?: string }; url?: string } | undefined;\ntype SocialShareElement = HTMLElement & {\n url?: string;\n refresh?: () => Promise<void>;\n open?: () => Promise<void>;\n close?: () => Promise<void>;\n};\n\n/**\n * Share state for the wishlist page: the \"Share\" dropdown (share the whole list / share\n * specific items), the selection used by \"specific items\", and the share request itself.\n * Mirrors what the SDK's `<salla-wishlist-actions>` does, but drives the page's own React\n * list — that component needs a sibling `<salla-products-list>`, which this page doesn't render.\n */\nexport function useWishlistShare() {\n const [menuOpen, setMenuOpen] = useState(false);\n const [selecting, setSelecting] = useState(false);\n const [selectedIds, setSelectedIds] = useState<number[]>([]);\n const [sharing, setSharing] = useState(false);\n const [shareUrl, setShareUrl] = useState('');\n /** Ids of every product currently rendered (later cursor pages included), for \"select all\". */\n const loadedIdsRef = useRef<number[]>([]);\n const socialShareRef = useRef<SocialShareElement | null>(null);\n\n const share = useCallback(async (ids: number[], selectAll: boolean) => {\n if (!window.salla?.wishlist?.share) return;\n setSharing(true);\n try {\n const response = (await window.salla.wishlist.share(ids, selectAll)) as ShareResponse;\n const url = response?.data?.url || response?.url || '';\n if (!url) return;\n setShareUrl(url);\n const element = socialShareRef.current;\n if (element) {\n element.url = url;\n await element.refresh?.();\n await element.open?.();\n }\n } catch {\n // The SDK reports a failed share itself (notification); nothing to recover here.\n } finally {\n setSharing(false);\n }\n }, []);\n\n const shareAll = useCallback(() => {\n setMenuOpen(false);\n void share([], true);\n }, [share]);\n\n const shareSelected = useCallback(() => {\n if (selectedIds.length) void share(selectedIds, false);\n }, [share, selectedIds]);\n\n const startSelecting = useCallback(() => {\n setMenuOpen(false);\n setSelecting(true);\n }, []);\n\n const cancelSelecting = useCallback(() => {\n setSelecting(false);\n setSelectedIds([]);\n setShareUrl('');\n void socialShareRef.current?.close?.();\n }, []);\n\n const toggleSelected = useCallback((id: number) => {\n setShareUrl('');\n setSelectedIds((current) =>\n current.includes(id) ? current.filter((existing) => existing !== id) : [...current, id]\n );\n }, []);\n\n const selectedIdsRef = useRef(selectedIds);\n useEffect(() => {\n selectedIdsRef.current = selectedIds;\n }, [selectedIds]);\n\n const deselect = useCallback((id: number) => {\n if (!selectedIdsRef.current.includes(id)) return;\n // A link built for the old selection would still offer the removed product.\n setShareUrl('');\n const element = socialShareRef.current;\n if (element) {\n element.url = undefined;\n void element.close?.();\n }\n setSelectedIds((current) => current.filter((existing) => existing !== id));\n }, []);\n\n const toggleAll = useCallback(() => {\n setShareUrl('');\n setSelectedIds((current) =>\n current.length && current.length === loadedIdsRef.current.length\n ? []\n : [...loadedIdsRef.current]\n );\n }, []);\n\n return {\n menuOpen,\n setMenuOpen,\n selecting,\n selectedIds,\n sharing,\n shareUrl,\n loadedIdsRef,\n socialShareRef,\n shareAll,\n shareSelected,\n startSelecting,\n cancelSelecting,\n toggleSelected,\n toggleAll,\n deselect,\n };\n}\n\nexport type WishlistShareState = ReturnType<typeof useWishlistShare>;\n\n/** The bar above the wishlist: the \"Share\" dropdown, or — while picking products — the selection controls. */\nexport function WishlistShareBar({\n state,\n hasProducts,\n}: {\n state: WishlistShareState;\n hasProducts: boolean;\n}) {\n const { t } = useTranslation();\n const rootRef = useRef<HTMLDivElement>(null);\n const { menuOpen, setMenuOpen } = state;\n\n // Close the dropdown on an outside click or Escape.\n useEffect(() => {\n if (!menuOpen) return;\n const onPointerDown = (event: MouseEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setMenuOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setMenuOpen(false);\n };\n document.addEventListener('mousedown', onPointerDown);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('mousedown', onPointerDown);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [menuOpen, setMenuOpen]);\n\n const selectedCount = state.selectedIds.length;\n const allSelected = selectedCount > 0 && selectedCount === state.loadedIdsRef.current.length;\n\n return (\n <div ref={rootRef} className=\"s-wishlist-actions\">\n <div className=\"s-wishlist-actions-bar flex items-center justify-end gap-3 mb-3\">\n {state.selecting ? (\n <div className=\"s-wishlist-actions-selection flex items-center gap-3\">\n <label className=\"s-wishlist-actions-select-all inline-flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={allSelected}\n ref={(input) => {\n if (input) input.indeterminate = selectedCount > 0 && !allSelected;\n }}\n onChange={state.toggleAll}\n />\n {t('pages.wishlist.select_all', 'Select all')}\n </label>\n <SallaButton\n color=\"primary\"\n disabled={selectedCount === 0 || state.sharing}\n onClick={state.shareSelected}\n >\n {t('pages.wishlist.share', 'Share')}\n {selectedCount > 0 ? ` (${selectedCount})` : ''}\n </SallaButton>\n <SallaButton fill=\"outline\" color=\"light\" onClick={state.cancelSelecting}>\n {t('common.elements.cancel', 'Cancel')}\n </SallaButton>\n </div>\n ) : (\n <div className=\"s-wishlist-actions-dropdown relative\">\n <SallaButton\n color=\"primary\"\n fill=\"outline\"\n disabled={!hasProducts || state.sharing}\n aria-haspopup=\"true\"\n aria-expanded={menuOpen}\n onClick={() => setMenuOpen(!menuOpen)}\n >\n <span className=\"flex items-center justify-center gap-2\">\n <i className=\"sicon-share-alt\" aria-hidden=\"true\" />\n {t('pages.wishlist.share', 'Share')}\n <i className=\"sicon-keyboard_arrow_down\" aria-hidden=\"true\" />\n </span>\n </SallaButton>\n {menuOpen && (\n <ul\n role=\"menu\"\n className=\"s-wishlist-actions-menu absolute z-10 mt-2 min-w-48 rounded-md bg-white py-2 shadow-default rtl:right-0 ltr:left-0\"\n >\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"s-wishlist-actions-item block w-full px-4 py-2 text-start text-sm text-gray-700 hover:bg-gray-50\"\n onClick={state.shareAll}\n >\n {t('pages.wishlist.share_all', 'Share the list')}\n </button>\n </li>\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"s-wishlist-actions-item block w-full px-4 py-2 text-start text-sm text-gray-700 hover:bg-gray-50\"\n onClick={state.startSelecting}\n >\n {t('pages.wishlist.share_specific', 'Share specific items')}\n </button>\n </li>\n </ul>\n )}\n </div>\n )}\n </div>\n {/* Same setup as the SDK's <salla-wishlist-actions>: the centered modal variant, opened by the\n dropdown rather than by the component's own round share button, so the default\n `widget` slot (that button) is replaced by an empty anchor. */}\n <SallaSocialShare\n ref={state.socialShareRef as never}\n url={state.shareUrl || undefined}\n mode=\"modal\"\n modalTitle={t('pages.wishlist.share_list_title', 'Share wishlist')}\n className=\"s-wishlist-actions-social\"\n >\n <span slot=\"widget\" className=\"s-wishlist-actions-social-anchor\" aria-hidden=\"true\" />\n </SallaSocialShare>\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type CSSProperties } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { ItemsList } from '@salla.sa/twilight-components-react';\nimport { SallaAddProductButton } from '@salla.sa/twilight-components-react/add-product-button';\nimport { SallaButton } from '@salla.sa/twilight-components-react/button';\nimport { wishlist } from '../../../api/wishlist';\nimport type { Product } from '../../../types';\nimport { HookSlot, useWishlist, useMoney } from '../../../hooks';\nimport { useTranslation } from '../../../providers/I18nProvider';\nimport type { WishlistPageProps } from './types';\nimport { WishlistShareBar, useWishlistShare } from './WishlistShare';\nimport { NoContent, Image } from '../../../components/common';\nimport { useLocation } from '../../../providers/NavigationProvider';\n\ninterface WishlistCardSelection {\n /** \"Share specific items\" mode: the card shows a checkbox and toggles on click. */\n selecting: boolean;\n selected: boolean;\n onToggle: (id: number) => void;\n}\n\n// The loaded component copies host attributes (not properties) onto its inner salla-button.\nconst setAddButtonAttributes = (el: HTMLElement | null) => {\n el?.setAttribute('loader-position', 'center');\n el?.setAttribute('fill', 'outline');\n};\n\nconst REMOVING_MS = 300;\n\nconst REMOVING_STYLE: CSSProperties = {\n opacity: 0,\n transform: 'scale(0.95)',\n transition: `opacity ${REMOVING_MS}ms ease-in-out, transform ${REMOVING_MS}ms ease-in-out`,\n};\n\nfunction WishlistCard({\n product: prod,\n selection,\n removing,\n onRemoved,\n}: {\n product: Product;\n selection?: WishlistCardSelection;\n /** Fades the card out, then calls `onRemoved` once the fade ends. */\n removing?: boolean;\n onRemoved?: (id: number) => void;\n}) {\n const { remove } = useWishlist();\n const { format } = useMoney();\n\n // Drops the card even when `transitionend` never fires (hidden tab, overridden styles).\n useEffect(() => {\n if (!removing) return;\n const timer = setTimeout(() => onRemoved?.(Number(prod.id)), REMOVING_MS + 50);\n return () => clearTimeout(timer);\n }, [removing, onRemoved, prod.id]);\n\n const handleRemove = () => {\n if (prod.id) {\n remove(Number(prod.id));\n }\n };\n\n const displayPrice = prod.sale_price ?? prod.price;\n const regularPrice = prod.regular_price;\n\n return (\n <div\n id={`wishlist-product-${prod.id}`}\n className={`product-entry product-entry--wishlist${selection?.selected ? ' is-selected' : ''}`}\n style={removing ? REMOVING_STYLE : undefined}\n onTransitionEnd={(event) => {\n if (removing && event.target === event.currentTarget && event.propertyName === 'opacity') {\n onRemoved?.(Number(prod.id));\n }\n }}\n >\n {selection?.selecting && (\n <input\n type=\"checkbox\"\n className=\"s-wishlist-select shrink-0 rtl:ml-4 ltr:mr-4\"\n aria-label={prod.name}\n checked={selection.selected}\n onChange={() => selection.onToggle(Number(prod.id))}\n />\n )}\n <div className=\"flex items-center mb-4 sm:mb-0\">\n <a href={prod.url} className=\"product-entry__image\">\n <Image\n className=\"object-cover w-full h-full\"\n src={prod.image?.url}\n alt={prod.image?.alt ?? prod.name}\n aspectRatio=\"1/1\"\n />\n </a>\n <div className=\"flex-1 rtl:pr-5 ltr:pl-5\">\n <h3 className=\"text-sm text-gray-800 leading-6 mb-1.5 rtl:pl-5 ltr:pr-5 rtl:md:pl-8 ltr:md:pr-8 line-clamp-1\">\n <a href={prod.url}>{prod.name}</a>\n </h3>\n <div className=\"w-full center-between\">\n {prod.is_on_sale && regularPrice ? (\n <div className=\"space-x-1 rtl:space-x-reverse\">\n <h4 className=\"inline-block text-sm font-bold text-red-400\">\n {format(displayPrice)}\n </h4>\n <span className=\"text-sm text-gray-500 line-through\">{format(regularPrice)}</span>\n </div>\n ) : (\n <h4 className=\"text-sm font-bold\">{format(displayPrice)}</h4>\n )}\n </div>\n </div>\n </div>\n <div className=\"flex items-center space-x-4 rtl:space-x-reverse\">\n <SallaAddProductButton\n ref={setAddButtonAttributes}\n productStatus={prod.status}\n productId={prod.id}\n productType={prod.type}\n loaderPosition=\"center\"\n fill=\"outline\"\n className=\"flex-grow w-full sm:grow-0 md:w-40\"\n />\n <SallaButton\n loaderPosition=\"center\"\n shape=\"icon\"\n size=\"small\"\n color=\"danger\"\n className=\"btn--delete\"\n onClick={handleRemove}\n >\n <i className=\"sicon-cancel\" />\n </SallaButton>\n </div>\n </div>\n );\n}\n\n/** The loaded wishlist pages, reloaded from the server once every loaded card is removed (like Twig). */\nfunction useWishlistItems(\n { query, products, pagination }: WishlistPageProps,\n onRemoved: (id: number) => void\n) {\n const queryClient = useQueryClient();\n // Track the next page to load (starts at page 2 since page 1 is SSR)\n const nextPageRef = useRef(query.page + 1);\n const [removedIds, setRemovedIds] = useState<ReadonlySet<number>>(() => new Set());\n const [removingIds, setRemovingIds] = useState<ReadonlySet<number>>(() => new Set());\n const [reloaded, setReloaded] = useState<{\n items: Product[];\n next: string | null;\n generation: number;\n } | null>(null);\n const loadedRef = useRef({\n ids: products.map((prod) => Number(prod.id)),\n hasMore: !!pagination?.next,\n });\n\n // A `?page=` navigation keeps this instance, so drop what the previous page removed or reloaded.\n const [loadedProducts, setLoadedProducts] = useState(products);\n if (loadedProducts !== products) {\n setLoadedProducts(products);\n setRemovedIds(new Set());\n setRemovingIds(new Set());\n setReloaded(null);\n }\n\n useEffect(() => {\n nextPageRef.current = query.page + 1;\n loadedRef.current = {\n ids: products.map((prod) => Number(prod.id)),\n hasMore: !!pagination?.next,\n };\n }, [products, query.page, pagination?.next]);\n\n useEffect(() => {\n const salla = window.salla;\n if (!salla?.event) return;\n\n const handleRemoved = (_response: unknown, id: unknown) => {\n const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n (reduceMotion ? setRemovedIds : setRemovingIds)((current) =>\n new Set(current).add(Number(id))\n );\n onRemoved(Number(id));\n };\n\n salla.event.on('wishlist::removed', handleRemoved);\n return () => {\n salla.event.off('wishlist::removed', handleRemoved);\n };\n }, [onRemoved]);\n\n useEffect(() => {\n const { ids, hasMore } = loadedRef.current;\n if (!ids.length || !ids.every((id) => removedIds.has(id))) return;\n\n const reset = (items: Product[], next: string | null) => {\n nextPageRef.current = query.page + 1;\n loadedRef.current = { ids: items.map((prod) => Number(prod.id)), hasMore: !!next };\n setRemovedIds(new Set());\n setRemovingIds(new Set());\n setReloaded((current) => ({ items, next, generation: (current?.generation ?? 0) + 1 }));\n };\n\n if (!hasMore) {\n reset([], null);\n return;\n }\n\n let cancelled = false;\n queryClient\n .fetchQuery({ ...wishlist.queries.list({ page: query.page }), staleTime: 0 })\n .then((result) => {\n if (!cancelled) reset(result.items, result.next);\n })\n // A failed reload keeps the list as it is; later pages still load on scroll.\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [removedIds, query.page, products, queryClient]);\n\n const loader = async () => {\n const pageToLoad = nextPageRef.current;\n const result = await wishlist.list({ page: pageToLoad });\n\n nextPageRef.current = pageToLoad + 1;\n loadedRef.current = {\n ids: [...loadedRef.current.ids, ...result.items.map((prod) => Number(prod.id))],\n hasMore: !!result.next,\n };\n\n return {\n items: result.items,\n next: result.next,\n };\n };\n\n const finishRemoving = useCallback((id: number) => {\n setRemovedIds((current) => (current.has(id) ? current : new Set(current).add(id)));\n }, []);\n\n return {\n items: reloaded ? reloaded.items : products,\n next: reloaded ? reloaded.next : pagination?.next,\n generation: reloaded?.generation ?? 0,\n removedIds,\n removingIds,\n finishRemoving,\n loader,\n };\n}\n\nexport function WishlistPage(props: WishlistPageProps) {\n const { t } = useTranslation();\n const { pathname, searchStr } = useLocation();\n const shareState = useWishlistShare();\n const selectedIdSet = useMemo(() => new Set(shareState.selectedIds), [shareState.selectedIds]);\n const { items, next, generation, removedIds, removingIds, finishRemoving, loader } =\n useWishlistItems(props, shareState.deselect);\n const hasRemaining = items.some((prod) => !removedIds.has(Number(prod.id)));\n\n return (\n <div className=\"space-y-5\" id=\"wishlist\">\n <HookSlot name=\"customer:wishlist.items.start\" />\n <WishlistShareBar state={shareState} hasProducts={hasRemaining || !!next} />\n <ItemsList<Product>\n key={generation}\n items={items}\n loader={loader}\n mode={next ? 'infinite' : 'static'}\n pageUrl={pathname + searchStr}\n className=\"s-products-list\"\n itemsClassName=\"s-products-list-wrapper s-products-list-row-cards\"\n empty={\n <div className=\"text-center py-16\">\n <NoContent\n icon=\"sicon-heart\"\n message={t('common.errors.no_wishlist', \"You don't have any wishes\")}\n actionLabel={t('pages.offer.continue_shopping', 'Continue shopping')}\n actionUrl=\"/\"\n />\n </div>\n }\n t={(key, fallback) => t(key, fallback || key)}\n >\n {(items) => {\n const remaining = items.filter((item) => !removedIds.has(Number(item.id)));\n shareState.loadedIdsRef.current = remaining.map((item) => Number(item.id));\n return remaining.map((prod) => (\n <WishlistCard\n key={prod.id}\n product={prod}\n removing={removingIds.has(Number(prod.id))}\n onRemoved={finishRemoving}\n selection={{\n selecting: shareState.selecting,\n selected: selectedIdSet.has(Number(prod.id)),\n onToggle: shareState.toggleSelected,\n }}\n />\n ));\n }}\n </ItemsList>\n <HookSlot name=\"customer:wishlist.items.end\" />\n </div>\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
- export { brand } from '../chunk-KWHCKGLL.js';
2
- import '../chunk-I62RENKM.js';
1
+ export { brand } from '../chunk-TOPFB6FL.js';
2
+ import '../chunk-SSPAMQRV.js';
3
3
  import '../chunk-ZGHRSRDO.js';
4
4
  import '../chunk-P3OPJL6I.js';
5
5
  import '../chunk-WY4IYO3G.js';
@@ -8,10 +8,15 @@ export interface CartApiResponse {
8
8
  export declare const cart: {
9
9
  get: (cartId: number) => Promise<Cart | null>;
10
10
  getOrThrow: (cartId: number) => Promise<Cart | null>;
11
+ /** The visitor's cart id, which only the Salla SDK knows; `null` outside the browser. */
12
+ getCurrentId: () => Promise<number | null>;
11
13
  queries: {
12
14
  detail: (cartId: number) => import("@tanstack/react-query").OmitKeyof<import("@tanstack/react-query").UseQueryOptions<Cart | null, Error, Cart | null, (string | number)[]>, "queryFn"> & {
13
15
  queryFn?: import("@tanstack/react-query").QueryFunction<Cart | null, (string | number)[], never> | undefined;
14
16
  } & import("@tanstack/react-query").QueryKeyWithDataTag<(string | number)[], Cart | null, Error>;
17
+ currentId: () => import("@tanstack/react-query").OmitKeyof<import("@tanstack/react-query").UseQueryOptions<number | null, Error, number | null, string[]>, "queryFn"> & {
18
+ queryFn?: import("@tanstack/react-query").QueryFunction<number | null, string[], never> | undefined;
19
+ } & import("@tanstack/react-query").QueryKeyWithDataTag<string[], number | null, Error>;
15
20
  };
16
21
  };
17
22
  //# sourceMappingURL=cart.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cart.d.ts","sourceRoot":"","sources":["../../src/api/cart.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGrC,MAAM,WAAW,eAAe;IAC9B,oGAAoG;IACpG,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1B,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;CACrB;AAWD,eAAO,MAAM,IAAI;kBACK,MAAM,KAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;yBAK5B,MAAM,KAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;;yBAG/B,MAAM;;;;CAM1B,CAAC"}
1
+ {"version":3,"file":"cart.d.ts","sourceRoot":"","sources":["../../src/api/cart.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAIrC,MAAM,WAAW,eAAe;IAC9B,oGAAoG;IACpG,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1B,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;CACrB;AAWD,eAAO,MAAM,IAAI;kBACK,MAAM,KAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;yBAK5B,MAAM,KAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAElD,yFAAyF;wBACjE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;;yBAS3B,MAAM;;;;;;;CAiB1B,CAAC"}
package/dist/api/cart.js CHANGED
@@ -1,5 +1,5 @@
1
- export { cart } from '../chunk-IIYK56TI.js';
2
- import '../chunk-I62RENKM.js';
1
+ export { cart } from '../chunk-3L5VG2X4.js';
2
+ import '../chunk-SSPAMQRV.js';
3
3
  import '../chunk-ZGHRSRDO.js';
4
4
  import '../chunk-P3OPJL6I.js';
5
5
  import '../chunk-WY4IYO3G.js';
@@ -1,5 +1,5 @@
1
- export { category } from '../chunk-PE3LLBNR.js';
2
- import '../chunk-I62RENKM.js';
1
+ export { category } from '../chunk-GYXT7T2Z.js';
2
+ import '../chunk-SSPAMQRV.js';
3
3
  import '../chunk-ZGHRSRDO.js';
4
4
  import '../chunk-P3OPJL6I.js';
5
5
  import '../chunk-WY4IYO3G.js';
@@ -1,5 +1,5 @@
1
- export { loyalty } from '../chunk-NPEI4SAZ.js';
2
- import '../chunk-I62RENKM.js';
1
+ export { loyalty } from '../chunk-VKB5AQUS.js';
2
+ import '../chunk-SSPAMQRV.js';
3
3
  import '../chunk-ZGHRSRDO.js';
4
4
  import '../chunk-P3OPJL6I.js';
5
5
  import '../chunk-WY4IYO3G.js';
package/dist/api/order.js CHANGED
@@ -1,5 +1,5 @@
1
- export { order } from '../chunk-N6TNEM5G.js';
2
- import '../chunk-I62RENKM.js';
1
+ export { order } from '../chunk-6IRWFBGU.js';
2
+ import '../chunk-SSPAMQRV.js';
3
3
  import '../chunk-ZGHRSRDO.js';
4
4
  import '../chunk-P3OPJL6I.js';
5
5
  import '../chunk-WY4IYO3G.js';
package/dist/api/page.js CHANGED
@@ -1,5 +1,5 @@
1
- export { page } from '../chunk-S3CC2YGF.js';
2
- import '../chunk-I62RENKM.js';
1
+ export { page } from '../chunk-EFMAB636.js';
2
+ import '../chunk-SSPAMQRV.js';
3
3
  import '../chunk-ZGHRSRDO.js';
4
4
  import '../chunk-P3OPJL6I.js';
5
5
  import '../chunk-WY4IYO3G.js';
@@ -1,5 +1,5 @@
1
- export { getProductPreview, isProductPreviewQuery, product, productDetailQueryKey, productPreviewQueryKey, rememberProductPreview, shouldDehydrateQuery } from '../chunk-W66OHTSM.js';
2
- import '../chunk-I62RENKM.js';
1
+ export { getProductPreview, isProductPreviewQuery, product, productDetailQueryKey, productPreviewQueryKey, rememberProductPreview, shouldDehydrateQuery } from '../chunk-HDO37URJ.js';
2
+ import '../chunk-SSPAMQRV.js';
3
3
  import '../chunk-ZGHRSRDO.js';
4
4
  import '../chunk-P3OPJL6I.js';
5
5
  import '../chunk-WY4IYO3G.js';
@@ -1,6 +1,6 @@
1
- export { wishlist } from '../chunk-VLBQPVHM.js';
2
- import '../chunk-W66OHTSM.js';
3
- import '../chunk-I62RENKM.js';
1
+ export { wishlist } from '../chunk-RH5VLLTG.js';
2
+ import '../chunk-HDO37URJ.js';
3
+ import '../chunk-SSPAMQRV.js';
4
4
  import '../chunk-ZGHRSRDO.js';
5
5
  import '../chunk-P3OPJL6I.js';
6
6
  import '../chunk-WY4IYO3G.js';
@@ -0,0 +1,47 @@
1
+ import { orThrow } from './chunk-SSPAMQRV.js';
2
+ import { api } from './chunk-P3OPJL6I.js';
3
+ import { getSallaSDK } from './chunk-WY4IYO3G.js';
4
+ import { queryOptions } from '@tanstack/react-query';
5
+
6
+ function normalizeCartResponse(data) {
7
+ if (!data.cart) return null;
8
+ return {
9
+ ...data.cart,
10
+ loyalty: data.loyalty ?? null,
11
+ gift: data.gift ?? null
12
+ };
13
+ }
14
+ var cart = {
15
+ get: async (cartId) => {
16
+ const { data } = await api.get(`cart/${cartId}`).json();
17
+ return normalizeCartResponse(data);
18
+ },
19
+ getOrThrow: (cartId) => orThrow(cart.get(cartId)),
20
+ /** The visitor's cart id, which only the Salla SDK knows; `null` outside the browser. */
21
+ getCurrentId: async () => {
22
+ const salla = getSallaSDK();
23
+ if (!salla) return null;
24
+ await salla.onReady().catch(() => void 0);
25
+ return salla.cart.api.getCurrentCartId();
26
+ },
27
+ queries: {
28
+ detail: (cartId) => queryOptions({
29
+ queryKey: ["cart", cartId],
30
+ queryFn: () => cart.get(cartId),
31
+ // The SDK changes the cart from any page, so a cached copy is never safe to show.
32
+ staleTime: 0,
33
+ gcTime: 0
34
+ }),
35
+ currentId: () => queryOptions({
36
+ queryKey: ["cart", "current-id"],
37
+ queryFn: () => cart.getCurrentId(),
38
+ // Completing an order starts a new cart, so an earlier id is never reused.
39
+ staleTime: 0,
40
+ gcTime: 0
41
+ })
42
+ }
43
+ };
44
+
45
+ export { cart };
46
+ //# sourceMappingURL=chunk-3L5VG2X4.js.map
47
+ //# sourceMappingURL=chunk-3L5VG2X4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/cart.ts"],"names":[],"mappings":";;;;;AAaA,SAAS,sBAAsB,IAAA,EAAoC;AACjE,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAM,OAAO,IAAA;AACvB,EAAA,OAAO;AAAA,IACL,GAAG,IAAA,CAAK,IAAA;AAAA,IACR,OAAA,EAAS,KAAK,OAAA,IAAW,IAAA;AAAA,IACzB,IAAA,EAAM,KAAK,IAAA,IAAQ;AAAA,GACrB;AACF;AAEO,IAAM,IAAA,GAAO;AAAA,EAClB,GAAA,EAAK,OAAO,MAAA,KAAyC;AACnD,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,GAAA,CAAI,IAAI,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAE,CAAA,CAAE,IAAA,EAAgC;AACjF,IAAA,OAAO,sBAAsB,IAAI,CAAA;AAAA,EACnC,CAAA;AAAA,EAEA,YAAY,CAAC,MAAA,KAAyC,QAAQ,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA;AAAA,EAG9E,cAAc,YAAoC;AAChD,IAAA,MAAM,QAAQ,WAAA,EAAY;AAC1B,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,IAAA,MAAM,KAAA,CAAM,OAAA,EAAQ,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAC3C,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAiB;AAAA,EACzC,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,KACP,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAM,CAAA;AAAA,MACzB,OAAA,EAAS,MAAM,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAAA;AAAA,MAE9B,SAAA,EAAW,CAAA;AAAA,MACX,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,IACH,SAAA,EAAW,MACT,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,MAAA,EAAQ,YAAY,CAAA;AAAA,MAC/B,OAAA,EAAS,MAAM,IAAA,CAAK,YAAA,EAAa;AAAA;AAAA,MAEjC,SAAA,EAAW,CAAA;AAAA,MACX,MAAA,EAAQ;AAAA,KACT;AAAA;AAEP","file":"chunk-3L5VG2X4.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport type { Cart } from '../types';\nimport { orThrow } from '../providers/NavigationProvider';\nimport { getSallaSDK } from '../utils/sdk-helpers';\n\nexport interface CartApiResponse {\n /** Absent once the cart was turned into an order (the body then carries a top-level `redirect`). */\n cart?: Omit<Cart, 'loyalty' | 'gift'>;\n loyalty?: Cart['loyalty'];\n gift?: Cart['gift'];\n}\n\nfunction normalizeCartResponse(data: CartApiResponse): Cart | null {\n if (!data.cart) return null;\n return {\n ...data.cart,\n loyalty: data.loyalty ?? null,\n gift: data.gift ?? null,\n } as Cart;\n}\n\nexport const cart = {\n get: async (cartId: number): Promise<Cart | null> => {\n const { data } = await api.get(`cart/${cartId}`).json<{ data: CartApiResponse }>();\n return normalizeCartResponse(data);\n },\n\n getOrThrow: (cartId: number): Promise<Cart | null> => orThrow(cart.get(cartId)),\n\n /** The visitor's cart id, which only the Salla SDK knows; `null` outside the browser. */\n getCurrentId: async (): Promise<number | null> => {\n const salla = getSallaSDK();\n if (!salla) return null;\n // The app bundle can run before the SDK module, when `salla` is still the head stub.\n await salla.onReady().catch(() => undefined);\n return salla.cart.api.getCurrentCartId();\n },\n\n queries: {\n detail: (cartId: number) =>\n queryOptions({\n queryKey: ['cart', cartId],\n queryFn: () => cart.get(cartId),\n // The SDK changes the cart from any page, so a cached copy is never safe to show.\n staleTime: 0,\n gcTime: 0,\n }),\n currentId: () =>\n queryOptions({\n queryKey: ['cart', 'current-id'],\n queryFn: () => cart.getCurrentId(),\n // Completing an order starts a new cart, so an earlier id is never reused.\n staleTime: 0,\n gcTime: 0,\n }),\n },\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { redirect } from './chunk-I62RENKM.js';
1
+ import { redirect } from './chunk-SSPAMQRV.js';
2
2
  import { clearAuthTokenCookie } from './chunk-SR4OTLTJ.js';
3
3
  import { FALLBACK_LOCALE } from './chunk-T72DAX7R.js';
4
4
  import { useEffect } from 'react';
@@ -11,6 +11,14 @@ async function pendingOrdersRedirectLoader(ctx = { params: {} }) {
11
11
  const locale = ctx.params.locale || FALLBACK_LOCALE;
12
12
  throw redirect(`/${locale}/account/orders?status=pending`);
13
13
  }
14
+ async function ratingRedirectLoader(ctx = { params: {} }) {
15
+ const locale = ctx.params.locale || FALLBACK_LOCALE;
16
+ throw redirect(`/${locale}/account/orders`);
17
+ }
18
+ async function accountRedirectLoader(ctx) {
19
+ const prefix = ctx.params.locale ? `/${ctx.params.locale}` : "";
20
+ throw redirect(`${prefix}/account/${ctx.page}${ctx.search ?? ""}`, { statusCode: 301 });
21
+ }
14
22
  function LogoutRedirect() {
15
23
  useEffect(() => {
16
24
  clearAuthTokenCookie();
@@ -19,6 +27,6 @@ function LogoutRedirect() {
19
27
  return null;
20
28
  }
21
29
 
22
- export { LogoutRedirect, pendingOrdersRedirectLoader, slugBrandRedirectLoader };
23
- //# sourceMappingURL=chunk-Q5UYV2EN.js.map
24
- //# sourceMappingURL=chunk-Q5UYV2EN.js.map
30
+ export { LogoutRedirect, accountRedirectLoader, pendingOrdersRedirectLoader, ratingRedirectLoader, slugBrandRedirectLoader };
31
+ //# sourceMappingURL=chunk-4YWBXQV5.js.map
32
+ //# sourceMappingURL=chunk-4YWBXQV5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/routes/seo-redirects.ts"],"names":[],"mappings":";;;;;AAcA,eAAsB,wBAAwB,GAAA,EAAkD;AAC9F,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,MAAA,IAAU,eAAA;AACpC,EAAA,MAAM,SAAS,CAAA,CAAA,EAAI,MAAM,WAAW,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,CAAE,CAAA;AACrD;AAOA,eAAsB,4BACpB,GAAA,GAA+C,EAAE,MAAA,EAAQ,IAAG,EAC5C;AAChB,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,MAAA,IAAU,eAAA;AACpC,EAAA,MAAM,QAAA,CAAS,CAAA,CAAA,EAAI,MAAM,CAAA,8BAAA,CAAgC,CAAA;AAC3D;AAGA,eAAsB,qBACpB,GAAA,GAA+C,EAAE,MAAA,EAAQ,IAAG,EAC5C;AAChB,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,MAAA,IAAU,eAAA;AACpC,EAAA,MAAM,QAAA,CAAS,CAAA,CAAA,EAAI,MAAM,CAAA,eAAA,CAAiB,CAAA;AAC5C;AAGA,eAAsB,sBAAsB,GAAA,EAKzB;AAEjB,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,MAAA,GAAS,IAAI,GAAA,CAAI,MAAA,CAAO,MAAM,CAAA,CAAA,GAAK,EAAA;AAC7D,EAAA,MAAM,QAAA,CAAS,CAAA,EAAG,MAAM,CAAA,SAAA,EAAY,IAAI,IAAI,CAAA,EAAG,GAAA,CAAI,MAAA,IAAU,EAAE,CAAA,CAAA,EAAI,EAAE,UAAA,EAAY,KAAK,CAAA;AACxF;AAUO,SAAS,cAAA,GAAuB;AACrC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,oBAAA,EAAqB;AAErB,IAAA,MAAA,CAAO,QAAA,CAAS,QAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,OAAA,CAAQ,8BAAA,EAAgC,EAAE,CAAC,CAAA;AAAA,EAC1F,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,OAAO,IAAA;AACT","file":"chunk-4YWBXQV5.js","sourcesContent":["import { useEffect } from 'react';\nimport { redirect } from '../providers/NavigationProvider';\nimport { FALLBACK_LOCALE } from '../providers/locale-constants';\nimport { clearAuthTokenCookie } from '../utils/cookies';\n\nexport interface SlugBrandParams {\n /** SEO slug segment (ignored — only here to match the route pattern). */\n slug: string;\n /** Brand numeric ID to redirect to. */\n id: string;\n /** Active locale from the `/$locale` parent layout (e.g. `'ar'`, `'en'`). */\n locale?: string;\n}\n\nexport async function slugBrandRedirectLoader(ctx: { params: SlugBrandParams }): Promise<never> {\n const locale = ctx.params.locale || FALLBACK_LOCALE;\n throw redirect(`/${locale}/brands/${ctx.params.id}`);\n}\n\nexport interface PendingOrdersRedirectParams {\n /** Active locale from the `/$locale` parent layout (e.g. `'ar'`, `'en'`). */\n locale?: string;\n}\n\nexport async function pendingOrdersRedirectLoader(\n ctx: { params: PendingOrdersRedirectParams } = { params: {} }\n): Promise<never> {\n const locale = ctx.params.locale || FALLBACK_LOCALE;\n throw redirect(`/${locale}/account/orders?status=pending`);\n}\n\n/** `/account/rating`: the loyalty \"rate your orders\" link. Twig Raed has no rating page and sends it to the orders list. */\nexport async function ratingRedirectLoader(\n ctx: { params: PendingOrdersRedirectParams } = { params: {} }\n): Promise<never> {\n const locale = ctx.params.locale || FALLBACK_LOCALE;\n throw redirect(`/${locale}/account/orders`);\n}\n\n/** A Twig customer URL (`/profile`, `/orders`, …) kept working as its `/account/…` page. */\nexport async function accountRedirectLoader(ctx: {\n params: PendingOrdersRedirectParams;\n page: string;\n /** The incoming query string (`?status=pending`), kept on the account page. */\n search?: string;\n}): Promise<never> {\n // No locale in the URL stays without one: the locale layout adds it only where the store has several.\n const prefix = ctx.params.locale ? `/${ctx.params.locale}` : '';\n throw redirect(`${prefix}/account/${ctx.page}${ctx.search ?? ''}`, { statusCode: 301 });\n}\n\n/**\n * `/logout` — where the SDK sends the browser once `salla.auth.logout()` has run\n * (`salla.url.get('logout?from=…')`). The Twig storefront serves that URL server-side. Here\n * it renders nothing and, in the browser, removes the theme's own `token` cookie (the SDK's\n * `cookie.clearAll()` leaves it) and then does a full navigation home. It has to be a\n * component, not a loader redirect: a loader runs during server rendering, where the cookie\n * can't be cleared, so the redirect would leave the visitor signed in on the next request.\n */\nexport function LogoutRedirect(): null {\n useEffect(() => {\n clearAuthTokenCookie();\n // `/{store base}/{locale}/logout?from=…` → `/{store base}/{locale}`\n window.location.replace(window.location.href.replace(/\\/logout\\/?(\\?[^#]*)?(#.*)?$/, ''));\n }, []);\n return null;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { orThrow, orUnauthorized } from './chunk-I62RENKM.js';
1
+ import { orThrow, orUnauthorized } from './chunk-SSPAMQRV.js';
2
2
  import { api } from './chunk-P3OPJL6I.js';
3
3
  import { queryOptions } from '@tanstack/react-query';
4
4
 
@@ -78,5 +78,5 @@ var order = {
78
78
  };
79
79
 
80
80
  export { order };
81
- //# sourceMappingURL=chunk-N6TNEM5G.js.map
82
- //# sourceMappingURL=chunk-N6TNEM5G.js.map
81
+ //# sourceMappingURL=chunk-6IRWFBGU.js.map
82
+ //# sourceMappingURL=chunk-6IRWFBGU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/order.ts"],"names":[],"mappings":"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","file":"chunk-N6TNEM5G.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport type {\n Order,\n OrderListItem,\n OrderShipmentItem,\n OrderRatingItem,\n} from '../routes/account/types';\nimport type { Pagination } from './types';\nimport { orThrow, orUnauthorized } from '../providers/NavigationProvider';\n\nexport interface OrderDetailResponse {\n order: Order;\n}\n\n/**\n * The order in the shape the Twilight web components read (`salla-order-details`,\n * `salla-order-totals-card`) and the Twig themes render: the API answers `orders/{id}` this\n * way when the request does not say it comes from a React theme (`s-theme-type`).\n */\nexport interface TwilightOrder {\n items: Array<{\n name: string;\n quantity: number;\n product?: { id: number; url?: string; type?: string; image?: { url?: string } };\n options?: unknown[];\n }>;\n [key: string]: unknown;\n}\n\nexport interface CheckoutThankYouData {\n thank_you_title?: string;\n messages?: string[];\n share_message?: string;\n short_share_message?: string;\n}\n\nexport interface OrdersListResponse {\n data: OrderListItem[];\n cursor?: Pagination;\n}\n\nexport interface OrdersListParams {\n page?: number;\n cursor?: string | null;\n status?: string;\n feedback_status?: string;\n /** When set, the list payload includes each order's `items[]` (`with_items=1`). */\n with_items?: boolean | number;\n signal?: AbortSignal;\n}\n\nexport const order = {\n list: async (params?: OrdersListParams): Promise<OrdersListResponse> => {\n const {\n page,\n cursor,\n status,\n feedback_status: feedbackStatus,\n with_items: withItems,\n signal,\n } = params ?? {};\n\n const searchParams = new URLSearchParams();\n if (page !== undefined) searchParams.set('page', String(page));\n if (cursor) searchParams.set('cursor', cursor);\n if (status) searchParams.set('status', status);\n if (feedbackStatus) searchParams.set('feedback_status', feedbackStatus);\n if (withItems) searchParams.set('with_items', '1');\n\n const options: Record<string, unknown> = {};\n if (signal) options.signal = signal;\n\n const response = await api\n .get(`orders?${searchParams.toString()}`, options as any)\n .json<{ data: OrderListItem[] | null; cursor?: Pagination }>();\n\n return {\n data: response.data ?? [],\n cursor: response.cursor,\n };\n },\n\n find: async (id: string): Promise<OrderDetailResponse> => {\n const response = await api.get(`orders/${id}`).json<{ data: Order }>();\n\n return { order: response.data };\n },\n\n findForComponents: async (id: string): Promise<TwilightOrder> => {\n const response = await api\n .get(`orders/${id}`, {\n hooks: {\n // Runs after the client's own hook, which marks every request as from a React theme.\n beforeRequest: [({ request }) => request.headers.delete('s-theme-type')],\n },\n })\n .json<{ data: TwilightOrder }>();\n return response.data;\n },\n\n shipments: async (orderId: string): Promise<OrderShipmentItem[]> => {\n const response = await api\n .get(`orders/${orderId}/shipments`)\n .json<{ data: OrderShipmentItem[] }>();\n return response.data ?? [];\n },\n\n ratings: async (orderId: string): Promise<OrderRatingItem[]> => {\n const response = await api.get(`orders/${orderId}/ratings`).json<{ data: OrderRatingItem[] }>();\n return response.data ?? [];\n },\n\n findOrThrow: (id: string): Promise<OrderDetailResponse> => orUnauthorized(order.find(id)),\n\n thankYou: async (orderId: string): Promise<CheckoutThankYouData> => {\n const { data } = await api\n .get(`checkout/thank-you/${orderId}`)\n .json<{ data: CheckoutThankYouData }>();\n return data;\n },\n\n thankYouOrThrow: (orderId: string): Promise<CheckoutThankYouData> =>\n orThrow(order.thankYou(orderId)),\n\n queries: {\n list: (params?: Omit<OrdersListParams, 'signal'>) =>\n queryOptions({\n queryKey: ['orders', 'list', params],\n queryFn: ({ signal }) => order.list({ ...params, signal }),\n }),\n find: (id: string) =>\n queryOptions({\n queryKey: ['orders', 'detail', id],\n queryFn: () => order.find(id),\n }),\n shipments: (orderId: string) =>\n queryOptions({\n queryKey: ['orders', 'shipments', orderId],\n queryFn: () => order.shipments(orderId),\n }),\n ratings: (orderId: string) =>\n queryOptions({\n queryKey: ['orders', 'ratings', orderId],\n queryFn: () => order.ratings(orderId),\n }),\n thankYou: (orderId: string) =>\n queryOptions({\n queryKey: ['orders', 'thankYou', orderId],\n queryFn: () => order.thankYou(orderId),\n }),\n },\n};\n"]}
1
+ {"version":3,"sources":["../src/api/order.ts"],"names":[],"mappings":"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","file":"chunk-6IRWFBGU.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport type {\n Order,\n OrderListItem,\n OrderShipmentItem,\n OrderRatingItem,\n} from '../routes/account/types';\nimport type { Pagination } from './types';\nimport { orThrow, orUnauthorized } from '../providers/NavigationProvider';\n\nexport interface OrderDetailResponse {\n order: Order;\n}\n\n/**\n * The order in the shape the Twilight web components read (`salla-order-details`,\n * `salla-order-totals-card`) and the Twig themes render: the API answers `orders/{id}` this\n * way when the request does not say it comes from a React theme (`s-theme-type`).\n */\nexport interface TwilightOrder {\n items: Array<{\n name: string;\n quantity: number;\n product?: { id: number; url?: string; type?: string; image?: { url?: string } };\n options?: unknown[];\n }>;\n [key: string]: unknown;\n}\n\nexport interface CheckoutThankYouData {\n thank_you_title?: string;\n messages?: string[];\n share_message?: string;\n short_share_message?: string;\n}\n\nexport interface OrdersListResponse {\n data: OrderListItem[];\n cursor?: Pagination;\n}\n\nexport interface OrdersListParams {\n page?: number;\n cursor?: string | null;\n status?: string;\n feedback_status?: string;\n /** When set, the list payload includes each order's `items[]` (`with_items=1`). */\n with_items?: boolean | number;\n signal?: AbortSignal;\n}\n\nexport const order = {\n list: async (params?: OrdersListParams): Promise<OrdersListResponse> => {\n const {\n page,\n cursor,\n status,\n feedback_status: feedbackStatus,\n with_items: withItems,\n signal,\n } = params ?? {};\n\n const searchParams = new URLSearchParams();\n if (page !== undefined) searchParams.set('page', String(page));\n if (cursor) searchParams.set('cursor', cursor);\n if (status) searchParams.set('status', status);\n if (feedbackStatus) searchParams.set('feedback_status', feedbackStatus);\n if (withItems) searchParams.set('with_items', '1');\n\n const options: Record<string, unknown> = {};\n if (signal) options.signal = signal;\n\n const response = await api\n .get(`orders?${searchParams.toString()}`, options as any)\n .json<{ data: OrderListItem[] | null; cursor?: Pagination }>();\n\n return {\n data: response.data ?? [],\n cursor: response.cursor,\n };\n },\n\n find: async (id: string): Promise<OrderDetailResponse> => {\n const response = await api.get(`orders/${id}`).json<{ data: Order }>();\n\n return { order: response.data };\n },\n\n findForComponents: async (id: string): Promise<TwilightOrder> => {\n const response = await api\n .get(`orders/${id}`, {\n hooks: {\n // Runs after the client's own hook, which marks every request as from a React theme.\n beforeRequest: [({ request }) => request.headers.delete('s-theme-type')],\n },\n })\n .json<{ data: TwilightOrder }>();\n return response.data;\n },\n\n shipments: async (orderId: string): Promise<OrderShipmentItem[]> => {\n const response = await api\n .get(`orders/${orderId}/shipments`)\n .json<{ data: OrderShipmentItem[] }>();\n return response.data ?? [];\n },\n\n ratings: async (orderId: string): Promise<OrderRatingItem[]> => {\n const response = await api.get(`orders/${orderId}/ratings`).json<{ data: OrderRatingItem[] }>();\n return response.data ?? [];\n },\n\n findOrThrow: (id: string): Promise<OrderDetailResponse> => orUnauthorized(order.find(id)),\n\n thankYou: async (orderId: string): Promise<CheckoutThankYouData> => {\n const { data } = await api\n .get(`checkout/thank-you/${orderId}`)\n .json<{ data: CheckoutThankYouData }>();\n return data;\n },\n\n thankYouOrThrow: (orderId: string): Promise<CheckoutThankYouData> =>\n orThrow(order.thankYou(orderId)),\n\n queries: {\n list: (params?: Omit<OrdersListParams, 'signal'>) =>\n queryOptions({\n queryKey: ['orders', 'list', params],\n queryFn: ({ signal }) => order.list({ ...params, signal }),\n }),\n find: (id: string) =>\n queryOptions({\n queryKey: ['orders', 'detail', id],\n queryFn: () => order.find(id),\n }),\n shipments: (orderId: string) =>\n queryOptions({\n queryKey: ['orders', 'shipments', orderId],\n queryFn: () => order.shipments(orderId),\n }),\n ratings: (orderId: string) =>\n queryOptions({\n queryKey: ['orders', 'ratings', orderId],\n queryFn: () => order.ratings(orderId),\n }),\n thankYou: (orderId: string) =>\n queryOptions({\n queryKey: ['orders', 'thankYou', orderId],\n queryFn: () => order.thankYou(orderId),\n }),\n },\n};\n"]}
@@ -5,10 +5,10 @@ import { resolveHead, mergeHead, setHeadAdapter } from './chunk-GD26FI4J.js';
5
5
  import { store } from './chunk-EQ32CL4D.js';
6
6
  import { translations } from './chunk-Q3COPV5Z.js';
7
7
  import { buildBaseHead } from './chunk-TZ3E5BN4.js';
8
- import { shouldDehydrateQuery } from './chunk-W66OHTSM.js';
8
+ import { shouldDehydrateQuery } from './chunk-HDO37URJ.js';
9
9
  import { apps } from './chunk-UIOLSYKV.js';
10
10
  import { renderThemeHookSlotsScript, renderAppScopeInstallScript } from './chunk-2XGQSJKH.js';
11
- import { RedirectError, NotFoundError, UnauthorizedError } from './chunk-I62RENKM.js';
11
+ import { RedirectError, NotFoundError, UnauthorizedError } from './chunk-SSPAMQRV.js';
12
12
  import { RouteId } from './chunk-ZGHRSRDO.js';
13
13
  import { syncSdkLocale } from './chunk-WY4IYO3G.js';
14
14
  import { renderRuntimeEnvScript, escapeForInlineScript, resolveStoreBase, readEnv, resolveStoreBaseRedirect } from './chunk-TYLKNVQA.js';
@@ -17,7 +17,7 @@ import { getTwilightContext, SettingsError, updateTwilightContext, createI18nIns
17
17
  import { useDocumentClass } from './chunk-JWXJPJBO.js';
18
18
  import { toReactProps, mergeElementAttrs } from './chunk-CW625T2E.js';
19
19
  import { FALLBACK_LOCALE, getLanguageInfo } from './chunk-T72DAX7R.js';
20
- import { createRootRouteWithContext, createRouter as createRouter$1, useRouterState, redirect } from '@tanstack/react-router';
20
+ import { createRootRouteWithContext, createRouter as createRouter$1, useRouterState, redirect, defaultStringifySearch } from '@tanstack/react-router';
21
21
  import { lazy, Suspense } from 'react';
22
22
  import { QueryClient } from '@tanstack/react-query';
23
23
  import { PageSkeleton } from '@salla.sa/twilight-components-react/skeletons';
@@ -26,6 +26,21 @@ import { getCookie } from '@tanstack/react-start/server';
26
26
  import { setupRouterSsrQueryIntegration } from '@tanstack/react-router-ssr-query';
27
27
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
28
28
 
29
+ var isList = ([key, value]) => key.endsWith("[]") && Array.isArray(value);
30
+ function stringifySearch(search) {
31
+ const entries = Object.entries(search);
32
+ const lists = entries.filter(isList);
33
+ if (!lists.length) return defaultStringifySearch(search);
34
+ const rest = defaultStringifySearch(
35
+ Object.fromEntries(entries.filter((entry) => !isList(entry)))
36
+ );
37
+ const repeated = lists.flatMap(
38
+ ([key, values]) => values.map(
39
+ (value) => `${encodeURIComponent(key)}=${encodeURIComponent(typeof value === "string" ? value : JSON.stringify(value))}`
40
+ )
41
+ );
42
+ return `${rest || "?"}${rest ? "&" : ""}${repeated.join("&")}`;
43
+ }
29
44
  var readServerCookieToken = createIsomorphicFn().server(() => {
30
45
  try {
31
46
  return getCookie(AUTH_TOKEN_COOKIE_NAME) ?? null;
@@ -441,6 +456,7 @@ var TANSTACK_ROUTE_ID_MAP = {
441
456
  "/{-$locale}/order/$id": RouteId.CUSTOMER_ORDERS_SINGLE,
442
457
  "/{-$locale}/pending-orders": RouteId.CUSTOMER_ORDERS_INDEX_PENDING,
443
458
  "/{-$locale}/account/pending_orders": RouteId.CUSTOMER_ORDERS_INDEX_PENDING,
459
+ "/{-$locale}/account/rating": RouteId.CUSTOMER_ORDERS_INDEX,
444
460
  "/{-$locale}/logout": RouteId.LOGOUT,
445
461
  "/{-$locale}/loyalty": RouteId.LOYALTY,
446
462
  "/{-$locale}/loyalty_points": RouteId.CUSTOMER_LOYALTY_POINTS,
@@ -451,7 +467,7 @@ function resolveRouteId(tanstackId) {
451
467
  return TANSTACK_ROUTE_ID_MAP[tanstackId] ?? tanstackId;
452
468
  }
453
469
  var LazyNotFoundPage = lazy(
454
- () => import('./not-found-UXBV4766.js').then((m) => ({ default: m.NotFoundPage }))
470
+ () => import('./not-found-LXTJBYJY.js').then((m) => ({ default: m.NotFoundPage }))
455
471
  );
456
472
  function StoreUnavailablePage() {
457
473
  return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
@@ -588,6 +604,23 @@ function hydrateTwilightContext(router, queryClient) {
588
604
  appsSettings
589
605
  });
590
606
  }
607
+ function syncPageFromMatches(router) {
608
+ const matches = router.state?.matches;
609
+ if (!matches) return;
610
+ const page = matches.reduceRight(
611
+ (found, m) => found ?? (m.loaderData?.page ? m.loaderData.page : null),
612
+ null
613
+ );
614
+ if (!page) return;
615
+ updateTwilightContext({ page });
616
+ const sdkPage = {
617
+ ...page,
618
+ url: page.url ?? router.state.location.pathname + router.state.location.searchStr
619
+ };
620
+ const push = () => window.salla?.config?.set?.("page", sdkPage);
621
+ if (window.salla?.config?.set) push();
622
+ else window.addEventListener("salla::created", push, { once: true });
623
+ }
591
624
  function createRouter(routeTree, options) {
592
625
  setHeadAdapter(tanstackHeadAdapter);
593
626
  const {
@@ -630,6 +663,7 @@ function createRouter(routeTree, options) {
630
663
  scrollRestoration: true,
631
664
  scrollRestorationBehavior: "instant",
632
665
  trailingSlash: "never",
666
+ stringifySearch,
633
667
  defaultStaleTime,
634
668
  defaultNotFoundComponent: () => /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(PageSkeleton, {}), children: /* @__PURE__ */ jsx(LazyNotFoundPage, {}) }),
635
669
  defaultPendingComponent: pendingComponent,
@@ -667,22 +701,8 @@ function createRouter(routeTree, options) {
667
701
  }
668
702
  }
669
703
  }
670
- router.subscribe("onLoad", () => {
671
- const matches = router.state?.matches;
672
- if (!matches) return;
673
- const page = matches.reduceRight(
674
- (found, m) => found ?? (m.loaderData?.page ? m.loaderData.page : null),
675
- null
676
- );
677
- if (page) {
678
- updateTwilightContext({ page });
679
- const salla = window.salla;
680
- salla?.config?.set?.("page", {
681
- ...page,
682
- url: page.url ?? router.state.location.pathname + router.state.location.searchStr
683
- });
684
- }
685
- });
704
+ router.subscribe("onLoad", () => syncPageFromMatches(router));
705
+ router.subscribe("onRendered", () => syncPageFromMatches(router));
686
706
  router.subscribe("onResolved", () => {
687
707
  syncNavigationState();
688
708
  dispatchRouteChanged();
@@ -710,6 +730,8 @@ var ROUTE_CLASS_MAP = {
710
730
  "/{-$locale}/pending-orders": "customer-orders-index-pending",
711
731
  // redirect to /account/orders?status=pending
712
732
  "/{-$locale}/account/pending_orders": "customer-orders-index-pending",
733
+ "/{-$locale}/account/rating": "customer-orders-index",
734
+ // redirect to /account/orders
713
735
  "/{-$locale}/order/$id": "customer-orders-single",
714
736
  "/{-$locale}/profile": "customer-profile",
715
737
  "/{-$locale}/wallet": "customer-wallet",
@@ -780,5 +802,5 @@ function tanstackDocumentAdapter(descriptor) {
780
802
  }
781
803
 
782
804
  export { RouteDocumentSync, TanStackDocumentSync, createRouter, createTwilightRootRoute, rootHead, tanstackDocumentAdapter, useTanstackDocumentAttrs };
783
- //# sourceMappingURL=chunk-6J33ZJB6.js.map
784
- //# sourceMappingURL=chunk-6J33ZJB6.js.map
805
+ //# sourceMappingURL=chunk-7WPZBVCZ.js.map
806
+ //# sourceMappingURL=chunk-7WPZBVCZ.js.map