@akinon/projectzero 2.0.0-beta.2 → 2.0.0-beta.20

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 (377) hide show
  1. package/CHANGELOG.md +147 -6
  2. package/app-template/.env.example +8 -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 +5 -0
  10. package/app-template/AGENTS.md +7 -0
  11. package/app-template/CHANGELOG.md +1645 -61
  12. package/app-template/Procfile +1 -1
  13. package/app-template/README.md +6 -0
  14. package/app-template/akinon.json +1 -4
  15. package/app-template/build.sh +10 -0
  16. package/app-template/config/prebuild-tests.json +5 -0
  17. package/app-template/docs/advanced-usage.md +111 -0
  18. package/app-template/docs/plugins.md +60 -25
  19. package/app-template/docs/sentry-usage.md +35 -0
  20. package/app-template/jest.config.ts +2 -2
  21. package/app-template/next-env.d.ts +1 -0
  22. package/app-template/next.config.mjs +8 -5
  23. package/app-template/package.json +60 -50
  24. package/app-template/postcss.config.mjs +5 -0
  25. package/app-template/public/amex.svg +12 -0
  26. package/app-template/public/apple-pay.svg +16 -0
  27. package/app-template/public/assets/images/product-placeholder-1.jpg +0 -0
  28. package/app-template/public/assets/images/product-placeholder-2.jpg +0 -0
  29. package/app-template/public/assets/images/product-placeholder-3.jpg +0 -0
  30. package/app-template/public/assets/images/product-placeholder-4.jpg +0 -0
  31. package/app-template/public/google-pay.svg +16 -0
  32. package/app-template/public/locales/en/account.json +13 -4
  33. package/app-template/public/locales/en/auth.json +6 -7
  34. package/app-template/public/locales/en/basket.json +6 -6
  35. package/app-template/public/locales/en/blog.json +7 -0
  36. package/app-template/public/locales/en/category.json +3 -1
  37. package/app-template/public/locales/en/checkout.json +17 -4
  38. package/app-template/public/locales/en/common.json +71 -3
  39. package/app-template/public/locales/en/forgot_password.json +6 -7
  40. package/app-template/public/locales/en/product.json +84 -4
  41. package/app-template/public/locales/tr/account.json +13 -4
  42. package/app-template/public/locales/tr/auth.json +16 -17
  43. package/app-template/public/locales/tr/basket.json +4 -4
  44. package/app-template/public/locales/tr/blog.json +7 -0
  45. package/app-template/public/locales/tr/category.json +3 -1
  46. package/app-template/public/locales/tr/checkout.json +48 -36
  47. package/app-template/public/locales/tr/common.json +70 -2
  48. package/app-template/public/locales/tr/forgot_password.json +12 -13
  49. package/app-template/public/locales/tr/product.json +82 -0
  50. package/app-template/public/logo.svg +3 -27
  51. package/app-template/public/mastercard.svg +14 -0
  52. package/app-template/public/masterpass-javascript-sdk-web.min.js +1 -0
  53. package/app-template/public/promotion-banner.jpg +0 -0
  54. package/app-template/public/shop-pay.svg +12 -0
  55. package/app-template/public/visa.svg +12 -0
  56. package/app-template/src/__tests__/middleware-matcher.test.ts +135 -0
  57. package/app-template/src/app/[commerce]/[locale]/[currency]/blog/[slug]/page.tsx +118 -0
  58. package/app-template/src/app/[commerce]/[locale]/[currency]/pages/[slug]/page.tsx +15 -0
  59. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/[...prettyurl]/page.tsx +9 -9
  60. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/layout.tsx +2 -2
  61. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/cancellation/page.tsx +105 -13
  62. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/page.tsx +136 -52
  63. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/profile/page.tsx +2 -2
  64. package/app-template/src/app/[pz]/category/[pk]/page.tsx +27 -0
  65. package/app-template/src/app/[pz]/error.tsx +17 -0
  66. package/app-template/src/app/[pz]/flat-page/[pk]/page.tsx +23 -0
  67. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/forms/[pk]/generate/page.tsx +1 -2
  68. package/app-template/src/app/[pz]/group-product/[pk]/page.tsx +93 -0
  69. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/landing-page/[pk]/page.tsx +2 -4
  70. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/layout.tsx +3 -10
  71. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/list/page.tsx +2 -4
  72. package/app-template/src/app/{[commerce]/[locale]/[currency]/pz-not-found/page.tsx → [pz]/not-found.tsx} +5 -7
  73. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/checkout/page.tsx +7 -4
  74. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/completed/[token]/page.tsx +6 -4
  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/[pz]/xml-sitemap/[node]/route.ts +73 -0
  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/form/[...id]/route.ts +1 -7
  84. package/app-template/src/app/api/image-proxy/route.ts +1 -0
  85. package/app-template/src/app/api/product-categories/route.ts +1 -0
  86. package/app-template/src/app/api/similar-product-list/route.ts +1 -0
  87. package/app-template/src/app/api/similar-products/route.ts +1 -0
  88. package/app-template/src/app/api/theme-settings/route.ts +12 -0
  89. package/app-template/src/app/api/virtual-try-on/limited-categories/route.ts +1 -0
  90. package/app-template/src/app/api/virtual-try-on/route.ts +1 -0
  91. package/app-template/src/assets/fonts/pz-icon.css +211 -49
  92. package/app-template/src/assets/fonts/pz-icon.eot +0 -0
  93. package/app-template/src/assets/fonts/pz-icon.html +486 -0
  94. package/app-template/src/assets/fonts/pz-icon.scss +373 -49
  95. package/app-template/src/assets/fonts/pz-icon.svg +215 -53
  96. package/app-template/src/assets/fonts/pz-icon.ttf +0 -0
  97. package/app-template/src/assets/fonts/pz-icon.woff +0 -0
  98. package/app-template/src/assets/fonts/pz-icon.woff2 +0 -0
  99. package/app-template/src/assets/globals.scss +37 -34
  100. package/app-template/src/assets/icons/arrow-right.svg +3 -0
  101. package/app-template/src/assets/icons/cart.svg +4 -12
  102. package/app-template/src/assets/icons/check.svg +2 -18
  103. package/app-template/src/assets/icons/chevron-down.svg +2 -7
  104. package/app-template/src/assets/icons/delete.svg +3 -0
  105. package/app-template/src/assets/icons/facebook.svg +2 -8
  106. package/app-template/src/assets/icons/fav-off.svg +5 -0
  107. package/app-template/src/assets/icons/fav-on.svg +5 -0
  108. package/app-template/src/assets/icons/filter-and-sort.svg +3 -0
  109. package/app-template/src/assets/icons/heart.svg +3 -0
  110. package/app-template/src/assets/icons/instagram.svg +2 -13
  111. package/app-template/src/assets/icons/materials.svg +3 -0
  112. package/app-template/src/assets/icons/person.svg +4 -0
  113. package/app-template/src/assets/icons/pinterest.svg +5 -11
  114. package/app-template/src/assets/icons/ruler.svg +3 -0
  115. package/app-template/src/assets/icons/search.svg +8 -11
  116. package/app-template/src/assets/icons/share.svg +2 -9
  117. package/app-template/src/assets/icons/snapchat.svg +3 -0
  118. package/app-template/src/assets/icons/tiktok.svg +3 -0
  119. package/app-template/src/assets/icons/tumblr.svg +6 -0
  120. package/app-template/src/assets/icons/twitter.svg +2 -10
  121. package/app-template/src/assets/icons/vimeo.svg +3 -0
  122. package/app-template/src/assets/icons/youtube.svg +3 -0
  123. package/app-template/src/assets/icons/zoom.svg +8 -0
  124. package/app-template/src/auth.ts +3 -0
  125. package/app-template/src/components/__tests__/link.test.tsx +2 -0
  126. package/app-template/src/components/accordion.tsx +48 -23
  127. package/app-template/src/components/action-tooltip.tsx +160 -0
  128. package/app-template/src/components/button.tsx +50 -35
  129. package/app-template/src/components/carousel-core.tsx +4 -11
  130. package/app-template/src/components/checkbox.tsx +2 -1
  131. package/app-template/src/components/currency-select.tsx +150 -4
  132. package/app-template/src/components/file-input.tsx +64 -2
  133. package/app-template/src/components/generate-form-fields.tsx +49 -10
  134. package/app-template/src/components/icon.tsx +5 -6
  135. package/app-template/src/components/index.ts +4 -1
  136. package/app-template/src/components/input.tsx +8 -2
  137. package/app-template/src/components/language-select.tsx +88 -2
  138. package/app-template/src/components/modal.tsx +34 -16
  139. package/app-template/src/components/pagination.tsx +133 -20
  140. package/app-template/src/components/price.tsx +1 -1
  141. package/app-template/src/components/pwa-tags.tsx +1 -0
  142. package/app-template/src/components/quantity-input.tsx +63 -0
  143. package/app-template/src/components/quantity-selector.tsx +203 -0
  144. package/app-template/src/components/route-handler.tsx +50 -0
  145. package/app-template/src/components/select.tsx +86 -54
  146. package/app-template/src/components/tabs.tsx +2 -2
  147. package/app-template/src/components/types/index.ts +55 -2
  148. package/app-template/src/components/widget-content.tsx +323 -0
  149. package/app-template/src/data/server/theme.ts +70 -0
  150. package/app-template/src/hooks/use-fav-button.tsx +9 -10
  151. package/app-template/src/hooks/use-product-cart.ts +80 -0
  152. package/app-template/src/hooks/use-stock-alert.ts +74 -0
  153. package/app-template/src/hooks/use-theme-settings.ts +42 -0
  154. package/app-template/src/lib/fonts.ts +149 -0
  155. package/app-template/src/middleware.ts +1 -0
  156. package/app-template/src/plugins.js +13 -2
  157. package/app-template/src/redux/middlewares/category.ts +6 -5
  158. package/app-template/src/redux/reducers/category.ts +1 -1
  159. package/app-template/src/redux/store.ts +21 -1
  160. package/app-template/src/routes/index.ts +2 -1
  161. package/app-template/src/settings.js +5 -3
  162. package/app-template/src/types/hookform-resolvers-yup.d.ts +28 -0
  163. package/app-template/src/types/index.ts +74 -3
  164. package/app-template/src/types/next-auth.d.ts +2 -2
  165. package/app-template/src/types/widget.ts +169 -0
  166. package/app-template/src/utils/convert-facet-search-params.ts +1 -1
  167. package/app-template/src/utils/formatDate.ts +48 -0
  168. package/app-template/src/utils/styles.ts +71 -0
  169. package/app-template/src/utils/variant-validation.ts +41 -0
  170. package/app-template/src/views/account/address-form.tsx +8 -4
  171. package/app-template/src/views/account/contact-form.tsx +148 -136
  172. package/app-template/src/views/account/content-header.tsx +2 -2
  173. package/app-template/src/views/account/faq/faq-tabs.tsx +8 -2
  174. package/app-template/src/views/account/favorite-item.tsx +1 -1
  175. package/app-template/src/views/account/order.tsx +10 -8
  176. package/app-template/src/views/account/orders/order-cancellation-item.tsx +4 -3
  177. package/app-template/src/views/account/orders/order-detail-header.tsx +1 -1
  178. package/app-template/src/views/anonymous-tracking/order-detail/index.tsx +44 -37
  179. package/app-template/src/views/basket/basket-item.tsx +697 -107
  180. package/app-template/src/views/basket/basket-summary-context.tsx +560 -0
  181. package/app-template/src/views/basket/designer-context.tsx +617 -0
  182. package/app-template/src/views/basket/index.ts +2 -0
  183. package/app-template/src/views/basket/summary.tsx +497 -60
  184. package/app-template/src/views/breadcrumb/breadcrumb-client.tsx +190 -0
  185. package/app-template/src/views/breadcrumb/breadcrumb-registrar.tsx +286 -0
  186. package/app-template/src/views/breadcrumb/constants.ts +15 -0
  187. package/app-template/src/views/breadcrumb/index.tsx +127 -0
  188. package/app-template/src/views/breadcrumb.tsx +13 -38
  189. package/app-template/src/views/category/category-active-filters.tsx +1 -1
  190. package/app-template/src/views/category/category-banner.tsx +4 -23
  191. package/app-template/src/views/category/category-header.tsx +289 -60
  192. package/app-template/src/views/category/category-info.tsx +177 -27
  193. package/app-template/src/views/category/filters/filter-item.tsx +138 -42
  194. package/app-template/src/views/category/filters/index.tsx +209 -49
  195. package/app-template/src/views/category/layout.tsx +7 -4
  196. package/app-template/src/views/category/native-widget-context.tsx +257 -0
  197. package/app-template/src/views/category/product-list-registrar.tsx +665 -0
  198. package/app-template/src/views/checkout/auth.tsx +64 -40
  199. package/app-template/src/views/checkout/checkout-address-registrar.tsx +254 -0
  200. package/app-template/src/views/checkout/checkout-buttons-registrar.tsx +183 -0
  201. package/app-template/src/views/checkout/checkout-delivery-method-registrar.tsx +259 -0
  202. package/app-template/src/views/checkout/checkout-payment-options-registrar.tsx +253 -0
  203. package/app-template/src/views/checkout/checkout-summary-registrar.tsx +183 -0
  204. package/app-template/src/views/checkout/constants.ts +5 -0
  205. package/app-template/src/views/checkout/index.tsx +5 -0
  206. package/app-template/src/views/checkout/layout/header.tsx +9 -5
  207. package/app-template/src/views/checkout/steps/payment/index.tsx +5 -2
  208. package/app-template/src/views/checkout/steps/payment/options/credit-card/index.tsx +93 -6
  209. package/app-template/src/views/checkout/steps/payment/options/funds-transfer.tsx +25 -5
  210. package/app-template/src/views/checkout/steps/payment/options/loyalty.tsx +21 -2
  211. package/app-template/src/views/checkout/steps/payment/options/masterpass-rest.tsx +15 -0
  212. package/app-template/src/views/checkout/steps/payment/options/redirection.tsx +27 -5
  213. package/app-template/src/views/checkout/steps/payment/options/saved-card.tsx +18 -0
  214. package/app-template/src/views/checkout/steps/payment/options/store-credit.tsx +464 -0
  215. package/app-template/src/views/checkout/steps/payment/payment-option-buttons.tsx +171 -40
  216. package/app-template/src/views/checkout/steps/shipping/address-box.tsx +104 -29
  217. package/app-template/src/views/checkout/steps/shipping/addresses.tsx +129 -46
  218. package/app-template/src/views/checkout/steps/shipping/shipping-options.tsx +232 -27
  219. package/app-template/src/views/checkout/summary.tsx +310 -26
  220. package/app-template/src/views/find-in-store/index.tsx +2 -2
  221. package/app-template/src/views/footer/footer-app-banner-context.tsx +326 -0
  222. package/app-template/src/views/footer/footer-bottom-context.tsx +215 -0
  223. package/app-template/src/views/footer/footer-bottom-wrapper.tsx +74 -0
  224. package/app-template/src/views/footer/footer-layout-constants.ts +35 -0
  225. package/app-template/src/views/footer/footer-layout-registrar.tsx +342 -0
  226. package/app-template/src/views/footer/footer-layout-switcher.tsx +110 -0
  227. package/app-template/src/views/footer/footer-menu-context.tsx +211 -0
  228. package/app-template/src/views/footer/footer-native-widgets.tsx +60 -0
  229. package/app-template/src/views/footer/footer-social-context.tsx +254 -0
  230. package/app-template/src/views/footer/footer-subscription-context.tsx +210 -0
  231. package/app-template/src/views/footer/footer-utils.ts +43 -0
  232. package/app-template/src/views/footer/footer-value-props-context.tsx +326 -0
  233. package/app-template/src/views/footer/logo-settings.ts +183 -0
  234. package/app-template/src/views/footer/native-widget-config.ts +262 -0
  235. package/app-template/src/views/footer/subscription-settings.ts +122 -0
  236. package/app-template/src/views/footer/use-footer-logo.ts +162 -0
  237. package/app-template/src/views/footer.tsx +415 -13
  238. package/app-template/src/views/guest-login/index.tsx +62 -58
  239. package/app-template/src/views/header/action-menu.tsx +284 -49
  240. package/app-template/src/views/header/band.tsx +6 -21
  241. package/app-template/src/views/header/designer-context.tsx +261 -0
  242. package/app-template/src/views/header/header-announcement-registrar.tsx +267 -0
  243. package/app-template/src/views/header/header-client-wrapper.tsx +496 -0
  244. package/app-template/src/views/header/header-content.tsx +1026 -0
  245. package/app-template/src/views/header/header-currency-registrar.tsx +348 -0
  246. package/app-template/src/views/header/header-icons-context.tsx +262 -0
  247. package/app-template/src/views/header/header-language-registrar.tsx +348 -0
  248. package/app-template/src/views/header/header-layout-context.tsx +143 -0
  249. package/app-template/src/views/header/header-layout-registrar.tsx +658 -0
  250. package/app-template/src/views/header/header-logo-context.tsx +228 -0
  251. package/app-template/src/views/header/header-logo.tsx +118 -0
  252. package/app-template/src/views/header/header-mini-basket-context.tsx +524 -0
  253. package/app-template/src/views/header/header-search-registrar.tsx +511 -0
  254. package/app-template/src/views/header/header-text-slider-registrar.tsx +382 -0
  255. package/app-template/src/views/header/index.tsx +110 -48
  256. package/app-template/src/views/header/inline-search.tsx +262 -0
  257. package/app-template/src/views/header/mini-basket.tsx +832 -46
  258. package/app-template/src/views/header/mobile-hamburger-button.tsx +5 -8
  259. package/app-template/src/views/header/mobile-menu.tsx +12 -0
  260. package/app-template/src/views/header/navbar-menu-context.tsx +219 -0
  261. package/app-template/src/views/header/navbar.tsx +178 -111
  262. package/app-template/src/views/header/search/index.tsx +85 -24
  263. package/app-template/src/views/header/search/results.tsx +127 -65
  264. package/app-template/src/views/header/search/search-input.tsx +61 -0
  265. package/app-template/src/views/header/server-settings-parser.ts +1105 -0
  266. package/app-template/src/views/header/use-header-icons.ts +241 -0
  267. package/app-template/src/views/header/use-header-logo.ts +213 -0
  268. package/app-template/src/views/header/use-navbar-menu.ts +179 -0
  269. package/app-template/src/views/installment-options/index.tsx +1 -1
  270. package/app-template/src/views/login/index.tsx +89 -56
  271. package/app-template/src/views/otp-login/index.tsx +23 -20
  272. package/app-template/src/views/product/accordion-section.tsx +61 -0
  273. package/app-template/src/views/product/accordion-wrapper.tsx +135 -43
  274. package/app-template/src/views/product/custom-button-group.tsx +69 -0
  275. package/app-template/src/views/product/favorites-button-section.tsx +69 -0
  276. package/app-template/src/views/product/find-in-store-section.tsx +60 -0
  277. package/app-template/src/views/product/index.ts +1 -0
  278. package/app-template/src/views/product/layout.tsx +21 -6
  279. package/app-template/src/views/product/misc-buttons.tsx +339 -25
  280. package/app-template/src/views/product/price-wrapper.tsx +3 -24
  281. package/app-template/src/views/product/product-actions.tsx +294 -0
  282. package/app-template/src/views/product/product-info-section.tsx +140 -0
  283. package/app-template/src/views/product/product-info.tsx +130 -254
  284. package/app-template/src/views/product/product-share.tsx +61 -0
  285. package/app-template/src/views/product/product-variants.tsx +26 -0
  286. package/app-template/src/views/product/quantity-section.tsx +73 -0
  287. package/app-template/src/views/product/sale-tag.tsx +10 -0
  288. package/app-template/src/views/product/share-section.tsx +357 -0
  289. package/app-template/src/views/product/slider.tsx +135 -76
  290. package/app-template/src/views/product/variant.tsx +69 -41
  291. package/app-template/src/views/product/variants-section.tsx +126 -0
  292. package/app-template/src/views/product-detail/constants.ts +272 -0
  293. package/app-template/src/views/product-detail/index.ts +10 -0
  294. package/app-template/src/views/product-detail/product-detail-registrar.tsx +616 -0
  295. package/app-template/src/views/product-item/index.tsx +119 -46
  296. package/app-template/src/views/register/index.tsx +54 -44
  297. package/app-template/src/views/share/index.tsx +9 -6
  298. package/app-template/src/views/widgets/home-hero-slider-content.tsx +41 -39
  299. package/app-template/src/widgets/flatpages/about-us/index.tsx +78 -0
  300. package/app-template/src/widgets/flatpages/blog-list/index.tsx +129 -0
  301. package/app-template/src/widgets/footer-app-banner.tsx +444 -0
  302. package/app-template/src/widgets/footer-bottom.tsx +127 -0
  303. package/app-template/src/widgets/footer-menu-compact.tsx +238 -0
  304. package/app-template/src/widgets/footer-menu-two.tsx +298 -0
  305. package/app-template/src/widgets/footer-menu.tsx +6 -2
  306. package/app-template/src/widgets/footer-social-client.tsx +251 -0
  307. package/app-template/src/widgets/footer-social.tsx +47 -16
  308. package/app-template/src/widgets/footer-subscription/footer-subscription-form.tsx +17 -14
  309. package/app-template/src/widgets/footer-subscription/index.tsx +183 -17
  310. package/app-template/src/widgets/footer-value-props.tsx +201 -0
  311. package/app-template/src/widgets/home-stories-eng.tsx +42 -34
  312. package/app-template/src/widgets/index.ts +7 -0
  313. package/app-template/src/widgets/schemas/about-us.json +46 -0
  314. package/app-template/src/widgets/schemas/blog-list.json +37 -0
  315. package/app-template/src/widgets/schemas/blog.json +29 -0
  316. package/app-template/tailwind.config.js +19 -7
  317. package/app-template/tsconfig.json +29 -11
  318. package/codemods/migrate-segments/index.js +591 -0
  319. package/codemods/sentry-9/index.js +30 -0
  320. package/codemods/sentry-9/remove-sentry-configs.js +14 -0
  321. package/codemods/sentry-9/remove-sentry-dependency.js +25 -0
  322. package/codemods/sentry-9/replace-error-page.js +32 -0
  323. package/codemods/update-tailwind-config/index.js +30 -0
  324. package/codemods/update-tailwind-config/transform.js +102 -0
  325. package/commands/codemod.ts +17 -0
  326. package/commands/index.ts +3 -1
  327. package/commands/plugins.ts +115 -46
  328. package/dist/codemods/sentry-9/templates/error.js +14 -0
  329. package/dist/commands/codemod.js +15 -0
  330. package/dist/commands/index.js +3 -1
  331. package/dist/commands/plugins.js +85 -34
  332. package/package.json +3 -2
  333. package/app-template/postcss.config.js +0 -6
  334. package/app-template/sentry.client.config.ts +0 -16
  335. package/app-template/sentry.edge.config.ts +0 -3
  336. package/app-template/sentry.properties +0 -4
  337. package/app-template/sentry.server.config.ts +0 -3
  338. package/app-template/src/app/[commerce]/[locale]/[currency]/category/[pk]/page.tsx +0 -22
  339. package/app-template/src/app/[commerce]/[locale]/[currency]/error.tsx +0 -20
  340. package/app-template/src/app/[commerce]/[locale]/[currency]/flat-page/[pk]/page.tsx +0 -20
  341. package/app-template/src/app/[commerce]/[locale]/[currency]/group-product/[pk]/page.tsx +0 -74
  342. package/app-template/src/app/[commerce]/[locale]/[currency]/product/[pk]/loading.tsx +0 -67
  343. package/app-template/src/app/[commerce]/[locale]/[currency]/product/[pk]/page.tsx +0 -84
  344. package/app-template/src/app/[commerce]/[locale]/[currency]/special-page/[pk]/page.tsx +0 -27
  345. package/app-template/src/app/[commerce]/[locale]/[currency]/xml-sitemap/[node]/route.ts +0 -25
  346. package/app-template/src/pages/api/auth/[...nextauth].ts +0 -3
  347. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/address/page.tsx +0 -0
  348. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/change-email/page.tsx +0 -0
  349. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/change-password/page.tsx +0 -0
  350. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/contact/page.tsx +0 -0
  351. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/coupons/page.tsx +0 -0
  352. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/email-verification/page.tsx +0 -0
  353. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/faq/page.tsx +0 -0
  354. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/favourite-products/page.tsx +0 -0
  355. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/my-quotations/page.tsx +0 -0
  356. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/layout.tsx +0 -0
  357. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/page.tsx +0 -0
  358. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/page.tsx +0 -0
  359. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/address/stores/page.tsx +0 -0
  360. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/anonymous-tracking/page.tsx +0 -0
  361. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/auth/oauth-login/page.tsx +0 -0
  362. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/auth/page.tsx +0 -0
  363. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/basket/page.tsx +0 -0
  364. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/basket-b2b/page.tsx +0 -0
  365. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/category/[pk]/loading.tsx +0 -0
  366. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/client-root.tsx +0 -0
  367. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/contact-us/page.tsx +0 -0
  368. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/flat-page/[pk]/loading.tsx +0 -0
  369. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/group-product/[pk]/loading.tsx +0 -0
  370. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/landing-page/[pk]/loading.tsx +0 -0
  371. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/list/loading.tsx +0 -0
  372. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/completed/[token]/layout.tsx +0 -0
  373. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/page.tsx +0 -0
  374. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/special-page/[pk]/loading.tsx +0 -0
  375. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/template.tsx +0 -0
  376. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/password/reset/page.tsx +0 -0
  377. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/xml-sitemap/route.ts +0 -0
@@ -0,0 +1,71 @@
1
+ export type ResponsiveSize = 'mobile' | 'tablet' | 'desktop';
2
+
3
+ const breakpointOrder: ResponsiveSize[] = ['mobile', 'tablet', 'desktop'];
4
+
5
+ export function getResponsiveStyle(
6
+ style: Record<string, Record<string, string>> = {},
7
+ currentBreakpoint: ResponsiveSize,
8
+ context?: 'slider-item'
9
+ ): Record<string, string> {
10
+ let result = style.default ? { ...style.default } : {};
11
+ let largestDefinedBreakpoint: ResponsiveSize | undefined;
12
+
13
+ for (let i = 0; i < breakpointOrder.length; i++) {
14
+ const breakpoint = breakpointOrder[i];
15
+
16
+ if (breakpoint === currentBreakpoint) break;
17
+ if (style[breakpoint] && Object.keys(style[breakpoint]).length > 0) {
18
+ largestDefinedBreakpoint = breakpoint;
19
+ break;
20
+ }
21
+ }
22
+
23
+ if (largestDefinedBreakpoint) {
24
+ const styles = Object.entries(style[largestDefinedBreakpoint]).reduce(
25
+ (acc, [key, value]) => {
26
+ if (
27
+ context === 'slider-item' &&
28
+ key === 'display' &&
29
+ value === 'none'
30
+ ) {
31
+ return acc;
32
+ }
33
+ acc[key] = value;
34
+ return acc;
35
+ },
36
+ {} as Record<string, string>
37
+ );
38
+
39
+ result = {
40
+ ...result,
41
+ ...styles
42
+ };
43
+ }
44
+
45
+ if (
46
+ style[currentBreakpoint] &&
47
+ Object.keys(style[currentBreakpoint]).length > 0
48
+ ) {
49
+ const styles = Object.entries(style[currentBreakpoint]).reduce(
50
+ (acc, [key, value]) => {
51
+ if (
52
+ context === 'slider-item' &&
53
+ key === 'display' &&
54
+ value === 'none'
55
+ ) {
56
+ return acc;
57
+ }
58
+ acc[key] = value;
59
+ return acc;
60
+ },
61
+ {} as Record<string, string>
62
+ );
63
+
64
+ result = {
65
+ ...result,
66
+ ...styles
67
+ };
68
+ }
69
+
70
+ return result;
71
+ }
@@ -0,0 +1,41 @@
1
+ import React from 'react';
2
+ import { Trans } from '@akinon/next/components/trans';
3
+ import { VariantType } from '@akinon/next/types';
4
+
5
+ export const isVariantSelectionComplete = (variants: VariantType[]): boolean => {
6
+ return variants?.every((variant) =>
7
+ variant?.options.some((opt) => opt.is_selected)
8
+ );
9
+ };
10
+
11
+ export const getUnselectedVariant = (variants: VariantType[]): VariantType | undefined => {
12
+ return variants.find((variant) =>
13
+ variant.options.every((opt) => !opt.is_selected)
14
+ );
15
+ };
16
+
17
+ export const createVariantErrorMessage = (unselectedVariant: VariantType) => {
18
+ const TransComponent = Trans as any;
19
+ return React.createElement(
20
+ TransComponent,
21
+ {
22
+ i18nKey: "product.please_select_variant",
23
+ components: {
24
+ VariantName: React.createElement('span', {}, unselectedVariant.attribute_name)
25
+ }
26
+ }
27
+ );
28
+ };
29
+
30
+ export const validateVariantSelection = (variants: VariantType[]) => {
31
+ const unselectedVariant = getUnselectedVariant(variants);
32
+
33
+ if (unselectedVariant) {
34
+ return {
35
+ isValid: false,
36
+ errorMessage: createVariantErrorMessage(unselectedVariant)
37
+ };
38
+ }
39
+
40
+ return { isValid: true, errorMessage: null };
41
+ };
@@ -259,23 +259,25 @@ export const AddressForm = (props: Props) => {
259
259
  {/* TODO: Fix select and textarea components */}
260
260
 
261
261
  <Select
262
- className="w-full border-gray-500 text-sm mt-2"
262
+ className="w-full border-gray-500 text-sm"
263
263
  options={countryOptions}
264
264
  {...register('country')}
265
265
  error={errors.country}
266
266
  data-testid="address-form-country"
267
267
  label={t('account.address_book.form.country.title')}
268
+ labelClassName="mb-3"
268
269
  required
269
270
  />
270
271
 
271
272
  {city && (
272
273
  <Select
273
- className="w-full border-gray-500 text-sm mt-2"
274
+ className="w-full border-gray-500 text-sm"
274
275
  options={cityOptions}
275
276
  {...register('city')}
276
277
  error={errors.city}
277
278
  data-testid="address-form-city"
278
279
  label={t('account.address_book.form.province.title')}
280
+ labelClassName="mb-3"
279
281
  required
280
282
  />
281
283
  )}
@@ -283,24 +285,26 @@ export const AddressForm = (props: Props) => {
283
285
  <div className="flex gap-4">
284
286
  <div className="flex-1">
285
287
  <Select
286
- className="w-full border-gray-500 text-sm mt-2"
288
+ className="w-full border-gray-500 text-sm"
287
289
  options={townshipOptions}
288
290
  {...register('township')}
289
291
  error={errors.township}
290
292
  data-testid="address-form-township"
291
293
  label={t('account.address_book.form.township.title')}
294
+ labelClassName="mb-3"
292
295
  required
293
296
  />
294
297
  </div>
295
298
  {district && (
296
299
  <div className="flex-1">
297
300
  <Select
298
- className="w-full border-gray-500 text-sm mt-2"
301
+ className="w-full border-gray-500 text-sm"
299
302
  options={districtOptions}
300
303
  {...register('district')}
301
304
  error={errors.district}
302
305
  data-testid="address-form-district"
303
306
  label={t('account.address_book.form.district.title')}
307
+ labelClassName="mb-3"
304
308
  required
305
309
  />
306
310
  </div>
@@ -79,7 +79,10 @@ const ContactForm = () => {
79
79
  }
80
80
  );
81
81
 
82
- const [sendContact, { isSuccess: formSuccess }] = useSendContactMutation();
82
+ const [
83
+ sendContact,
84
+ { isSuccess: formSuccess, isLoading: isSubmitting, error: submitError }
85
+ ] = useSendContactMutation();
83
86
 
84
87
  if (ordersSuccess) {
85
88
  orders?.results?.map((item) => {
@@ -111,7 +114,7 @@ const ContactForm = () => {
111
114
  resolver: yupResolver(contactFormSchema(t))
112
115
  });
113
116
 
114
- const onSubmit: SubmitHandler<ContactFormType> = (data, event) => {
117
+ const onSubmit: SubmitHandler<ContactFormType> = (data) => {
115
118
  const formData = new FormData();
116
119
 
117
120
  Object.keys(data ?? {}).forEach((key) => {
@@ -122,6 +125,9 @@ const ContactForm = () => {
122
125
  }
123
126
  });
124
127
 
128
+ formData.append('subject', 'tdsadasdsa');
129
+ formData.append('order', '2222');
130
+
125
131
  sendContact(formData);
126
132
  };
127
133
 
@@ -141,158 +147,164 @@ const ContactForm = () => {
141
147
  }, [session, reset]);
142
148
 
143
149
  return (
144
- <div className="flex-1">
145
- <div className="bg-gray-150 p-4 lg:p-8">
146
- <h2 className="text-3xl text-center mb-5">
147
- {t('account.contact.header.title')}
148
- </h2>
149
- <p className="text-center">{t('account.contact.header.subtitle')}</p>
150
- </div>
151
- <div className="flex flex-col lg:flex-row">
150
+ <div className="max-w-lg mx-auto">
151
+ <div className="flex flex-col text-black-750">
152
152
  {formSuccess ? (
153
153
  <div>
154
- <div className="border border-gray-500 mt-5 p-6 lg:px-24 lg:py-10 lg:w-[670px]">
155
- <h3 className="text-3xl mb-5">
156
- {t('account.contact.form.success.title')}
157
- </h3>
158
- <p className="text-sm mb-4">
159
- {t('account.contact.form.success.description')}
160
- </p>
161
- <Link href={'/'} className="underline">
162
- {t('account.contact.form.success.button')}
163
- </Link>
164
- </div>
154
+ <h3 className="text-3xl mb-5">
155
+ {t('account.contact.form.success.title')}
156
+ </h3>
157
+ <p className="text-sm mb-4">
158
+ {t('account.contact.form.success.description')}
159
+ </p>
160
+ <Link href={'/'} className="underline">
161
+ {t('account.contact.form.success.button')}
162
+ </Link>
165
163
  </div>
166
164
  ) : (
167
- <form
168
- onSubmit={handleSubmit(onSubmit)}
169
- className="border border-gray-500 mt-5 p-6 lg:px-24 lg:py-10 lg:w-[670px]"
170
- >
171
- <div className="mb-5">
172
- <Input
173
- label={t('account.contact.form.full_name.placeholder')}
174
- className="mb-1"
175
- {...register('full_name')}
176
- error={errors.full_name}
177
- required
178
- />
179
- </div>
180
- <div className="mb-5">
181
- <Input
182
- label={t('account.contact.form.email.placeholder')}
183
- type="email"
184
- className="mb-1"
185
- {...register('email')}
186
- error={errors.email}
187
- required
188
- />
189
- </div>
190
- <div className="mb-5">
191
- <Input
192
- label={t('account.contact.form.phone.placeholder')}
193
- type="tel"
194
- className="mb-1"
195
- format={user_phone_format.replace(/9/g, '#')}
196
- mask="_"
197
- allowEmptyFormatting={true}
198
- control={control}
199
- {...register('phone')}
200
- error={errors.phone}
201
- required
202
- />
165
+ <>
166
+ <div>
167
+ <h2 className="text-[40px] mb-8">
168
+ {' '}
169
+ {t('account.contact.header.title')}
170
+ </h2>
171
+
172
+ <div className="mb-16">
173
+ <h3 className="mb-8 font-bold">{t('account.contact.hours')}</h3>
174
+ <p> Monday – Friday: 10:00am – 7:30pm</p>
175
+ <p>Saturday: 10:00am – 6:00pm</p>
176
+ <p>Sunday: 11:00am – 6:00pm</p>
177
+ </div>
203
178
  </div>
204
179
 
205
- <div className="mb-5 relative">
206
- {subjectLoading && <LoaderSpinner />}
207
- {subjectSuccess && (
208
- <>
209
- <Select
210
- className="w-full mb-1 border-gray-500 text-sm"
211
- options={filteredSubjects}
212
- {...register('subject')}
213
- error={errors.subject}
214
- onChange={handleChange}
215
- label={t('account.contact.form.subject.title')}
180
+ <form
181
+ onSubmit={handleSubmit(onSubmit)}
182
+ className="flex flex-col gap-4"
183
+ >
184
+ <div className="flex flex-col gap-4 lg:flex-row">
185
+ <div className="lg:w-1/2">
186
+ <Input
187
+ placeholder={t(
188
+ 'account.contact.form.full_name.placeholder'
189
+ )}
190
+ {...register('full_name')}
191
+ error={errors.full_name}
192
+ className="h-12"
216
193
  required
217
194
  />
218
- </>
219
- )}
220
- </div>
195
+ </div>
196
+
197
+ <div className="lg:w-1/2">
198
+ <Input
199
+ placeholder={t('account.contact.form.email.placeholder')}
200
+ type="email"
201
+ {...register('email')}
202
+ className="h-12"
203
+ error={errors.email}
204
+ required
205
+ />
206
+ </div>
207
+ </div>
221
208
 
222
- {selectedSubject === '2' && (
223
- <div className="mb-5 relative">
224
- {ordersLoading && <LoaderSpinner />}
225
- {ordersSuccess && (
209
+ <div>
210
+ <Input
211
+ placeholder={t('account.contact.form.phone.placeholder')}
212
+ type="tel"
213
+ className="h-12"
214
+ format={user_phone_format.replace(/9/g, '#')}
215
+ mask="_"
216
+ allowEmptyFormatting={true}
217
+ control={control}
218
+ {...register('phone')}
219
+ error={errors.phone}
220
+ required
221
+ />
222
+ </div>
223
+
224
+ <div className="relative">
225
+ {subjectLoading && <LoaderSpinner />}
226
+ {subjectSuccess && (
226
227
  <>
227
228
  <Select
228
- className="w-full mb-1 border-gray-500 text-sm"
229
- options={filteredOrders}
230
- {...register('order')}
231
- error={errors.order}
232
- label={t('account.contact.form.order.title')}
229
+ className="w-full h-12 border-gray-500 text-sm"
230
+ options={filteredSubjects}
231
+ {...register('subject')}
232
+ error={errors.subject}
233
+ onChange={handleChange}
233
234
  required
234
235
  />
235
236
  </>
236
237
  )}
237
238
  </div>
238
- )}
239
239
 
240
- <label className="text-xs text-gray-800 mb-2 block">
241
- {t('account.contact.form.message.title')}{' '}
242
- <span className="text-secondary">*</span>
243
- </label>
244
- <textarea
245
- className="border-gray-500 border w-full text-xs p-2.5 focus-visible:outline-none focus:border-black hover:border-black"
246
- rows={7}
247
- name="message"
248
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
249
- // @ts-ignore - Fix TS error
250
- {...register('message')}
251
- />
252
- {errors.message && (
253
- <div className="text-sm text-error">{errors.message.message}</div>
254
- )}
255
- <label className="text-xs text-gray-800 mb-2 block">
256
- {t('account.contact.form.file.title')}
257
- </label>
258
- <FileInput
259
- name="file"
260
- title="file"
261
- className="w-full mb-5"
262
- {...register('file')}
263
- />
264
- <Button type="submit" className="w-full font-medium">
265
- {t('account.contact.form.submit_button')}
266
- </Button>
267
- </form>
268
- )}
240
+ {selectedSubject === '2' && (
241
+ <div className="relative">
242
+ {ordersLoading && <LoaderSpinner />}
243
+ {ordersSuccess && (
244
+ <>
245
+ <Select
246
+ className="w-full h-12 border-gray-500 text-sm"
247
+ options={filteredOrders}
248
+ {...register('order')}
249
+ error={errors.order}
250
+ required
251
+ />
252
+ </>
253
+ )}
254
+ </div>
255
+ )}
269
256
 
270
- <div className="my-6 lg:ml-8">
271
- <h2 className="text-3xl mb-4">
272
- {' '}
273
- {t('account.contact.address_title')}
274
- </h2>
275
- <div className="mb-4">
276
- <h3 className="font-medium text-sm">London</h3>
277
- <p className="text-sm">7 Bell Yard, London, WC2A 2JR</p>
278
- <p className="text-sm">+44 20 3740 62 63</p>
279
- </div>
280
- <div className="mb-4">
281
- <h3 className="font-medium text-sm">İstanbul</h3>
282
- <p className="text-sm">YTU Davutpasa Teknopark A1 Z10</p>
283
- <p className="text-sm">+90 212 483 72 45</p>
284
- </div>
285
- <div className="mb-4">
286
- <h3 className="font-medium text-sm">Dubai</h3>
287
- <p className="text-sm">Level 21 Al Habtoor Business Tower</p>
288
- <p className="text-sm">+971 4275 6336</p>
289
- </div>
290
- <div className="mb-4">
291
- <h3 className="font-medium text-sm">Athens</h3>
292
- <p className="text-sm">Averof 18a, Chalandri</p>
293
- <p className="text-sm">+30 21 1411 6000</p>
294
- </div>
295
- </div>
257
+ <textarea
258
+ className="border-gray-500 border w-full text-xs p-2.5 focus-visible:outline-none focus:border-black hover:border-black"
259
+ rows={7}
260
+ name="message"
261
+ placeholder={t('account.contact.form.message.title')}
262
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
263
+ // @ts-ignore - Fix TS error
264
+ {...register('message')}
265
+ />
266
+ {errors.message && (
267
+ <div className="text-sm text-error">
268
+ {errors.message.message}
269
+ </div>
270
+ )}
271
+
272
+ <FileInput
273
+ name="file"
274
+ title="file"
275
+ buttonClassName="w-full h-12"
276
+ {...register('file')}
277
+ />
278
+ <Button
279
+ type="submit"
280
+ className="w-fit mt-4 h-12 px-8"
281
+ disabled={isSubmitting}
282
+ >
283
+ {isSubmitting
284
+ ? t('account.contact.form.submitting')
285
+ : t('account.contact.form.submit_button')}
286
+ </Button>
287
+
288
+ {submitError && (
289
+ <div className="text-sm text-error mt-2">
290
+ {'data' in submitError &&
291
+ submitError.data &&
292
+ typeof submitError.data === 'object'
293
+ ? Object.entries(submitError.data).map(
294
+ ([field, messages]) => (
295
+ <div key={field}>
296
+ {Array.isArray(messages)
297
+ ? messages.join(', ')
298
+ : String(messages)}
299
+ </div>
300
+ )
301
+ )
302
+ : t('account.contact.form.error.general')}
303
+ </div>
304
+ )}
305
+ </form>
306
+ </>
307
+ )}
296
308
  </div>
297
309
  </div>
298
310
  );
@@ -31,13 +31,13 @@ export const ContentHeader = (props: Props) => {
31
31
  </h3>
32
32
  <Select
33
33
  onChange={handleChange}
34
- className="w-full mb-4 md:mb-0 md:w-56 md:mr-4 text-xs"
34
+ className="w-full mb-4 md:mb-0 md:w-56 text-xs"
35
35
  options={orders}
36
36
  data-testid="account-orders-header-select"
37
37
  ></Select>
38
38
  <Button
39
39
  className={clsx(
40
- 'w-full md:w-56',
40
+ 'w-full md:w-56 md:ms-4',
41
41
  isButtonDisabled &&
42
42
  'hover:bg-black hover:text-white disabled:opacity-75'
43
43
  )}
@@ -3,6 +3,7 @@
3
3
  import { Accordion, LoaderSpinner, TabPanel, Tabs } from '@theme/components';
4
4
  import React from 'react';
5
5
  import { useGetWidgetQuery } from '@akinon/next/data/client/misc';
6
+ import { useLocalization } from '@akinon/next/hooks';
6
7
 
7
8
  interface Props {
8
9
  searchKey?: string;
@@ -11,6 +12,7 @@ interface Props {
11
12
  export function FaqTabs(props: Props) {
12
13
  const { searchKey } = props;
13
14
  const { data, isLoading } = useGetWidgetQuery('faq');
15
+ const { locale } = useLocalization();
14
16
 
15
17
  if (isLoading) {
16
18
  return <LoaderSpinner className="mt-4" />;
@@ -29,8 +31,12 @@ export function FaqTabs(props: Props) {
29
31
  {data?.attributes?.faq_contents
30
32
  ?.filter(
31
33
  (faq) =>
32
- faq.value.content.toLocaleLowerCase().includes(searchKey) ||
33
- faq.value.title.toLocaleLowerCase().includes(searchKey)
34
+ faq.value.content
35
+ .toLocaleLowerCase(locale)
36
+ .includes(searchKey) ||
37
+ faq.value.title
38
+ .toLocaleLowerCase(locale)
39
+ .includes(searchKey)
34
40
  )
35
41
  .map((faq, index) => {
36
42
  if (faq.value.category == item.value.category_id) {
@@ -91,7 +91,7 @@ export const FavoriteItem = (props: Props) => {
91
91
  size={14}
92
92
  onClick={() => removeFavorite(item.pk)}
93
93
  className={clsx(
94
- 'absolute top-4 right-4 cursor-pointer',
94
+ 'absolute top-4 right-4 cursor-pointer p-1 drop-shadow-[1px_2px_0px_rgb(255,255,255)]',
95
95
  isRemoveFavoriteLoading
96
96
  ? 'hover:cursor-wait'
97
97
  : 'hover:cursor-pointer'
@@ -13,7 +13,7 @@ export const Order = (props) => {
13
13
  .reverse()
14
14
  .join(' ');
15
15
 
16
- const orderStatus = getOrderStatus(props.status.value.toString(), t);
16
+ const orderStatus = getOrderStatus(props?.status?.value?.toString(), t);
17
17
 
18
18
  return (
19
19
  <div className="border border-gray px-5 py-4 text-sm mb-4 last:mb-0">
@@ -58,30 +58,32 @@ export const Order = (props) => {
58
58
 
59
59
  <div className="w-full flex flex-col justify-between mt-6 mb-2 order-3 md:items-center md:flex-row md:order-none md:gap-20 lg:gap-40">
60
60
  <ul className="flex flex-wrap gap-3.5 mb-6 items-center md:mb-0">
61
- {props.orderitem_set.slice(0, 3).map((item, index) => (
61
+ {props?.orderitem_set?.slice(0, 3).map((item, index) => (
62
62
  // TODO: Static image will change (TR)
63
63
  <li className="flex-shrink-0" key={index}>
64
64
  <Image
65
- src={item.product.image ? item.product.image : '/noimage.jpg'}
66
- alt={item.product.name}
65
+ src={
66
+ item?.product?.image ? item.product.image : '/noimage.jpg'
67
+ }
68
+ alt={item?.product?.name}
67
69
  width={64}
68
70
  height={96}
69
71
  />
70
72
  </li>
71
73
  ))}
72
- {props.orderitem_set.length > 3 && (
73
- <div>+ {props.orderitem_set.length - 3}</div>
74
+ {props?.orderitem_set?.length > 3 && (
75
+ <div>+ {props?.orderitem_set?.length - 3}</div>
74
76
  )}
75
77
  </ul>
76
78
 
77
- <span className={orderStatus.className}>{orderStatus.label}</span>
79
+ <span className={orderStatus?.className}>{orderStatus?.label}</span>
78
80
  </div>
79
81
 
80
82
  <div
81
83
  className="order-2 flex items-end md:order-none"
82
84
  data-testid="account-orders-count"
83
85
  >
84
- {props.orderitem_set.length} {t('account.my_orders.order.items')}
86
+ {props?.orderitem_set?.length} {t('account.my_orders.order.items')}
85
87
  </div>
86
88
  </div>
87
89
  </div>
@@ -8,7 +8,8 @@ export const OrderCancellationItem = ({
8
8
  item,
9
9
  value,
10
10
  onChange,
11
- selectOption
11
+ selectOption,
12
+ fileInput
12
13
  }) => {
13
14
  const { t } = useLocalization();
14
15
  const checkboxStatus =
@@ -38,7 +39,6 @@ export const OrderCancellationItem = ({
38
39
  <div className="flex flex-wrap justify-between border-gray border-b mb-4 pb-3">
39
40
  <div className="flex gap-3 mb-5 lg:mb-0">
40
41
  {checkboxStatus && (
41
- // TODO: Static image will change (TR)
42
42
  <Checkbox
43
43
  className="m-auto"
44
44
  data-testid="account-orders-return-checkbox"
@@ -80,7 +80,7 @@ export const OrderCancellationItem = ({
80
80
  </div>
81
81
  </div>
82
82
  </div>
83
- <div className="flex flex-wrap justify-between w-full items-start lg:items-center lg:w-auto">
83
+ <div className="flex flex-wrap justify-between w-full items-start lg:items-center lg:w-80 gap-4">
84
84
  <div className="w-full flex flex-col lg:items-center lg:flex-row">
85
85
  {item.active_cancellation_request?.easy_return?.code && (
86
86
  <div className="flex items-center">
@@ -93,6 +93,7 @@ export const OrderCancellationItem = ({
93
93
 
94
94
  {selectOption}
95
95
  </div>
96
+ <div>{fileInput}</div>
96
97
  </div>
97
98
  </div>
98
99
  );
@@ -21,7 +21,7 @@ export const OrderDetailHeader = ({ title, order, children }: Props) => {
21
21
  <div>
22
22
  <span>{t('account.my_orders.detail.order_number')}</span>:{' '}
23
23
  <span data-testid="account-orders-return-order-id">
24
- {order.number}
24
+ {order?.number}
25
25
  </span>
26
26
  </div>
27
27