@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
@@ -5,7 +5,8 @@ import { Image } from '@akinon/next/components/image';
5
5
  import clsx from 'clsx';
6
6
  import { SalesContractModal } from '@theme/views/sales-contract-modal';
7
7
  import { useGetOrderQuery } from '@akinon/next/data/client/account';
8
- import { useEffect, useState, use } from 'react';
8
+ import { useEffect, useState } from 'react';
9
+ import { useParams } from 'next/navigation';
9
10
 
10
11
  import { OrderDetailHeader } from '@theme/views/account/orders/order-detail-header';
11
12
  import { ROUTES } from '@theme/routes';
@@ -13,9 +14,8 @@ import { useLocalization } from '@akinon/next/hooks';
13
14
  import settings from 'settings';
14
15
  import { getOrderStatus } from 'utils';
15
16
 
16
- const AccountOrderDetail = ({ params }) => {
17
- const pageParams = use(params) as { id: string };
18
-
17
+ const AccountOrderDetail = () => {
18
+ const { id } = useParams<{ id: string }>();
19
19
  const { locale, t } = useLocalization();
20
20
 
21
21
  const localeValue = settings.localization.locales.find(
@@ -27,20 +27,21 @@ const AccountOrderDetail = ({ params }) => {
27
27
  isLoading,
28
28
  isSuccess,
29
29
  isFetching
30
- } = useGetOrderQuery(pageParams.id);
30
+ } = useGetOrderQuery(id);
31
31
  const [orderDate, setOrderDate] = useState('');
32
32
 
33
33
  const groupedOrder = [];
34
34
 
35
35
  if (order) {
36
- const groupedData = order.orderitem_set.reduce((groups, item) => {
37
- const { tracking_number } = item;
38
- if (!groups[tracking_number]) {
39
- groups[tracking_number] = [];
40
- }
41
- groups[tracking_number].push(item);
42
- return groups;
43
- }, {});
36
+ const groupedData =
37
+ order?.orderitem_set?.reduce((groups, item) => {
38
+ const { tracking_number } = item;
39
+ if (!groups[tracking_number]) {
40
+ groups[tracking_number] = [];
41
+ }
42
+ groups[tracking_number].push(item);
43
+ return groups;
44
+ }, {}) || {};
44
45
 
45
46
  const result = Object.values(groupedData);
46
47
 
@@ -62,7 +63,26 @@ const AccountOrderDetail = ({ params }) => {
62
63
  }, [order, isSuccess, localeValue]);
63
64
 
64
65
  if (isLoading && isFetching) {
65
- return <LoaderSpinner />;
66
+ return (
67
+ <div className="flex flex-col items-center justify-center h-96">
68
+ <LoaderSpinner />
69
+ </div>
70
+ );
71
+ }
72
+
73
+ if (!order) {
74
+ return (
75
+ <div className="flex flex-col items-center justify-center h-96">
76
+ <p className="mt-5 text-start text-lg mb-4">
77
+ {t('account.my_orders.detail.no_orders_found')}
78
+ </p>
79
+ <Link href={`/account/orders/`}>
80
+ <Button className="px-4" appearance="filled">
81
+ {t('account.my_orders.detail.back_to_orders')}
82
+ </Button>
83
+ </Link>
84
+ </div>
85
+ );
66
86
  }
67
87
 
68
88
  return (
@@ -77,8 +97,8 @@ const AccountOrderDetail = ({ params }) => {
77
97
 
78
98
  <div>
79
99
  <span className="text-base font-bold">
80
- {order?.orderitem_set.length}{' '}
81
- {t('account.my_orders.detail.products')} {groupedOrder.length}{' '}
100
+ {order?.orderitem_set?.length}{' '}
101
+ {t('account.my_orders.detail.products')} {groupedOrder?.length}{' '}
82
102
  {t('account.my_orders.detail.packages')}
83
103
  </span>
84
104
  </div>
@@ -88,16 +108,17 @@ const AccountOrderDetail = ({ params }) => {
88
108
  className="break-words"
89
109
  >
90
110
  <span>{t('account.my_orders.detail.delivery_address')}</span>:{' '}
91
- {order.shipping_address.line} {order.shipping_address.district.name}{' '}
92
- {order.shipping_address.township.name}{' '}
93
- {order.shipping_address.city.name}
111
+ {order?.shipping_address?.line}{' '}
112
+ {order?.shipping_address?.district?.name}{' '}
113
+ {order?.shipping_address?.township?.name}{' '}
114
+ {order?.shipping_address?.city?.name}
94
115
  </div>
95
116
  </OrderDetailHeader>
96
117
 
97
118
  <div>
98
119
  {groupedOrder.map((group, i) => {
99
120
  const orderStatus = getOrderStatus(
100
- group[0].status.value.toString(),
121
+ group[0]?.status?.value?.toString(),
101
122
  t
102
123
  );
103
124
 
@@ -121,8 +142,8 @@ const AccountOrderDetail = ({ params }) => {
121
142
  <div className="flex justify-between items-center lg:gap-x-12">
122
143
  <div className="text-base">{orderStatus.label}</div>
123
144
 
124
- {group[0].tracking_number && group[0].tracking_url && (
125
- <Link href={group[0].tracking_url}>
145
+ {group[0]?.tracking_number && group[0]?.tracking_url && (
146
+ <Link href={group[0]?.tracking_url}>
126
147
  <Button className="px-7" appearance="filled">
127
148
  {t('account.my_orders.detail.track_shipment')}
128
149
  </Button>
@@ -134,7 +155,7 @@ const AccountOrderDetail = ({ params }) => {
134
155
  <div className="px-4 lg:px-7">
135
156
  {group.map((item, index) => {
136
157
  const itemStatus = getOrderStatus(
137
- item.status.value.toString(),
158
+ item?.status?.value?.toString(),
138
159
  t
139
160
  );
140
161
 
@@ -147,15 +168,15 @@ const AccountOrderDetail = ({ params }) => {
147
168
  <div className="flex-shrink-0">
148
169
  <Link
149
170
  className="block"
150
- href={item.product.absolute_url}
171
+ href={item?.product?.absolute_url}
151
172
  >
152
173
  <Image
153
174
  src={
154
- item.product.image
175
+ item?.product?.image
155
176
  ? item.product.image
156
177
  : '/noimage.jpg'
157
178
  }
158
- alt={item.product.name}
179
+ alt={item?.product?.name}
159
180
  width={112}
160
181
  height={150}
161
182
  />
@@ -164,33 +185,33 @@ const AccountOrderDetail = ({ params }) => {
164
185
 
165
186
  <div className="flex flex-col justify-between lg:max-w-48">
166
187
  <div className="text-sm">
167
- <Link href={item.product.absolute_url}>
168
- {item.product.name}
188
+ <Link href={item?.product?.absolute_url}>
189
+ {item?.product?.name}
169
190
  </Link>
170
191
  </div>
171
192
 
172
193
  <div className="text-gray-900 text-xs">
173
- {item.product.attributes.filterable_color && (
194
+ {item?.product?.attributes?.filterable_color && (
174
195
  <div>
175
196
  <span>
176
197
  {t('account.my_orders.detail.color')}
177
198
  </span>
178
- : {item.product.attributes.filterable_color}
199
+ : {item?.product?.attributes?.filterable_color}
179
200
  </div>
180
201
  )}
181
202
 
182
- {item.product.attributes.size && (
203
+ {item?.product?.attributes?.size && (
183
204
  <div>
184
205
  <span>
185
206
  {t('account.my_orders.detail.size')}
186
207
  </span>
187
- :{item.product.attributes.size}
208
+ :{item?.product?.attributes?.size}
188
209
  </div>
189
210
  )}
190
211
 
191
212
  <div>
192
213
  <span>{t('account.my_orders.detail.code')}</span>:{' '}
193
- {item.product.base_code}
214
+ {item?.product?.base_code}
194
215
  </div>
195
216
  </div>
196
217
  </div>
@@ -207,12 +228,11 @@ const AccountOrderDetail = ({ params }) => {
207
228
  {itemStatus.label}
208
229
  </div>
209
230
 
210
- {(item.is_cancellable || item.is_refundable) &&
211
- order.is_cancellable &&
212
- item.status.value == '400' && (
231
+ {(item?.is_cancellable || item?.is_refundable) &&
232
+ order?.is_cancellable && (
213
233
  <div className="lg:ml-24">
214
234
  <Link
215
- href={`${ROUTES.ACCOUNT_ORDERS}/${order.id}/cancellation`}
235
+ href={`${ROUTES.ACCOUNT_ORDERS}/${order?.id}/cancellation`}
216
236
  >
217
237
  <Button
218
238
  className="px-4 uppercase font-bold h-7"
@@ -227,23 +247,22 @@ const AccountOrderDetail = ({ params }) => {
227
247
  </div>
228
248
  )}
229
249
  </div>
230
-
231
250
  <div className="flex flex-col justify-center items-end lg:ml-6 lg:min-w-[7rem]">
232
- {parseFloat(item.retail_price) >
233
- parseFloat(item.price) && (
251
+ {parseFloat(item?.retail_price || '0') >
252
+ parseFloat(item?.price || '0') && (
234
253
  <Price
235
254
  className="font-normal line-through"
236
- value={item.retail_price}
255
+ value={item?.retail_price}
237
256
  />
238
257
  )}
239
258
 
240
259
  <Price
241
260
  className={clsx('font-normal', {
242
261
  'text-secondary-600':
243
- parseFloat(item.retail_price) >
244
- parseFloat(item.price)
262
+ parseFloat(item?.retail_price || '0') >
263
+ parseFloat(item?.price || '0')
245
264
  })}
246
- value={item.price}
265
+ value={item?.price}
247
266
  />
248
267
  </div>
249
268
  </div>
@@ -251,6 +270,70 @@ const AccountOrderDetail = ({ params }) => {
251
270
  );
252
271
  })}
253
272
  </div>
273
+
274
+ {group.map((item) =>
275
+ item.cancellationrequest_set?.map((cancellationItem) => {
276
+ const status = cancellationItem.status?.value;
277
+ const isRejected = status === 'rejected';
278
+ const isCompleted = status === 'completed';
279
+
280
+ const filteredImages =
281
+ cancellationItem.cancellation_request_image_set?.filter(
282
+ (img) =>
283
+ isRejected
284
+ ? !img.is_uploaded_by_user
285
+ : isCompleted
286
+ ? img.is_uploaded_by_user
287
+ : false
288
+ ) || [];
289
+
290
+ const statusText = isRejected
291
+ ? t('account.my_orders.return.rejected')
292
+ : isCompleted
293
+ ? t('account.my_orders.return.completed')
294
+ : null;
295
+
296
+ if (!statusText || filteredImages.length === 0) return null;
297
+
298
+ return (
299
+ <div
300
+ className="w-full px-4 lg:px-7"
301
+ key={cancellationItem.id}
302
+ >
303
+ <div className="flex flex-col py-2 gap-4 border-t border-gray">
304
+ <div className="flex flex-col">
305
+ <div className="text-sm font-semibold">
306
+ {t('account.my_orders.return.return_status')}
307
+ <span className="font-normal"> {statusText}</span>
308
+ </div>
309
+
310
+ <div className="flex gap-2 mt-2 flex-wrap">
311
+ {filteredImages.map((img) => (
312
+ <div className="flex flex-col gap-2" key={img.id}>
313
+ <Link href={img.image} target="_blank">
314
+ <Image
315
+ src={img.image}
316
+ width={112}
317
+ height={150}
318
+ alt={img.description}
319
+ />
320
+ </Link>
321
+
322
+ {img.description && (
323
+ <p className="text-xs">
324
+ {t('account.my_orders.return.explanation')}:
325
+ {img.description}
326
+ </p>
327
+ )}
328
+ </div>
329
+ ))}
330
+ </div>
331
+ </div>
332
+ </div>
333
+ </div>
334
+ );
335
+ })
336
+ )}
254
337
  </div>
255
338
  );
256
339
  })}
@@ -263,29 +346,29 @@ const AccountOrderDetail = ({ params }) => {
263
346
  <div className="flex justify-between text-sm text-black-700 mb-2">
264
347
  <p>
265
348
  <span>{t('account.my_orders.detail.subtotal')}</span> (
266
- {order.orderitem_set.length}{' '}
349
+ {order?.orderitem_set?.length}{' '}
267
350
  <span>{t('account.my_orders.detail.items')}</span>)
268
351
  </p>
269
352
 
270
353
  <Price
271
354
  className="font-normal min-w-max"
272
355
  value={
273
- parseFloat(order.amount_without_discount) -
274
- parseFloat(order.shipping_amount)
356
+ parseFloat(order?.amount_without_discount || '0') -
357
+ parseFloat(order?.shipping_amount || '0')
275
358
  }
276
359
  />
277
360
  </div>
278
361
 
279
- {order.discountitem_set &&
280
- order.discountitem_set.map((item, index) => (
362
+ {order?.discountitem_set &&
363
+ order?.discountitem_set?.map((item, index) => (
281
364
  <div
282
365
  className="flex justify-between text-sm text-black-700 mb-2"
283
366
  key={index}
284
367
  >
285
- <p>{item.name}</p>
368
+ <p>{item?.name}</p>
286
369
  <Price
287
370
  className="font-normal min-w-max"
288
- value={item.amount}
371
+ value={item?.amount}
289
372
  useNegative
290
373
  />
291
374
  </div>
@@ -298,7 +381,8 @@ const AccountOrderDetail = ({ params }) => {
298
381
  className="font-normal min-w-max"
299
382
  data-testid="account-orders-detail-total"
300
383
  value={
301
- parseFloat(order.amount) - parseFloat(order.shipping_amount)
384
+ parseFloat(order?.amount || '0') -
385
+ parseFloat(order?.shipping_amount || '0')
302
386
  }
303
387
  />
304
388
  </div>
@@ -288,9 +288,9 @@ export default function Page() {
288
288
  />
289
289
  </div>
290
290
  </div>
291
- {errors && (
291
+ {errors?.birthdate?.message && (
292
292
  <div className="mt-1 text-sm text-error">
293
- {errors.birthdate?.message}
293
+ {String(errors.birthdate.message)}
294
294
  </div>
295
295
  )}
296
296
  </div>
@@ -0,0 +1,27 @@
1
+ import { getCategoryData } from '@akinon/next/data/server';
2
+ import { withSegmentDefaults } from '@akinon/next/hocs/server';
3
+ import { ResolvedPageProps } from '@akinon/next/types';
4
+ import CategoryLayout from '@theme/views/category/layout';
5
+ import { notFound } from 'next/navigation';
6
+
7
+ async function Page({ params, searchParams }: ResolvedPageProps<{ pk: number }>) {
8
+ try {
9
+ const { data, breadcrumbData } = await getCategoryData({
10
+ pk: params.pk,
11
+ searchParams
12
+ });
13
+
14
+ return (
15
+ <>
16
+ <CategoryLayout data={data} breadcrumbData={breadcrumbData} />
17
+ </>
18
+ );
19
+ } catch (error: unknown) {
20
+ if ((error as Error & { status?: number })?.status === 404) {
21
+ notFound();
22
+ }
23
+ throw error;
24
+ }
25
+ }
26
+
27
+ export default withSegmentDefaults(Page, { segmentType: 'page' });
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import { useSentryUncaughtErrors } from '@akinon/next/hooks';
4
+ import PzErrorPage from '@akinon/next/views/error-page';
5
+
6
+ export default function ErrorPage({
7
+ error,
8
+ reset
9
+ }: {
10
+ error: Error & { digest?: string; isServerError?: boolean };
11
+ reset: () => void;
12
+ }) {
13
+ // DO NOT REMOVE THIS LINE TO REPORT UNCAUGHT ERRORS TO SENTRY
14
+ useSentryUncaughtErrors(error);
15
+
16
+ return <PzErrorPage error={error} reset={reset} />;
17
+ }
@@ -0,0 +1,23 @@
1
+ import { getFlatPageData } from '@akinon/next/data/server';
2
+ import { withSegmentDefaults } from '@akinon/next/hocs/server';
3
+ import { ResolvedPageProps } from '@akinon/next/types';
4
+ import { notFound } from 'next/navigation';
5
+
6
+ async function Page({ params }: ResolvedPageProps<{ pk: number }>) {
7
+ try {
8
+ const data = await getFlatPageData({ pk: params.pk });
9
+
10
+ return (
11
+ <div className="container mx-auto py-6">
12
+ <div
13
+ className="mx-auto prose prose-headings:text-primary"
14
+ dangerouslySetInnerHTML={{ __html: data.flat_page.content }}
15
+ />
16
+ </div>
17
+ );
18
+ } catch (error) {
19
+ notFound();
20
+ }
21
+ }
22
+
23
+ export default withSegmentDefaults(Page, { segmentType: 'page' });
@@ -4,7 +4,6 @@ import { GenerateFormFields } from '@theme/components/generate-form-fields';
4
4
 
5
5
  export default async function Page(props) {
6
6
  const params = await props.params;
7
-
8
7
  const data = await getFormData({ pk: params.pk });
9
8
  const { schema, is_active, name, pk } = data;
10
9
 
@@ -41,7 +40,7 @@ export default async function Page(props) {
41
40
  formProperties={{
42
41
  actionUrl: `/api/form/${pk}/`,
43
42
  className:
44
- 'w-[calc(100%-36px)] md:w-[570px] px-[18px] py-[60px] md:p-[100px] border border-[#cbc8c8] border-t-[3px] border-t-[#e95151] mx-auto -mt-[100px] bg-white mb-14'
43
+ 'w-[calc(100%-36px)] md:w-[570px] px-[18px] py-[60px] md:p-[100px] border border-[#cbc8c8] border-t-[3px] border-t-[#e95151] mx-auto -mt-[100px] bg-white mb-14',
45
44
  }}
46
45
  submitButtonText={t('form.form_page.submit_button_text')}
47
46
  />
@@ -0,0 +1,93 @@
1
+ import ProductLayout from '@theme/views/product/layout';
2
+ import { ProductGroupInfo } from '@theme/views/product';
3
+ import { getProductData, getWidgetData } from '@akinon/next/data/server';
4
+ import { withSegmentDefaults } from '@akinon/next/hocs/server';
5
+ import { PageProps, ResolvedPageProps, Metadata } from '@akinon/next/types';
6
+ import { generateJsonLd } from '@theme/utils/generate-jsonld';
7
+ import { notFound } from 'next/navigation';
8
+
9
+ export async function generateMetadata(
10
+ props: PageProps<{ pk: number }>
11
+ ) {
12
+ const params = await props.params;
13
+ const searchParams = await props.searchParams;
14
+ let result: Metadata = {};
15
+
16
+ try {
17
+ const { data } = await getProductData({
18
+ pk: params.pk,
19
+ searchParams,
20
+ groupProduct: true
21
+ });
22
+
23
+ const product = data?.product;
24
+
25
+ if (!product) {
26
+ return {};
27
+ }
28
+
29
+ result = {
30
+ title: product.name,
31
+ description: String(product.attributes?.description),
32
+ twitter: {
33
+ title: product.name,
34
+ description: String(product.attributes?.description)
35
+ },
36
+ openGraph: {
37
+ title: product.name,
38
+ description: String(product.attributes?.description),
39
+ images: product.productimage_set?.map((item) => ({
40
+ url: item.image
41
+ }))
42
+ }
43
+ };
44
+ } catch (error: unknown) {
45
+ if ((error as Error & { status?: number })?.status === 404) {
46
+ notFound();
47
+ }
48
+ throw error;
49
+ }
50
+
51
+ return result;
52
+ }
53
+
54
+ async function Page({ params, searchParams }: ResolvedPageProps<{ pk: number }>) {
55
+ if (params.pk === undefined || isNaN(Number(params.pk))) {
56
+ notFound();
57
+ }
58
+
59
+ try {
60
+ const [{ data, breadcrumbData }, deliveryReturn] = await Promise.all([
61
+ getProductData({
62
+ pk: params.pk,
63
+ searchParams,
64
+ groupProduct: true
65
+ }),
66
+ getWidgetData({ slug: 'product-delivery-returns' })
67
+ ]);
68
+
69
+ const jsonLd = generateJsonLd(data.product);
70
+
71
+ return (
72
+ <>
73
+ <ProductLayout data={data} breadcrumbData={breadcrumbData}>
74
+ <ProductGroupInfo
75
+ data={data}
76
+ deliveryReturn={deliveryReturn?.attributes}
77
+ />
78
+ </ProductLayout>
79
+ <script
80
+ type="application/ld+json"
81
+ dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
82
+ />
83
+ </>
84
+ );
85
+ } catch (error: unknown) {
86
+ if ((error as Error & { status?: number })?.status === 404) {
87
+ notFound();
88
+ }
89
+ throw error;
90
+ }
91
+ }
92
+
93
+ export default withSegmentDefaults(Page, { segmentType: 'page' });
@@ -1,10 +1,8 @@
1
1
  import { getLandingPageData } from '@akinon/next/data/server';
2
2
  import { withSegmentDefaults } from '@akinon/next/hocs/server';
3
- import { PageProps } from '@akinon/next/types';
4
-
5
- async function Page(props: PageProps<{ pk: number }>) {
6
- const params = await props.params;
3
+ import { ResolvedPageProps } from '@akinon/next/types';
7
4
 
5
+ async function Page({ params }: ResolvedPageProps<{ pk: number }>) {
8
6
  const data = await getLandingPageData({ pk: params.pk });
9
7
 
10
8
  const content = data.landing_page;
@@ -6,7 +6,7 @@ import Footer from '@theme/views/footer';
6
6
  import Header from '@theme/views/header';
7
7
  import RootModal from '@theme/views/root-modal';
8
8
  import ClientRoot from './client-root';
9
- import { RootLayoutProps, Metadata } from '@akinon/next/types';
9
+ import { ResolvedRootLayoutProps, Metadata } from '@akinon/next/types';
10
10
  import { getSeoData } from '@akinon/next/data/server';
11
11
  import PzRoot from '@akinon/next/components/pz-root';
12
12
  import MobileAppToggler from '@akinon/next/components/mobile-app-toggler';
@@ -42,19 +42,12 @@ export async function generateMetadata() {
42
42
  return result;
43
43
  }
44
44
 
45
- async function RootLayout({
46
- params,
47
- locale,
48
- translations,
49
- children
50
- }: RootLayoutProps) {
51
- const layoutParams = await params;
52
-
45
+ async function RootLayout({ locale, translations, children }: ResolvedRootLayoutProps) {
53
46
  return (
54
47
  <html lang={locale.isoCode} {...(locale.rtl ? { dir: 'rtl' } : {})}>
55
48
  <head />
56
49
  <body className="overflow-x-hidden">
57
- <PzRoot translations={translations} {...layoutParams}>
50
+ <PzRoot translations={translations} locale={locale.value}>
58
51
  <ClientRoot>
59
52
  <div className="overflow-x-hidden">
60
53
  <MobileAppToggler>
@@ -1,11 +1,9 @@
1
1
  import { getListData } from '@akinon/next/data/server';
2
2
  import { withSegmentDefaults } from '@akinon/next/hocs/server';
3
- import { PageProps } from '@akinon/next/types';
3
+ import { ResolvedPageProps } from '@akinon/next/types';
4
4
  import CategoryLayout from '@theme/views/category/layout';
5
5
 
6
- async function Page(props: PageProps) {
7
- const searchParams = await props.searchParams;
8
-
6
+ async function Page({ searchParams }: ResolvedPageProps) {
9
7
  const data = await getListData({ searchParams });
10
8
 
11
9
  return (
@@ -4,14 +4,14 @@ import React from 'react';
4
4
  import { Button, Link } from '@theme/components';
5
5
  import { useLocalization } from '@akinon/next/hooks';
6
6
 
7
- const NotFound = () => {
7
+ export default function NotFound() {
8
8
  const { t } = useLocalization();
9
9
 
10
10
  return (
11
- <div className="py-6 flex flex-col items-center justify-center">
12
- <div className="text-8xl font-bold">404</div>
11
+ <div className="py-10 flex flex-col items-center justify-center">
12
+ <div className="text-8xl font-bold text-gray-400">404</div>
13
13
  <h1 className="text-4xl font-bold mb-4">{t('not_found.title')}</h1>
14
- <p className="text-lg mb-6">{t('not_found.sub_title')}</p>
14
+ <p className="text-lg mb-6 text-gray-600">{t('not_found.sub_title')}</p>
15
15
  <Link href={'/'}>
16
16
  <Button className="h-auto mt-4 text-base py-3 px-6">
17
17
  {t('not_found.button')}
@@ -19,6 +19,4 @@ const NotFound = () => {
19
19
  </Link>
20
20
  </div>
21
21
  );
22
- };
23
-
24
- export default NotFound;
22
+ }