@vendure-platform/create 0.4.0 → 0.5.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 (334) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +39 -39
  3. package/dist/add-to-existing.js +1 -1
  4. package/dist/assets/demo-data/initial-data.json +663 -663
  5. package/dist/assets/storefront/components.json +20 -20
  6. package/dist/assets/storefront/eslint.config.mjs +10 -10
  7. package/dist/assets/storefront/graphql.config.yml +1 -1
  8. package/dist/assets/storefront/messages/de.json +2 -0
  9. package/dist/assets/storefront/messages/en.json +2 -0
  10. package/dist/assets/storefront/next.config.ts +5 -4
  11. package/dist/assets/storefront/package.json +1 -1
  12. package/dist/assets/storefront/postcss.config.mjs +1 -1
  13. package/dist/assets/storefront/src/app/[locale]/(catalog)/catalog/page.tsx +17 -21
  14. package/dist/assets/storefront/src/app/[locale]/(catalog)/collection/[slug]/page.tsx +64 -42
  15. package/dist/assets/storefront/src/app/[locale]/(catalog)/layout.tsx +1 -5
  16. package/dist/assets/storefront/src/app/[locale]/(catalog)/product/[slug]/actions.ts +69 -65
  17. package/dist/assets/storefront/src/app/[locale]/(catalog)/product/[slug]/page.tsx +68 -37
  18. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/page.tsx +24 -27
  19. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/search-results.tsx +11 -9
  20. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/search-term.tsx +4 -4
  21. package/dist/assets/storefront/src/app/[locale]/(scenario)/[...path]/page.tsx +1 -1
  22. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/accept-invitation-client.tsx +8 -13
  23. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/actions.ts +11 -14
  24. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/page.tsx +30 -33
  25. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/sign-out-and-retry.tsx +6 -6
  26. package/dist/assets/storefront/src/app/[locale]/account/addresses/actions.ts +30 -45
  27. package/dist/assets/storefront/src/app/[locale]/account/addresses/address-form.tsx +166 -159
  28. package/dist/assets/storefront/src/app/[locale]/account/addresses/addresses-client.tsx +35 -26
  29. package/dist/assets/storefront/src/app/[locale]/account/addresses/loading.tsx +1 -3
  30. package/dist/assets/storefront/src/app/[locale]/account/addresses/page.tsx +16 -18
  31. package/dist/assets/storefront/src/app/[locale]/account/approvals/actions.ts +5 -8
  32. package/dist/assets/storefront/src/app/[locale]/account/approvals/page.tsx +77 -69
  33. package/dist/assets/storefront/src/app/[locale]/account/company/actions.ts +10 -11
  34. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/actions.ts +6 -15
  35. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/address-form.tsx +57 -49
  36. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/addresses-client.tsx +23 -25
  37. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/page.tsx +30 -30
  38. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/actions.ts +20 -29
  39. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/business-unit-form.tsx +32 -37
  40. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/business-units-client.tsx +32 -25
  41. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/page.tsx +24 -24
  42. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/types.ts +7 -4
  43. package/dist/assets/storefront/src/app/[locale]/account/company/edit-company-form.tsx +11 -21
  44. package/dist/assets/storefront/src/app/[locale]/account/company/page.tsx +23 -28
  45. package/dist/assets/storefront/src/app/[locale]/account/company/payment-methods/page.tsx +24 -24
  46. package/dist/assets/storefront/src/app/[locale]/account/company/payment-methods/payment-methods-client.tsx +5 -7
  47. package/dist/assets/storefront/src/app/[locale]/account/company/roles/page.tsx +22 -25
  48. package/dist/assets/storefront/src/app/[locale]/account/company/roles/roles-client.tsx +11 -26
  49. package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/actions.ts +6 -10
  50. package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/page.tsx +18 -16
  51. package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/tax-ids-client.tsx +74 -67
  52. package/dist/assets/storefront/src/app/[locale]/account/company/users/actions.ts +16 -25
  53. package/dist/assets/storefront/src/app/[locale]/account/company/users/edit-user-form.tsx +27 -25
  54. package/dist/assets/storefront/src/app/[locale]/account/company/users/invite-user-form.tsx +27 -19
  55. package/dist/assets/storefront/src/app/[locale]/account/company/users/page.tsx +32 -29
  56. package/dist/assets/storefront/src/app/[locale]/account/company/users/users-client.tsx +35 -38
  57. package/dist/assets/storefront/src/app/[locale]/account/error.tsx +1 -3
  58. package/dist/assets/storefront/src/app/[locale]/account/layout.tsx +16 -22
  59. package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/page.tsx +151 -103
  60. package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/reorder-actions.ts +6 -7
  61. package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/reorder-dialog.tsx +22 -48
  62. package/dist/assets/storefront/src/app/[locale]/account/orders/loading.tsx +8 -8
  63. package/dist/assets/storefront/src/app/[locale]/account/orders/page.tsx +101 -61
  64. package/dist/assets/storefront/src/app/[locale]/account/profile/actions.ts +32 -23
  65. package/dist/assets/storefront/src/app/[locale]/account/profile/change-password-form.tsx +6 -16
  66. package/dist/assets/storefront/src/app/[locale]/account/profile/edit-email-form.tsx +7 -17
  67. package/dist/assets/storefront/src/app/[locale]/account/profile/edit-profile-form.tsx +6 -16
  68. package/dist/assets/storefront/src/app/[locale]/account/profile/loading.tsx +12 -18
  69. package/dist/assets/storefront/src/app/[locale]/account/profile/page.tsx +15 -15
  70. package/dist/assets/storefront/src/app/[locale]/account/quick-order/file-upload-tab.tsx +2 -6
  71. package/dist/assets/storefront/src/app/[locale]/account/quick-order/manual-entry-tab.tsx +18 -15
  72. package/dist/assets/storefront/src/app/[locale]/account/quick-order/page.tsx +3 -6
  73. package/dist/assets/storefront/src/app/[locale]/account/quick-order/preview-table.tsx +10 -2
  74. package/dist/assets/storefront/src/app/[locale]/account/quick-order/save-to-list-dialog.tsx +24 -26
  75. package/dist/assets/storefront/src/app/[locale]/account/quick-order/sku-autocomplete.tsx +19 -10
  76. package/dist/assets/storefront/src/app/[locale]/account/quick-order/text-input-tab.tsx +3 -8
  77. package/dist/assets/storefront/src/app/[locale]/account/quotes/[id]/page.tsx +86 -59
  78. package/dist/assets/storefront/src/app/[locale]/account/quotes/actions.ts +38 -45
  79. package/dist/assets/storefront/src/app/[locale]/account/quotes/new/new-quote-form.tsx +3 -5
  80. package/dist/assets/storefront/src/app/[locale]/account/quotes/new/page.tsx +6 -6
  81. package/dist/assets/storefront/src/app/[locale]/account/quotes/page.tsx +92 -59
  82. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/activity-feed.tsx +152 -0
  83. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/add-item-search.tsx +132 -0
  84. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/add-member-form.tsx +140 -0
  85. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/members-panel.tsx +259 -0
  86. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/page.tsx +55 -0
  87. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/rename-dialog.tsx +117 -0
  88. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/shared-cart-detail-client.tsx +555 -0
  89. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/actions.ts +305 -0
  90. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/new/new-shared-cart-form.tsx +84 -0
  91. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/new/page.tsx +47 -0
  92. package/dist/assets/storefront/src/app/[locale]/account/shared-carts/page.tsx +276 -0
  93. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/[id]/page.tsx +22 -8
  94. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/[id]/shopping-list-detail-client.tsx +62 -49
  95. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/actions.ts +9 -4
  96. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/create-shopping-list-form.tsx +5 -11
  97. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/loading.tsx +1 -1
  98. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/page.tsx +32 -42
  99. package/dist/assets/storefront/src/app/[locale]/account/store-credits/actions.ts +8 -8
  100. package/dist/assets/storefront/src/app/[locale]/account/store-credits/claim-form.tsx +6 -10
  101. package/dist/assets/storefront/src/app/[locale]/account/store-credits/page.tsx +76 -55
  102. package/dist/assets/storefront/src/app/[locale]/account/store-credits/reveal-code.tsx +10 -6
  103. package/dist/assets/storefront/src/app/[locale]/account/verify-email/page.tsx +32 -39
  104. package/dist/assets/storefront/src/app/[locale]/cart/actions.ts +29 -23
  105. package/dist/assets/storefront/src/app/[locale]/cart/cart-items.tsx +111 -40
  106. package/dist/assets/storefront/src/app/[locale]/cart/cart-line-actions.tsx +9 -9
  107. package/dist/assets/storefront/src/app/[locale]/cart/cart-quantity-control.tsx +61 -48
  108. package/dist/assets/storefront/src/app/[locale]/cart/cart-remove-button.tsx +15 -9
  109. package/dist/assets/storefront/src/app/[locale]/cart/cart.tsx +38 -41
  110. package/dist/assets/storefront/src/app/[locale]/cart/code-input.tsx +8 -8
  111. package/dist/assets/storefront/src/app/[locale]/cart/order-summary.tsx +70 -29
  112. package/dist/assets/storefront/src/app/[locale]/cart/page.tsx +11 -11
  113. package/dist/assets/storefront/src/app/[locale]/cart/promotion-code.tsx +48 -42
  114. package/dist/assets/storefront/src/app/[locale]/cart/reapproval-confirm.tsx +22 -20
  115. package/dist/assets/storefront/src/app/[locale]/cart/request-quote-button.tsx +7 -16
  116. package/dist/assets/storefront/src/app/[locale]/checkout/actions.ts +39 -65
  117. package/dist/assets/storefront/src/app/[locale]/checkout/cancel-quote-checkout-button.tsx +5 -5
  118. package/dist/assets/storefront/src/app/[locale]/checkout/checkout-flow.tsx +202 -202
  119. package/dist/assets/storefront/src/app/[locale]/checkout/checkout-provider.tsx +142 -142
  120. package/dist/assets/storefront/src/app/[locale]/checkout/order-summary.tsx +158 -139
  121. package/dist/assets/storefront/src/app/[locale]/checkout/page.tsx +56 -47
  122. package/dist/assets/storefront/src/app/[locale]/checkout/steps/delivery-step.tsx +86 -88
  123. package/dist/assets/storefront/src/app/[locale]/checkout/steps/payment-step.tsx +90 -91
  124. package/dist/assets/storefront/src/app/[locale]/checkout/steps/review-step.tsx +166 -161
  125. package/dist/assets/storefront/src/app/[locale]/checkout/steps/shipping-address-step.tsx +573 -494
  126. package/dist/assets/storefront/src/app/[locale]/error.tsx +3 -5
  127. package/dist/assets/storefront/src/app/[locale]/forgot-password/actions.ts +10 -7
  128. package/dist/assets/storefront/src/app/[locale]/forgot-password/forgot-password-form.tsx +10 -25
  129. package/dist/assets/storefront/src/app/[locale]/forgot-password/page.tsx +5 -5
  130. package/dist/assets/storefront/src/app/[locale]/globals.css +48 -48
  131. package/dist/assets/storefront/src/app/[locale]/layout.tsx +53 -47
  132. package/dist/assets/storefront/src/app/[locale]/not-found.tsx +3 -5
  133. package/dist/assets/storefront/src/app/[locale]/order-confirmation/[code]/order-confirmation.tsx +71 -44
  134. package/dist/assets/storefront/src/app/[locale]/order-confirmation/[code]/page.tsx +7 -5
  135. package/dist/assets/storefront/src/app/[locale]/page.tsx +33 -35
  136. package/dist/assets/storefront/src/app/[locale]/register/actions.ts +7 -7
  137. package/dist/assets/storefront/src/app/[locale]/register/page.tsx +22 -16
  138. package/dist/assets/storefront/src/app/[locale]/register/registration-form.tsx +22 -34
  139. package/dist/assets/storefront/src/app/[locale]/register-company/actions.ts +15 -19
  140. package/dist/assets/storefront/src/app/[locale]/register-company/page.tsx +17 -15
  141. package/dist/assets/storefront/src/app/[locale]/register-company/registration-form.tsx +9 -15
  142. package/dist/assets/storefront/src/app/[locale]/reset-password/actions.ts +7 -8
  143. package/dist/assets/storefront/src/app/[locale]/reset-password/page.tsx +18 -12
  144. package/dist/assets/storefront/src/app/[locale]/reset-password/reset-password-form.tsx +8 -16
  145. package/dist/assets/storefront/src/app/[locale]/shopping-list/[code]/add-to-cart-button.tsx +10 -4
  146. package/dist/assets/storefront/src/app/[locale]/shopping-list/[code]/page.tsx +62 -30
  147. package/dist/assets/storefront/src/app/[locale]/sign-in/actions.ts +14 -16
  148. package/dist/assets/storefront/src/app/[locale]/sign-in/login-form.tsx +17 -30
  149. package/dist/assets/storefront/src/app/[locale]/sign-in/page.tsx +35 -30
  150. package/dist/assets/storefront/src/app/[locale]/verify/actions.ts +8 -8
  151. package/dist/assets/storefront/src/app/[locale]/verify/page.tsx +18 -14
  152. package/dist/assets/storefront/src/app/[locale]/verify/verify-content.tsx +25 -27
  153. package/dist/assets/storefront/src/app/[locale]/verify-pending/page.tsx +23 -23
  154. package/dist/assets/storefront/src/app/api/clear-company-context/route.ts +6 -3
  155. package/dist/assets/storefront/src/app/api/revalidate/route.ts +19 -28
  156. package/dist/assets/storefront/src/app/api/search-analytics/route.ts +1 -1
  157. package/dist/assets/storefront/src/components/commerce/account-nav-items.ts +44 -17
  158. package/dist/assets/storefront/src/components/commerce/account-sidebar.tsx +30 -22
  159. package/dist/assets/storefront/src/components/commerce/active-filters.tsx +1 -1
  160. package/dist/assets/storefront/src/components/commerce/add-to-shared-cart.tsx +247 -0
  161. package/dist/assets/storefront/src/components/commerce/approval-decision-form.tsx +9 -13
  162. package/dist/assets/storefront/src/components/commerce/approval-status-badge.tsx +23 -15
  163. package/dist/assets/storefront/src/components/commerce/business-unit-switcher.tsx +11 -11
  164. package/dist/assets/storefront/src/components/commerce/catalog-search-bar.tsx +2 -2
  165. package/dist/assets/storefront/src/components/commerce/category-product-section.tsx +28 -16
  166. package/dist/assets/storefront/src/components/commerce/category-sidebar.tsx +31 -18
  167. package/dist/assets/storefront/src/components/commerce/collection-hero-banner.tsx +2 -4
  168. package/dist/assets/storefront/src/components/commerce/company-state-badge.tsx +10 -16
  169. package/dist/assets/storefront/src/components/commerce/company-switcher.tsx +12 -12
  170. package/dist/assets/storefront/src/components/commerce/configurator-form.tsx +188 -79
  171. package/dist/assets/storefront/src/components/commerce/facet-filters.tsx +29 -49
  172. package/dist/assets/storefront/src/components/commerce/gift-card-pdp.tsx +4 -4
  173. package/dist/assets/storefront/src/components/commerce/gift-card-product-info.tsx +20 -30
  174. package/dist/assets/storefront/src/components/commerce/instant-search-dropdown.tsx +258 -227
  175. package/dist/assets/storefront/src/components/commerce/order-status-badge.tsx +27 -19
  176. package/dist/assets/storefront/src/components/commerce/packaging-unit-selector.tsx +27 -26
  177. package/dist/assets/storefront/src/components/commerce/permission-gate.tsx +4 -4
  178. package/dist/assets/storefront/src/components/commerce/price-range-filter.tsx +5 -5
  179. package/dist/assets/storefront/src/components/commerce/price-tiers.tsx +38 -21
  180. package/dist/assets/storefront/src/components/commerce/price.tsx +3 -3
  181. package/dist/assets/storefront/src/components/commerce/product-card-list.tsx +35 -14
  182. package/dist/assets/storefront/src/components/commerce/product-card.tsx +31 -16
  183. package/dist/assets/storefront/src/components/commerce/product-carousel.tsx +20 -12
  184. package/dist/assets/storefront/src/components/commerce/product-grid.tsx +14 -13
  185. package/dist/assets/storefront/src/components/commerce/product-image-carousel.tsx +10 -8
  186. package/dist/assets/storefront/src/components/commerce/product-info.tsx +129 -72
  187. package/dist/assets/storefront/src/components/commerce/product-list-expansion.tsx +102 -74
  188. package/dist/assets/storefront/src/components/commerce/product-list-view.tsx +1 -1
  189. package/dist/assets/storefront/src/components/commerce/product-sidebar.tsx +36 -11
  190. package/dist/assets/storefront/src/components/commerce/product-view-switcher.tsx +33 -21
  191. package/dist/assets/storefront/src/components/commerce/quote-action-buttons.tsx +54 -36
  192. package/dist/assets/storefront/src/components/commerce/quote-activity-timeline.tsx +126 -50
  193. package/dist/assets/storefront/src/components/commerce/quote-comment-form.tsx +9 -13
  194. package/dist/assets/storefront/src/components/commerce/quote-csv-export-button.tsx +6 -6
  195. package/dist/assets/storefront/src/components/commerce/quote-product-search.tsx +22 -18
  196. package/dist/assets/storefront/src/components/commerce/quote-request-form.tsx +28 -27
  197. package/dist/assets/storefront/src/components/commerce/quote-status-badge.tsx +26 -18
  198. package/dist/assets/storefront/src/components/commerce/quote-validity-indicator.tsx +7 -7
  199. package/dist/assets/storefront/src/components/commerce/quote-version-comparison.tsx +50 -30
  200. package/dist/assets/storefront/src/components/commerce/related-products.tsx +37 -28
  201. package/dist/assets/storefront/src/components/commerce/shared-cart-role.ts +39 -0
  202. package/dist/assets/storefront/src/components/commerce/shared-cart-status-badge.tsx +28 -0
  203. package/dist/assets/storefront/src/components/commerce/shop-by-category.tsx +8 -7
  204. package/dist/assets/storefront/src/components/commerce/shopping-list-toggle.tsx +14 -20
  205. package/dist/assets/storefront/src/components/commerce/sort-dropdown.tsx +9 -16
  206. package/dist/assets/storefront/src/components/commerce/store-credit-summary.tsx +30 -32
  207. package/dist/assets/storefront/src/components/commerce/subcollection-tiles.tsx +11 -13
  208. package/dist/assets/storefront/src/components/layout/auth-page-shell.tsx +2 -2
  209. package/dist/assets/storefront/src/components/layout/draft-mode-indicator.tsx +2 -7
  210. package/dist/assets/storefront/src/components/layout/draft-mode-link.tsx +4 -2
  211. package/dist/assets/storefront/src/components/layout/footer.tsx +70 -28
  212. package/dist/assets/storefront/src/components/layout/navbar/actions.ts +9 -12
  213. package/dist/assets/storefront/src/components/layout/navbar/cart-icon.tsx +9 -9
  214. package/dist/assets/storefront/src/components/layout/navbar/channel-picker-wrapper.tsx +4 -9
  215. package/dist/assets/storefront/src/components/layout/navbar/channel-picker.tsx +13 -8
  216. package/dist/assets/storefront/src/components/layout/navbar/currency-picker-wrapper.tsx +4 -4
  217. package/dist/assets/storefront/src/components/layout/navbar/currency-picker.tsx +11 -6
  218. package/dist/assets/storefront/src/components/layout/navbar/language-picker.tsx +7 -7
  219. package/dist/assets/storefront/src/components/layout/navbar/login-button.tsx +24 -21
  220. package/dist/assets/storefront/src/components/layout/navbar/mobile-nav.tsx +8 -8
  221. package/dist/assets/storefront/src/components/layout/navbar/nav-menu-items.tsx +4 -6
  222. package/dist/assets/storefront/src/components/layout/navbar/navbar-cart.tsx +1 -1
  223. package/dist/assets/storefront/src/components/layout/navbar/navbar-collections.tsx +41 -42
  224. package/dist/assets/storefront/src/components/layout/navbar/navbar-link.tsx +7 -10
  225. package/dist/assets/storefront/src/components/layout/navbar/navbar-user.tsx +18 -23
  226. package/dist/assets/storefront/src/components/layout/navbar/theme-switcher.tsx +9 -9
  227. package/dist/assets/storefront/src/components/layout/navbar.tsx +36 -31
  228. package/dist/assets/storefront/src/components/layout/search-input.tsx +35 -32
  229. package/dist/assets/storefront/src/components/providers/awaiting-approval-banner.tsx +12 -10
  230. package/dist/assets/storefront/src/components/providers/cart-count-server.tsx +14 -12
  231. package/dist/assets/storefront/src/components/providers/company-context-guard.tsx +4 -4
  232. package/dist/assets/storefront/src/components/providers/company-permissions-server.tsx +2 -6
  233. package/dist/assets/storefront/src/components/providers/theme-provider.tsx +3 -3
  234. package/dist/assets/storefront/src/components/shared/breadcrumbs.tsx +4 -1
  235. package/dist/assets/storefront/src/components/shared/country-select.tsx +63 -67
  236. package/dist/assets/storefront/src/components/shared/pagination.tsx +15 -28
  237. package/dist/assets/storefront/src/components/shared/prefetch-link.tsx +1 -1
  238. package/dist/assets/storefront/src/components/shared/skeletons/search-input-skeleton.tsx +1 -3
  239. package/dist/assets/storefront/src/components/ui/accordion.tsx +46 -51
  240. package/dist/assets/storefront/src/components/ui/alert-dialog.tsx +94 -121
  241. package/dist/assets/storefront/src/components/ui/alert.tsx +48 -54
  242. package/dist/assets/storefront/src/components/ui/aspect-ratio.tsx +5 -7
  243. package/dist/assets/storefront/src/components/ui/avatar.tsx +29 -44
  244. package/dist/assets/storefront/src/components/ui/badge.tsx +28 -37
  245. package/dist/assets/storefront/src/components/ui/breadcrumb.tsx +82 -89
  246. package/dist/assets/storefront/src/components/ui/button.tsx +43 -49
  247. package/dist/assets/storefront/src/components/ui/calendar.tsx +157 -198
  248. package/dist/assets/storefront/src/components/ui/card.tsx +53 -76
  249. package/dist/assets/storefront/src/components/ui/carousel.tsx +194 -212
  250. package/dist/assets/storefront/src/components/ui/chart.tsx +274 -317
  251. package/dist/assets/storefront/src/components/ui/checkbox.tsx +24 -27
  252. package/dist/assets/storefront/src/components/ui/collapsible.tsx +9 -21
  253. package/dist/assets/storefront/src/components/ui/command.tsx +114 -159
  254. package/dist/assets/storefront/src/components/ui/context-menu.tsx +167 -199
  255. package/dist/assets/storefront/src/components/ui/dialog.tsx +97 -114
  256. package/dist/assets/storefront/src/components/ui/drawer.tsx +93 -107
  257. package/dist/assets/storefront/src/components/ui/dropdown-menu.tsx +171 -206
  258. package/dist/assets/storefront/src/components/ui/empty-state.tsx +5 -5
  259. package/dist/assets/storefront/src/components/ui/field.tsx +196 -208
  260. package/dist/assets/storefront/src/components/ui/form.tsx +115 -139
  261. package/dist/assets/storefront/src/components/ui/hover-card.tsx +27 -33
  262. package/dist/assets/storefront/src/components/ui/input-otp.tsx +50 -59
  263. package/dist/assets/storefront/src/components/ui/input.tsx +17 -17
  264. package/dist/assets/storefront/src/components/ui/kbd-shortcut.tsx +3 -1
  265. package/dist/assets/storefront/src/components/ui/label.tsx +16 -19
  266. package/dist/assets/storefront/src/components/ui/menubar.tsx +193 -223
  267. package/dist/assets/storefront/src/components/ui/navigation-menu.tsx +123 -130
  268. package/dist/assets/storefront/src/components/ui/pagination.tsx +87 -108
  269. package/dist/assets/storefront/src/components/ui/popover.tsx +29 -35
  270. package/dist/assets/storefront/src/components/ui/progress.tsx +19 -26
  271. package/dist/assets/storefront/src/components/ui/radio-group.tsx +32 -38
  272. package/dist/assets/storefront/src/components/ui/resizable.tsx +37 -42
  273. package/dist/assets/storefront/src/components/ui/scroll-area.tsx +41 -47
  274. package/dist/assets/storefront/src/components/ui/select.tsx +130 -152
  275. package/dist/assets/storefront/src/components/ui/separator.tsx +21 -21
  276. package/dist/assets/storefront/src/components/ui/sheet.tsx +90 -111
  277. package/dist/assets/storefront/src/components/ui/sidebar.tsx +611 -649
  278. package/dist/assets/storefront/src/components/ui/skeleton.tsx +10 -10
  279. package/dist/assets/storefront/src/components/ui/slider.tsx +50 -55
  280. package/dist/assets/storefront/src/components/ui/sonner.tsx +20 -20
  281. package/dist/assets/storefront/src/components/ui/switch.tsx +23 -26
  282. package/dist/assets/storefront/src/components/ui/table.tsx +65 -97
  283. package/dist/assets/storefront/src/components/ui/tabs.tsx +39 -55
  284. package/dist/assets/storefront/src/components/ui/textarea.tsx +14 -14
  285. package/dist/assets/storefront/src/components/ui/toggle-group.tsx +56 -62
  286. package/dist/assets/storefront/src/components/ui/toggle.tsx +37 -38
  287. package/dist/assets/storefront/src/components/ui/tooltip.tsx +38 -46
  288. package/dist/assets/storefront/src/config/scenario-meta.ts +2 -2
  289. package/dist/assets/storefront/src/config/scenario.ts +14 -16
  290. package/dist/assets/storefront/src/contexts/auth-context.tsx +5 -6
  291. package/dist/assets/storefront/src/graphql-env.d.ts +18 -5
  292. package/dist/assets/storefront/src/graphql.ts +5 -5
  293. package/dist/assets/storefront/src/hooks/use-mobile.ts +13 -13
  294. package/dist/assets/storefront/src/i18n/locale-utils.ts +3 -3
  295. package/dist/assets/storefront/src/i18n/navigation.ts +4 -4
  296. package/dist/assets/storefront/src/i18n/request.ts +4 -4
  297. package/dist/assets/storefront/src/i18n/routing.ts +5 -5
  298. package/dist/assets/storefront/src/i18n/server.ts +3 -3
  299. package/dist/assets/storefront/src/lib/actions/switch-channel.ts +9 -9
  300. package/dist/assets/storefront/src/lib/actions/switch-currency.ts +7 -7
  301. package/dist/assets/storefront/src/lib/auth.ts +1 -1
  302. package/dist/assets/storefront/src/lib/backend-health.ts +3 -3
  303. package/dist/assets/storefront/src/lib/cart-count-context.tsx +10 -4
  304. package/dist/assets/storefront/src/lib/cart-guard-utils.ts +2 -1
  305. package/dist/assets/storefront/src/lib/cart-guard.ts +7 -6
  306. package/dist/assets/storefront/src/lib/channel-server.ts +4 -4
  307. package/dist/assets/storefront/src/lib/company-context.ts +1 -1
  308. package/dist/assets/storefront/src/lib/company-permissions-context.tsx +1 -5
  309. package/dist/assets/storefront/src/lib/currency-server.ts +4 -4
  310. package/dist/assets/storefront/src/lib/format.ts +16 -7
  311. package/dist/assets/storefront/src/lib/metadata.ts +39 -44
  312. package/dist/assets/storefront/src/lib/quantity.ts +2 -4
  313. package/dist/assets/storefront/src/lib/search-bar-context.tsx +7 -4
  314. package/dist/assets/storefront/src/lib/use-recent-searches.ts +8 -6
  315. package/dist/assets/storefront/src/lib/utils.ts +3 -3
  316. package/dist/assets/storefront/src/lib/vendure/actions.ts +18 -16
  317. package/dist/assets/storefront/src/lib/vendure/api.ts +44 -27
  318. package/dist/assets/storefront/src/lib/vendure/approval-utils.ts +9 -8
  319. package/dist/assets/storefront/src/lib/vendure/cached.ts +20 -15
  320. package/dist/assets/storefront/src/lib/vendure/mutations.ts +96 -0
  321. package/dist/assets/storefront/src/lib/vendure/queries.ts +157 -5
  322. package/dist/assets/storefront/src/middleware.ts +1 -1
  323. package/dist/assets/storefront/src/scenarios/customer/hero.tsx +2 -2
  324. package/dist/assets/storefront/src/scenarios/customer/meta.ts +1 -1
  325. package/dist/assets/storefront/src/schema.graphql +134 -0
  326. package/dist/bin/run.js +1 -1
  327. package/dist/cli.d.ts +1 -1
  328. package/dist/index.d.ts +5 -5
  329. package/dist/index.js +1 -1
  330. package/dist/plugin-registry.js +1 -1
  331. package/dist/scaffold-storefront-only.js +1 -1
  332. package/dist/scaffolder.js +1 -1
  333. package/dist/template-renderer.js +1 -1
  334. package/package.json +2 -2
@@ -7,6 +7,7 @@ import { usePathname, useRouter, useSearchParams } from 'next/navigation';
7
7
  import { useCallback, useEffect, useState, useTransition } from 'react';
8
8
  import { toast } from 'sonner';
9
9
 
10
+ import { Price } from '@/components/commerce/price';
10
11
  import { Badge } from '@/components/ui/badge';
11
12
  import { Button } from '@/components/ui/button';
12
13
  import { Checkbox } from '@/components/ui/checkbox';
@@ -19,7 +20,6 @@ import {
19
20
  DialogTitle,
20
21
  DialogTrigger,
21
22
  } from '@/components/ui/dialog';
22
- import { Price } from '@/components/commerce/price';
23
23
 
24
24
  import {
25
25
  commitReorder,
@@ -35,12 +35,7 @@ type Props = {
35
35
  sourceOrderCode: string;
36
36
  };
37
37
 
38
- const COMMIT_ELIGIBLE: ReorderLineStatus[] = [
39
- 'AVAILABLE',
40
- 'LOW_STOCK',
41
- 'PRICE_CHANGED',
42
- 'SUBSTITUTED',
43
- ];
38
+ const COMMIT_ELIGIBLE: ReorderLineStatus[] = ['AVAILABLE', 'LOW_STOCK', 'PRICE_CHANGED', 'SUBSTITUTED'];
44
39
 
45
40
  const STATUS_MESSAGE_KEY: Record<ReorderLineStatus, string> = {
46
41
  AVAILABLE: 'status.available',
@@ -52,10 +47,7 @@ const STATUS_MESSAGE_KEY: Record<ReorderLineStatus, string> = {
52
47
  UNSUPPORTED: 'status.unsupported',
53
48
  };
54
49
 
55
- const STATUS_BADGE_VARIANT: Record<
56
- ReorderLineStatus,
57
- 'secondary' | 'outline' | 'destructive'
58
- > = {
50
+ const STATUS_BADGE_VARIANT: Record<ReorderLineStatus, 'secondary' | 'outline' | 'destructive'> = {
59
51
  AVAILABLE: 'secondary',
60
52
  LOW_STOCK: 'outline',
61
53
  OUT_OF_STOCK: 'destructive',
@@ -142,12 +134,12 @@ export function ReorderDialog({ sourceOrderId, sourceOrderCode }: Props) {
142
134
 
143
135
  const toggleLine = (line: PreviewLineView) => {
144
136
  if (!COMMIT_ELIGIBLE.includes(line.status)) return;
145
- setSelected(prev => ({ ...prev, [line.sourceLineId]: !prev[line.sourceLineId] }));
137
+ setSelected((prev) => ({ ...prev, [line.sourceLineId]: !prev[line.sourceLineId] }));
146
138
  };
147
139
 
148
140
  const setQty = (line: PreviewLineView, quantity: number) => {
149
141
  const next = Math.max(1, Math.floor(quantity));
150
- setQuantities(prev => ({ ...prev, [line.sourceLineId]: next }));
142
+ setQuantities((prev) => ({ ...prev, [line.sourceLineId]: next }));
151
143
  };
152
144
 
153
145
  const indicativeSubtotal = (() => {
@@ -163,8 +155,8 @@ export function ReorderDialog({ sourceOrderId, sourceOrderCode }: Props) {
163
155
  const handleConfirm = () => {
164
156
  if (!preview) return;
165
157
  const lines = preview.lines
166
- .filter(l => selected[l.sourceLineId] && l.productVariantId != null)
167
- .map(l => ({
158
+ .filter((l) => selected[l.sourceLineId] && l.productVariantId != null)
159
+ .map((l) => ({
168
160
  sourceLineId: l.sourceLineId,
169
161
  productVariantId: l.productVariantId as string,
170
162
  quantity: quantities[l.sourceLineId] ?? l.quantity,
@@ -193,7 +185,7 @@ export function ReorderDialog({ sourceOrderId, sourceOrderCode }: Props) {
193
185
  // fallback — e.g. "Your cart is in ArrangingPayment and
194
186
  // cannot accept new items" is vastly more useful than
195
187
  // "No items could be added".
196
- const specific = serverMessages.find(m => m.type === 'ERROR')?.message;
188
+ const specific = serverMessages.find((m) => m.type === 'ERROR')?.message;
197
189
  toast.error(specific ?? t('toast.nothingAddable'));
198
190
  return;
199
191
  }
@@ -217,9 +209,7 @@ export function ReorderDialog({ sourceOrderId, sourceOrderCode }: Props) {
217
209
  </DialogHeader>
218
210
 
219
211
  {isLoadingPreview && (
220
- <p className="py-8 text-center text-sm text-muted-foreground">
221
- {t('dialog.loading')}
222
- </p>
212
+ <p className="py-8 text-center text-sm text-muted-foreground">{t('dialog.loading')}</p>
223
213
  )}
224
214
 
225
215
  {loadError && (
@@ -230,33 +220,25 @@ export function ReorderDialog({ sourceOrderId, sourceOrderCode }: Props) {
230
220
  )}
231
221
 
232
222
  {preview && !isLoadingPreview && preview.lines.length === 0 && (
233
- <p className="py-8 text-center text-sm text-muted-foreground">
234
- {t('dialog.empty')}
235
- </p>
223
+ <p className="py-8 text-center text-sm text-muted-foreground">{t('dialog.empty')}</p>
236
224
  )}
237
225
 
238
- {preview &&
239
- !isLoadingPreview &&
240
- preview.lines.length > 0 &&
241
- preview.availableCount === 0 && (
242
- <div className="flex items-start gap-2 rounded-md border border-muted bg-muted/30 p-3 text-sm">
243
- <AlertCircle className="h-4 w-4 mt-0.5" />
244
- <span>{t('dialog.noneAvailable')}</span>
245
- </div>
246
- )}
226
+ {preview && !isLoadingPreview && preview.lines.length > 0 && preview.availableCount === 0 && (
227
+ <div className="flex items-start gap-2 rounded-md border border-muted bg-muted/30 p-3 text-sm">
228
+ <AlertCircle className="h-4 w-4 mt-0.5" />
229
+ <span>{t('dialog.noneAvailable')}</span>
230
+ </div>
231
+ )}
247
232
 
248
233
  {preview && !isLoadingPreview && preview.lines.length > 0 && (
249
234
  <>
250
235
  <div className="max-h-[50vh] overflow-y-auto divide-y">
251
- {preview.lines.map(line => {
236
+ {preview.lines.map((line) => {
252
237
  const isEligible = COMMIT_ELIGIBLE.includes(line.status);
253
238
  const qty = quantities[line.sourceLineId] ?? line.quantity;
254
239
  const productName = line.productName ?? t('dialog.discontinuedFallback');
255
240
  return (
256
- <div
257
- key={line.sourceLineId}
258
- className="flex gap-3 py-3 items-start"
259
- >
241
+ <div key={line.sourceLineId} className="flex gap-3 py-3 items-start">
260
242
  <div className="pt-1">
261
243
  <Checkbox
262
244
  checked={selected[line.sourceLineId] ?? false}
@@ -322,7 +304,7 @@ export function ReorderDialog({ sourceOrderId, sourceOrderCode }: Props) {
322
304
  type="number"
323
305
  min={1}
324
306
  value={qty}
325
- onChange={e => setQty(line, Number(e.target.value))}
307
+ onChange={(e) => setQty(line, Number(e.target.value))}
326
308
  disabled={!isEligible}
327
309
  className="w-20 rounded-md border px-2 py-1 text-right text-sm disabled:opacity-50"
328
310
  aria-label={t('dialog.quantityAriaLabel', {
@@ -354,25 +336,17 @@ export function ReorderDialog({ sourceOrderId, sourceOrderCode }: Props) {
354
336
  </span>
355
337
  <span>
356
338
  {t('dialog.indicativeTotalLabel')}{' '}
357
- <Price
358
- value={indicativeSubtotal}
359
- currencyCode={preview.currencyCode}
360
- />
339
+ <Price value={indicativeSubtotal} currencyCode={preview.currencyCode} />
361
340
  </span>
362
341
  </div>
363
- <p className="mt-1 text-xs text-muted-foreground">
364
- {t('dialog.disclaimer')}
365
- </p>
342
+ <p className="mt-1 text-xs text-muted-foreground">{t('dialog.disclaimer')}</p>
366
343
  </div>
367
344
 
368
345
  <DialogFooter>
369
346
  <Button variant="ghost" onClick={() => setOpen(false)}>
370
347
  {t('dialog.cancel')}
371
348
  </Button>
372
- <Button
373
- onClick={handleConfirm}
374
- disabled={isCommitting || selectedCount === 0}
375
- >
349
+ <Button onClick={handleConfirm} disabled={isCommitting || selectedCount === 0}>
376
350
  {isCommitting
377
351
  ? t('dialog.adding')
378
352
  : t('dialog.addToCart', { count: selectedCount })}
@@ -1,5 +1,5 @@
1
- import {Table, TableBody, TableCell, TableHead, TableHeader, TableRow} from '@/components/ui/table';
2
- import {Skeleton} from '@/components/ui/skeleton';
1
+ import { Skeleton } from '@/components/ui/skeleton';
2
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';
3
3
 
4
4
  export default function OrdersLoading() {
5
5
  return (
@@ -18,22 +18,22 @@ export default function OrdersLoading() {
18
18
  </TableRow>
19
19
  </TableHeader>
20
20
  <TableBody>
21
- {Array.from({length: 5}).map((_, i) => (
21
+ {Array.from({ length: 5 }).map((_, i) => (
22
22
  <TableRow key={i}>
23
23
  <TableCell>
24
- <Skeleton className="h-9 w-32"/>
24
+ <Skeleton className="h-9 w-32" />
25
25
  </TableCell>
26
26
  <TableCell>
27
- <Skeleton className="h-4 w-24"/>
27
+ <Skeleton className="h-4 w-24" />
28
28
  </TableCell>
29
29
  <TableCell>
30
- <Skeleton className="h-6 w-20"/>
30
+ <Skeleton className="h-6 w-20" />
31
31
  </TableCell>
32
32
  <TableCell>
33
- <Skeleton className="h-4 w-16"/>
33
+ <Skeleton className="h-4 w-16" />
34
34
  </TableCell>
35
35
  <TableCell className="text-right">
36
- <Skeleton className="h-4 w-20 ml-auto"/>
36
+ <Skeleton className="h-4 w-20 ml-auto" />
37
37
  </TableCell>
38
38
  </TableRow>
39
39
  ))}
@@ -1,9 +1,6 @@
1
- import type {Metadata} from 'next';
2
- import {Suspense} from 'react';
3
- import {client} from '@/lib/vendure/api';
4
- import {GetCustomerOrdersQuery, GetCompanyOrdersQuery} from '@/lib/vendure/queries';
5
- import {getActiveCustomer, getCompanyAccount} from '@/lib/vendure/actions';
6
- import {Table, TableBody, TableCell, TableHead, TableHeader, TableRow,} from '@/components/ui/table';
1
+ import { ErrorState } from '@/components/shared/error-state';
2
+ import { Button } from '@/components/ui/button';
3
+ import { EmptyState } from '@/components/ui/empty-state';
7
4
  import {
8
5
  Pagination,
9
6
  PaginationContent,
@@ -13,17 +10,19 @@ import {
13
10
  PaginationNext,
14
11
  PaginationPrevious,
15
12
  } from '@/components/ui/pagination';
16
- import {RotateCcw, ShoppingBag} from "lucide-react";
17
- import {Button} from '@/components/ui/button';
18
- import {EmptyState} from '@/components/ui/empty-state';
19
- import {ErrorState} from '@/components/shared/error-state';
13
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';
14
+ import { getActiveCustomer, getCompanyAccount } from '@/lib/vendure/actions';
15
+ import { client } from '@/lib/vendure/api';
16
+ import { GetCompanyOrdersQuery, GetCustomerOrdersQuery } from '@/lib/vendure/queries';
17
+ import { RotateCcw, ShoppingBag } from 'lucide-react';
18
+ import type { Metadata } from 'next';
19
+ import { Suspense } from 'react';
20
20
 
21
- import {Price} from '@/components/commerce/price';
22
- import {OrderStatusBadge} from '@/components/commerce/order-status-badge';
23
- import {formatDate} from '@/lib/format';
24
- import {getTranslations, setRequestLocale} from 'next-intl/server';
25
- import {Link} from "@/i18n/navigation";
26
- import {redirect} from "@/i18n/navigation";
21
+ import { OrderStatusBadge } from '@/components/commerce/order-status-badge';
22
+ import { Price } from '@/components/commerce/price';
23
+ import { Link, redirect } from '@/i18n/navigation';
24
+ import { formatDate } from '@/lib/format';
25
+ import { getTranslations, setRequestLocale } from 'next-intl/server';
27
26
 
28
27
  export const metadata: Metadata = {
29
28
  title: 'Orders',
@@ -51,7 +50,17 @@ const REORDERABLE_STATES = new Set([
51
50
  'Delivered',
52
51
  ]);
53
52
 
54
- function OrderTable({orders, locale, t, tReorder}: {orders: OrderRow[]; locale: string; t: Awaited<ReturnType<typeof getTranslations<'Account'>>>; tReorder: Awaited<ReturnType<typeof getTranslations<'Reorder'>>>}) {
53
+ function OrderTable({
54
+ orders,
55
+ locale,
56
+ t,
57
+ tReorder,
58
+ }: {
59
+ orders: OrderRow[];
60
+ locale: string;
61
+ t: Awaited<ReturnType<typeof getTranslations<'Account'>>>;
62
+ tReorder: Awaited<ReturnType<typeof getTranslations<'Reorder'>>>;
63
+ }) {
55
64
  return (
56
65
  <div className="border rounded-lg">
57
66
  <Table>
@@ -62,7 +71,9 @@ function OrderTable({orders, locale, t, tReorder}: {orders: OrderRow[]; locale:
62
71
  <TableHead>{t('date')}</TableHead>
63
72
  <TableHead>{t('status')}</TableHead>
64
73
  <TableHead className="text-right">{t('totalHeader')}</TableHead>
65
- <TableHead className="text-right w-28"><span className="sr-only">Actions</span></TableHead>
74
+ <TableHead className="text-right w-28">
75
+ <span className="sr-only">Actions</span>
76
+ </TableHead>
66
77
  </TableRow>
67
78
  </TableHeader>
68
79
  <TableBody>
@@ -78,15 +89,21 @@ function OrderTable({orders, locale, t, tReorder}: {orders: OrderRow[]; locale:
78
89
  </TableCell>
79
90
  <TableCell className="text-sm">{order.placedBy}</TableCell>
80
91
  <TableCell>{formatDate(order.createdAt, locale)}</TableCell>
81
- <TableCell><OrderStatusBadge state={order.state}/></TableCell>
92
+ <TableCell>
93
+ <OrderStatusBadge state={order.state} />
94
+ </TableCell>
82
95
  <TableCell className="text-right">
83
- <Price value={order.totalWithTax} currencyCode={order.currencyCode} taxLabel="incl" />
96
+ <Price
97
+ value={order.totalWithTax}
98
+ currencyCode={order.currencyCode}
99
+ taxLabel="incl"
100
+ />
84
101
  </TableCell>
85
102
  <TableCell className="text-right">
86
103
  {REORDERABLE_STATES.has(order.state) && (
87
104
  <Button asChild variant="ghost" size="sm">
88
105
  <Link href={`/account/orders/${order.code}?reorder=1`}>
89
- <RotateCcw className="h-3.5 w-3.5 mr-1.5"/>
106
+ <RotateCcw className="h-3.5 w-3.5 mr-1.5" />
90
107
  {tReorder('trigger')}
91
108
  </Link>
92
109
  </Button>
@@ -118,21 +135,18 @@ async function MyOrdersSection({
118
135
  const currentPage = parseInt(Array.isArray(pageParam) ? pageParam[0] : pageParam || '1', 10);
119
136
  const skip = (currentPage - 1) * ITEMS_PER_PAGE;
120
137
 
121
- const [result, error] = await client.query(
122
- GetCustomerOrdersQuery,
123
- {
124
- options: {
125
- take: ITEMS_PER_PAGE,
126
- skip,
127
- sort: { createdAt: 'DESC' },
128
- filter: { state: { notEq: 'AddingItems' } },
129
- },
138
+ const [result, error] = await client.query(GetCustomerOrdersQuery, {
139
+ options: {
140
+ take: ITEMS_PER_PAGE,
141
+ skip,
142
+ sort: { createdAt: 'DESC' },
143
+ filter: { state: { notEq: 'AddingItems' } },
130
144
  },
131
- );
145
+ });
132
146
  if (error) {
133
147
  return <ErrorState message="We couldn't load your orders. Please try again later." />;
134
148
  }
135
- const {data} = result;
149
+ const { data } = result;
136
150
 
137
151
  if (!data.activeCustomer) {
138
152
  return await redirect('/sign-in');
@@ -171,11 +185,18 @@ async function MyOrdersSection({
171
185
  className={currentPage === 1 ? 'pointer-events-none opacity-50' : ''}
172
186
  />
173
187
  </PaginationItem>
174
- {Array.from({length: totalPages}, (_, i) => i + 1).map((page) => {
175
- if (page === 1 || page === totalPages || (page >= currentPage - 1 && page <= currentPage + 1)) {
188
+ {Array.from({ length: totalPages }, (_, i) => i + 1).map((page) => {
189
+ if (
190
+ page === 1 ||
191
+ page === totalPages ||
192
+ (page >= currentPage - 1 && page <= currentPage + 1)
193
+ ) {
176
194
  return (
177
195
  <PaginationItem key={page}>
178
- <PaginationLink href={`/account/orders?page=${page}`} isActive={page === currentPage}>
196
+ <PaginationLink
197
+ href={`/account/orders?page=${page}`}
198
+ isActive={page === currentPage}
199
+ >
179
200
  {page}
180
201
  </PaginationLink>
181
202
  </PaginationItem>
@@ -183,7 +204,7 @@ async function MyOrdersSection({
183
204
  } else if (page === currentPage - 2 || page === currentPage + 2) {
184
205
  return (
185
206
  <PaginationItem key={page}>
186
- <PaginationEllipsis/>
207
+ <PaginationEllipsis />
187
208
  </PaginationItem>
188
209
  );
189
210
  }
@@ -191,8 +212,14 @@ async function MyOrdersSection({
191
212
  })}
192
213
  <PaginationItem>
193
214
  <PaginationNext
194
- href={currentPage < totalPages ? `/account/orders?page=${currentPage + 1}` : '#'}
195
- className={currentPage === totalPages ? 'pointer-events-none opacity-50' : ''}
215
+ href={
216
+ currentPage < totalPages
217
+ ? `/account/orders?page=${currentPage + 1}`
218
+ : '#'
219
+ }
220
+ className={
221
+ currentPage === totalPages ? 'pointer-events-none opacity-50' : ''
222
+ }
196
223
  />
197
224
  </PaginationItem>
198
225
  </PaginationContent>
@@ -203,17 +230,22 @@ async function MyOrdersSection({
203
230
  );
204
231
  }
205
232
 
206
- async function CompanyOrdersSection({activeCustomerId, locale}: {activeCustomerId: string; locale: string}) {
233
+ async function CompanyOrdersSection({
234
+ activeCustomerId,
235
+ locale,
236
+ }: {
237
+ activeCustomerId: string;
238
+ locale: string;
239
+ }) {
207
240
  const t = await getTranslations('Account');
208
241
  const tReorder = await getTranslations('Reorder');
209
- const [result, error] = await client.query(
210
- GetCompanyOrdersQuery,
211
- {options: {take: 50, sort: {createdAt: 'DESC'}}},
212
- );
242
+ const [result, error] = await client.query(GetCompanyOrdersQuery, {
243
+ options: { take: 50, sort: { createdAt: 'DESC' } },
244
+ });
213
245
  if (error) {
214
246
  return <ErrorState message="We couldn't load company orders. Please try again later." />;
215
247
  }
216
- const {data} = result;
248
+ const { data } = result;
217
249
  const allOrders = data.companyOrders?.items ?? [];
218
250
 
219
251
  // Exclude the current user's own orders — those are already in "My Orders"
@@ -230,9 +262,7 @@ async function CompanyOrdersSection({activeCustomerId, locale}: {activeCustomerI
230
262
  state: order.state,
231
263
  totalWithTax: order.totalWithTax,
232
264
  currencyCode: order.currencyCode,
233
- placedBy: order.customer
234
- ? `${order.customer.firstName} ${order.customer.lastName}`
235
- : '—',
265
+ placedBy: order.customer ? `${order.customer.firstName} ${order.customer.lastName}` : '—',
236
266
  }));
237
267
 
238
268
  return (
@@ -244,35 +274,45 @@ async function CompanyOrdersSection({activeCustomerId, locale}: {activeCustomerI
244
274
  }
245
275
 
246
276
  async function OrdersEmptyState() {
247
- const [tAccount, tCommon] = await Promise.all([
248
- getTranslations('Account'),
249
- getTranslations('Common'),
250
- ]);
277
+ const [tAccount, tCommon] = await Promise.all([getTranslations('Account'), getTranslations('Common')]);
251
278
  return (
252
279
  <EmptyState
253
280
  icon={ShoppingBag}
254
281
  heading={tAccount('noOrders')}
255
- action={{label: tCommon('startShopping'), href: '/'}}
282
+ action={{ label: tCommon('startShopping'), href: '/' }}
256
283
  />
257
284
  );
258
285
  }
259
286
 
260
- export default async function OrdersPage(props: {params: Promise<{locale: string}>; searchParams: Promise<Record<string, string | string[] | undefined>>}) {
287
+ export default async function OrdersPage(props: {
288
+ params: Promise<{ locale: string }>;
289
+ searchParams: Promise<Record<string, string | string[] | undefined>>;
290
+ }) {
261
291
  return (
262
- <Suspense fallback={<div><h1 className="text-3xl font-bold mb-6">Orders</h1><p className="text-sm text-muted-foreground">Loading orders...</p></div>}>
292
+ <Suspense
293
+ fallback={
294
+ <div>
295
+ <h1 className="text-3xl font-bold mb-6">Orders</h1>
296
+ <p className="text-sm text-muted-foreground">Loading orders...</p>
297
+ </div>
298
+ }
299
+ >
263
300
  <OrdersContent params={props.params} searchParams={props.searchParams} />
264
301
  </Suspense>
265
302
  );
266
303
  }
267
304
 
268
- async function OrdersContent({params, searchParams}: {params: Promise<{locale: string}>; searchParams: Promise<Record<string, string | string[] | undefined>>}) {
269
- const {locale} = await params;
305
+ async function OrdersContent({
306
+ params,
307
+ searchParams,
308
+ }: {
309
+ params: Promise<{ locale: string }>;
310
+ searchParams: Promise<Record<string, string | string[] | undefined>>;
311
+ }) {
312
+ const { locale } = await params;
270
313
  setRequestLocale(locale);
271
314
  const t = await getTranslations('Account');
272
- const [activeCustomer, companyAccount] = await Promise.all([
273
- getActiveCustomer(),
274
- getCompanyAccount(),
275
- ]);
315
+ const [activeCustomer, companyAccount] = await Promise.all([getActiveCustomer(), getCompanyAccount()]);
276
316
  if (!activeCustomer) return await redirect('/sign-in');
277
317
 
278
318
  const permissions = companyAccount?.permissions ?? [];
@@ -283,7 +323,7 @@ async function OrdersContent({params, searchParams}: {params: Promise<{locale: s
283
323
  // "My Orders" subheading — with only one section there's no need
284
324
  // to duplicate the page title as a section heading.
285
325
  const companyOrders = canViewCompanyOrders
286
- ? await CompanyOrdersSection({activeCustomerId: activeCustomer.id, locale})
326
+ ? await CompanyOrdersSection({ activeCustomerId: activeCustomer.id, locale })
287
327
  : null;
288
328
  const myOrders = await MyOrdersSection({
289
329
  searchParams,
@@ -1,28 +1,31 @@
1
1
  'use server';
2
2
 
3
- import {client} from '@/lib/vendure/api';
3
+ import { client } from '@/lib/vendure/api';
4
4
  import {
5
- UpdateCustomerPasswordMutation,
6
- UpdateCustomerMutation,
7
5
  RequestUpdateCustomerEmailAddressMutation,
6
+ UpdateCustomerMutation,
7
+ UpdateCustomerPasswordMutation,
8
8
  } from '@/lib/vendure/mutations';
9
- import {revalidatePath, revalidateTag} from 'next/cache';
9
+ import { revalidatePath, revalidateTag } from 'next/cache';
10
10
 
11
- export async function updatePasswordAction(prevState: { error?: string; success?: boolean } | undefined, formData: FormData) {
11
+ export async function updatePasswordAction(
12
+ prevState: { error?: string; success?: boolean } | undefined,
13
+ formData: FormData,
14
+ ) {
12
15
  const currentPassword = formData.get('currentPassword') as string;
13
16
  const newPassword = formData.get('newPassword') as string;
14
17
  const confirmPassword = formData.get('confirmPassword') as string;
15
18
 
16
19
  if (!currentPassword || !newPassword || !confirmPassword) {
17
- return {error: 'All fields are required'};
20
+ return { error: 'All fields are required' };
18
21
  }
19
22
 
20
23
  if (newPassword !== confirmPassword) {
21
- return {error: 'New passwords do not match'};
24
+ return { error: 'New passwords do not match' };
22
25
  }
23
26
 
24
27
  if (currentPassword === newPassword) {
25
- return {error: 'New password must be different from current password'};
28
+ return { error: 'New password must be different from current password' };
26
29
  }
27
30
 
28
31
  const [result, error] = await client.mutate(UpdateCustomerPasswordMutation, {
@@ -31,24 +34,27 @@ export async function updatePasswordAction(prevState: { error?: string; success?
31
34
  });
32
35
 
33
36
  if (error) {
34
- return {error: 'An unexpected error occurred. Please try again.'};
37
+ return { error: 'An unexpected error occurred. Please try again.' };
35
38
  }
36
39
 
37
40
  const updateResult = result.data.updateCustomerPassword;
38
41
 
39
42
  if (updateResult.__typename !== 'Success') {
40
- return {error: updateResult.message};
43
+ return { error: updateResult.message };
41
44
  }
42
45
 
43
- return {success: true};
46
+ return { success: true };
44
47
  }
45
48
 
46
- export async function updateCustomerAction(prevState: { error?: string; success?: boolean } | undefined, formData: FormData) {
49
+ export async function updateCustomerAction(
50
+ prevState: { error?: string; success?: boolean } | undefined,
51
+ formData: FormData,
52
+ ) {
47
53
  const firstName = formData.get('firstName') as string;
48
54
  const lastName = formData.get('lastName') as string;
49
55
 
50
56
  if (!firstName || !lastName) {
51
- return {error: 'First name and last name are required'};
57
+ return { error: 'First name and last name are required' };
52
58
  }
53
59
 
54
60
  const [result, error] = await client.mutate(UpdateCustomerMutation, {
@@ -59,32 +65,35 @@ export async function updateCustomerAction(prevState: { error?: string; success?
59
65
  });
60
66
 
61
67
  if (error) {
62
- return {error: 'An unexpected error occurred. Please try again.'};
68
+ return { error: 'An unexpected error occurred. Please try again.' };
63
69
  }
64
70
 
65
71
  const updateResult = result.data.updateCustomer;
66
72
 
67
73
  if (!updateResult || !updateResult.id) {
68
- return {error: 'Failed to update customer information'};
74
+ return { error: 'Failed to update customer information' };
69
75
  }
70
76
 
71
- revalidateTag('active-customer', {expire: 0});
77
+ revalidateTag('active-customer', { expire: 0 });
72
78
  revalidatePath('/account/profile');
73
- return {success: true};
79
+ return { success: true };
74
80
  }
75
81
 
76
- export async function requestEmailUpdateAction(prevState: { error?: string; success?: boolean } | undefined, formData: FormData) {
82
+ export async function requestEmailUpdateAction(
83
+ prevState: { error?: string; success?: boolean } | undefined,
84
+ formData: FormData,
85
+ ) {
77
86
  const password = formData.get('password') as string;
78
87
  const newEmailAddress = formData.get('newEmailAddress') as string;
79
88
 
80
89
  if (!password || !newEmailAddress) {
81
- return {error: 'Password and new email address are required'};
90
+ return { error: 'Password and new email address are required' };
82
91
  }
83
92
 
84
93
  // Basic email validation
85
94
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
86
95
  if (!emailRegex.test(newEmailAddress)) {
87
- return {error: 'Please enter a valid email address'};
96
+ return { error: 'Please enter a valid email address' };
88
97
  }
89
98
 
90
99
  const [result, error] = await client.mutate(RequestUpdateCustomerEmailAddressMutation, {
@@ -93,14 +102,14 @@ export async function requestEmailUpdateAction(prevState: { error?: string; succ
93
102
  });
94
103
 
95
104
  if (error) {
96
- return {error: 'An unexpected error occurred. Please try again.'};
105
+ return { error: 'An unexpected error occurred. Please try again.' };
97
106
  }
98
107
 
99
108
  const updateResult = result.data.requestUpdateCustomerEmailAddress;
100
109
 
101
110
  if (updateResult.__typename !== 'Success') {
102
- return {error: updateResult.message};
111
+ return { error: updateResult.message };
103
112
  }
104
113
 
105
- return {success: true};
114
+ return { success: true };
106
115
  }