@akinon/projectzero 2.0.0-beta.9 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/CHANGELOG.md +191 -17
  2. package/app-template/.env.example +3 -0
  3. package/app-template/.github/instructions/account.instructions.md +749 -0
  4. package/app-template/.github/instructions/checkout.instructions.md +678 -0
  5. package/app-template/.github/instructions/default.instructions.md +279 -0
  6. package/app-template/.github/instructions/edge-cases.instructions.md +73 -0
  7. package/app-template/.github/instructions/routing.instructions.md +603 -0
  8. package/app-template/.github/instructions/settings.instructions.md +338 -0
  9. package/app-template/.gitignore +3 -0
  10. package/app-template/AGENTS.md +7 -0
  11. package/app-template/CHANGELOG.md +2065 -232
  12. package/app-template/Procfile +1 -1
  13. package/app-template/akinon.json +1 -4
  14. package/app-template/build.sh +10 -0
  15. package/app-template/docs/advanced-usage.md +111 -0
  16. package/app-template/docs/plugins.md +60 -25
  17. package/app-template/docs/sentry-usage.md +35 -0
  18. package/app-template/jest.config.ts +2 -2
  19. package/app-template/next-env.d.ts +1 -0
  20. package/app-template/{next.config.ts → next.config.mjs} +6 -7
  21. package/app-template/package.json +58 -50
  22. package/app-template/postcss.config.mjs +1 -4
  23. package/app-template/public/amex.svg +12 -0
  24. package/app-template/public/apple-pay.svg +16 -0
  25. package/app-template/public/assets/images/product-placeholder-1.jpg +0 -0
  26. package/app-template/public/assets/images/product-placeholder-2.jpg +0 -0
  27. package/app-template/public/assets/images/product-placeholder-3.jpg +0 -0
  28. package/app-template/public/assets/images/product-placeholder-4.jpg +0 -0
  29. package/app-template/public/google-pay.svg +16 -0
  30. package/app-template/public/locales/en/account.json +9 -4
  31. package/app-template/public/locales/en/auth.json +6 -7
  32. package/app-template/public/locales/en/basket.json +6 -6
  33. package/app-template/public/locales/en/blog.json +7 -0
  34. package/app-template/public/locales/en/category.json +3 -1
  35. package/app-template/public/locales/en/checkout.json +17 -4
  36. package/app-template/public/locales/en/common.json +61 -3
  37. package/app-template/public/locales/en/forgot_password.json +6 -7
  38. package/app-template/public/locales/en/product.json +84 -4
  39. package/app-template/public/locales/tr/account.json +9 -4
  40. package/app-template/public/locales/tr/auth.json +16 -17
  41. package/app-template/public/locales/tr/basket.json +4 -4
  42. package/app-template/public/locales/tr/blog.json +7 -0
  43. package/app-template/public/locales/tr/category.json +3 -1
  44. package/app-template/public/locales/tr/checkout.json +48 -36
  45. package/app-template/public/locales/tr/common.json +60 -2
  46. package/app-template/public/locales/tr/forgot_password.json +12 -13
  47. package/app-template/public/locales/tr/product.json +82 -0
  48. package/app-template/public/logo.svg +3 -27
  49. package/app-template/public/mastercard.svg +14 -0
  50. package/app-template/public/masterpass-javascript-sdk-web.min.js +1 -0
  51. package/app-template/public/promotion-banner.jpg +0 -0
  52. package/app-template/public/shop-pay.svg +12 -0
  53. package/app-template/public/visa.svg +12 -0
  54. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/[...prettyurl]/page.tsx +11 -11
  55. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/layout.tsx +4 -3
  56. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/cancellation/page.tsx +13 -10
  57. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/page.tsx +73 -51
  58. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/page.tsx +1 -1
  59. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/profile/page.tsx +2 -2
  60. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/address/stores/page.tsx +2 -2
  61. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/auth/page.tsx +1 -1
  62. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/basket/page.tsx +2 -2
  63. package/app-template/src/app/[pz]/blog/[slug]/page.tsx +120 -0
  64. package/app-template/src/app/[pz]/category/[pk]/page.tsx +37 -0
  65. package/app-template/src/app/[pz]/flat-page/[pk]/page.tsx +23 -0
  66. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/forms/[pk]/generate/page.tsx +2 -3
  67. package/app-template/src/app/[pz]/group-product/[pk]/page.tsx +93 -0
  68. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/landing-page/[pk]/page.tsx +2 -4
  69. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/layout.tsx +6 -11
  70. package/app-template/src/app/[pz]/list/page.tsx +26 -0
  71. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/not-found.tsx +5 -7
  72. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/completed/[token]/page.tsx +6 -4
  73. package/app-template/src/app/[pz]/page.tsx +28 -0
  74. package/app-template/src/app/[pz]/pages/[slug]/page.tsx +19 -0
  75. package/app-template/src/app/[pz]/product/[pk]/page.tsx +102 -0
  76. package/app-template/src/app/[pz]/special-page/[pk]/page.tsx +35 -0
  77. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/email-set-primary/[[...id]]/page.tsx +3 -4
  78. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/registration/account-confirm-email/[[...id]]/page.tsx +3 -3
  79. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/reset/[[...id]]/page.tsx +41 -5
  80. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/xml-sitemap/[node]/route.ts +8 -6
  81. package/app-template/src/app/api/auth/[...nextauth]/route.ts +3 -0
  82. package/app-template/src/app/api/barcode-search/route.ts +1 -0
  83. package/app-template/src/app/api/cache/route.ts +1 -1
  84. package/app-template/src/app/api/form/[...id]/route.ts +1 -7
  85. package/app-template/src/app/api/image-proxy/route.ts +1 -0
  86. package/app-template/src/app/api/logout/route.ts +1 -1
  87. package/app-template/src/app/api/product-categories/route.ts +1 -0
  88. package/app-template/src/app/api/similar-product-list/route.ts +1 -0
  89. package/app-template/src/app/api/similar-products/route.ts +1 -0
  90. package/app-template/src/app/api/theme-settings/route.ts +12 -0
  91. package/app-template/src/app/api/virtual-try-on/limited-categories/route.ts +1 -0
  92. package/app-template/src/app/api/virtual-try-on/route.ts +1 -0
  93. package/app-template/src/app/api/web-vitals/route.ts +1 -1
  94. package/app-template/src/assets/fonts/pz-icon.css +211 -49
  95. package/app-template/src/assets/fonts/pz-icon.eot +0 -0
  96. package/app-template/src/assets/fonts/pz-icon.html +486 -0
  97. package/app-template/src/assets/fonts/pz-icon.scss +373 -49
  98. package/app-template/src/assets/fonts/pz-icon.svg +215 -53
  99. package/app-template/src/assets/fonts/pz-icon.ttf +0 -0
  100. package/app-template/src/assets/fonts/pz-icon.woff +0 -0
  101. package/app-template/src/assets/fonts/pz-icon.woff2 +0 -0
  102. package/app-template/src/assets/globals.scss +8 -133
  103. package/app-template/src/assets/icons/arrow-right.svg +3 -0
  104. package/app-template/src/assets/icons/cart.svg +4 -12
  105. package/app-template/src/assets/icons/check.svg +2 -18
  106. package/app-template/src/assets/icons/chevron-down.svg +2 -7
  107. package/app-template/src/assets/icons/delete.svg +3 -0
  108. package/app-template/src/assets/icons/facebook.svg +2 -8
  109. package/app-template/src/assets/icons/fav-off.svg +5 -0
  110. package/app-template/src/assets/icons/fav-on.svg +5 -0
  111. package/app-template/src/assets/icons/filter-and-sort.svg +3 -0
  112. package/app-template/src/assets/icons/heart.svg +3 -0
  113. package/app-template/src/assets/icons/instagram.svg +2 -13
  114. package/app-template/src/assets/icons/materials.svg +3 -0
  115. package/app-template/src/assets/icons/person.svg +4 -0
  116. package/app-template/src/assets/icons/pinterest.svg +5 -11
  117. package/app-template/src/assets/icons/ruler.svg +3 -0
  118. package/app-template/src/assets/icons/search.svg +8 -11
  119. package/app-template/src/assets/icons/share.svg +2 -9
  120. package/app-template/src/assets/icons/snapchat.svg +3 -0
  121. package/app-template/src/assets/icons/tiktok.svg +3 -0
  122. package/app-template/src/assets/icons/tumblr.svg +6 -0
  123. package/app-template/src/assets/icons/twitter.svg +2 -10
  124. package/app-template/src/assets/icons/vimeo.svg +3 -0
  125. package/app-template/src/assets/icons/youtube.svg +3 -0
  126. package/app-template/src/assets/icons/zoom.svg +8 -0
  127. package/app-template/src/auth.ts +3 -0
  128. package/app-template/src/components/__tests__/badge.test.tsx +2 -2
  129. package/app-template/src/components/__tests__/link.test.tsx +2 -0
  130. package/app-template/src/components/accordion.tsx +48 -23
  131. package/app-template/src/components/action-tooltip.tsx +160 -0
  132. package/app-template/src/components/button.tsx +1 -1
  133. package/app-template/src/components/carousel-core.tsx +4 -11
  134. package/app-template/src/components/checkbox.tsx +2 -1
  135. package/app-template/src/components/currency-select.tsx +150 -4
  136. package/app-template/src/components/file-input.tsx +27 -7
  137. package/app-template/src/components/generate-form-fields.tsx +49 -10
  138. package/app-template/src/components/icon.tsx +5 -6
  139. package/app-template/src/components/index.ts +4 -1
  140. package/app-template/src/components/input.tsx +11 -5
  141. package/app-template/src/components/language-select.tsx +88 -2
  142. package/app-template/src/components/modal.tsx +34 -16
  143. package/app-template/src/components/pagination.tsx +133 -20
  144. package/app-template/src/components/price.tsx +1 -1
  145. package/app-template/src/components/pwa-tags.tsx +1 -0
  146. package/app-template/src/components/quantity-input.tsx +63 -0
  147. package/app-template/src/components/quantity-selector.tsx +215 -0
  148. package/app-template/src/components/route-handler.tsx +50 -0
  149. package/app-template/src/components/select.tsx +86 -54
  150. package/app-template/src/components/shimmer.tsx +1 -1
  151. package/app-template/src/components/types/index.ts +51 -1
  152. package/app-template/src/components/widget-content.tsx +323 -0
  153. package/app-template/src/data/server/theme.ts +70 -0
  154. package/app-template/src/hooks/use-fav-button.tsx +9 -10
  155. package/app-template/src/hooks/use-product-cart.ts +80 -0
  156. package/app-template/src/hooks/use-stock-alert.ts +74 -0
  157. package/app-template/src/hooks/use-theme-settings.ts +42 -0
  158. package/app-template/src/lib/fonts.ts +149 -0
  159. package/app-template/src/plugins.js +12 -2
  160. package/app-template/src/{middleware.ts → proxy.ts} +3 -3
  161. package/app-template/src/redux/middlewares/category.ts +5 -4
  162. package/app-template/src/redux/store.ts +21 -1
  163. package/app-template/src/routes/index.ts +8 -7
  164. package/app-template/src/settings.js +6 -3
  165. package/app-template/src/types/hookform-resolvers-yup.d.ts +28 -0
  166. package/app-template/src/types/index.ts +74 -3
  167. package/app-template/src/types/next-auth.d.ts +2 -2
  168. package/app-template/src/types/widget.ts +169 -0
  169. package/app-template/src/utils/__tests__/theme-page-context.test.ts +145 -0
  170. package/app-template/src/utils/formatDate.ts +48 -0
  171. package/app-template/src/utils/styles.ts +71 -0
  172. package/app-template/src/utils/theme-page-context.ts +309 -0
  173. package/app-template/src/utils/variant-validation.ts +41 -0
  174. package/app-template/src/views/account/address-form.tsx +8 -4
  175. package/app-template/src/views/account/contact-form.tsx +148 -131
  176. package/app-template/src/views/account/content-header.tsx +4 -3
  177. package/app-template/src/views/account/faq/faq-tabs.tsx +8 -2
  178. package/app-template/src/views/account/favorite-item.tsx +1 -1
  179. package/app-template/src/views/account/order.tsx +11 -9
  180. package/app-template/src/views/account/orders/order-cancellation-item.tsx +1 -1
  181. package/app-template/src/views/account/orders/order-detail-header.tsx +1 -1
  182. package/app-template/src/views/anonymous-tracking/order-detail/index.tsx +45 -38
  183. package/app-template/src/views/basket/basket-item.tsx +6 -1
  184. package/app-template/src/views/basket/summary.tsx +16 -0
  185. package/app-template/src/views/breadcrumb.tsx +2 -2
  186. package/app-template/src/views/category/category-banner.tsx +4 -23
  187. package/app-template/src/views/category/category-info.tsx +2 -1
  188. package/app-template/src/views/category/filters/filter-item.tsx +138 -42
  189. package/app-template/src/views/category/filters/index.tsx +1 -1
  190. package/app-template/src/views/category/layout.tsx +1 -0
  191. package/app-template/src/views/checkout/auth.tsx +64 -40
  192. package/app-template/src/views/checkout/layout/header.tsx +10 -6
  193. package/app-template/src/views/checkout/steps/payment/options/credit-card/index.tsx +22 -6
  194. package/app-template/src/views/checkout/steps/payment/options/funds-transfer.tsx +25 -5
  195. package/app-template/src/views/checkout/steps/payment/options/loyalty.tsx +21 -2
  196. package/app-template/src/views/checkout/steps/payment/options/redirection.tsx +27 -5
  197. package/app-template/src/views/checkout/steps/payment/options/store-credit.tsx +464 -0
  198. package/app-template/src/views/checkout/steps/payment/payment-option-buttons.tsx +4 -4
  199. package/app-template/src/views/checkout/steps/shipping/address-box.tsx +33 -20
  200. package/app-template/src/views/checkout/steps/shipping/addresses.tsx +2 -2
  201. package/app-template/src/views/checkout/summary.tsx +12 -2
  202. package/app-template/src/views/find-in-store/index.tsx +2 -2
  203. package/app-template/src/views/guest-login/index.tsx +62 -58
  204. package/app-template/src/views/header/action-menu.tsx +1 -1
  205. package/app-template/src/views/header/band.tsx +2 -2
  206. package/app-template/src/views/header/index.tsx +1 -1
  207. package/app-template/src/views/header/mini-basket.tsx +3 -3
  208. package/app-template/src/views/header/mobile-hamburger-button.tsx +5 -8
  209. package/app-template/src/views/header/mobile-menu.tsx +18 -6
  210. package/app-template/src/views/header/navbar.tsx +1 -1
  211. package/app-template/src/views/header/pwa-back-button.tsx +1 -1
  212. package/app-template/src/views/header/search/index.tsx +13 -3
  213. package/app-template/src/views/header/search/results.tsx +1 -1
  214. package/app-template/src/views/header/user-menu.tsx +1 -3
  215. package/app-template/src/views/login/index.tsx +66 -57
  216. package/app-template/src/views/otp-login/index.tsx +11 -6
  217. package/app-template/src/views/product/index.ts +1 -0
  218. package/app-template/src/views/product/layout.tsx +26 -6
  219. package/app-template/src/views/product/price-wrapper.tsx +3 -24
  220. package/app-template/src/views/product/product-actions.tsx +165 -0
  221. package/app-template/src/views/product/product-info.tsx +76 -238
  222. package/app-template/src/views/product/product-share.tsx +58 -0
  223. package/app-template/src/views/product/product-variants.tsx +26 -0
  224. package/app-template/src/views/product/slider.tsx +22 -1
  225. package/app-template/src/views/product/variant.tsx +69 -41
  226. package/app-template/src/views/product-pointer-banner-item.tsx +1 -1
  227. package/app-template/src/views/register/index.tsx +31 -46
  228. package/app-template/src/views/sales-contract-modal/index.tsx +17 -17
  229. package/app-template/src/views/share/index.tsx +9 -6
  230. package/app-template/src/views/widgets/home-hero-slider-content.tsx +41 -39
  231. package/app-template/src/widgets/flatpages/about-us/index.tsx +78 -0
  232. package/app-template/src/widgets/flatpages/blog-list/index.tsx +129 -0
  233. package/app-template/src/widgets/footer-info.tsx +1 -1
  234. package/app-template/src/widgets/footer-menu.tsx +7 -3
  235. package/app-template/src/widgets/footer-subscription/footer-subscription-form.tsx +17 -14
  236. package/app-template/src/widgets/footer-subscription/index.tsx +1 -1
  237. package/app-template/src/widgets/home-stories-eng.tsx +43 -35
  238. package/app-template/src/widgets/index.ts +7 -0
  239. package/app-template/src/widgets/schemas/about-us.json +46 -0
  240. package/app-template/src/widgets/schemas/blog-list.json +37 -0
  241. package/app-template/src/widgets/schemas/blog.json +29 -0
  242. package/app-template/tailwind.config.js +155 -7
  243. package/app-template/tsconfig.json +29 -11
  244. package/codemods/migrate-auth-v5/index.js +339 -0
  245. package/codemods/migrate-auth-v5/transform.js +86 -0
  246. package/codemods/migrate-segments/index.js +591 -0
  247. package/codemods/update-tailwind-config/index.js +30 -0
  248. package/codemods/update-tailwind-config/transform.js +102 -0
  249. package/codemods/upgrade-to-2/index.js +549 -0
  250. package/commands/codemod.ts +0 -1
  251. package/commands/plugins.ts +111 -46
  252. package/dist/commands/codemod.js +0 -1
  253. package/dist/commands/plugins.js +104 -36
  254. package/package.json +3 -2
  255. package/app-template/src/app/[commerce]/[locale]/[currency]/category/[pk]/page.tsx +0 -22
  256. package/app-template/src/app/[commerce]/[locale]/[currency]/flat-page/[pk]/page.tsx +0 -20
  257. package/app-template/src/app/[commerce]/[locale]/[currency]/group-product/[pk]/page.tsx +0 -74
  258. package/app-template/src/app/[commerce]/[locale]/[currency]/list/page.tsx +0 -18
  259. package/app-template/src/app/[commerce]/[locale]/[currency]/page.tsx +0 -50
  260. package/app-template/src/app/[commerce]/[locale]/[currency]/product/[pk]/page.tsx +0 -84
  261. package/app-template/src/app/[commerce]/[locale]/[currency]/special-page/[pk]/page.tsx +0 -27
  262. package/app-template/src/pages/api/auth/[...nextauth].ts +0 -3
  263. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/address/page.tsx +0 -0
  264. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/change-email/page.tsx +0 -0
  265. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/change-password/page.tsx +0 -0
  266. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/contact/page.tsx +0 -0
  267. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/coupons/page.tsx +0 -0
  268. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/email-verification/page.tsx +0 -0
  269. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/faq/page.tsx +0 -0
  270. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/favourite-products/page.tsx +0 -0
  271. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/my-quotations/page.tsx +0 -0
  272. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/layout.tsx +0 -0
  273. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/page.tsx +0 -0
  274. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/anonymous-tracking/page.tsx +0 -0
  275. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/auth/oauth-login/page.tsx +0 -0
  276. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/basket-b2b/page.tsx +0 -0
  277. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/category/[pk]/loading.tsx +0 -0
  278. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/client-root.tsx +0 -0
  279. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/contact-us/page.tsx +0 -0
  280. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/error.tsx +0 -0
  281. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/flat-page/[pk]/loading.tsx +0 -0
  282. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/group-product/[pk]/loading.tsx +0 -0
  283. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/landing-page/[pk]/loading.tsx +0 -0
  284. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/list/loading.tsx +0 -0
  285. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/checkout/page.tsx +0 -0
  286. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/completed/[token]/layout.tsx +0 -0
  287. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/special-page/[pk]/loading.tsx +0 -0
  288. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/template.tsx +0 -0
  289. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/password/reset/page.tsx +0 -0
  290. /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/xml-sitemap/route.ts +0 -0
@@ -0,0 +1,120 @@
1
+ 'use client';
2
+
3
+ import { Image } from '@akinon/next/components';
4
+ import { useGetWidgetQuery } from '@akinon/next/data/client/misc';
5
+ import { useLocalization } from '@akinon/next/hooks/use-localization';
6
+ import { WidgetResultType } from '@akinon/next/types';
7
+ import { Icon, Link, LoaderSpinner } from '@theme/components';
8
+ import { formatDateToMonthYear } from '@theme/utils/formatDate';
9
+ import { useParams } from 'next/navigation';
10
+
11
+ interface BlogItemKwargs {
12
+ url: string;
13
+ data_type: string;
14
+ value: string;
15
+ }
16
+
17
+ type blogItem = {
18
+ value: string;
19
+ kwargs: BlogItemKwargs;
20
+ };
21
+
22
+ type BlogType = {
23
+ title: blogItem;
24
+ link: blogItem;
25
+ description: blogItem;
26
+ image: blogItem;
27
+ date: blogItem;
28
+ };
29
+
30
+ export default function Page() {
31
+ const params = useParams<{ slug: string }>();
32
+ const { locale, t } = useLocalization();
33
+ const slug = params.slug;
34
+ const { data, isLoading } = useGetWidgetQuery(slug) as ReturnType<
35
+ typeof useGetWidgetQuery
36
+ >;
37
+ const blogData = data as WidgetResultType<BlogType> | undefined;
38
+
39
+ if (isLoading) {
40
+ return (
41
+ <div className="py-20">
42
+ <LoaderSpinner />
43
+ </div>
44
+ );
45
+ }
46
+
47
+ if (!blogData) {
48
+ return (
49
+ <div className="container mx-auto py-10">
50
+ <p className="text-center py-20">{t('blog.blog_not_found')}</p>
51
+ <Link
52
+ className="text-sm text-[#121212] mt-20 mb-20 lg:mb-10 flex items-center justify-center"
53
+ href="/blog"
54
+ >
55
+ <Icon name="arrow-left" size={16} className="mr-2" />
56
+ <span className="hover:underline">{t('blog.back_to_blogs')}</span>
57
+ </Link>
58
+ </div>
59
+ );
60
+ }
61
+
62
+ const formattedDate = formatDateToMonthYear(
63
+ blogData?.attributes?.date?.value,
64
+ locale as any
65
+ );
66
+
67
+ return (
68
+ <div>
69
+ <div className="container mx-auto py-1 lg:py-10 lg:px-4">
70
+ <Image
71
+ src={blogData?.attributes?.image?.kwargs?.url}
72
+ alt={blogData?.attributes?.title?.value || 'Blog Image'}
73
+ aspectRatio={1072 / 923}
74
+ fill
75
+ sizes="100vw"
76
+ className="w-full h-auto mb-6 rounded-lg object-cover"
77
+ />
78
+ <div className="lg:max-w-[699px] lg:mx-auto px-3 lg:px-0">
79
+ <h1 className="text-[40px] mb-2 lg:mb-4 text-[#121212]">
80
+ {blogData?.attributes?.title?.value || 'Blog Title'}
81
+ </h1>
82
+ <span className="text-[13px] mb-5 lg:mb-12 block">
83
+ {formattedDate}
84
+ </span>
85
+
86
+ <Link className=" mb-12 inline-flex items-center" href={'#'}>
87
+ <Icon name="share" size={16} className="mr-2" />
88
+ <span className="text-sm text-[#121212] hover:underline">
89
+ {t('blog.share')}
90
+ </span>
91
+ </Link>
92
+
93
+ <div
94
+ className="prose max-w-none prose-headings:text-primary"
95
+ dangerouslySetInnerHTML={{
96
+ __html: blogData?.attributes?.description?.value || 'Blog Content'
97
+ }}
98
+ />
99
+
100
+ {blogData?.attributes?.link?.value && (
101
+ <Link
102
+ className="text-sm text-[#121212] underline mt-6 inline-block"
103
+ href={blogData?.attributes?.link?.value}
104
+ >
105
+ {t('blog.view_product')}
106
+ </Link>
107
+ )}
108
+ </div>
109
+
110
+ <Link
111
+ className="text-sm text-[#121212] mt-20 mb-20 lg:mb-10 flex items-center justify-center"
112
+ href="/blog"
113
+ >
114
+ <Icon name="arrow-left" size={16} className="mr-2" />
115
+ <span className="hover:underline">{t('blog.back_to_blogs')}</span>
116
+ </Link>
117
+ </div>
118
+ </div>
119
+ );
120
+ }
@@ -0,0 +1,37 @@
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 { buildListingPageContext } from '@theme/utils/theme-page-context';
6
+ import { notFound } from 'next/navigation';
7
+
8
+ async function Page({ params, searchParams }: ResolvedPageProps<{ pk: number }>) {
9
+ try {
10
+ const { data, breadcrumbData } = await getCategoryData({
11
+ pk: params.pk,
12
+ searchParams
13
+ });
14
+
15
+ return (
16
+ <>
17
+ <CategoryLayout
18
+ data={data}
19
+ breadcrumbData={breadcrumbData}
20
+ pageContext={buildListingPageContext({
21
+ data,
22
+ breadcrumbData,
23
+ pageType: 'category',
24
+ path: data.category?.absolute_url
25
+ })}
26
+ />
27
+ </>
28
+ );
29
+ } catch (error: unknown) {
30
+ if ((error as Error & { status?: number })?.status === 404) {
31
+ notFound();
32
+ }
33
+ throw error;
34
+ }
35
+ }
36
+
37
+ export default withSegmentDefaults(Page, { segmentType: 'page' });
@@ -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
 
@@ -21,7 +20,7 @@ export default async function Page(props) {
21
20
  schema={schema}
22
21
  allFieldClasses={{
23
22
  className:
24
- 'border border-[#d4d4d4] text-[#4a4f54] mt-1.5 h-[38px] p-2.5 text-xs outline-hidden focus:border-black',
23
+ 'border border-[#d4d4d4] text-[#4a4f54] mt-1.5 h-[38px] p-2.5 text-xs outline-none focus:border-black',
25
24
  labelClassName: 'text-[#4a4f54] text-xs',
26
25
  wrapperClassName: 'flex flex-col mb-6'
27
26
  }}
@@ -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 { AsyncPageProps, 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: AsyncPageProps<{ 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,13 +6,14 @@ 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';
13
13
  import pwaTags from '@theme/components/pwa-tags';
14
14
  import type { Viewport } from 'next';
15
15
  import settings from '@theme/settings';
16
+ import RouteHandler from '@theme/components/route-handler';
16
17
 
17
18
  export const viewport: Viewport = {
18
19
  width: 'device-width',
@@ -42,26 +43,20 @@ export async function generateMetadata() {
42
43
  return result;
43
44
  }
44
45
 
45
- async function RootLayout({
46
- params,
47
- locale,
48
- translations,
49
- children
50
- }: RootLayoutProps) {
51
- const layoutParams = await params;
52
-
46
+ async function RootLayout({ locale, translations, children }: ResolvedRootLayoutProps) {
53
47
  return (
54
48
  <html lang={locale.isoCode} {...(locale.rtl ? { dir: 'rtl' } : {})}>
55
49
  <head />
56
50
  <body className="overflow-x-hidden">
57
- <PzRoot translations={translations} {...layoutParams}>
51
+ <PzRoot translations={translations} locale={locale.value}>
58
52
  <ClientRoot>
59
- <div className="overflow-x-hidden">
53
+ <div className="overflow-x-clip">
60
54
  <MobileAppToggler>
61
55
  <Header />
62
56
  </MobileAppToggler>
63
57
  <main>
64
58
  {children}
59
+ <RouteHandler />
65
60
  <RootModal />
66
61
  </main>
67
62
  <MobileAppToggler>
@@ -0,0 +1,26 @@
1
+ import { getListData } 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 { ROUTES } from '@theme/routes';
6
+ import { buildListingPageContext } from '@theme/utils/theme-page-context';
7
+
8
+ async function Page({ searchParams }: ResolvedPageProps) {
9
+ const data = await getListData({ searchParams });
10
+ const pageType = data.search_text ? 'search' : 'plp';
11
+
12
+ return (
13
+ <>
14
+ <CategoryLayout
15
+ data={data}
16
+ pageContext={buildListingPageContext({
17
+ data,
18
+ pageType,
19
+ path: ROUTES.LIST
20
+ })}
21
+ />
22
+ </>
23
+ );
24
+ }
25
+
26
+ export default withSegmentDefaults(Page, { segmentType: 'page' });
@@ -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-10 lg:py-8 flex flex-col items-center justify-center px-4 lg:px-0">
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 text-center">{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
+ }
@@ -1,11 +1,12 @@
1
1
  'use client';
2
2
 
3
- import { useEffect, useRef, use } from 'react';
3
+ import { useEffect, useRef } from 'react';
4
+ import { useParams } from 'next/navigation';
4
5
  import { useAppDispatch } from '@akinon/next/redux/hooks';
5
6
  import { setCurrentStep } from '@akinon/next/redux/reducers/checkout';
6
7
  import { ROUTES } from '@theme/routes';
7
8
  import { useFetchCheckoutResultQuery } from '@akinon/next/data/client/checkout';
8
- import { CheckoutStep, PageProps } from '@akinon/next/types';
9
+ import { CheckoutStep } from '@akinon/next/types';
9
10
  import { CarouselCore } from '@theme/components/carousel-core';
10
11
  import { Price, Button, Icon, LoaderSpinner, Link } from '@theme/components';
11
12
  import { CheckoutStepList } from '@theme/views/checkout';
@@ -14,10 +15,11 @@ import { Image } from '@akinon/next/components/image';
14
15
  import { Trans } from '@akinon/next/components/trans';
15
16
  import { pushPurchaseEvent } from '@theme/utils/gtm';
16
17
 
17
- const CheckoutCompleted = (props) => {
18
+ const CheckoutCompleted = () => {
19
+ const params = useParams<{ token: string }>();
18
20
  const { t } = useLocalization();
19
21
  const dispatch = useAppDispatch();
20
- const params = use(props.params) as { token: string };
22
+
21
23
  const { data, isLoading } = useFetchCheckoutResultQuery(String(params.token));
22
24
 
23
25
  const carouselRef = useRef(null);
@@ -0,0 +1,28 @@
1
+ import 'server-only';
2
+
3
+ import { withSegmentDefaults } from '@akinon/next/hocs/server';
4
+ import ThemePlaceholder from '@akinon/pz-theme/src/theme-placeholder';
5
+ import { buildHomepagePageContext } from '@theme/utils/theme-page-context';
6
+
7
+ export const dynamic = 'force-static';
8
+ export const revalidate = 600;
9
+
10
+ const getPlaceholderSlug = (baseSlug: string) => {
11
+ const isDevelopment = process.env.NODE_ENV === 'development';
12
+ return isDevelopment ? `${baseSlug}-dev` : baseSlug;
13
+ };
14
+
15
+ async function Page() {
16
+ return (
17
+ <ThemePlaceholder
18
+ slug={getPlaceholderSlug('homepage-body-new')}
19
+ pageContext={buildHomepagePageContext()}
20
+ />
21
+ );
22
+ }
23
+
24
+ export async function generateStaticParams() {
25
+ return [];
26
+ }
27
+
28
+ export default withSegmentDefaults(Page, { segmentType: 'page' });
@@ -0,0 +1,19 @@
1
+ import ThemePlaceholder from '@akinon/pz-theme/src/theme-placeholder';
2
+ import { withSegmentDefaults } from '@akinon/next/hocs/server';
3
+ import { ResolvedPageProps } from '@akinon/next/types';
4
+ import { buildCustomPageContext } from '@theme/utils/theme-page-context';
5
+
6
+ export const dynamic = 'force-dynamic';
7
+
8
+ async function Page({ params }: ResolvedPageProps<{ slug: string }>) {
9
+ return (
10
+ <div className="min-h-screen">
11
+ <ThemePlaceholder
12
+ slug={`page-${params.slug}`}
13
+ pageContext={buildCustomPageContext(params.slug)}
14
+ />
15
+ </div>
16
+ );
17
+ }
18
+
19
+ export default withSegmentDefaults(Page, { segmentType: 'page' });
@@ -0,0 +1,102 @@
1
+ import { getProductData, getWidgetData } from '@akinon/next/data/server';
2
+ import { withSegmentDefaults } from '@akinon/next/hocs/server';
3
+ import { AsyncPageProps, ResolvedPageProps, Metadata } from '@akinon/next/types';
4
+ import { generateJsonLd } from '@theme/utils/generate-jsonld';
5
+ import { AccordionWrapper, ProductInfo } from '@theme/views/product';
6
+ import ProductLayout from '@theme/views/product/layout';
7
+ import { notFound } from 'next/navigation';
8
+
9
+ export async function generateMetadata(
10
+ props: AsyncPageProps<{ 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
+ });
21
+
22
+ const product = data?.product;
23
+
24
+ if (!product) {
25
+ return {};
26
+ }
27
+
28
+ result = {
29
+ title: product.name,
30
+ description: String(product.attributes?.description),
31
+ twitter: {
32
+ title: product.name,
33
+ description: String(product.attributes?.description)
34
+ },
35
+ openGraph: {
36
+ title: product.name,
37
+ description: String(product.attributes?.description),
38
+ images: product.productimage_set?.map((item) => ({
39
+ url: item.image
40
+ }))
41
+ }
42
+ };
43
+ } catch (error: unknown) {
44
+ if ((error as Error & { status?: number })?.status === 404) {
45
+ notFound();
46
+ }
47
+ throw error;
48
+ }
49
+
50
+ return result;
51
+ }
52
+
53
+ async function Page({ params, searchParams }: ResolvedPageProps<{ pk: number }>) {
54
+ if (params.pk === undefined || isNaN(Number(params.pk))) {
55
+ notFound();
56
+ }
57
+
58
+ try {
59
+ const [{ data, breadcrumbData }, deliveryReturn] = await Promise.all([
60
+ getProductData({
61
+ pk: params.pk,
62
+ searchParams
63
+ }),
64
+ getWidgetData({ slug: 'product-delivery-returns' })
65
+ ]);
66
+
67
+ const jsonLd = generateJsonLd(data.product);
68
+
69
+ return (
70
+ <>
71
+ <ProductLayout data={data} breadcrumbData={breadcrumbData}>
72
+ <div className="flex flex-col items-center">
73
+ <h1
74
+ className="mt-4 text-2xl text-center md:mt-0"
75
+ data-testid="product-name"
76
+ >
77
+ {data.product.name}
78
+ </h1>
79
+
80
+ <ProductInfo data={data} />
81
+
82
+ <AccordionWrapper
83
+ data={data}
84
+ deliveryReturn={deliveryReturn?.attributes}
85
+ />
86
+ </div>
87
+ </ProductLayout>
88
+ <script
89
+ type="application/ld+json"
90
+ dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
91
+ />
92
+ </>
93
+ );
94
+ } catch (error: unknown) {
95
+ if ((error as Error & { status?: number })?.status === 404) {
96
+ notFound();
97
+ }
98
+ throw error;
99
+ }
100
+ }
101
+
102
+ export default withSegmentDefaults(Page, { segmentType: 'page' });
@@ -0,0 +1,35 @@
1
+ import { getSpecialPageData } 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 SpecialPageBanner from '@theme/widgets/special-page-banner';
6
+ import SpecialPageCarousel from '@theme/widgets/special-page-carousel';
7
+ import { notFound } from 'next/navigation';
8
+
9
+ async function Page({ params, searchParams }: ResolvedPageProps<{ pk: number }>) {
10
+ try {
11
+ const data = await getSpecialPageData({ pk: params.pk, searchParams });
12
+
13
+ return (
14
+ <>
15
+ <CategoryLayout data={data}>
16
+ {data.special_page && (
17
+ <>
18
+ <SpecialPageBanner data={data.special_page} />
19
+ <SpecialPageCarousel
20
+ slug={data.special_page.video_embedded_code}
21
+ />
22
+ </>
23
+ )}
24
+ </CategoryLayout>
25
+ </>
26
+ );
27
+ } catch (error: unknown) {
28
+ if ((error as Error & { status?: number })?.status === 404) {
29
+ notFound();
30
+ }
31
+ throw error;
32
+ }
33
+ }
34
+
35
+ export default withSegmentDefaults(Page, { segmentType: 'page' });
@@ -2,11 +2,10 @@
2
2
  import { Icon, Link, LoaderSpinner } from '@theme/components';
3
3
  import { useLocalization } from '@akinon/next/hooks';
4
4
  import { useChangeEmailVerificationQuery } from '@akinon/next/data/client/user';
5
- import { use } from 'react';
6
-
7
- export default function Page(props) {
8
- const { id } = use(props.params) as { id: string[] };
5
+ import { useParams } from 'next/navigation';
9
6
 
7
+ export default function Page() {
8
+ const { id } = useParams<{ id: string[] }>();
10
9
  const { t } = useLocalization();
11
10
  const { isSuccess, isLoading } = useChangeEmailVerificationQuery(
12
11
  id.join('/')
@@ -2,10 +2,10 @@
2
2
  import { Icon, Link, LoaderSpinner } from '@theme/components';
3
3
  import { useLocalization } from '@akinon/next/hooks';
4
4
  import { useConfirmEmailVerificationQuery } from '@akinon/next/data/client/user';
5
- import { use } from 'react';
5
+ import { useParams } from 'next/navigation';
6
6
 
7
- export default function Page(props) {
8
- const { id } = use(props.params) as { id: string[] };
7
+ export default function Page() {
8
+ const { id } = useParams<{ id: string[] }>();
9
9
  const { t } = useLocalization();
10
10
  const { isSuccess, isLoading } = useConfirmEmailVerificationQuery(
11
11
  id.join('/')