@salla.sa/twilight-theme-engine 1.0.108 → 1.0.109

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 (259) hide show
  1. package/dist/{AddToCartForm-CF4H32X7.js → AddToCartForm-ZIZKGYJR.js} +3 -3
  2. package/dist/{AddToCartForm-CF4H32X7.js.map → AddToCartForm-ZIZKGYJR.js.map} +1 -1
  3. package/dist/{BlogAuthorPage-LHYDUFDA.js → BlogAuthorPage-GLAYDKIX.js} +27 -27
  4. package/dist/{BlogAuthorPage-LHYDUFDA.js.map → BlogAuthorPage-GLAYDKIX.js.map} +1 -1
  5. package/dist/{BlogCategoryPage-6BORI4YG.js → BlogCategoryPage-KPU6LYHK.js} +27 -27
  6. package/dist/{BlogCategoryPage-6BORI4YG.js.map → BlogCategoryPage-KPU6LYHK.js.map} +1 -1
  7. package/dist/{BlogPage-TSRWNX6M.js → BlogPage-VDDHOD33.js} +25 -25
  8. package/dist/{BlogPage-TSRWNX6M.js.map → BlogPage-VDDHOD33.js.map} +1 -1
  9. package/dist/{BlogSinglePage-TLTW67S7.js → BlogSinglePage-UWP5MFAS.js} +25 -25
  10. package/dist/{BlogSinglePage-TLTW67S7.js.map → BlogSinglePage-UWP5MFAS.js.map} +1 -1
  11. package/dist/{BlogTagPage-RAMP5XNR.js → BlogTagPage-V3Z4AD4C.js} +27 -27
  12. package/dist/{BlogTagPage-RAMP5XNR.js.map → BlogTagPage-V3Z4AD4C.js.map} +1 -1
  13. package/dist/{BrandsPage-KUFEUFVZ.js → BrandsPage-ARYKHCTB.js} +26 -26
  14. package/dist/{BrandsPage-KUFEUFVZ.js.map → BrandsPage-ARYKHCTB.js.map} +1 -1
  15. package/dist/{Breadcrumb-ZS3ZMMTM.js → Breadcrumb-XT2MP2ZW.js} +25 -25
  16. package/dist/{Breadcrumb-ZS3ZMMTM.js.map → Breadcrumb-XT2MP2ZW.js.map} +1 -1
  17. package/dist/{CartItem-7QCAQ3QQ.js → CartItem-4VXVOKVF.js} +25 -25
  18. package/dist/{CartItem-7QCAQ3QQ.js.map → CartItem-4VXVOKVF.js.map} +1 -1
  19. package/dist/{CartSummary-ZPG7IAXE.js → CartSummary-K23PGOUL.js} +25 -25
  20. package/dist/{CartSummary-ZPG7IAXE.js.map → CartSummary-K23PGOUL.js.map} +1 -1
  21. package/dist/{Copyright-VPJMIQSO.js → Copyright-KBCQVD5Y.js} +3 -3
  22. package/dist/{Copyright-VPJMIQSO.js.map → Copyright-KBCQVD5Y.js.map} +1 -1
  23. package/dist/{CustomerLayout-E5FYPKT4.js → CustomerLayout-B77ZKB4X.js} +25 -25
  24. package/dist/{CustomerLayout-E5FYPKT4.js.map → CustomerLayout-B77ZKB4X.js.map} +1 -1
  25. package/dist/{Footer-GIPFBQEY.js → Footer-L52M4T24.js} +4 -4
  26. package/dist/{Footer-GIPFBQEY.js.map → Footer-L52M4T24.js.map} +1 -1
  27. package/dist/Header-QOAV23HD.js +22 -0
  28. package/dist/{Header-HYTNO4IR.js.map → Header-QOAV23HD.js.map} +1 -1
  29. package/dist/{LoyaltyPage-YMK7SISF.js → LoyaltyPage-3OIZG2ZJ.js} +25 -25
  30. package/dist/{LoyaltyPage-YMK7SISF.js.map → LoyaltyPage-3OIZG2ZJ.js.map} +1 -1
  31. package/dist/{LoyaltyPointsPage-V2463UQ6.js → LoyaltyPointsPage-I3O3JA7Q.js} +9 -9
  32. package/dist/{LoyaltyPointsPage-V2463UQ6.js.map → LoyaltyPointsPage-I3O3JA7Q.js.map} +1 -1
  33. package/dist/{MainMenu-IP6AVEIF.js → MainMenu-VIDYUQNX.js} +8 -8
  34. package/dist/{MainMenu-IP6AVEIF.js.map → MainMenu-VIDYUQNX.js.map} +1 -1
  35. package/dist/MaintenancePage-UBJ5Q3L5.js +7 -0
  36. package/dist/{MaintenancePage-Z34IQCUV.js.map → MaintenancePage-UBJ5Q3L5.js.map} +1 -1
  37. package/dist/{MasterLayout-3YSR4VFQ.js → MasterLayout-FY666JMR.js} +25 -25
  38. package/dist/{MasterLayout-3YSR4VFQ.js.map → MasterLayout-FY666JMR.js.map} +1 -1
  39. package/dist/{MobileMenu-ZJLXCG4P.js → MobileMenu-3ILQKCHA.js} +26 -26
  40. package/dist/{MobileMenu-ZJLXCG4P.js.map → MobileMenu-3ILQKCHA.js.map} +1 -1
  41. package/dist/{NotificationsPage-XKSW3DFD.js → NotificationsPage-EYTBUS36.js} +25 -25
  42. package/dist/{NotificationsPage-XKSW3DFD.js.map → NotificationsPage-EYTBUS36.js.map} +1 -1
  43. package/dist/{OrderSinglePage-WSUNHCY6.js → OrderSinglePage-YHA5D2ZI.js} +26 -26
  44. package/dist/{OrderSinglePage-WSUNHCY6.js.map → OrderSinglePage-YHA5D2ZI.js.map} +1 -1
  45. package/dist/{OrdersPage-TAME5ACG.js → OrdersPage-4A2QINDX.js} +25 -25
  46. package/dist/{OrdersPage-TAME5ACG.js.map → OrdersPage-4A2QINDX.js.map} +1 -1
  47. package/dist/{PageSingle-MYDLIP55.js → PageSingle-ED24MS2Z.js} +7 -7
  48. package/dist/{PageSingle-MYDLIP55.js.map → PageSingle-ED24MS2Z.js.map} +1 -1
  49. package/dist/{ProductDetails-MFAKRQ72.js → ProductDetails-ZA5A66JW.js} +8 -8
  50. package/dist/{ProductDetails-MFAKRQ72.js.map → ProductDetails-ZA5A66JW.js.map} +1 -1
  51. package/dist/{ProfilePage-4W7DBXLW.js → ProfilePage-ZTYHIDGE.js} +25 -25
  52. package/dist/{ProfilePage-4W7DBXLW.js.map → ProfilePage-ZTYHIDGE.js.map} +1 -1
  53. package/dist/{ReviewsPage-G3IEPOOO.js → ReviewsPage-LTEOFKHW.js} +3 -3
  54. package/dist/{ReviewsPage-G3IEPOOO.js.map → ReviewsPage-LTEOFKHW.js.map} +1 -1
  55. package/dist/{SeoCartWidget-7UDOVSWP.js → SeoCartWidget-3O35VZZO.js} +25 -25
  56. package/dist/{SeoCartWidget-7UDOVSWP.js.map → SeoCartWidget-3O35VZZO.js.map} +1 -1
  57. package/dist/{SettingsPage-TEMXC3OF.js → SettingsPage-3VRJ3AYE.js} +25 -25
  58. package/dist/{SettingsPage-TEMXC3OF.js.map → SettingsPage-3VRJ3AYE.js.map} +1 -1
  59. package/dist/StoreClosedNotification-7KACKGVH.js +54 -0
  60. package/dist/{StoreClosedNotification-YMPBP56U.js.map → StoreClosedNotification-7KACKGVH.js.map} +1 -1
  61. package/dist/{TestimonialsPage-G2S3JQNT.js → TestimonialsPage-LYJFX32D.js} +7 -7
  62. package/dist/{TestimonialsPage-G2S3JQNT.js.map → TestimonialsPage-LYJFX32D.js.map} +1 -1
  63. package/dist/{ThankYouPage-HPF3PIAT.js → ThankYouPage-Z2S7MJ7J.js} +25 -25
  64. package/dist/{ThankYouPage-HPF3PIAT.js.map → ThankYouPage-Z2S7MJ7J.js.map} +1 -1
  65. package/dist/{WalletPage-G7FOMHFX.js → WalletPage-EZ4RTLGE.js} +26 -26
  66. package/dist/{WalletPage-G7FOMHFX.js.map → WalletPage-EZ4RTLGE.js.map} +1 -1
  67. package/dist/{WishlistPage-VULTU6K2.js → WishlistPage-V7Z6GWQI.js} +27 -27
  68. package/dist/{WishlistPage-VULTU6K2.js.map → WishlistPage-V7Z6GWQI.js.map} +1 -1
  69. package/dist/api/advertisement.js +5 -5
  70. package/dist/api/apps.js +5 -5
  71. package/dist/api/blog.js +7 -7
  72. package/dist/api/brands.js +7 -7
  73. package/dist/api/cart.js +7 -7
  74. package/dist/api/category.js +7 -7
  75. package/dist/api/client.js +4 -4
  76. package/dist/api/home.js +5 -5
  77. package/dist/api/loyalty.js +7 -7
  78. package/dist/api/menu.js +5 -5
  79. package/dist/api/notification.js +5 -5
  80. package/dist/api/order.js +7 -7
  81. package/dist/api/page.js +7 -7
  82. package/dist/api/product.js +7 -7
  83. package/dist/api/profile.js +4 -4
  84. package/dist/api/store.d.ts.map +1 -1
  85. package/dist/api/store.js +5 -5
  86. package/dist/api/translations.js +5 -5
  87. package/dist/api/user.js +5 -5
  88. package/dist/api/wallet.js +5 -5
  89. package/dist/api/wishlist.js +8 -8
  90. package/dist/{chunk-XL42DUCQ.js → chunk-2MHMQOMJ.js} +3 -3
  91. package/dist/{chunk-XL42DUCQ.js.map → chunk-2MHMQOMJ.js.map} +1 -1
  92. package/dist/chunk-2RRZZYH4.js +14 -0
  93. package/dist/{chunk-47C3MTZI.js.map → chunk-2RRZZYH4.js.map} +1 -1
  94. package/dist/{chunk-3DVAXIY3.js → chunk-3MTOUUC7.js} +4 -4
  95. package/dist/{chunk-3DVAXIY3.js.map → chunk-3MTOUUC7.js.map} +1 -1
  96. package/dist/{chunk-UWDUMPL7.js → chunk-3QJCZSLR.js} +6 -6
  97. package/dist/{chunk-UWDUMPL7.js.map → chunk-3QJCZSLR.js.map} +1 -1
  98. package/dist/{chunk-VUWBGAET.js → chunk-3WMGAFWX.js} +4 -4
  99. package/dist/{chunk-VUWBGAET.js.map → chunk-3WMGAFWX.js.map} +1 -1
  100. package/dist/{chunk-BEMWHR4T.js → chunk-4CCCNO2Q.js} +3 -3
  101. package/dist/{chunk-BEMWHR4T.js.map → chunk-4CCCNO2Q.js.map} +1 -1
  102. package/dist/{chunk-HNSR4KLL.js → chunk-6V4SM23M.js} +3 -3
  103. package/dist/{chunk-HNSR4KLL.js.map → chunk-6V4SM23M.js.map} +1 -1
  104. package/dist/{chunk-UKLYL5LM.js → chunk-7JAOXOEW.js} +4 -4
  105. package/dist/{chunk-UKLYL5LM.js.map → chunk-7JAOXOEW.js.map} +1 -1
  106. package/dist/{chunk-ENC6POPF.js → chunk-B272JNRU.js} +4 -4
  107. package/dist/{chunk-ENC6POPF.js.map → chunk-B272JNRU.js.map} +1 -1
  108. package/dist/{chunk-KSS7OA3Q.js → chunk-C7CJZ5DK.js} +3 -3
  109. package/dist/{chunk-KSS7OA3Q.js.map → chunk-C7CJZ5DK.js.map} +1 -1
  110. package/dist/{chunk-FQLF555I.js → chunk-CQ6J4FKU.js} +4 -4
  111. package/dist/{chunk-FQLF555I.js.map → chunk-CQ6J4FKU.js.map} +1 -1
  112. package/dist/{chunk-U6KJ7XBO.js → chunk-GGATZRAY.js} +3 -3
  113. package/dist/{chunk-U6KJ7XBO.js.map → chunk-GGATZRAY.js.map} +1 -1
  114. package/dist/{chunk-UZGP2KFA.js → chunk-GIAXPCHD.js} +3 -3
  115. package/dist/{chunk-UZGP2KFA.js.map → chunk-GIAXPCHD.js.map} +1 -1
  116. package/dist/{chunk-QA4FBMFJ.js → chunk-HGA5D4LJ.js} +4 -4
  117. package/dist/{chunk-QA4FBMFJ.js.map → chunk-HGA5D4LJ.js.map} +1 -1
  118. package/dist/{chunk-BR56OEPZ.js → chunk-HSKRX3WR.js} +4 -4
  119. package/dist/{chunk-BR56OEPZ.js.map → chunk-HSKRX3WR.js.map} +1 -1
  120. package/dist/{chunk-F6XPGONG.js → chunk-HSXQUHZO.js} +5 -5
  121. package/dist/{chunk-F6XPGONG.js.map → chunk-HSXQUHZO.js.map} +1 -1
  122. package/dist/{chunk-5L37UNQQ.js → chunk-I2ZO57UV.js} +6 -6
  123. package/dist/{chunk-5L37UNQQ.js.map → chunk-I2ZO57UV.js.map} +1 -1
  124. package/dist/{chunk-6UG4IVUF.js → chunk-IRLKZ3LB.js} +23 -23
  125. package/dist/{chunk-6UG4IVUF.js.map → chunk-IRLKZ3LB.js.map} +1 -1
  126. package/dist/{chunk-OSSOU36J.js → chunk-IXFBHQ5P.js} +3 -3
  127. package/dist/{chunk-OSSOU36J.js.map → chunk-IXFBHQ5P.js.map} +1 -1
  128. package/dist/{chunk-ZLLHL3NI.js → chunk-KPQEPQ4L.js} +7 -7
  129. package/dist/{chunk-ZLLHL3NI.js.map → chunk-KPQEPQ4L.js.map} +1 -1
  130. package/dist/{chunk-3NFVZJNI.js → chunk-L6TSHT52.js} +3 -3
  131. package/dist/{chunk-3NFVZJNI.js.map → chunk-L6TSHT52.js.map} +1 -1
  132. package/dist/{chunk-T5VU67NQ.js → chunk-LG2UQKSH.js} +4 -4
  133. package/dist/{chunk-T5VU67NQ.js.map → chunk-LG2UQKSH.js.map} +1 -1
  134. package/dist/{chunk-EHX45KZG.js → chunk-LZZ6EESI.js} +3 -3
  135. package/dist/{chunk-EHX45KZG.js.map → chunk-LZZ6EESI.js.map} +1 -1
  136. package/dist/{chunk-2CL6AEO4.js → chunk-N5WT7UM3.js} +3 -3
  137. package/dist/{chunk-2CL6AEO4.js.map → chunk-N5WT7UM3.js.map} +1 -1
  138. package/dist/{chunk-OHUTM224.js → chunk-N6B4LPKS.js} +4 -4
  139. package/dist/{chunk-OHUTM224.js.map → chunk-N6B4LPKS.js.map} +1 -1
  140. package/dist/{chunk-RA6ZTHN6.js → chunk-N6JUOBYJ.js} +4 -4
  141. package/dist/{chunk-RA6ZTHN6.js.map → chunk-N6JUOBYJ.js.map} +1 -1
  142. package/dist/{chunk-5N74JJ2Z.js → chunk-NEKHAKA7.js} +21 -17
  143. package/dist/chunk-NEKHAKA7.js.map +1 -0
  144. package/dist/{chunk-4PT5MXGR.js → chunk-NEPWW7KM.js} +4 -4
  145. package/dist/{chunk-4PT5MXGR.js.map → chunk-NEPWW7KM.js.map} +1 -1
  146. package/dist/{chunk-T4BRWJSI.js → chunk-P36CIH6E.js} +7 -7
  147. package/dist/{chunk-T4BRWJSI.js.map → chunk-P36CIH6E.js.map} +1 -1
  148. package/dist/{chunk-D7XWUD6T.js → chunk-PFMTPKZO.js} +4 -4
  149. package/dist/{chunk-D7XWUD6T.js.map → chunk-PFMTPKZO.js.map} +1 -1
  150. package/dist/{chunk-L4JI2AAL.js → chunk-QEPZPPLH.js} +4 -4
  151. package/dist/{chunk-L4JI2AAL.js.map → chunk-QEPZPPLH.js.map} +1 -1
  152. package/dist/{chunk-JNAJTCJD.js → chunk-QRHXAKJ3.js} +5 -3
  153. package/dist/chunk-QRHXAKJ3.js.map +1 -0
  154. package/dist/{chunk-GFUXGVER.js → chunk-QZM4ZACO.js} +3 -3
  155. package/dist/{chunk-GFUXGVER.js.map → chunk-QZM4ZACO.js.map} +1 -1
  156. package/dist/{chunk-Y464WYUT.js → chunk-RJ5HY6PN.js} +5 -5
  157. package/dist/{chunk-Y464WYUT.js.map → chunk-RJ5HY6PN.js.map} +1 -1
  158. package/dist/{chunk-PTQVBPPN.js → chunk-SCL6EXHP.js} +3 -3
  159. package/dist/{chunk-PTQVBPPN.js.map → chunk-SCL6EXHP.js.map} +1 -1
  160. package/dist/{chunk-SQXUWX4B.js → chunk-SGZ6TCHB.js} +5 -5
  161. package/dist/{chunk-SQXUWX4B.js.map → chunk-SGZ6TCHB.js.map} +1 -1
  162. package/dist/{chunk-W354TTIE.js → chunk-TOVC6CV7.js} +6 -6
  163. package/dist/{chunk-W354TTIE.js.map → chunk-TOVC6CV7.js.map} +1 -1
  164. package/dist/{chunk-YDSWLCOY.js → chunk-TTTI4W5F.js} +5 -5
  165. package/dist/{chunk-YDSWLCOY.js.map → chunk-TTTI4W5F.js.map} +1 -1
  166. package/dist/{chunk-B2OJZKU4.js → chunk-TUVDPELG.js} +8 -8
  167. package/dist/{chunk-B2OJZKU4.js.map → chunk-TUVDPELG.js.map} +1 -1
  168. package/dist/{chunk-TWUOIBO7.js → chunk-U46RGTYO.js} +3 -3
  169. package/dist/{chunk-TWUOIBO7.js.map → chunk-U46RGTYO.js.map} +1 -1
  170. package/dist/{chunk-2IW3JRWL.js → chunk-UCJNWQF2.js} +4 -4
  171. package/dist/{chunk-2IW3JRWL.js.map → chunk-UCJNWQF2.js.map} +1 -1
  172. package/dist/{chunk-LUFLN7WL.js → chunk-UEOXX7N2.js} +7 -7
  173. package/dist/{chunk-LUFLN7WL.js.map → chunk-UEOXX7N2.js.map} +1 -1
  174. package/dist/{chunk-GKKHNGLI.js → chunk-UO4HPAP5.js} +8 -8
  175. package/dist/{chunk-GKKHNGLI.js.map → chunk-UO4HPAP5.js.map} +1 -1
  176. package/dist/{chunk-SCRNQWZT.js → chunk-VDBDYFAL.js} +4 -4
  177. package/dist/{chunk-SCRNQWZT.js.map → chunk-VDBDYFAL.js.map} +1 -1
  178. package/dist/chunk-VM5Y62RM.js +182 -0
  179. package/dist/chunk-VM5Y62RM.js.map +1 -0
  180. package/dist/{chunk-ZVYJK6XQ.js → chunk-WAYZZVNX.js} +5 -5
  181. package/dist/{chunk-ZVYJK6XQ.js.map → chunk-WAYZZVNX.js.map} +1 -1
  182. package/dist/{chunk-BQ2MNEN7.js → chunk-WEN6FKY6.js} +3 -3
  183. package/dist/{chunk-BQ2MNEN7.js.map → chunk-WEN6FKY6.js.map} +1 -1
  184. package/dist/{chunk-24UCMWQB.js → chunk-WX2UWLMW.js} +3 -3
  185. package/dist/{chunk-24UCMWQB.js.map → chunk-WX2UWLMW.js.map} +1 -1
  186. package/dist/{chunk-S5EVFWAL.js → chunk-YDKPG3AP.js} +8 -8
  187. package/dist/{chunk-S5EVFWAL.js.map → chunk-YDKPG3AP.js.map} +1 -1
  188. package/dist/{chunk-GXZW6BJY.js → chunk-YUI6R2PA.js} +3 -3
  189. package/dist/{chunk-GXZW6BJY.js.map → chunk-YUI6R2PA.js.map} +1 -1
  190. package/dist/{chunk-A4NN6C5B.js → chunk-YZDHDHSN.js} +3 -3
  191. package/dist/{chunk-A4NN6C5B.js.map → chunk-YZDHDHSN.js.map} +1 -1
  192. package/dist/{chunk-RBFLDI2Z.js → chunk-ZM4J5A4Z.js} +4 -4
  193. package/dist/{chunk-RBFLDI2Z.js.map → chunk-ZM4J5A4Z.js.map} +1 -1
  194. package/dist/components/cart/index.js +1 -1
  195. package/dist/components/common/index.js +1 -1
  196. package/dist/components/drawer/index.js +23 -23
  197. package/dist/components/home/index.js +27 -27
  198. package/dist/components/layout/index.js +7 -7
  199. package/dist/components/product/index.js +24 -24
  200. package/dist/components/store/index.js +25 -25
  201. package/dist/components/toast/index.js +5 -5
  202. package/dist/dev/editor/index.js +3 -3
  203. package/dist/dev/index.js +3 -3
  204. package/dist/document-class-2PMYG45N.js +29 -0
  205. package/dist/{document-class-B2MXKYAQ.js.map → document-class-2PMYG45N.js.map} +1 -1
  206. package/dist/hooks/index.js +23 -23
  207. package/dist/hooks/useComments.js +4 -4
  208. package/dist/hooks/useGtm.js +23 -23
  209. package/dist/hooks/useMoney.js +23 -23
  210. package/dist/hooks/useProduct.js +4 -4
  211. package/dist/hooks/useStore.js +23 -23
  212. package/dist/hooks/useUser.js +6 -6
  213. package/dist/hooks/useWishlist.js +4 -4
  214. package/dist/index.d.ts +1 -0
  215. package/dist/index.d.ts.map +1 -1
  216. package/dist/index.js +23 -23
  217. package/dist/native-app/index.js +4 -4
  218. package/dist/{navigation-LSRNHKGJ.js → navigation-3HNNCUGK.js} +8 -8
  219. package/dist/{navigation-LSRNHKGJ.js.map → navigation-3HNNCUGK.js.map} +1 -1
  220. package/dist/navigation-GF4ODD46.js +14 -0
  221. package/dist/{navigation-WASYQTFC.js.map → navigation-GF4ODD46.js.map} +1 -1
  222. package/dist/{not-found-M3ZPUVVC.js → not-found-5YCYDSHS.js} +26 -26
  223. package/dist/{not-found-M3ZPUVVC.js.map → not-found-5YCYDSHS.js.map} +1 -1
  224. package/dist/providers/index.js +23 -23
  225. package/dist/routes/account/orders.js +8 -8
  226. package/dist/routes/account.js +17 -17
  227. package/dist/routes/blog.js +12 -12
  228. package/dist/routes/brands.js +8 -8
  229. package/dist/routes/cart.js +31 -31
  230. package/dist/routes/home.js +28 -28
  231. package/dist/routes/index.js +7 -7
  232. package/dist/routes/loyalty.js +9 -9
  233. package/dist/routes/page.js +8 -8
  234. package/dist/routes/product-listing.js +29 -29
  235. package/dist/routes/product.js +27 -27
  236. package/dist/routes/root/beforeLoad.d.ts.map +1 -1
  237. package/dist/routes/seo-redirects.js +7 -7
  238. package/dist/routes/testimonials.js +3 -3
  239. package/dist/routes/thank-you.js +8 -8
  240. package/dist/skeleton.js +28 -28
  241. package/dist/{store-lookup-EW6ALPQF.js → store-lookup-TK4QCWNT.js} +12 -12
  242. package/dist/{store-lookup-EW6ALPQF.js.map → store-lookup-TK4QCWNT.js.map} +1 -1
  243. package/dist/tanstack.js +20 -20
  244. package/dist/utils/errors.d.ts +18 -1
  245. package/dist/utils/errors.d.ts.map +1 -1
  246. package/dist/utils/index.js +6 -6
  247. package/dist/vite/index.js +3 -3
  248. package/package.json +1 -1
  249. package/tailwind/routes/root/beforeLoad.ts.txt +8 -2
  250. package/dist/Header-HYTNO4IR.js +0 -22
  251. package/dist/MaintenancePage-Z34IQCUV.js +0 -7
  252. package/dist/StoreClosedNotification-YMPBP56U.js +0 -54
  253. package/dist/chunk-47C3MTZI.js +0 -14
  254. package/dist/chunk-5N74JJ2Z.js.map +0 -1
  255. package/dist/chunk-D42M66E4.js +0 -127
  256. package/dist/chunk-D42M66E4.js.map +0 -1
  257. package/dist/chunk-JNAJTCJD.js.map +0 -1
  258. package/dist/document-class-B2MXKYAQ.js +0 -29
  259. package/dist/navigation-WASYQTFC.js +0 -14
@@ -0,0 +1,182 @@
1
+ import { getActiveScope, requestedThemeVersionId, api, STORE_IDENTIFIER_HEADER } from './chunk-TTTI4W5F.js';
2
+ import { resolveStoreIdentifier } from './chunk-YUI6R2PA.js';
3
+ import { getTwilightContext, SettingsError } from './chunk-QRHXAKJ3.js';
4
+ import { queryOptions } from '@tanstack/react-query';
5
+ import { isTimeoutError, isHTTPError, isNetworkError } from 'ky';
6
+
7
+ // src/utils/native-app-headers.ts
8
+ var NATIVE_APP_HEADERS = [
9
+ "s-app-os",
10
+ "s-app-version",
11
+ "s-app-full-version",
12
+ "s-app-os-version"
13
+ ];
14
+ function readNativeAppHeaders(headers) {
15
+ const os = headers.get("s-app-os")?.toLowerCase();
16
+ if (os !== "ios" && os !== "android") return null;
17
+ const found = {};
18
+ for (const name of NATIVE_APP_HEADERS) {
19
+ const value = headers.get(name);
20
+ if (value) found[name] = value;
21
+ }
22
+ return found;
23
+ }
24
+
25
+ // src/api/store.ts
26
+ var DEFAULT_INCLUDE_ITEMS = [
27
+ "store",
28
+ "settings",
29
+ "theme",
30
+ "theme_settings",
31
+ "external_services",
32
+ "currencies",
33
+ "languages",
34
+ "payments",
35
+ "product_widgets",
36
+ "rating",
37
+ "ratings",
38
+ "user"
39
+ ];
40
+ function languagesToArray(languages) {
41
+ if (!languages) return void 0;
42
+ return Object.values(languages).map((lang) => ({ iso_code: lang.code, ...lang }));
43
+ }
44
+ function withNativeAppHeaders(jitsu) {
45
+ if (!jitsu || typeof window !== "undefined") return jitsu;
46
+ let appHeaders = null;
47
+ try {
48
+ appHeaders = getTwilightContext().nativeAppHeaders;
49
+ } catch {
50
+ return jitsu;
51
+ }
52
+ if (!appHeaders) return jitsu;
53
+ const extra = jitsu.context?.extra;
54
+ const headers = { ...extra?.headers };
55
+ for (const name of NATIVE_APP_HEADERS) delete headers[name];
56
+ return {
57
+ ...jitsu,
58
+ context: {
59
+ ...jitsu.context,
60
+ extra: { ...extra, headers: { ...headers, ...appHeaders } }
61
+ }
62
+ };
63
+ }
64
+ var SETTINGS_TIMEOUT_MS = 5e3;
65
+ async function requestSettings(identifier) {
66
+ const includeParams = DEFAULT_INCLUDE_ITEMS.map((i) => `include[]=${i}`).join("&");
67
+ const scope = getActiveScope();
68
+ const params = scope != null ? `${includeParams}&scope=${scope.id}` : includeParams;
69
+ const json = await api.get(`store/settings?${params}`, {
70
+ timeout: SETTINGS_TIMEOUT_MS,
71
+ headers: { [STORE_IDENTIFIER_HEADER]: identifier }
72
+ }).json();
73
+ const data = json?.data;
74
+ if (!data) {
75
+ throw new SettingsError(
76
+ `The Salla API answered the settings request for store "${identifier}" without settings.`,
77
+ { reason: "empty" }
78
+ );
79
+ }
80
+ const languages = languagesToArray(data.languages);
81
+ return {
82
+ store: data.store,
83
+ theme: data.theme,
84
+ languages,
85
+ currencies: data.currencies,
86
+ external_services: data.external_services,
87
+ headers: data.headers,
88
+ login: data.login,
89
+ affiliate: data.affiliate,
90
+ policy_url: data.policy_url,
91
+ user: data.user,
92
+ swoole: data.swoole,
93
+ jitsu: withNativeAppHeaders(data.jitsu),
94
+ maintenance: data.maintenance,
95
+ maintenance_details: data.maintenance_details,
96
+ ...scope && { requestedScopeId: scope.id }
97
+ };
98
+ }
99
+ function apiErrorMessage(data) {
100
+ const message = data?.error?.message;
101
+ return typeof message === "string" && message.length > 0 && message.length <= 200 ? message : void 0;
102
+ }
103
+ function describeSettingsFailure(identifier, error) {
104
+ if (error instanceof SettingsError) return error;
105
+ const request = `the settings request for store "${identifier}"`;
106
+ if (isTimeoutError(error)) {
107
+ return new SettingsError(
108
+ `The Salla API did not answer ${request} within ${SETTINGS_TIMEOUT_MS} ms.`,
109
+ { reason: "timeout" }
110
+ );
111
+ }
112
+ if (isHTTPError(error)) {
113
+ const { status } = error.response;
114
+ const said = apiErrorMessage(error.data);
115
+ return new SettingsError(
116
+ `The Salla API answered ${request} with HTTP ${status}${said ? `: ${said}` : ""}.`,
117
+ { reason: "http", status }
118
+ );
119
+ }
120
+ if (isNetworkError(error)) {
121
+ return new SettingsError(`The Salla API could not be reached for ${request}.`, {
122
+ reason: "network"
123
+ });
124
+ }
125
+ const detail = error instanceof Error ? `: ${error.message}` : "";
126
+ return new SettingsError(`The settings request for store "${identifier}" failed${detail}.`);
127
+ }
128
+ async function fetchSettings(storeIdentifier) {
129
+ const identifier = storeIdentifier ?? resolveStoreIdentifier();
130
+ if (!identifier) {
131
+ const error = new SettingsError(
132
+ "No store is named for this request: add `?storeId=` on the preview host, or set VITE_STORE_DOMAIN in local development.",
133
+ { reason: "no-store" }
134
+ );
135
+ console.warn("[store.settings]", error.message);
136
+ throw error;
137
+ }
138
+ try {
139
+ return await requestSettings(identifier);
140
+ } catch (cause) {
141
+ const error = describeSettingsFailure(identifier, cause);
142
+ console.error("[store.settings]", error.message, ...cause === error ? [] : [cause]);
143
+ throw error;
144
+ }
145
+ }
146
+ var store = {
147
+ settings: async (storeIdentifier) => {
148
+ try {
149
+ return await fetchSettings(storeIdentifier);
150
+ } catch {
151
+ return null;
152
+ }
153
+ },
154
+ queries: {
155
+ settings: (storeIdentifier) => queryOptions({
156
+ queryKey: [
157
+ "store",
158
+ "settings",
159
+ storeIdentifier,
160
+ getTwilightContext().locale,
161
+ getActiveScope(),
162
+ // Two versions of one store's settings are two different answers, and
163
+ // this is the query whose answer decides what every other call is
164
+ // pinned to. `requestedThemeVersionId` rather than the resolved one:
165
+ // the resolved value falls back to what these settings report, so it
166
+ // is not knowable until after this query has run — the key would be
167
+ // one thing on the server and another on the client, and the hydrated
168
+ // page would refetch the settings it was just handed.
169
+ requestedThemeVersionId()
170
+ ],
171
+ // Throws rather than resolving `null`, so the failure keeps its reason.
172
+ queryFn: () => fetchSettings(storeIdentifier),
173
+ // A null never retried, and the root route waits on this: the router's
174
+ // default `retry: 1` would sit through the timeout twice.
175
+ retry: 0
176
+ })
177
+ }
178
+ };
179
+
180
+ export { readNativeAppHeaders, store };
181
+ //# sourceMappingURL=chunk-VM5Y62RM.js.map
182
+ //# sourceMappingURL=chunk-VM5Y62RM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/native-app-headers.ts","../src/api/store.ts"],"names":[],"mappings":"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","file":"chunk-VM5Y62RM.js","sourcesContent":["/** The headers the Salla native app sends with every page it loads in its webview. */\nexport const NATIVE_APP_HEADERS = [\n 's-app-os',\n 's-app-version',\n 's-app-full-version',\n 's-app-os-version',\n];\n\n/**\n * The native app's own headers on this request, or null when it is not the app.\n *\n * On a Twig theme Laravel copies them into the settings' `jitsu.context.extra.headers`,\n * where the SDK reads the app's platform and version from (`salla.config.isMobileApp()`).\n * A React theme asks for its settings from the server, through the API, so the app's\n * headers never reach that call: the request is the only place they are.\n */\nexport function readNativeAppHeaders(headers: Headers): Record<string, string> | null {\n const os = headers.get('s-app-os')?.toLowerCase();\n if (os !== 'ios' && os !== 'android') return null;\n const found: Record<string, string> = {};\n for (const name of NATIVE_APP_HEADERS) {\n const value = headers.get(name);\n if (value) found[name] = value;\n }\n return found;\n}\n","import { queryOptions } from '@tanstack/react-query';\nimport { isHTTPError, isNetworkError, isTimeoutError } from 'ky';\nimport { api, getActiveScope, STORE_IDENTIFIER_HEADER } from './client';\nimport { SettingsError } from '../utils/errors';\nimport type { Store, Theme, Language, JitsuConfig, MaintenanceDetails } from '../types';\nimport { getTwilightContext } from '../twilight/context';\nimport { resolveStoreIdentifier } from '../utils/store-identity';\nimport { requestedThemeVersionId } from '../utils/theme-version';\nimport { NATIVE_APP_HEADERS } from '../utils/native-app-headers';\n\nexport { resolveStoreIdentifier };\n\nconst DEFAULT_INCLUDE_ITEMS = [\n 'store',\n 'settings',\n 'theme',\n 'theme_settings',\n 'external_services',\n 'currencies',\n 'languages',\n 'payments',\n 'product_widgets',\n 'rating',\n 'ratings',\n 'user',\n];\n\n/** Twig's `salla.init({ user })` object; the endpoint ignores the token, so always the guest. */\nexport interface SettingsUser {\n type: 'guest' | 'user';\n id?: number | string | null;\n language_code?: string;\n currency_code?: string;\n country_code?: string;\n [key: string]: unknown;\n}\n\n/**\n * Raw API response for settings endpoint.\n * Languages come as object: { \"AR\": { code, name, ... }, \"EN\": {...} }\n */\ninterface SettingsApiResponse {\n store?: Store;\n theme?: Theme;\n languages?: Record<string, Language>;\n currencies?: Record<\n string,\n { code: string; name: string; symbol: string; amount: number; country_code: string }\n >;\n external_services?: Record<string, unknown>;\n headers?: Record<string, unknown>;\n login?: { url: string; turnstile_site_key: string };\n affiliate?: { utm_url: string; cta_enabled: boolean };\n debug?: boolean;\n trace_console?: boolean;\n policy_url?: string;\n user?: SettingsUser;\n swoole?: string[];\n jitsu?: JitsuConfig;\n maintenance?: boolean;\n maintenance_details?: MaintenanceDetails;\n}\n\n/**\n * Central settings context - single source of truth for all API data.\n * Contains everything from the settings endpoint response after processing.\n */\nexport interface StoreContext {\n store?: Store;\n theme?: Theme;\n /** Languages as array after conversion from API object format */\n languages?: Language[];\n currencies?: Record<\n string,\n { code: string; name: string; symbol: string; amount: number; country_code: string }\n >;\n external_services?: Record<string, unknown>;\n headers?: Record<string, unknown>;\n login?: { url: string; turnstile_site_key: string };\n affiliate?: { utm_url: string; cta_enabled: boolean };\n debug?: boolean;\n trace_console?: boolean; // todo:: remove it\n policy_url?: string;\n user?: SettingsUser;\n /** API paths the SDK sends with `s-store-api-version: swoole` */\n swoole?: string[];\n /** Where the SDK's analytics send events, and which ones; without it the SDK tracks nothing. */\n jitsu?: JitsuConfig;\n /**\n * The store is closed: by the merchant from the dashboard, by the platform, or\n * for the selected market only. The engine then renders the maintenance page\n * to everyone but the merchant; see `rootBeforeLoad`.\n */\n maintenance?: boolean;\n /** What the maintenance page says; sent beside `maintenance`. */\n maintenance_details?: MaintenanceDetails;\n /**\n * The scope these settings were requested with; absent when none was. Not from\n * the API: stamped by `store.settings`, so `resolveThemeVersionId` can tell\n * whether the version they name still answers the scope that is active now.\n */\n requestedScopeId?: string;\n}\n\n/**\n * Converts languages object from API to array format.\n * API returns: { \"AR\": { code, name, ... }, \"EN\": { ... } }\n * We need: [{ code, name, ... }, { code, name, ... }]\n * todo:: return the languages as object from the APIs to avoid this\n */\nfunction languagesToArray(languages?: Record<string, Language>): Language[] | undefined {\n if (!languages) return undefined;\n // The SDK's localization modal reads `lang.iso_code` (not `code`) when a language is\n // selected — without it the switch navigates to `/undefined/...`.\n return Object.values(languages).map((lang) => ({ iso_code: lang.code, ...lang }));\n}\n\n/**\n * The settings' analytics context with the native app's headers in it, as Laravel\n * writes it for a Twig theme: the SDK reads the app's platform and version from there.\n * The API answers a server-side call with the engine's own headers, never the app's.\n */\nfunction withNativeAppHeaders(jitsu?: JitsuConfig): JitsuConfig | undefined {\n if (!jitsu || typeof window !== 'undefined') return jitsu;\n let appHeaders: Record<string, string> | null = null;\n try {\n appHeaders = getTwilightContext().nativeAppHeaders;\n } catch {\n return jitsu;\n }\n if (!appHeaders) return jitsu;\n const extra = jitsu.context?.extra;\n // The engine's own app headers go, so an app that sends no version doesn't get the engine's.\n const headers = { ...extra?.headers };\n for (const name of NATIVE_APP_HEADERS) delete headers[name];\n return {\n ...jitsu,\n context: {\n ...jitsu.context,\n extra: { ...extra, headers: { ...headers, ...appHeaders } },\n },\n };\n}\n\nconst SETTINGS_TIMEOUT_MS = 5000;\n\nasync function requestSettings(identifier: string): Promise<StoreContext> {\n const includeParams = DEFAULT_INCLUDE_ITEMS.map((i) => `include[]=${i}`).join('&');\n const scope = getActiveScope();\n const params = scope != null ? `${includeParams}&scope=${scope.id}` : includeParams;\n\n const json = await api\n // Sent explicitly rather than left to the client's own resolution, so\n // the identifier this function checked is the identifier that travels.\n // They agree today; a caller passing one and being answered about\n // another is the failure this makes impossible rather than unlikely.\n .get(`store/settings?${params}`, {\n timeout: SETTINGS_TIMEOUT_MS,\n headers: { [STORE_IDENTIFIER_HEADER]: identifier },\n })\n .json<{ data?: SettingsApiResponse }>();\n\n const data = json?.data;\n if (!data) {\n throw new SettingsError(\n `The Salla API answered the settings request for store \"${identifier}\" without settings.`,\n { reason: 'empty' }\n );\n }\n\n // Convert languages from object to array\n const languages = languagesToArray(data.languages);\n\n return {\n store: data.store,\n theme: data.theme,\n languages,\n currencies: data.currencies,\n external_services: data.external_services,\n headers: data.headers,\n login: data.login,\n affiliate: data.affiliate,\n policy_url: data.policy_url,\n user: data.user,\n swoole: data.swoole,\n jitsu: withNativeAppHeaders(data.jitsu),\n maintenance: data.maintenance,\n maintenance_details: data.maintenance_details,\n ...(scope && { requestedScopeId: scope.id }),\n };\n}\n\n/** The message the API put in an error body, `{ error: { message } }`, when it sent one. */\nfunction apiErrorMessage(data: unknown): string | undefined {\n const message = (data as { error?: { message?: unknown } } | undefined)?.error?.message;\n return typeof message === 'string' && message.length > 0 && message.length <= 200\n ? message\n : undefined;\n}\n\n/**\n * Names what went wrong, because the page, the server log and Sentry all carry\n * this message. Every failure used to read \"Make sure VITE_STORE_DOMAIN is set\",\n * a local-development variable no deployed theme has, so a slow API looked like\n * a misconfigured theme.\n */\nfunction describeSettingsFailure(identifier: string, error: unknown): SettingsError {\n if (error instanceof SettingsError) return error;\n const request = `the settings request for store \"${identifier}\"`;\n if (isTimeoutError(error)) {\n return new SettingsError(\n `The Salla API did not answer ${request} within ${SETTINGS_TIMEOUT_MS} ms.`,\n { reason: 'timeout' }\n );\n }\n if (isHTTPError(error)) {\n const { status } = error.response;\n const said = apiErrorMessage(error.data);\n return new SettingsError(\n `The Salla API answered ${request} with HTTP ${status}${said ? `: ${said}` : ''}.`,\n { reason: 'http', status }\n );\n }\n if (isNetworkError(error)) {\n return new SettingsError(`The Salla API could not be reached for ${request}.`, {\n reason: 'network',\n });\n }\n const detail = error instanceof Error ? `: ${error.message}` : '';\n return new SettingsError(`The settings request for store \"${identifier}\" failed${detail}.`);\n}\n\n/**\n * The settings, or a {@link SettingsError} that says why there are none. The\n * query throws it so the root route can say why the store did not load;\n * `store.settings` keeps answering `null` for its own callers.\n */\nasync function fetchSettings(storeIdentifier?: string): Promise<StoreContext> {\n const identifier = storeIdentifier ?? resolveStoreIdentifier();\n\n if (!identifier) {\n const error = new SettingsError(\n 'No store is named for this request: add `?storeId=` on the preview host, or set VITE_STORE_DOMAIN in local development.',\n { reason: 'no-store' }\n );\n console.warn('[store.settings]', error.message);\n throw error;\n }\n\n try {\n return await requestSettings(identifier);\n } catch (cause) {\n const error = describeSettingsFailure(identifier, cause);\n console.error('[store.settings]', error.message, ...(cause === error ? [] : [cause]));\n throw error;\n }\n}\n\nexport const store = {\n settings: async (storeIdentifier?: string): Promise<StoreContext | null> => {\n try {\n return await fetchSettings(storeIdentifier);\n } catch {\n // Already logged, with the reason.\n return null;\n }\n },\n\n queries: {\n settings: (storeIdentifier?: string) =>\n queryOptions<StoreContext | null>({\n queryKey: [\n 'store',\n 'settings',\n storeIdentifier,\n getTwilightContext().locale,\n getActiveScope(),\n // Two versions of one store's settings are two different answers, and\n // this is the query whose answer decides what every other call is\n // pinned to. `requestedThemeVersionId` rather than the resolved one:\n // the resolved value falls back to what these settings report, so it\n // is not knowable until after this query has run — the key would be\n // one thing on the server and another on the client, and the hydrated\n // page would refetch the settings it was just handed.\n requestedThemeVersionId(),\n ],\n // Throws rather than resolving `null`, so the failure keeps its reason.\n queryFn: () => fetchSettings(storeIdentifier),\n // A null never retried, and the root route waits on this: the router's\n // default `retry: 1` would sit through the timeout twice.\n retry: 0,\n }),\n },\n};\n"]}
@@ -1,7 +1,7 @@
1
- import { advertisement, advertisementsFor } from './chunk-4PT5MXGR.js';
1
+ import { advertisement, advertisementsFor } from './chunk-NEPWW7KM.js';
2
2
  import { useTranslation } from './chunk-TYNZ5B2B.js';
3
- import { whenSallaReady } from './chunk-3NFVZJNI.js';
4
- import { subscribeTwilight, getTwilightContext } from './chunk-JNAJTCJD.js';
3
+ import { whenSallaReady } from './chunk-L6TSHT52.js';
4
+ import { subscribeTwilight, getTwilightContext } from './chunk-QRHXAKJ3.js';
5
5
  import { useSyncExternalStore, useState, useEffect } from 'react';
6
6
  import { useQuery } from '@tanstack/react-query';
7
7
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
@@ -99,5 +99,5 @@ function PageAdvertisements() {
99
99
  }
100
100
 
101
101
  export { PageAdvertisements };
102
- //# sourceMappingURL=chunk-ZVYJK6XQ.js.map
103
- //# sourceMappingURL=chunk-ZVYJK6XQ.js.map
102
+ //# sourceMappingURL=chunk-WAYZZVNX.js.map
103
+ //# sourceMappingURL=chunk-WAYZZVNX.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/layout/PageAdvertisements.tsx"],"names":[],"mappings":";;;;;;;;AAOA,IAAM,eAAA,GAAkB,MAAM,kBAAA,EAAmB,CAAE,IAAA,EAAM,IAAA;AAGzD,IAAM,YAAA,GAAe,CAAC,EAAA,KAAe,CAAA,SAAA,EAAY,EAAE,CAAA,CAAA;AAGnD,IAAM,SAA0B,EAAC;AAGjC,IAAM,qBAAA,GACJ,uPAAA;AAEF,SAAS,YAAY,EAAA,EAAqB;AACxC,EAAA,IAAI;AACF,IAAA,OAAO,QAAQ,MAAA,CAAO,YAAA,CAAa,QAAQ,YAAA,CAAa,EAAE,CAAC,CAAC,CAAA;AAAA,EAC9D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,QAAQ,EAAA,EAAkB;AACjC,EAAA,MAAM,OAAA,GAAU,OAAO,KAAA,EAAO,OAAA;AAC9B,EAAA,IAAI,OAAO,SAAS,GAAA,KAAQ,UAAA,UAAoB,GAAA,CAAI,YAAA,CAAa,EAAE,CAAA,EAAG,WAAW,CAAA;AAAA,OAC5E;AACH,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,YAAA,CAAa,QAAQ,YAAA,CAAa,EAAE,GAAG,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC,CAAA;AAAA,IAC3E,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACF;AAeO,SAAS,kBAAA,GAAqB;AACnC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,iBAAA,EAAmB,eAAA,EAAiB,eAAe,CAAA;AAEzF,EAAA,MAAM,EAAE,IAAA,EAAM,GAAA,GAAM,MAAA,KAAW,QAAA,CAAS,EAAE,GAAG,aAAA,CAAc,OAAA,CAAQ,IAAA,EAAK,EAAG,KAAA,EAAO,GAAG,CAAA;AACrF,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAA4B,IAAI,CAAA;AAExD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,YAAY,IAAI,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,CAAC,EAAA,KAAO,WAAA,CAAY,EAAA,CAAG,EAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,EAAA,KAAO,EAAA,CAAG,EAAE,CAAC,CAAA;AACnF,IAAA,OAAA,CAAQ,EAAE,SAAS,MAAA,CAAO,IAAA,KAAS,OAAO,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,CAAA;AACxE,IAAA,OAAO,cAAA,CAAe,CAAC,GAAA,KAAQ;AAC7B,MAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,EAAQ,WAAA,IAAe,CAAA;AAC7C,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,EAAQ,OAAA,IAAW,CAAA;AACzC,MAAA,IAAI,SAAS,KAAA,EAAO;AAClB,QAAA,OAAA;AAAA,UAAQ,CAAC,OAAA,KACP,OAAA,GAAU,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW,KAAA,EAAM,GAAI;AAAA,SACvE;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,IAAI,IAAA,EAAM,OAAO,OAAO,IAAA;AACxB,EAAA,MAAM,QAAQ,IAAA,EAAM,OAAA,GAChB,GAAA,GACA,iBAAA,CAAkB,KAAK,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,OAAO,CAAC,IAAA,EAAM,UAAU,GAAA,CAAI,EAAA,CAAG,EAAE,CAAC,CAAA;AAC/E,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,IAAA;AAE1B,EAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,KAAe;AAC5B,IAAA,OAAA,CAAQ,EAAE,CAAA;AACV,IAAA,OAAA;AAAA,MAAQ,CAAC,OAAA,KACP,OAAA,GAAU,EAAE,GAAG,OAAA,EAAS,SAAA,EAAW,IAAI,GAAA,CAAI,QAAQ,SAAS,CAAA,CAAE,GAAA,CAAI,EAAE,GAAE,GAAI;AAAA,KAC5E;AAAA,EACF,CAAA;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,GAAA,CAAI,CAAC,EAAA,qBACV,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,iBAAA;AAAA,QACV,WAAS,EAAA,CAAG,EAAA;AAAA,QACZ,KAAA,EAAO,EAAE,eAAA,EAAiB,EAAA,CAAG,QAAQ,EAAA,EAAI,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,IAAA,EAAK;AAAA,QAEhE,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4EAAA,EACb,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,mEAAA,EAEd,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,CAAA,sEAAA,EAAyE,EAAA,CAAG,IAAA,IAAQ,EAAE,CAAA;AAAA;AAAA,aACnG;AAAA,YACC,GAAG,GAAA,mBACF,GAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,MAAM,EAAA,CAAG,GAAA;AAAA,gBACT,MAAA,EAAQ,GAAG,MAAA,IAAU,MAAA;AAAA,gBACrB,GAAA,EAAK,EAAA,CAAG,MAAA,KAAW,QAAA,GAAW,UAAA,GAAa,MAAA;AAAA,gBAE1C,QAAA,EAAA,EAAA,CAAG;AAAA;AAAA,gBAGN,EAAA,CAAG;AAAA,WAAA,EAEP,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,6BAAA;AAAA,cACV,YAAA,EAAY,CAAA,CAAE,sBAAA,EAAwB,OAAO,CAAA;AAAA,cAC7C,OAAA,EAAS,MAAM,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA;AAAA,cAG1B,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2BAAA,EAA4B;AAAA;AAAA;AAC3C,SAAA,EACF;AAAA,OAAA;AAAA,MAhCK,EAAA,CAAG;AAAA,KAkCX,CAAA;AAAA,oBACD,GAAA,CAAC,QAAA,EAAA,EAAO,wBAAA,EAAwB,IAAA,EAAE,QAAA,EAAA,qBAAA,EAAsB;AAAA,GAAA,EAC1D,CAAA;AAEJ","file":"chunk-ZVYJK6XQ.js","sourcesContent":["import { useEffect, useState, useSyncExternalStore } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { advertisement, advertisementsFor, type Advertisement } from '../../api/advertisement';\nimport { whenSallaReady } from '../../utils/sdk-helpers';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { getTwilightContext, subscribeTwilight } from '../../twilight/context';\n\nconst currentPageSlug = () => getTwilightContext().page?.slug;\n\n/** The key `<salla-advertisement>` marks a closed ad with, through `salla.storage` (store.js, JSON). */\nconst dismissedKey = (id: number) => `statusAd-${id}`;\n\n/** Stable while the query has no data, so the effect below doesn't rerun on every render. */\nconst NO_ADS: Advertisement[] = [];\n\n/** Hides the ads this visitor closed before the first paint; the effect then drops them. */\nconst HIDE_DISMISSED_SCRIPT =\n \"(function(){try{if(window.self!==window.top)return;document.currentScript.parentNode.querySelectorAll('.s-advertisement[data-id]').forEach(function(e){if(localStorage.getItem('statusAd-'+e.getAttribute('data-id')))e.hidden=true})}catch(e){}})();\";\n\nfunction isDismissed(id: number): boolean {\n try {\n return Boolean(window.localStorage.getItem(dismissedKey(id)));\n } catch {\n return false;\n }\n}\n\nfunction dismiss(id: number): void {\n const storage = window.salla?.storage;\n if (typeof storage?.set === 'function') storage.set(dismissedKey(id), 'dismissed');\n else {\n try {\n window.localStorage.setItem(dismissedKey(id), JSON.stringify('dismissed'));\n } catch {\n // Storage disabled: the ad hides for this page view only.\n }\n }\n}\n\ninterface ClientView {\n /** The theme editor's iframe, or the SDK's debug flag: every ad shows, closed or not. */\n preview: boolean;\n /** Inside the Salla mobile app, which shows no ads. */\n inApp: boolean;\n dismissed: Set<number>;\n}\n\n/**\n * The merchant's announcement bars, in place of `<salla-advertisement>`. Same data, rules and\n * markup, but rendered on the server (the ads are prefetched in the root `beforeLoad`), so the\n * bar is in the first paint instead of pushing the page down when the web component fetches it.\n */\nexport function PageAdvertisements() {\n const { t } = useTranslation();\n // The deepest route loader's `page`, the page `salla.config` reports.\n const pageSlug = useSyncExternalStore(subscribeTwilight, currentPageSlug, currentPageSlug);\n // The query's `retry: 0` only bounds the server wait; the browser may retry.\n const { data: ads = NO_ADS } = useQuery({ ...advertisement.queries.list(), retry: 2 });\n const [view, setView] = useState<ClientView | null>(null);\n\n useEffect(() => {\n const dismissed = new Set(ads.filter((ad) => isDismissed(ad.id)).map((ad) => ad.id));\n setView({ preview: window.self !== window.top, inApp: false, dismissed });\n return whenSallaReady((sdk) => {\n const config = sdk.config as { isMobileApp?: () => boolean; isDebug?: () => boolean };\n const inApp = Boolean(config?.isMobileApp?.());\n const debug = Boolean(config?.isDebug?.());\n if (inApp || debug) {\n setView((current) =>\n current ? { ...current, inApp, preview: current.preview || debug } : current\n );\n }\n });\n }, [ads]);\n\n if (view?.inApp) return null;\n const shown = view?.preview\n ? ads\n : advertisementsFor(ads, pageSlug).filter((ad) => !view?.dismissed.has(ad.id));\n if (!shown.length) return null;\n\n const close = (id: number) => {\n dismiss(id);\n setView((current) =>\n current ? { ...current, dismissed: new Set(current.dismissed).add(id) } : current\n );\n };\n\n return (\n <>\n {shown.map((ad) => (\n <div\n key={ad.id}\n className=\"s-advertisement\"\n data-id={ad.id}\n style={{ backgroundColor: ad.colors?.bg, color: ad.colors?.text }}\n >\n <div className=\"s-advertisement-content container flex justify-between items-center py-2.5\">\n <span className=\"s-advertisement-content-main flex-1 font-bold text-center text-sm\">\n {/* Rendered without an icon too, as the SDK does: its margin is part of the layout. */}\n <i\n className={`s-advertisement-content-icon inline-block align-middle me-2 text-base ${ad.icon ?? ''}`}\n />\n {ad.url ? (\n <a\n href={ad.url}\n target={ad.target ?? undefined}\n rel={ad.target === '_blank' ? 'noopener' : undefined}\n >\n {ad.description}\n </a>\n ) : (\n ad.description\n )}\n </span>\n <button\n type=\"button\"\n className=\"s-advertisement-action px-1\"\n aria-label={t('common.buttons.close', 'Close')}\n onClick={() => close(ad.id)}\n >\n {/* `inline-block`: before the icon CSS loads, an empty inline `<i>` leaves the button 0px tall. */}\n <i className=\"sicon-cancel inline-block\" />\n </button>\n </div>\n </div>\n ))}\n <script suppressHydrationWarning>{HIDE_DISMISSED_SCRIPT}</script>\n </>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/layout/PageAdvertisements.tsx"],"names":[],"mappings":"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","file":"chunk-WAYZZVNX.js","sourcesContent":["import { useEffect, useState, useSyncExternalStore } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { advertisement, advertisementsFor, type Advertisement } from '../../api/advertisement';\nimport { whenSallaReady } from '../../utils/sdk-helpers';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { getTwilightContext, subscribeTwilight } from '../../twilight/context';\n\nconst currentPageSlug = () => getTwilightContext().page?.slug;\n\n/** The key `<salla-advertisement>` marks a closed ad with, through `salla.storage` (store.js, JSON). */\nconst dismissedKey = (id: number) => `statusAd-${id}`;\n\n/** Stable while the query has no data, so the effect below doesn't rerun on every render. */\nconst NO_ADS: Advertisement[] = [];\n\n/** Hides the ads this visitor closed before the first paint; the effect then drops them. */\nconst HIDE_DISMISSED_SCRIPT =\n \"(function(){try{if(window.self!==window.top)return;document.currentScript.parentNode.querySelectorAll('.s-advertisement[data-id]').forEach(function(e){if(localStorage.getItem('statusAd-'+e.getAttribute('data-id')))e.hidden=true})}catch(e){}})();\";\n\nfunction isDismissed(id: number): boolean {\n try {\n return Boolean(window.localStorage.getItem(dismissedKey(id)));\n } catch {\n return false;\n }\n}\n\nfunction dismiss(id: number): void {\n const storage = window.salla?.storage;\n if (typeof storage?.set === 'function') storage.set(dismissedKey(id), 'dismissed');\n else {\n try {\n window.localStorage.setItem(dismissedKey(id), JSON.stringify('dismissed'));\n } catch {\n // Storage disabled: the ad hides for this page view only.\n }\n }\n}\n\ninterface ClientView {\n /** The theme editor's iframe, or the SDK's debug flag: every ad shows, closed or not. */\n preview: boolean;\n /** Inside the Salla mobile app, which shows no ads. */\n inApp: boolean;\n dismissed: Set<number>;\n}\n\n/**\n * The merchant's announcement bars, in place of `<salla-advertisement>`. Same data, rules and\n * markup, but rendered on the server (the ads are prefetched in the root `beforeLoad`), so the\n * bar is in the first paint instead of pushing the page down when the web component fetches it.\n */\nexport function PageAdvertisements() {\n const { t } = useTranslation();\n // The deepest route loader's `page`, the page `salla.config` reports.\n const pageSlug = useSyncExternalStore(subscribeTwilight, currentPageSlug, currentPageSlug);\n // The query's `retry: 0` only bounds the server wait; the browser may retry.\n const { data: ads = NO_ADS } = useQuery({ ...advertisement.queries.list(), retry: 2 });\n const [view, setView] = useState<ClientView | null>(null);\n\n useEffect(() => {\n const dismissed = new Set(ads.filter((ad) => isDismissed(ad.id)).map((ad) => ad.id));\n setView({ preview: window.self !== window.top, inApp: false, dismissed });\n return whenSallaReady((sdk) => {\n const config = sdk.config as { isMobileApp?: () => boolean; isDebug?: () => boolean };\n const inApp = Boolean(config?.isMobileApp?.());\n const debug = Boolean(config?.isDebug?.());\n if (inApp || debug) {\n setView((current) =>\n current ? { ...current, inApp, preview: current.preview || debug } : current\n );\n }\n });\n }, [ads]);\n\n if (view?.inApp) return null;\n const shown = view?.preview\n ? ads\n : advertisementsFor(ads, pageSlug).filter((ad) => !view?.dismissed.has(ad.id));\n if (!shown.length) return null;\n\n const close = (id: number) => {\n dismiss(id);\n setView((current) =>\n current ? { ...current, dismissed: new Set(current.dismissed).add(id) } : current\n );\n };\n\n return (\n <>\n {shown.map((ad) => (\n <div\n key={ad.id}\n className=\"s-advertisement\"\n data-id={ad.id}\n style={{ backgroundColor: ad.colors?.bg, color: ad.colors?.text }}\n >\n <div className=\"s-advertisement-content container flex justify-between items-center py-2.5\">\n <span className=\"s-advertisement-content-main flex-1 font-bold text-center text-sm\">\n {/* Rendered without an icon too, as the SDK does: its margin is part of the layout. */}\n <i\n className={`s-advertisement-content-icon inline-block align-middle me-2 text-base ${ad.icon ?? ''}`}\n />\n {ad.url ? (\n <a\n href={ad.url}\n target={ad.target ?? undefined}\n rel={ad.target === '_blank' ? 'noopener' : undefined}\n >\n {ad.description}\n </a>\n ) : (\n ad.description\n )}\n </span>\n <button\n type=\"button\"\n className=\"s-advertisement-action px-1\"\n aria-label={t('common.buttons.close', 'Close')}\n onClick={() => close(ad.id)}\n >\n {/* `inline-block`: before the icon CSS loads, an empty inline `<i>` leaves the button 0px tall. */}\n <i className=\"sicon-cancel inline-block\" />\n </button>\n </div>\n </div>\n ))}\n <script suppressHydrationWarning>{HIDE_DISMISSED_SCRIPT}</script>\n </>\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { api } from './chunk-YDSWLCOY.js';
1
+ import { api } from './chunk-TTTI4W5F.js';
2
2
  import { queryOptions } from '@tanstack/react-query';
3
3
 
4
4
  var notification = {
@@ -24,5 +24,5 @@ var notification = {
24
24
  };
25
25
 
26
26
  export { notification };
27
- //# sourceMappingURL=chunk-BQ2MNEN7.js.map
28
- //# sourceMappingURL=chunk-BQ2MNEN7.js.map
27
+ //# sourceMappingURL=chunk-WEN6FKY6.js.map
28
+ //# sourceMappingURL=chunk-WEN6FKY6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/notification.ts"],"names":[],"mappings":";;;AAcO,IAAM,YAAA,GAAe;AAAA,EAC1B,MAAM,YAAgD;AACpD,IAAA,MAAM,WAAW,MAAM,GAAA,CACpB,GAAA,CAAI,eAAe,EACnB,IAAA,EAAmF;AACtF,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA,CAAS,IAAA,IAAQ,EAAC;AAAA,MACxB,QAAQ,QAAA,CAAS;AAAA,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,EAAY,OAAO,EAAA,KAA8B;AAC/C,IAAA,MAAM,IAAI,GAAA,CAAI,CAAA,cAAA,EAAiB,EAAE,CAAA,KAAA,CAAO,EAAE,IAAA,EAAK;AAAA,EACjD,CAAA;AAAA,EAEA,eAAe,YAA2B;AACxC,IAAA,MAAM,GAAA,CAAI,GAAA,CAAI,wBAAwB,CAAA,CAAE,IAAA,EAAK;AAAA,EAC/C,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,MACJ,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,eAAA,EAAiB,MAAM,CAAA;AAAA,MAClC,OAAA,EAAS,MAAM,YAAA,CAAa,IAAA;AAAK,KAClC;AAAA;AAEP","file":"chunk-BQ2MNEN7.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport type { Notification } from '../routes/account/notifications/types';\n\nexport interface NotificationsListResponse {\n data: Notification[];\n cursor: {\n current: number;\n previous: number | null;\n next: number | null;\n count: number;\n };\n}\n\nexport const notification = {\n list: async (): Promise<NotificationsListResponse> => {\n const response = await api\n .get('notifications')\n .json<{ data: Notification[] | null; cursor: NotificationsListResponse['cursor'] }>();\n return {\n data: response.data ?? [],\n cursor: response.cursor,\n };\n },\n\n markAsRead: async (id: number): Promise<void> => {\n await api.put(`notifications/${id}/read`).json();\n },\n\n markAllAsRead: async (): Promise<void> => {\n await api.put('notifications/read-all').json();\n },\n\n queries: {\n list: () =>\n queryOptions({\n queryKey: ['notifications', 'list'],\n queryFn: () => notification.list(),\n }),\n },\n};\n"]}
1
+ {"version":3,"sources":["../src/api/notification.ts"],"names":[],"mappings":";;;AAcO,IAAM,YAAA,GAAe;AAAA,EAC1B,MAAM,YAAgD;AACpD,IAAA,MAAM,WAAW,MAAM,GAAA,CACpB,GAAA,CAAI,eAAe,EACnB,IAAA,EAAmF;AACtF,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA,CAAS,IAAA,IAAQ,EAAC;AAAA,MACxB,QAAQ,QAAA,CAAS;AAAA,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,UAAA,EAAY,OAAO,EAAA,KAA8B;AAC/C,IAAA,MAAM,IAAI,GAAA,CAAI,CAAA,cAAA,EAAiB,EAAE,CAAA,KAAA,CAAO,EAAE,IAAA,EAAK;AAAA,EACjD,CAAA;AAAA,EAEA,eAAe,YAA2B;AACxC,IAAA,MAAM,GAAA,CAAI,GAAA,CAAI,wBAAwB,CAAA,CAAE,IAAA,EAAK;AAAA,EAC/C,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,MACJ,YAAA,CAAa;AAAA,MACX,QAAA,EAAU,CAAC,eAAA,EAAiB,MAAM,CAAA;AAAA,MAClC,OAAA,EAAS,MAAM,YAAA,CAAa,IAAA;AAAK,KAClC;AAAA;AAEP","file":"chunk-WEN6FKY6.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport type { Notification } from '../routes/account/notifications/types';\n\nexport interface NotificationsListResponse {\n data: Notification[];\n cursor: {\n current: number;\n previous: number | null;\n next: number | null;\n count: number;\n };\n}\n\nexport const notification = {\n list: async (): Promise<NotificationsListResponse> => {\n const response = await api\n .get('notifications')\n .json<{ data: Notification[] | null; cursor: NotificationsListResponse['cursor'] }>();\n return {\n data: response.data ?? [],\n cursor: response.cursor,\n };\n },\n\n markAsRead: async (id: number): Promise<void> => {\n await api.put(`notifications/${id}/read`).json();\n },\n\n markAllAsRead: async (): Promise<void> => {\n await api.put('notifications/read-all').json();\n },\n\n queries: {\n list: () =>\n queryOptions({\n queryKey: ['notifications', 'list'],\n queryFn: () => notification.list(),\n }),\n },\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { api } from './chunk-YDSWLCOY.js';
1
+ import { api } from './chunk-TTTI4W5F.js';
2
2
  import { queryOptions } from '@tanstack/react-query';
3
3
 
4
4
  var user = {
@@ -19,5 +19,5 @@ var user = {
19
19
  };
20
20
 
21
21
  export { user };
22
- //# sourceMappingURL=chunk-24UCMWQB.js.map
23
- //# sourceMappingURL=chunk-24UCMWQB.js.map
22
+ //# sourceMappingURL=chunk-WX2UWLMW.js.map
23
+ //# sourceMappingURL=chunk-WX2UWLMW.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/user.ts"],"names":[],"mappings":";;;AAIO,IAAM,IAAA,GAAO;AAAA,EAClB,KAAK,YAAkC;AACrC,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,GAAA,CACV,GAAA,CAAI,WAAW,CAAA,CACf,MAAmC,CACnC,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,CAAE,IAAA,EAAM,IAAA,EAAM,QAAgB,CAAE,CAAA;AAAA,IACvD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,MACP,YAAA,CAA0B;AAAA,MACxB,QAAA,EAAU,CAAC,MAAA,EAAQ,SAAS,CAAA;AAAA,MAC5B,SAAS,IAAA,CAAK;AAAA,KACf;AAAA;AAEP","file":"chunk-24UCMWQB.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport type { User } from '../types';\n\nexport const user = {\n get: async (): Promise<User | null> => {\n try {\n return await api\n .get('auth/user')\n .json<{ data: Omit<User, 'type'> }>()\n .then((r) => ({ ...r.data, type: 'user' as const }));\n } catch (error) {\n console.debug('[user.get] Failed:', error);\n return null;\n }\n },\n\n queries: {\n current: () =>\n queryOptions<User | null>({\n queryKey: ['user', 'current'],\n queryFn: user.get,\n }),\n },\n};\n"]}
1
+ {"version":3,"sources":["../src/api/user.ts"],"names":[],"mappings":";;;AAIO,IAAM,IAAA,GAAO;AAAA,EAClB,KAAK,YAAkC;AACrC,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,GAAA,CACV,GAAA,CAAI,WAAW,CAAA,CACf,MAAmC,CACnC,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,CAAE,IAAA,EAAM,IAAA,EAAM,QAAgB,CAAE,CAAA;AAAA,IACvD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,MACP,YAAA,CAA0B;AAAA,MACxB,QAAA,EAAU,CAAC,MAAA,EAAQ,SAAS,CAAA;AAAA,MAC5B,SAAS,IAAA,CAAK;AAAA,KACf;AAAA;AAEP","file":"chunk-WX2UWLMW.js","sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport { api } from './client';\nimport type { User } from '../types';\n\nexport const user = {\n get: async (): Promise<User | null> => {\n try {\n return await api\n .get('auth/user')\n .json<{ data: Omit<User, 'type'> }>()\n .then((r) => ({ ...r.data, type: 'user' as const }));\n } catch (error) {\n console.debug('[user.get] Failed:', error);\n return null;\n }\n },\n\n queries: {\n current: () =>\n queryOptions<User | null>({\n queryKey: ['user', 'current'],\n queryFn: user.get,\n }),\n },\n};\n"]}
@@ -1,12 +1,12 @@
1
- import { home } from './chunk-TWUOIBO7.js';
2
- import { product } from './chunk-SQXUWX4B.js';
3
- import { ProductCard } from './chunk-B2OJZKU4.js';
1
+ import { home } from './chunk-U46RGTYO.js';
2
+ import { product } from './chunk-SGZ6TCHB.js';
3
+ import { ProductCard } from './chunk-TUVDPELG.js';
4
4
  import { registry } from './chunk-Y32RHCOH.js';
5
5
  import { useTranslation } from './chunk-TYNZ5B2B.js';
6
- import { Image, LazyRenderWhenVisible } from './chunk-GFUXGVER.js';
6
+ import { Image, LazyRenderWhenVisible } from './chunk-QZM4ZACO.js';
7
7
  import { Link } from './chunk-AXW67SY7.js';
8
- import { whenSallaLoaded } from './chunk-3NFVZJNI.js';
9
- import { getTwilightContext } from './chunk-JNAJTCJD.js';
8
+ import { whenSallaLoaded } from './chunk-L6TSHT52.js';
9
+ import { getTwilightContext } from './chunk-QRHXAKJ3.js';
10
10
  import { useTwilight, TwilightContext } from './chunk-DF6FBKDN.js';
11
11
  import { memo, useState, useCallback, createElement, useEffect, lazy, Component, useRef, useMemo, Suspense } from 'react';
12
12
  import { SallaProductsSlider, SallaProductsList, ProductsSliderSkeleton, ListSkeleton, SliderSkeleton, BackgroundSliderSkeleton, BulletDeliverySkeleton, ReviewItemSkeleton, FixedProductsSkeleton, Pulse } from '@salla.sa/twilight-components-react';
@@ -783,5 +783,5 @@ var ReorderProducts = memo(function ReorderProducts2() {
783
783
  });
784
784
 
785
785
  export { BundleComponent, ComponentErrorBoundary, DefaultHomeComponents, FeaturedProductsStyle1, FeaturedProductsStyle2, FeaturedProductsStyle3, FixedBanner, FixedProducts, HomeComponentRenderer, LazyTestimonials, PageBlocks, ParallaxBackground, PhotosSlider, ProductsSlider, ReorderProducts, SquarePhotos, StoreFeatures, Youtube, registerHomeComponentConfig, registerHomeComponents, useReorderButtons };
786
- //# sourceMappingURL=chunk-S5EVFWAL.js.map
787
- //# sourceMappingURL=chunk-S5EVFWAL.js.map
786
+ //# sourceMappingURL=chunk-YDKPG3AP.js.map
787
+ //# sourceMappingURL=chunk-YDKPG3AP.js.map