@akinon/projectzero 2.0.0-beta.9 → 2.0.0

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 (290) hide show
  1. package/CHANGELOG.md +183 -17
  2. package/app-template/.env.example +3 -0
  3. package/app-template/.github/instructions/account.instructions.md +749 -0
  4. package/app-template/.github/instructions/checkout.instructions.md +678 -0
  5. package/app-template/.github/instructions/default.instructions.md +279 -0
  6. package/app-template/.github/instructions/edge-cases.instructions.md +73 -0
  7. package/app-template/.github/instructions/routing.instructions.md +603 -0
  8. package/app-template/.github/instructions/settings.instructions.md +338 -0
  9. package/app-template/.gitignore +3 -0
  10. package/app-template/AGENTS.md +7 -0
  11. package/app-template/CHANGELOG.md +2033 -232
  12. package/app-template/Procfile +1 -1
  13. package/app-template/akinon.json +1 -4
  14. package/app-template/build.sh +10 -0
  15. package/app-template/docs/advanced-usage.md +111 -0
  16. package/app-template/docs/plugins.md +60 -25
  17. package/app-template/docs/sentry-usage.md +35 -0
  18. package/app-template/jest.config.ts +2 -2
  19. package/app-template/next-env.d.ts +1 -0
  20. package/app-template/{next.config.ts → next.config.mjs} +6 -7
  21. package/app-template/package.json +58 -50
  22. package/app-template/postcss.config.mjs +1 -4
  23. package/app-template/public/amex.svg +12 -0
  24. package/app-template/public/apple-pay.svg +16 -0
  25. package/app-template/public/assets/images/product-placeholder-1.jpg +0 -0
  26. package/app-template/public/assets/images/product-placeholder-2.jpg +0 -0
  27. package/app-template/public/assets/images/product-placeholder-3.jpg +0 -0
  28. package/app-template/public/assets/images/product-placeholder-4.jpg +0 -0
  29. package/app-template/public/google-pay.svg +16 -0
  30. package/app-template/public/locales/en/account.json +9 -4
  31. package/app-template/public/locales/en/auth.json +6 -7
  32. package/app-template/public/locales/en/basket.json +6 -6
  33. package/app-template/public/locales/en/blog.json +7 -0
  34. package/app-template/public/locales/en/category.json +3 -1
  35. package/app-template/public/locales/en/checkout.json +17 -4
  36. package/app-template/public/locales/en/common.json +61 -3
  37. package/app-template/public/locales/en/forgot_password.json +6 -7
  38. package/app-template/public/locales/en/product.json +84 -4
  39. package/app-template/public/locales/tr/account.json +9 -4
  40. package/app-template/public/locales/tr/auth.json +16 -17
  41. package/app-template/public/locales/tr/basket.json +4 -4
  42. package/app-template/public/locales/tr/blog.json +7 -0
  43. package/app-template/public/locales/tr/category.json +3 -1
  44. package/app-template/public/locales/tr/checkout.json +48 -36
  45. package/app-template/public/locales/tr/common.json +60 -2
  46. package/app-template/public/locales/tr/forgot_password.json +12 -13
  47. package/app-template/public/locales/tr/product.json +82 -0
  48. package/app-template/public/logo.svg +3 -27
  49. package/app-template/public/mastercard.svg +14 -0
  50. package/app-template/public/masterpass-javascript-sdk-web.min.js +1 -0
  51. package/app-template/public/promotion-banner.jpg +0 -0
  52. package/app-template/public/shop-pay.svg +12 -0
  53. package/app-template/public/visa.svg +12 -0
  54. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/[...prettyurl]/page.tsx +11 -11
  55. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/layout.tsx +4 -3
  56. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/cancellation/page.tsx +13 -10
  57. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/page.tsx +73 -51
  58. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/page.tsx +1 -1
  59. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/profile/page.tsx +2 -2
  60. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/address/stores/page.tsx +2 -2
  61. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/auth/page.tsx +1 -1
  62. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/basket/page.tsx +2 -2
  63. package/app-template/src/app/[pz]/blog/[slug]/page.tsx +120 -0
  64. package/app-template/src/app/[pz]/category/[pk]/page.tsx +37 -0
  65. package/app-template/src/app/[pz]/flat-page/[pk]/page.tsx +23 -0
  66. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/forms/[pk]/generate/page.tsx +2 -3
  67. package/app-template/src/app/[pz]/group-product/[pk]/page.tsx +93 -0
  68. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/landing-page/[pk]/page.tsx +2 -4
  69. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/layout.tsx +6 -11
  70. package/app-template/src/app/[pz]/list/page.tsx +26 -0
  71. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/not-found.tsx +5 -7
  72. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/completed/[token]/page.tsx +6 -4
  73. package/app-template/src/app/[pz]/page.tsx +28 -0
  74. package/app-template/src/app/[pz]/pages/[slug]/page.tsx +19 -0
  75. package/app-template/src/app/[pz]/product/[pk]/page.tsx +102 -0
  76. package/app-template/src/app/[pz]/special-page/[pk]/page.tsx +35 -0
  77. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/email-set-primary/[[...id]]/page.tsx +3 -4
  78. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/registration/account-confirm-email/[[...id]]/page.tsx +3 -3
  79. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/reset/[[...id]]/page.tsx +41 -5
  80. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/xml-sitemap/[node]/route.ts +8 -6
  81. package/app-template/src/app/api/auth/[...nextauth]/route.ts +3 -0
  82. package/app-template/src/app/api/barcode-search/route.ts +1 -0
  83. package/app-template/src/app/api/cache/route.ts +1 -1
  84. package/app-template/src/app/api/form/[...id]/route.ts +1 -7
  85. package/app-template/src/app/api/image-proxy/route.ts +1 -0
  86. package/app-template/src/app/api/logout/route.ts +1 -1
  87. package/app-template/src/app/api/product-categories/route.ts +1 -0
  88. package/app-template/src/app/api/similar-product-list/route.ts +1 -0
  89. package/app-template/src/app/api/similar-products/route.ts +1 -0
  90. package/app-template/src/app/api/theme-settings/route.ts +12 -0
  91. package/app-template/src/app/api/virtual-try-on/limited-categories/route.ts +1 -0
  92. package/app-template/src/app/api/virtual-try-on/route.ts +1 -0
  93. package/app-template/src/app/api/web-vitals/route.ts +1 -1
  94. package/app-template/src/assets/fonts/pz-icon.css +211 -49
  95. package/app-template/src/assets/fonts/pz-icon.eot +0 -0
  96. package/app-template/src/assets/fonts/pz-icon.html +486 -0
  97. package/app-template/src/assets/fonts/pz-icon.scss +373 -49
  98. package/app-template/src/assets/fonts/pz-icon.svg +215 -53
  99. package/app-template/src/assets/fonts/pz-icon.ttf +0 -0
  100. package/app-template/src/assets/fonts/pz-icon.woff +0 -0
  101. package/app-template/src/assets/fonts/pz-icon.woff2 +0 -0
  102. package/app-template/src/assets/globals.scss +8 -133
  103. package/app-template/src/assets/icons/arrow-right.svg +3 -0
  104. package/app-template/src/assets/icons/cart.svg +4 -12
  105. package/app-template/src/assets/icons/check.svg +2 -18
  106. package/app-template/src/assets/icons/chevron-down.svg +2 -7
  107. package/app-template/src/assets/icons/delete.svg +3 -0
  108. package/app-template/src/assets/icons/facebook.svg +2 -8
  109. package/app-template/src/assets/icons/fav-off.svg +5 -0
  110. package/app-template/src/assets/icons/fav-on.svg +5 -0
  111. package/app-template/src/assets/icons/filter-and-sort.svg +3 -0
  112. package/app-template/src/assets/icons/heart.svg +3 -0
  113. package/app-template/src/assets/icons/instagram.svg +2 -13
  114. package/app-template/src/assets/icons/materials.svg +3 -0
  115. package/app-template/src/assets/icons/person.svg +4 -0
  116. package/app-template/src/assets/icons/pinterest.svg +5 -11
  117. package/app-template/src/assets/icons/ruler.svg +3 -0
  118. package/app-template/src/assets/icons/search.svg +8 -11
  119. package/app-template/src/assets/icons/share.svg +2 -9
  120. package/app-template/src/assets/icons/snapchat.svg +3 -0
  121. package/app-template/src/assets/icons/tiktok.svg +3 -0
  122. package/app-template/src/assets/icons/tumblr.svg +6 -0
  123. package/app-template/src/assets/icons/twitter.svg +2 -10
  124. package/app-template/src/assets/icons/vimeo.svg +3 -0
  125. package/app-template/src/assets/icons/youtube.svg +3 -0
  126. package/app-template/src/assets/icons/zoom.svg +8 -0
  127. package/app-template/src/auth.ts +3 -0
  128. package/app-template/src/components/__tests__/badge.test.tsx +2 -2
  129. package/app-template/src/components/__tests__/link.test.tsx +2 -0
  130. package/app-template/src/components/accordion.tsx +48 -23
  131. package/app-template/src/components/action-tooltip.tsx +160 -0
  132. package/app-template/src/components/button.tsx +1 -1
  133. package/app-template/src/components/carousel-core.tsx +4 -11
  134. package/app-template/src/components/checkbox.tsx +2 -1
  135. package/app-template/src/components/currency-select.tsx +150 -4
  136. package/app-template/src/components/file-input.tsx +27 -7
  137. package/app-template/src/components/generate-form-fields.tsx +49 -10
  138. package/app-template/src/components/icon.tsx +5 -6
  139. package/app-template/src/components/index.ts +4 -1
  140. package/app-template/src/components/input.tsx +11 -5
  141. package/app-template/src/components/language-select.tsx +88 -2
  142. package/app-template/src/components/modal.tsx +34 -16
  143. package/app-template/src/components/pagination.tsx +133 -20
  144. package/app-template/src/components/price.tsx +1 -1
  145. package/app-template/src/components/pwa-tags.tsx +1 -0
  146. package/app-template/src/components/quantity-input.tsx +63 -0
  147. package/app-template/src/components/quantity-selector.tsx +215 -0
  148. package/app-template/src/components/route-handler.tsx +50 -0
  149. package/app-template/src/components/select.tsx +86 -54
  150. package/app-template/src/components/shimmer.tsx +1 -1
  151. package/app-template/src/components/types/index.ts +51 -1
  152. package/app-template/src/components/widget-content.tsx +323 -0
  153. package/app-template/src/data/server/theme.ts +70 -0
  154. package/app-template/src/hooks/use-fav-button.tsx +9 -10
  155. package/app-template/src/hooks/use-product-cart.ts +80 -0
  156. package/app-template/src/hooks/use-stock-alert.ts +74 -0
  157. package/app-template/src/hooks/use-theme-settings.ts +42 -0
  158. package/app-template/src/lib/fonts.ts +149 -0
  159. package/app-template/src/plugins.js +12 -2
  160. package/app-template/src/{middleware.ts → proxy.ts} +3 -3
  161. package/app-template/src/redux/middlewares/category.ts +5 -4
  162. package/app-template/src/redux/store.ts +21 -1
  163. package/app-template/src/routes/index.ts +8 -7
  164. package/app-template/src/settings.js +6 -3
  165. package/app-template/src/types/hookform-resolvers-yup.d.ts +28 -0
  166. package/app-template/src/types/index.ts +74 -3
  167. package/app-template/src/types/next-auth.d.ts +2 -2
  168. package/app-template/src/types/widget.ts +169 -0
  169. package/app-template/src/utils/__tests__/theme-page-context.test.ts +145 -0
  170. package/app-template/src/utils/formatDate.ts +48 -0
  171. package/app-template/src/utils/styles.ts +71 -0
  172. package/app-template/src/utils/theme-page-context.ts +309 -0
  173. package/app-template/src/utils/variant-validation.ts +41 -0
  174. package/app-template/src/views/account/address-form.tsx +8 -4
  175. package/app-template/src/views/account/contact-form.tsx +148 -131
  176. package/app-template/src/views/account/content-header.tsx +4 -3
  177. package/app-template/src/views/account/faq/faq-tabs.tsx +8 -2
  178. package/app-template/src/views/account/favorite-item.tsx +1 -1
  179. package/app-template/src/views/account/order.tsx +11 -9
  180. package/app-template/src/views/account/orders/order-cancellation-item.tsx +1 -1
  181. package/app-template/src/views/account/orders/order-detail-header.tsx +1 -1
  182. package/app-template/src/views/anonymous-tracking/order-detail/index.tsx +45 -38
  183. package/app-template/src/views/basket/basket-item.tsx +6 -1
  184. package/app-template/src/views/basket/summary.tsx +16 -0
  185. package/app-template/src/views/breadcrumb.tsx +2 -2
  186. package/app-template/src/views/category/category-banner.tsx +4 -23
  187. package/app-template/src/views/category/category-info.tsx +2 -1
  188. package/app-template/src/views/category/filters/filter-item.tsx +138 -42
  189. package/app-template/src/views/category/filters/index.tsx +1 -1
  190. package/app-template/src/views/category/layout.tsx +1 -0
  191. package/app-template/src/views/checkout/auth.tsx +64 -40
  192. package/app-template/src/views/checkout/layout/header.tsx +10 -6
  193. package/app-template/src/views/checkout/steps/payment/options/credit-card/index.tsx +22 -6
  194. package/app-template/src/views/checkout/steps/payment/options/funds-transfer.tsx +25 -5
  195. package/app-template/src/views/checkout/steps/payment/options/loyalty.tsx +21 -2
  196. package/app-template/src/views/checkout/steps/payment/options/redirection.tsx +27 -5
  197. package/app-template/src/views/checkout/steps/payment/options/store-credit.tsx +464 -0
  198. package/app-template/src/views/checkout/steps/payment/payment-option-buttons.tsx +4 -4
  199. package/app-template/src/views/checkout/steps/shipping/address-box.tsx +33 -20
  200. package/app-template/src/views/checkout/steps/shipping/addresses.tsx +2 -2
  201. package/app-template/src/views/checkout/summary.tsx +12 -2
  202. package/app-template/src/views/find-in-store/index.tsx +2 -2
  203. package/app-template/src/views/guest-login/index.tsx +62 -58
  204. package/app-template/src/views/header/action-menu.tsx +1 -1
  205. package/app-template/src/views/header/band.tsx +2 -2
  206. package/app-template/src/views/header/index.tsx +1 -1
  207. package/app-template/src/views/header/mini-basket.tsx +3 -3
  208. package/app-template/src/views/header/mobile-hamburger-button.tsx +5 -8
  209. package/app-template/src/views/header/mobile-menu.tsx +18 -6
  210. package/app-template/src/views/header/navbar.tsx +1 -1
  211. package/app-template/src/views/header/pwa-back-button.tsx +1 -1
  212. package/app-template/src/views/header/search/index.tsx +13 -3
  213. package/app-template/src/views/header/search/results.tsx +1 -1
  214. package/app-template/src/views/header/user-menu.tsx +1 -3
  215. package/app-template/src/views/login/index.tsx +66 -57
  216. package/app-template/src/views/otp-login/index.tsx +11 -6
  217. package/app-template/src/views/product/index.ts +1 -0
  218. package/app-template/src/views/product/layout.tsx +26 -6
  219. package/app-template/src/views/product/price-wrapper.tsx +3 -24
  220. package/app-template/src/views/product/product-actions.tsx +165 -0
  221. package/app-template/src/views/product/product-info.tsx +76 -238
  222. package/app-template/src/views/product/product-share.tsx +58 -0
  223. package/app-template/src/views/product/product-variants.tsx +26 -0
  224. package/app-template/src/views/product/slider.tsx +22 -1
  225. package/app-template/src/views/product/variant.tsx +69 -41
  226. package/app-template/src/views/product-pointer-banner-item.tsx +1 -1
  227. package/app-template/src/views/register/index.tsx +31 -46
  228. package/app-template/src/views/sales-contract-modal/index.tsx +17 -17
  229. package/app-template/src/views/share/index.tsx +9 -6
  230. package/app-template/src/views/widgets/home-hero-slider-content.tsx +41 -39
  231. package/app-template/src/widgets/flatpages/about-us/index.tsx +78 -0
  232. package/app-template/src/widgets/flatpages/blog-list/index.tsx +129 -0
  233. package/app-template/src/widgets/footer-info.tsx +1 -1
  234. package/app-template/src/widgets/footer-menu.tsx +7 -3
  235. package/app-template/src/widgets/footer-subscription/footer-subscription-form.tsx +17 -14
  236. package/app-template/src/widgets/footer-subscription/index.tsx +1 -1
  237. package/app-template/src/widgets/home-stories-eng.tsx +43 -35
  238. package/app-template/src/widgets/index.ts +7 -0
  239. package/app-template/src/widgets/schemas/about-us.json +46 -0
  240. package/app-template/src/widgets/schemas/blog-list.json +37 -0
  241. package/app-template/src/widgets/schemas/blog.json +29 -0
  242. package/app-template/tailwind.config.js +155 -7
  243. package/app-template/tsconfig.json +29 -11
  244. package/codemods/migrate-auth-v5/index.js +339 -0
  245. package/codemods/migrate-auth-v5/transform.js +86 -0
  246. package/codemods/migrate-segments/index.js +591 -0
  247. package/codemods/update-tailwind-config/index.js +30 -0
  248. package/codemods/update-tailwind-config/transform.js +102 -0
  249. package/codemods/upgrade-to-2/index.js +549 -0
  250. package/commands/codemod.ts +0 -1
  251. package/commands/plugins.ts +111 -46
  252. package/dist/commands/codemod.js +0 -1
  253. package/dist/commands/plugins.js +104 -36
  254. package/package.json +3 -2
  255. package/app-template/src/app/[commerce]/[locale]/[currency]/category/[pk]/page.tsx +0 -22
  256. package/app-template/src/app/[commerce]/[locale]/[currency]/flat-page/[pk]/page.tsx +0 -20
  257. package/app-template/src/app/[commerce]/[locale]/[currency]/group-product/[pk]/page.tsx +0 -74
  258. package/app-template/src/app/[commerce]/[locale]/[currency]/list/page.tsx +0 -18
  259. package/app-template/src/app/[commerce]/[locale]/[currency]/page.tsx +0 -50
  260. package/app-template/src/app/[commerce]/[locale]/[currency]/product/[pk]/page.tsx +0 -84
  261. package/app-template/src/app/[commerce]/[locale]/[currency]/special-page/[pk]/page.tsx +0 -27
  262. package/app-template/src/pages/api/auth/[...nextauth].ts +0 -3
  263. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/address/page.tsx +0 -0
  264. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/change-email/page.tsx +0 -0
  265. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/change-password/page.tsx +0 -0
  266. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/contact/page.tsx +0 -0
  267. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/coupons/page.tsx +0 -0
  268. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/email-verification/page.tsx +0 -0
  269. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/faq/page.tsx +0 -0
  270. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/favourite-products/page.tsx +0 -0
  271. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/my-quotations/page.tsx +0 -0
  272. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/layout.tsx +0 -0
  273. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/page.tsx +0 -0
  274. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/anonymous-tracking/page.tsx +0 -0
  275. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/auth/oauth-login/page.tsx +0 -0
  276. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/basket-b2b/page.tsx +0 -0
  277. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/category/[pk]/loading.tsx +0 -0
  278. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/client-root.tsx +0 -0
  279. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/contact-us/page.tsx +0 -0
  280. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/error.tsx +0 -0
  281. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/flat-page/[pk]/loading.tsx +0 -0
  282. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/group-product/[pk]/loading.tsx +0 -0
  283. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/landing-page/[pk]/loading.tsx +0 -0
  284. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/list/loading.tsx +0 -0
  285. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/checkout/page.tsx +0 -0
  286. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/completed/[token]/layout.tsx +0 -0
  287. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/special-page/[pk]/loading.tsx +0 -0
  288. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/template.tsx +0 -0
  289. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/password/reset/page.tsx +0 -0
  290. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/xml-sitemap/route.ts +0 -0
@@ -0,0 +1,464 @@
1
+ import clsx from 'clsx';
2
+ import {
3
+ useGetCheckoutLoyaltyBalanceQuery,
4
+ usePayWithLoyaltyBalanceMutation
5
+ } from '@akinon/next/data/client/checkout';
6
+ import { useAppSelector } from '@akinon/next/redux/hooks';
7
+ import { useEffect, useMemo, useState } from 'react';
8
+ import { useLocalization } from '@akinon/next/hooks';
9
+ import { twMerge } from 'tailwind-merge';
10
+ import { Icon, Price } from '@theme/components';
11
+ import { Trans } from '@akinon/next/components';
12
+ import { LoaderSpinner } from '@theme/components';
13
+ import { AccountUsage, LoyaltyBalanceItem } from '@akinon/next/types';
14
+
15
+ export const StoreCredits = () => {
16
+ const { t } = useLocalization();
17
+
18
+ const [payWithLoyaltyBalance, { isLoading: isPayLoading }] =
19
+ usePayWithLoyaltyBalanceMutation();
20
+
21
+ const { loyaltyBalance, loyaltyBalances, preOrder } = useAppSelector(
22
+ (state) => state.checkout
23
+ );
24
+
25
+ const { data: checkoutLoyaltyData, isLoading: isLoyaltyBalanceLoading } =
26
+ useGetCheckoutLoyaltyBalanceQuery(undefined, {
27
+ refetchOnMountOrArgChange: true,
28
+ skip: !preOrder?.payment_option
29
+ });
30
+
31
+ // New approach: read accounts from LoyaltyMoneyUsagePage context
32
+ const loyaltyAccounts: LoyaltyBalanceItem[] = useMemo(() => {
33
+ const loyaltyContext = checkoutLoyaltyData?.context_list?.find(
34
+ (ctx) => ctx.page_name === 'LoyaltyMoneyUsagePage'
35
+ );
36
+ return (
37
+ (loyaltyContext?.page_context?.accounts as LoyaltyBalanceItem[]) ?? []
38
+ );
39
+ }, [checkoutLoyaltyData]);
40
+
41
+ const selectableAccounts = useMemo(() => {
42
+ return loyaltyAccounts.filter((account) => parseFloat(account.balance) > 0);
43
+ }, [loyaltyAccounts]);
44
+
45
+ // Determine which mode to use:
46
+ // - "accounts" mode: backend returns page_context.accounts (new)
47
+ // - "legacy" mode: Redux loyaltyBalance/loyaltyBalances from page_context.balance/balances (old)
48
+ const hasAccounts = selectableAccounts.length > 0;
49
+ const hasLegacyGrouped = !hasAccounts && loyaltyBalances?.length > 0;
50
+ const hasLegacySingle =
51
+ !hasAccounts && !hasLegacyGrouped && parseFloat(loyaltyBalance || '0') > 0;
52
+
53
+ const isLoyaltyBalanceUsed = useMemo(() => {
54
+ return parseFloat(preOrder?.loyalty_money ?? '0') > 0;
55
+ }, [preOrder?.loyalty_money]);
56
+
57
+ // --- Accounts mode state ---
58
+ const [selectedAccountIds, setSelectedAccountIds] = useState<Set<string>>(
59
+ new Set()
60
+ );
61
+
62
+ useEffect(() => {
63
+ if (!hasAccounts) return;
64
+ const usages = preOrder?.loyalty_account_usages;
65
+ if (usages && Array.isArray(usages)) {
66
+ setSelectedAccountIds(
67
+ new Set(
68
+ usages
69
+ .filter((u) => parseFloat(String(u.amount)) > 0)
70
+ .map((u) => String(u.label_id))
71
+ )
72
+ );
73
+ } else if (
74
+ parseFloat(preOrder?.loyalty_money ?? '0') > 0 &&
75
+ selectableAccounts.length > 0
76
+ ) {
77
+ setSelectedAccountIds(
78
+ new Set(selectableAccounts.map((a) => String(a.label_id)))
79
+ );
80
+ } else {
81
+ setSelectedAccountIds(new Set());
82
+ }
83
+ }, [
84
+ hasAccounts,
85
+ preOrder?.loyalty_account_usages,
86
+ preOrder?.loyalty_money,
87
+ selectableAccounts
88
+ ]);
89
+
90
+ // --- Legacy grouped mode state ---
91
+ const [selectedLabels, setSelectedLabels] = useState<Record<string, boolean>>(
92
+ {}
93
+ );
94
+
95
+ const [isLoading, setIsLoading] = useState(false);
96
+
97
+ const totalGroupedBalance = useMemo(() => {
98
+ if (!loyaltyBalances) return 0;
99
+ return loyaltyBalances.reduce(
100
+ (sum, item) => sum + parseFloat(item.balance || '0'),
101
+ 0
102
+ );
103
+ }, [loyaltyBalances]);
104
+
105
+ // --- Handlers ---
106
+ const handleToggleAccount = async (account: LoyaltyBalanceItem) => {
107
+ if (isLoading) return;
108
+ setIsLoading(true);
109
+
110
+ try {
111
+ const key = String(account.label_id);
112
+ const newSelected = new Set(selectedAccountIds);
113
+
114
+ if (newSelected.has(key)) {
115
+ newSelected.delete(key);
116
+ } else {
117
+ newSelected.add(key);
118
+ }
119
+
120
+ setSelectedAccountIds(newSelected);
121
+
122
+ const accountUsages: AccountUsage[] = selectableAccounts
123
+ .filter((acc) => newSelected.has(String(acc.label_id)))
124
+ .map((acc) => ({
125
+ label_id: acc.label_id,
126
+ amount: parseFloat(acc.balance)
127
+ }));
128
+
129
+ await payWithLoyaltyBalance({ account_usages: accountUsages });
130
+ } finally {
131
+ setIsLoading(false);
132
+ }
133
+ };
134
+
135
+ const handleToggleLegacyAll = async () => {
136
+ if (isLoading) return;
137
+ setIsLoading(true);
138
+
139
+ try {
140
+ if (isLoyaltyBalanceUsed) {
141
+ if (hasLegacyGrouped) {
142
+ const accountUsages: AccountUsage[] = loyaltyBalances.map((item) => ({
143
+ label_id: item.label_id,
144
+ amount: 0
145
+ }));
146
+ await payWithLoyaltyBalance({ account_usages: accountUsages });
147
+ setSelectedLabels({});
148
+ } else {
149
+ await payWithLoyaltyBalance('0');
150
+ }
151
+ } else {
152
+ if (hasLegacyGrouped) {
153
+ const accountUsages: AccountUsage[] = loyaltyBalances.map((item) => ({
154
+ label_id: item.label_id,
155
+ amount: parseFloat(item.balance)
156
+ }));
157
+ await payWithLoyaltyBalance({ account_usages: accountUsages });
158
+ const allSelected = loyaltyBalances.reduce(
159
+ (acc, item) => ({ ...acc, [String(item.label_id)]: true }),
160
+ {} as Record<string, boolean>
161
+ );
162
+ setSelectedLabels(allSelected);
163
+ } else {
164
+ await payWithLoyaltyBalance(loyaltyBalance);
165
+ }
166
+ }
167
+ } finally {
168
+ setIsLoading(false);
169
+ }
170
+ };
171
+
172
+ const handleToggleLegacyLabel = async (item: LoyaltyBalanceItem) => {
173
+ if (isLoading) return;
174
+ setIsLoading(true);
175
+
176
+ try {
177
+ const key = String(item.label_id);
178
+ const isCurrentlySelected = selectedLabels[key] ?? false;
179
+ const newSelectedLabels = {
180
+ ...selectedLabels,
181
+ [key]: !isCurrentlySelected
182
+ };
183
+
184
+ const accountUsages: AccountUsage[] = loyaltyBalances.map((b) => ({
185
+ label_id: b.label_id,
186
+ amount: newSelectedLabels[String(b.label_id)]
187
+ ? parseFloat(b.balance)
188
+ : 0
189
+ }));
190
+
191
+ await payWithLoyaltyBalance({ account_usages: accountUsages });
192
+ setSelectedLabels(newSelectedLabels);
193
+ } finally {
194
+ setIsLoading(false);
195
+ }
196
+ };
197
+
198
+ // --- Early returns ---
199
+ if (preOrder?.is_guest) {
200
+ return null;
201
+ }
202
+
203
+ if (isLoyaltyBalanceLoading) {
204
+ return (
205
+ <div className="mb-3 px-4 py-3 xs:px-0">
206
+ <LoaderSpinner />
207
+ </div>
208
+ );
209
+ }
210
+
211
+ if (!hasAccounts && !hasLegacyGrouped && !hasLegacySingle) {
212
+ return null;
213
+ }
214
+
215
+ // --- Accounts mode render (new: from page_context.accounts) ---
216
+ if (hasAccounts) {
217
+ return (
218
+ <div
219
+ className={twMerge(
220
+ 'flex flex-col w-full mb-4 border border-solid border-gray-400 px-0 md:p-4',
221
+ isPayLoading && 'pointer-events-none opacity-30'
222
+ )}
223
+ >
224
+ {selectableAccounts.map((account) => {
225
+ const isSelected = selectedAccountIds.has(String(account.label_id));
226
+
227
+ return (
228
+ <div
229
+ key={String(account.label_id) ?? 'default'}
230
+ className="mb-3 flex w-full items-center"
231
+ >
232
+ <button onClick={() => handleToggleAccount(account)}>
233
+ <span
234
+ className={clsx(
235
+ 'flex h-5 w-5 items-center justify-center rounded border border-solid border-primary',
236
+ isSelected ? 'bg-primary' : 'bg-white'
237
+ )}
238
+ >
239
+ <Icon
240
+ name={isSelected ? 'check' : ''}
241
+ size={10}
242
+ className={clsx({ 'text-white': isSelected })}
243
+ />
244
+ </span>
245
+ </button>
246
+
247
+ <div className="w-full pl-4 rtl:pr-4">
248
+ <p
249
+ className="cursor-pointer text-sm"
250
+ onClick={() => handleToggleAccount(account)}
251
+ >
252
+ {account.label ??
253
+ t('checkout.payment.store_credit.use_my_store_credits')}
254
+ </p>
255
+ <p className="flex text-sm text-[#606060]">
256
+ {t('checkout.payment.store_credit.available_balance')}:
257
+ <Price
258
+ value={account.balance}
259
+ currencyCode={
260
+ account.currency?.toUpperCase() ||
261
+ preOrder?.currency_type_label
262
+ }
263
+ className="pe-1 font-bold"
264
+ />
265
+ </p>
266
+ </div>
267
+ </div>
268
+ );
269
+ })}
270
+
271
+ {isLoyaltyBalanceUsed && parseFloat(preOrder?.unpaid_amount) > 0 && (
272
+ <p className="my-4 text-[15px] font-light italic text-[#707070] max-xs:text-xs">
273
+ <Trans
274
+ i18nKey="checkout.payment.store_credit.insufficient_balance"
275
+ components={{
276
+ Amount: (
277
+ <div className="inline-flex">
278
+ <Price
279
+ value={preOrder?.unpaid_amount}
280
+ currencyCode={preOrder?.currency_type_label}
281
+ className="text-primary"
282
+ />
283
+ </div>
284
+ )
285
+ }}
286
+ />
287
+ </p>
288
+ )}
289
+ </div>
290
+ );
291
+ }
292
+
293
+ // --- Legacy grouped mode render (from Redux loyaltyBalances) ---
294
+ if (hasLegacyGrouped) {
295
+ return (
296
+ <div
297
+ className={twMerge(
298
+ 'flex flex-col w-full mb-4 border border-solid border-gray-400 px-0 md:p-4',
299
+ isPayLoading && 'pointer-events-none opacity-30'
300
+ )}
301
+ >
302
+ <div className="flex w-full items-center mb-3">
303
+ <button onClick={handleToggleLegacyAll}>
304
+ <span
305
+ className={clsx(
306
+ 'flex h-5 w-5 items-center justify-center rounded border border-solid border-primary',
307
+ isLoyaltyBalanceUsed ? 'bg-primary' : 'bg-white'
308
+ )}
309
+ >
310
+ <Icon
311
+ name={isLoyaltyBalanceUsed ? 'check' : ''}
312
+ size={10}
313
+ className={clsx({ 'text-white': isLoyaltyBalanceUsed })}
314
+ />
315
+ </span>
316
+ </button>
317
+
318
+ <div className="w-full pl-4">
319
+ <p
320
+ className="cursor-pointer text-sm"
321
+ onClick={handleToggleLegacyAll}
322
+ >
323
+ {t('checkout.payment.store_credit.use_my_store_credits')}
324
+ </p>
325
+ <p className="flex text-sm text-[#606060]">
326
+ {t('checkout.payment.store_credit.total_balance')}:
327
+ <Price
328
+ value={String(totalGroupedBalance)}
329
+ currencyCode={preOrder?.currency_type_label}
330
+ className="pe-1 font-bold"
331
+ />
332
+ </p>
333
+ </div>
334
+ </div>
335
+
336
+ <div className="ml-9 flex flex-col gap-2">
337
+ {loyaltyBalances.map((item) => {
338
+ const isSelected = selectedLabels[String(item.label_id)] ?? false;
339
+ return (
340
+ <div
341
+ key={String(item.label_id)}
342
+ className="flex items-center border border-solid border-gray-200 rounded p-2"
343
+ >
344
+ <button onClick={() => handleToggleLegacyLabel(item)}>
345
+ <span
346
+ className={clsx(
347
+ 'flex h-4 w-4 items-center justify-center rounded border border-solid border-primary',
348
+ isSelected ? 'bg-primary' : 'bg-white'
349
+ )}
350
+ >
351
+ <Icon
352
+ name={isSelected ? 'check' : ''}
353
+ size={8}
354
+ className={clsx({ 'text-white': isSelected })}
355
+ />
356
+ </span>
357
+ </button>
358
+ <div className="flex w-full items-center justify-between pl-3">
359
+ <span
360
+ className="cursor-pointer text-sm"
361
+ onClick={() => handleToggleLegacyLabel(item)}
362
+ >
363
+ {item.label ??
364
+ t('checkout.payment.store_credit.use_my_store_credits')}
365
+ </span>
366
+ <Price
367
+ value={item.balance}
368
+ currencyCode={
369
+ item.currency?.toUpperCase() ||
370
+ preOrder?.currency_type_label
371
+ }
372
+ className="text-sm font-bold"
373
+ />
374
+ </div>
375
+ </div>
376
+ );
377
+ })}
378
+ </div>
379
+
380
+ {isLoyaltyBalanceUsed && parseFloat(preOrder?.unpaid_amount) > 0 && (
381
+ <p className="my-4 text-[15px] font-light italic text-[#707070] max-xs:text-xs">
382
+ <Trans
383
+ i18nKey="checkout.payment.store_credit.insufficient_balance"
384
+ components={{
385
+ Amount: (
386
+ <div className="inline-flex">
387
+ <Price
388
+ value={preOrder?.unpaid_amount}
389
+ currencyCode={preOrder?.currency_type_label}
390
+ className="text-primary"
391
+ />
392
+ </div>
393
+ )
394
+ }}
395
+ />
396
+ </p>
397
+ )}
398
+ </div>
399
+ );
400
+ }
401
+
402
+ // --- Legacy single balance mode render (from Redux loyaltyBalance) ---
403
+ return (
404
+ <div
405
+ className={twMerge(
406
+ 'flex flex-col w-full mb-4 border border-solid border-gray-400 px-0 md:p-4',
407
+ isPayLoading && 'pointer-events-none opacity-30'
408
+ )}
409
+ >
410
+ <div className="flex w-full items-center">
411
+ <button onClick={handleToggleLegacyAll}>
412
+ <span
413
+ className={clsx(
414
+ 'flex h-5 w-5 items-center justify-center rounded border border-solid border-primary',
415
+ isLoyaltyBalanceUsed ? 'bg-primary' : 'bg-white'
416
+ )}
417
+ >
418
+ <Icon
419
+ name={isLoyaltyBalanceUsed ? 'check' : ''}
420
+ size={10}
421
+ className={clsx({ 'text-white': isLoyaltyBalanceUsed })}
422
+ />
423
+ </span>
424
+ </button>
425
+
426
+ <div className="w-full pl-4">
427
+ <p
428
+ className="cursor-pointer text-sm"
429
+ onClick={handleToggleLegacyAll}
430
+ >
431
+ {t('checkout.payment.store_credit.use_my_store_credits')}
432
+ </p>
433
+ <p className="flex text-sm text-[#606060]">
434
+ {t('checkout.payment.store_credit.available_balance')}:
435
+ <Price
436
+ value={loyaltyBalance}
437
+ currencyCode={preOrder?.currency_type_label}
438
+ className="pe-1 font-bold"
439
+ />
440
+ </p>
441
+ </div>
442
+ </div>
443
+
444
+ {isLoyaltyBalanceUsed && parseFloat(preOrder?.unpaid_amount) > 0 && (
445
+ <p className="my-4 text-[15px] font-light italic text-[#707070] max-xs:text-xs">
446
+ <Trans
447
+ i18nKey="checkout.payment.store_credit.insufficient_balance"
448
+ components={{
449
+ Amount: (
450
+ <div className="inline-flex">
451
+ <Price
452
+ value={preOrder?.unpaid_amount}
453
+ currencyCode={preOrder?.currency_type_label}
454
+ className="text-primary"
455
+ />
456
+ </div>
457
+ )
458
+ }}
459
+ />
460
+ </p>
461
+ )}
462
+ </div>
463
+ );
464
+ };
@@ -44,7 +44,7 @@ const PaymentOptionButtons = () => {
44
44
  {displayedPaymentOptions.map((option) => (
45
45
  <label
46
46
  key={`payment-option-${option.pk}`}
47
- className="border border-gray-200 px-4 py-3 mt-3 flex h-12"
47
+ className="border px-4 py-3 mt-3 flex h-12"
48
48
  onClick={scrollToTop}
49
49
  >
50
50
  <Radio
@@ -69,10 +69,10 @@ const PaymentOptionButtons = () => {
69
69
  onClick={() => onClickHandler(option)}
70
70
  className={clsx(
71
71
  'flex items-center justify-center border-r border-b border-solid',
72
- 'border-gray-400 text-xs uppercase text-black-800/60 font-medium',
73
- 'bg-white h-11 px-5 transition-colors sm:h-15 sm:px-8 sm:py-8 hover:text-secondary',
72
+ 'border-gray-400 text-xs uppercase text-black-800 font-medium',
73
+ 'text-opacity-60 bg-white h-11 px-5 transition-colors sm:h-15 sm:px-8 sm:py-8 hover:text-secondary',
74
74
  {
75
- 'text-black-800/100 border-b-transparent':
75
+ 'text-opacity-100 border-b-transparent':
76
76
  preOrder?.payment_option?.pk === option.pk
77
77
  }
78
78
  )}
@@ -85,7 +85,7 @@ const AddressBox = ({
85
85
  };
86
86
 
87
87
  const onSubmit = (data) => {
88
- editAddress({ ...data, invalidateTag: 'Addresses' })
88
+ editAddress({ ...data, invalidateTag: 'Checkout' })
89
89
  .unwrap()
90
90
  .then((editAddressResponse) => {
91
91
  handleAddressClick(addressType, editAddressResponse);
@@ -96,7 +96,7 @@ const AddressBox = ({
96
96
  };
97
97
 
98
98
  const handleRemoveAddress = async (addressPk: number) => {
99
- await removeAddress({ id: addressPk, invalidateTag: 'Addresses' });
99
+ await removeAddress({ id: addressPk, invalidateTag: 'Checkout' });
100
100
  setRemoveAddressModalOpen(false);
101
101
  dispatch(resetCheckoutState());
102
102
 
@@ -130,7 +130,7 @@ const AddressBox = ({
130
130
  onClick={() => handleAddressClick(addressType, address)}
131
131
  key={address.pk}
132
132
  className={clsx(
133
- 'cursor-pointer relative w-full border border-gray-200 shadow-sm p-4 min-h-[8rem]',
133
+ 'cursor-pointer relative w-full border shadow p-4 min-h-[8rem]',
134
134
  "hover:after:content-[''] hover:after:border-4 hover:after:opacity-30 hover:after:transition-opacity",
135
135
  'after:border-secondary-400 after:absolute after:inset-0 after:duration-150 after:-z-10',
136
136
  {
@@ -167,8 +167,11 @@ const AddressBox = ({
167
167
  <div className="text-xs flex justify-between">
168
168
  <Button
169
169
  appearance="ghost"
170
- className="italic underline hover:text-secondary-500 hover:bg-white! hover:border-white! p-0 h-auto"
171
- onClick={() => setIsEditAddressModalOpen(true)}
170
+ className="italic underline hover:text-secondary-500 hover:!bg-white hover:!border-white p-0 h-auto"
171
+ onClick={(e) => {
172
+ e.stopPropagation();
173
+ setIsEditAddressModalOpen(true);
174
+ }}
172
175
  data-testid="checkout-address-edit"
173
176
  >
174
177
  {t('checkout.address.box.edit')}
@@ -180,21 +183,26 @@ const AddressBox = ({
180
183
  setOpen={setIsEditAddressModalOpen}
181
184
  className="w-full sm:w-[28rem] max-h-[90vh] overflow-y-auto"
182
185
  >
183
- <AddressForm
184
- data={{
185
- ...address,
186
- country: address.country?.pk,
187
- city: address.city?.pk,
188
- township: address.township?.pk,
189
- district: address.district?.pk
190
- }}
191
- onSubmit={onSubmit}
192
- />
186
+ <div onClick={(e) => e.stopPropagation()}>
187
+ <AddressForm
188
+ data={{
189
+ ...address,
190
+ country: address.country?.pk,
191
+ city: address.city?.pk,
192
+ township: address.township?.pk,
193
+ district: address.district?.pk
194
+ }}
195
+ onSubmit={onSubmit}
196
+ />
197
+ </div>
193
198
  </Modal>
194
199
  <Button
195
200
  appearance="ghost"
196
- className="italic underline hover:text-secondary-500 hover:bg-white! hover:border-white! p-0 h-auto"
197
- onClick={() => setRemoveAddressModalOpen(true)}
201
+ className="italic underline hover:text-secondary-500 hover:!bg-white hover:!border-white p-0 h-auto"
202
+ onClick={(e) => {
203
+ e.stopPropagation();
204
+ setRemoveAddressModalOpen(true);
205
+ }}
198
206
  data-testid="checkout-address-remove"
199
207
  >
200
208
  {t('checkout.address.box.remove')}
@@ -207,14 +215,18 @@ const AddressBox = ({
207
215
  setOpen={setRemoveAddressModalOpen}
208
216
  showCloseButton={false}
209
217
  >
210
- <div className="text-center px-6 py-10">
218
+ <div
219
+ className="text-center px-6 py-10"
220
+ onClick={(e) => e.stopPropagation()}
221
+ >
211
222
  <p className="mb-4">
212
223
  {t('account.address_book.modal.delete_description')}
213
224
  </p>
214
225
  <div className="space-x-3 flex justify-center">
215
226
  <Button
216
227
  appearance="outlined"
217
- onClick={() => {
228
+ onClick={(e) => {
229
+ e.stopPropagation();
218
230
  setRemoveAddressModalOpen(false);
219
231
  }}
220
232
  data-testid="remove-address-modal-cancel"
@@ -224,7 +236,8 @@ const AddressBox = ({
224
236
  <Button
225
237
  appearance="filled"
226
238
  disabled={removeAddressLoading}
227
- onClick={() => {
239
+ onClick={(e) => {
240
+ e.stopPropagation();
228
241
  handleRemoveAddress(address.pk);
229
242
  }}
230
243
  className={
@@ -77,7 +77,7 @@ const Addresses = () => {
77
77
  }, [billing_and_shipping_same]);
78
78
 
79
79
  const onSubmit = (data) => {
80
- addAddress({ ...data, invalidateTag: 'Addresses' })
80
+ addAddress({ ...data, invalidateTag: 'Checkout' })
81
81
  .unwrap()
82
82
  .then((addAddressResponse) => {
83
83
  if (addressList.length === 0) {
@@ -153,7 +153,7 @@ const Addresses = () => {
153
153
  role="button"
154
154
  onClick={() => setIsModalOpen(true)}
155
155
  className={clsx(
156
- 'relative cursor-pointer w-full min-h-[8rem] border border-gray-200 shadow-sm p-4',
156
+ 'relative cursor-pointer w-full min-h-[8rem] border shadow p-4',
157
157
  "hover:after:content-[''] hover:after:border-4 hover:after:opacity-30 hover:after:transition-opacity",
158
158
  'after:border-secondary-400 after:absolute after:inset-0 after:opacity-0 after:duration-150 after:-z-10',
159
159
  {
@@ -8,6 +8,7 @@ import PluginModule, { Component } from '@akinon/next/components/plugin-module';
8
8
  import { twMerge } from 'tailwind-merge';
9
9
  import { Image } from '@akinon/next/components/image';
10
10
  import { Trans } from '@akinon/next/components/trans';
11
+ import { StoreCredits } from './steps/payment/options/store-credit';
11
12
 
12
13
  export const Summary = () => {
13
14
  const { t } = useLocalization();
@@ -38,6 +39,7 @@ export const Summary = () => {
38
39
  'flex flex-col w-full mb-4 border border-solid border-gray-400'
39
40
  }}
40
41
  />
42
+ <StoreCredits />
41
43
  <div className="flex flex-col w-full border border-solid border-gray-400">
42
44
  <div className="flex justify-between items-center flex-row border-b border-solid border-gray-400 px-4 py-2 sm:px-5 sm:py-4 sm:min-h-15">
43
45
  <span className="text-black-800 text-xl font-light sm:text-2xl">
@@ -118,6 +120,14 @@ export const Summary = () => {
118
120
  <Price value={preOrder?.shipping_amount} />
119
121
  </span>
120
122
  </div>
123
+ {parseFloat(preOrder?.loyalty_money) > 0 && (
124
+ <div className="flex items-center justify-between w-full text-xs text-black-800 py-1 px-4 sm:px-5">
125
+ <span>{t('checkout.summary.loyalty_money_total')}</span>
126
+ <span>
127
+ <Price value={preOrder?.loyalty_money} />
128
+ </span>
129
+ </div>
130
+ )}
121
131
  <div className="flex items-center justify-between w-full text-xs text-black-800 py-1 px-4 sm:px-5">
122
132
  <span>{t('checkout.summary.discounts_total')}</span>
123
133
  <span>
@@ -149,7 +159,7 @@ export const Summary = () => {
149
159
  </div>
150
160
  </div>
151
161
  <div className="flex flex-col py-4 px-4 text-black-800 text-xs sm:px-5">
152
- <div className="w-full overflow-hidden text-ellipsis mb-1 last:mb-0">
162
+ <div className="w-full overflow-hidden overflow-ellipsis mb-1 last:mb-0">
153
163
  <Trans
154
164
  i18nKey="checkout.summary.info"
155
165
  components={{
@@ -162,7 +172,7 @@ export const Summary = () => {
162
172
  }}
163
173
  />
164
174
  </div>
165
- <div className="w-full overflow-hidden text-ellipsis mb-1 last:mb-0">
175
+ <div className="w-full overflow-hidden overflow-ellipsis mb-1 last:mb-0">
166
176
  {preOrder.shipping_address?.line}{' '}
167
177
  {preOrder.shipping_address?.postcode}{' '}
168
178
  {preOrder.shipping_address?.district && (
@@ -123,14 +123,14 @@ export const FindInStore = ({ productPk, productName, variants }) => {
123
123
  className="w-full"
124
124
  options={retailStoreOptions}
125
125
  {...register('city_id')}
126
- error={errors.city_id}
126
+ error={errors.city_id as any}
127
127
  />
128
128
  {sizeOptions.length > 1 && (
129
129
  <Select
130
130
  className="w-full"
131
131
  options={sizeOptions}
132
132
  {...register('size')}
133
- error={errors.size}
133
+ error={errors.size as any}
134
134
  />
135
135
  )}
136
136
  </div>