@vendure-platform/create 0.5.0 → 0.5.2
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.
- package/CHANGELOG.md +8 -0
- package/README.md +39 -39
- package/dist/add-to-existing.js +1 -1
- package/dist/assets/demo-data/initial-data.json +663 -663
- package/dist/assets/storefront/components.json +20 -20
- package/dist/assets/storefront/eslint.config.mjs +10 -10
- package/dist/assets/storefront/graphql.config.yml +1 -1
- package/dist/assets/storefront/next.config.ts +5 -4
- package/dist/assets/storefront/package.json +1 -1
- package/dist/assets/storefront/postcss.config.mjs +1 -1
- package/dist/assets/storefront/src/app/[locale]/(catalog)/catalog/page.tsx +17 -21
- package/dist/assets/storefront/src/app/[locale]/(catalog)/collection/[slug]/page.tsx +64 -42
- package/dist/assets/storefront/src/app/[locale]/(catalog)/layout.tsx +1 -5
- package/dist/assets/storefront/src/app/[locale]/(catalog)/product/[slug]/actions.ts +69 -65
- package/dist/assets/storefront/src/app/[locale]/(catalog)/product/[slug]/page.tsx +64 -38
- package/dist/assets/storefront/src/app/[locale]/(catalog)/search/page.tsx +24 -27
- package/dist/assets/storefront/src/app/[locale]/(catalog)/search/search-results.tsx +11 -9
- package/dist/assets/storefront/src/app/[locale]/(catalog)/search/search-term.tsx +4 -4
- package/dist/assets/storefront/src/app/[locale]/(scenario)/[...path]/page.tsx +1 -1
- package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/accept-invitation-client.tsx +8 -13
- package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/actions.ts +11 -14
- package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/page.tsx +30 -33
- package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/sign-out-and-retry.tsx +6 -6
- package/dist/assets/storefront/src/app/[locale]/account/addresses/actions.ts +30 -45
- package/dist/assets/storefront/src/app/[locale]/account/addresses/address-form.tsx +166 -159
- package/dist/assets/storefront/src/app/[locale]/account/addresses/addresses-client.tsx +35 -26
- package/dist/assets/storefront/src/app/[locale]/account/addresses/loading.tsx +1 -3
- package/dist/assets/storefront/src/app/[locale]/account/addresses/page.tsx +16 -18
- package/dist/assets/storefront/src/app/[locale]/account/approvals/actions.ts +5 -8
- package/dist/assets/storefront/src/app/[locale]/account/approvals/page.tsx +77 -69
- package/dist/assets/storefront/src/app/[locale]/account/company/actions.ts +10 -11
- package/dist/assets/storefront/src/app/[locale]/account/company/addresses/actions.ts +6 -15
- package/dist/assets/storefront/src/app/[locale]/account/company/addresses/address-form.tsx +57 -49
- package/dist/assets/storefront/src/app/[locale]/account/company/addresses/addresses-client.tsx +23 -25
- package/dist/assets/storefront/src/app/[locale]/account/company/addresses/page.tsx +30 -30
- package/dist/assets/storefront/src/app/[locale]/account/company/business-units/actions.ts +20 -29
- package/dist/assets/storefront/src/app/[locale]/account/company/business-units/business-unit-form.tsx +32 -37
- package/dist/assets/storefront/src/app/[locale]/account/company/business-units/business-units-client.tsx +32 -25
- package/dist/assets/storefront/src/app/[locale]/account/company/business-units/page.tsx +24 -24
- package/dist/assets/storefront/src/app/[locale]/account/company/business-units/types.ts +7 -4
- package/dist/assets/storefront/src/app/[locale]/account/company/edit-company-form.tsx +11 -21
- package/dist/assets/storefront/src/app/[locale]/account/company/page.tsx +23 -28
- package/dist/assets/storefront/src/app/[locale]/account/company/payment-methods/page.tsx +24 -24
- package/dist/assets/storefront/src/app/[locale]/account/company/payment-methods/payment-methods-client.tsx +5 -7
- package/dist/assets/storefront/src/app/[locale]/account/company/roles/page.tsx +22 -25
- package/dist/assets/storefront/src/app/[locale]/account/company/roles/roles-client.tsx +11 -26
- package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/actions.ts +6 -10
- package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/page.tsx +18 -16
- package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/tax-ids-client.tsx +74 -67
- package/dist/assets/storefront/src/app/[locale]/account/company/users/actions.ts +16 -25
- package/dist/assets/storefront/src/app/[locale]/account/company/users/edit-user-form.tsx +27 -25
- package/dist/assets/storefront/src/app/[locale]/account/company/users/invite-user-form.tsx +27 -19
- package/dist/assets/storefront/src/app/[locale]/account/company/users/page.tsx +32 -29
- package/dist/assets/storefront/src/app/[locale]/account/company/users/users-client.tsx +35 -38
- package/dist/assets/storefront/src/app/[locale]/account/error.tsx +1 -3
- package/dist/assets/storefront/src/app/[locale]/account/layout.tsx +16 -22
- package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/page.tsx +151 -103
- package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/reorder-actions.ts +6 -7
- package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/reorder-dialog.tsx +22 -48
- package/dist/assets/storefront/src/app/[locale]/account/orders/loading.tsx +8 -8
- package/dist/assets/storefront/src/app/[locale]/account/orders/page.tsx +101 -61
- package/dist/assets/storefront/src/app/[locale]/account/profile/actions.ts +32 -23
- package/dist/assets/storefront/src/app/[locale]/account/profile/change-password-form.tsx +6 -16
- package/dist/assets/storefront/src/app/[locale]/account/profile/edit-email-form.tsx +7 -17
- package/dist/assets/storefront/src/app/[locale]/account/profile/edit-profile-form.tsx +6 -16
- package/dist/assets/storefront/src/app/[locale]/account/profile/loading.tsx +12 -18
- package/dist/assets/storefront/src/app/[locale]/account/profile/page.tsx +15 -15
- package/dist/assets/storefront/src/app/[locale]/account/quick-order/file-upload-tab.tsx +2 -6
- package/dist/assets/storefront/src/app/[locale]/account/quick-order/manual-entry-tab.tsx +18 -15
- package/dist/assets/storefront/src/app/[locale]/account/quick-order/page.tsx +3 -6
- package/dist/assets/storefront/src/app/[locale]/account/quick-order/preview-table.tsx +10 -2
- package/dist/assets/storefront/src/app/[locale]/account/quick-order/save-to-list-dialog.tsx +24 -26
- package/dist/assets/storefront/src/app/[locale]/account/quick-order/sku-autocomplete.tsx +19 -10
- package/dist/assets/storefront/src/app/[locale]/account/quick-order/text-input-tab.tsx +3 -8
- package/dist/assets/storefront/src/app/[locale]/account/quotes/[id]/page.tsx +86 -59
- package/dist/assets/storefront/src/app/[locale]/account/quotes/actions.ts +38 -45
- package/dist/assets/storefront/src/app/[locale]/account/quotes/new/new-quote-form.tsx +3 -5
- package/dist/assets/storefront/src/app/[locale]/account/quotes/new/page.tsx +6 -6
- package/dist/assets/storefront/src/app/[locale]/account/quotes/page.tsx +92 -59
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/add-item-search.tsx +11 -9
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/add-member-form.tsx +31 -15
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/members-panel.tsx +52 -33
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/page.tsx +22 -14
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/[id]/rename-dialog.tsx +34 -13
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/actions.ts +117 -72
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/new/new-shared-cart-form.tsx +21 -14
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/new/page.tsx +10 -10
- package/dist/assets/storefront/src/app/[locale]/account/shared-carts/page.tsx +54 -41
- package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/[id]/page.tsx +22 -8
- package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/[id]/shopping-list-detail-client.tsx +62 -49
- package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/actions.ts +9 -4
- package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/create-shopping-list-form.tsx +5 -11
- package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/loading.tsx +1 -1
- package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/page.tsx +32 -42
- package/dist/assets/storefront/src/app/[locale]/account/store-credits/actions.ts +8 -8
- package/dist/assets/storefront/src/app/[locale]/account/store-credits/claim-form.tsx +6 -10
- package/dist/assets/storefront/src/app/[locale]/account/store-credits/page.tsx +76 -55
- package/dist/assets/storefront/src/app/[locale]/account/store-credits/reveal-code.tsx +10 -6
- package/dist/assets/storefront/src/app/[locale]/account/verify-email/page.tsx +32 -39
- package/dist/assets/storefront/src/app/[locale]/cart/actions.ts +29 -23
- package/dist/assets/storefront/src/app/[locale]/cart/cart-items.tsx +111 -40
- package/dist/assets/storefront/src/app/[locale]/cart/cart-line-actions.tsx +9 -9
- package/dist/assets/storefront/src/app/[locale]/cart/cart-quantity-control.tsx +61 -48
- package/dist/assets/storefront/src/app/[locale]/cart/cart-remove-button.tsx +15 -9
- package/dist/assets/storefront/src/app/[locale]/cart/cart.tsx +38 -41
- package/dist/assets/storefront/src/app/[locale]/cart/code-input.tsx +8 -8
- package/dist/assets/storefront/src/app/[locale]/cart/order-summary.tsx +50 -32
- package/dist/assets/storefront/src/app/[locale]/cart/page.tsx +11 -11
- package/dist/assets/storefront/src/app/[locale]/cart/promotion-code.tsx +48 -42
- package/dist/assets/storefront/src/app/[locale]/cart/reapproval-confirm.tsx +22 -20
- package/dist/assets/storefront/src/app/[locale]/cart/request-quote-button.tsx +7 -16
- package/dist/assets/storefront/src/app/[locale]/checkout/actions.ts +39 -65
- package/dist/assets/storefront/src/app/[locale]/checkout/cancel-quote-checkout-button.tsx +5 -5
- package/dist/assets/storefront/src/app/[locale]/checkout/checkout-flow.tsx +202 -202
- package/dist/assets/storefront/src/app/[locale]/checkout/checkout-provider.tsx +142 -142
- package/dist/assets/storefront/src/app/[locale]/checkout/order-summary.tsx +158 -139
- package/dist/assets/storefront/src/app/[locale]/checkout/page.tsx +56 -47
- package/dist/assets/storefront/src/app/[locale]/checkout/steps/delivery-step.tsx +86 -88
- package/dist/assets/storefront/src/app/[locale]/checkout/steps/payment-step.tsx +90 -91
- package/dist/assets/storefront/src/app/[locale]/checkout/steps/review-step.tsx +166 -161
- package/dist/assets/storefront/src/app/[locale]/checkout/steps/shipping-address-step.tsx +573 -494
- package/dist/assets/storefront/src/app/[locale]/error.tsx +3 -5
- package/dist/assets/storefront/src/app/[locale]/forgot-password/actions.ts +10 -7
- package/dist/assets/storefront/src/app/[locale]/forgot-password/forgot-password-form.tsx +10 -25
- package/dist/assets/storefront/src/app/[locale]/forgot-password/page.tsx +5 -5
- package/dist/assets/storefront/src/app/[locale]/globals.css +48 -48
- package/dist/assets/storefront/src/app/[locale]/layout.tsx +53 -47
- package/dist/assets/storefront/src/app/[locale]/not-found.tsx +3 -5
- package/dist/assets/storefront/src/app/[locale]/order-confirmation/[code]/order-confirmation.tsx +71 -44
- package/dist/assets/storefront/src/app/[locale]/order-confirmation/[code]/page.tsx +7 -5
- package/dist/assets/storefront/src/app/[locale]/page.tsx +33 -35
- package/dist/assets/storefront/src/app/[locale]/register/actions.ts +7 -7
- package/dist/assets/storefront/src/app/[locale]/register/page.tsx +22 -16
- package/dist/assets/storefront/src/app/[locale]/register/registration-form.tsx +22 -34
- package/dist/assets/storefront/src/app/[locale]/register-company/actions.ts +15 -19
- package/dist/assets/storefront/src/app/[locale]/register-company/page.tsx +17 -15
- package/dist/assets/storefront/src/app/[locale]/register-company/registration-form.tsx +9 -15
- package/dist/assets/storefront/src/app/[locale]/reset-password/actions.ts +7 -8
- package/dist/assets/storefront/src/app/[locale]/reset-password/page.tsx +18 -12
- package/dist/assets/storefront/src/app/[locale]/reset-password/reset-password-form.tsx +8 -16
- package/dist/assets/storefront/src/app/[locale]/shopping-list/[code]/add-to-cart-button.tsx +10 -4
- package/dist/assets/storefront/src/app/[locale]/shopping-list/[code]/page.tsx +62 -30
- package/dist/assets/storefront/src/app/[locale]/sign-in/actions.ts +14 -16
- package/dist/assets/storefront/src/app/[locale]/sign-in/login-form.tsx +17 -30
- package/dist/assets/storefront/src/app/[locale]/sign-in/page.tsx +35 -30
- package/dist/assets/storefront/src/app/[locale]/verify/actions.ts +8 -8
- package/dist/assets/storefront/src/app/[locale]/verify/page.tsx +18 -14
- package/dist/assets/storefront/src/app/[locale]/verify/verify-content.tsx +25 -27
- package/dist/assets/storefront/src/app/[locale]/verify-pending/page.tsx +23 -23
- package/dist/assets/storefront/src/app/api/clear-company-context/route.ts +6 -3
- package/dist/assets/storefront/src/app/api/revalidate/route.ts +19 -28
- package/dist/assets/storefront/src/app/api/search-analytics/route.ts +1 -1
- package/dist/assets/storefront/src/components/commerce/account-nav-items.ts +43 -18
- package/dist/assets/storefront/src/components/commerce/account-sidebar.tsx +30 -22
- package/dist/assets/storefront/src/components/commerce/active-filters.tsx +1 -1
- package/dist/assets/storefront/src/components/commerce/add-to-shared-cart.tsx +49 -27
- package/dist/assets/storefront/src/components/commerce/approval-decision-form.tsx +9 -13
- package/dist/assets/storefront/src/components/commerce/approval-status-badge.tsx +23 -15
- package/dist/assets/storefront/src/components/commerce/business-unit-switcher.tsx +11 -11
- package/dist/assets/storefront/src/components/commerce/catalog-search-bar.tsx +2 -2
- package/dist/assets/storefront/src/components/commerce/category-product-section.tsx +28 -16
- package/dist/assets/storefront/src/components/commerce/category-sidebar.tsx +31 -18
- package/dist/assets/storefront/src/components/commerce/collection-hero-banner.tsx +2 -4
- package/dist/assets/storefront/src/components/commerce/company-state-badge.tsx +10 -16
- package/dist/assets/storefront/src/components/commerce/company-switcher.tsx +12 -12
- package/dist/assets/storefront/src/components/commerce/configurator-form.tsx +188 -79
- package/dist/assets/storefront/src/components/commerce/facet-filters.tsx +29 -49
- package/dist/assets/storefront/src/components/commerce/gift-card-pdp.tsx +4 -4
- package/dist/assets/storefront/src/components/commerce/gift-card-product-info.tsx +20 -30
- package/dist/assets/storefront/src/components/commerce/instant-search-dropdown.tsx +258 -227
- package/dist/assets/storefront/src/components/commerce/order-status-badge.tsx +27 -19
- package/dist/assets/storefront/src/components/commerce/packaging-unit-selector.tsx +27 -26
- package/dist/assets/storefront/src/components/commerce/permission-gate.tsx +4 -4
- package/dist/assets/storefront/src/components/commerce/price-range-filter.tsx +5 -5
- package/dist/assets/storefront/src/components/commerce/price-tiers.tsx +38 -21
- package/dist/assets/storefront/src/components/commerce/price.tsx +3 -3
- package/dist/assets/storefront/src/components/commerce/product-card-list.tsx +35 -14
- package/dist/assets/storefront/src/components/commerce/product-card.tsx +31 -16
- package/dist/assets/storefront/src/components/commerce/product-carousel.tsx +20 -12
- package/dist/assets/storefront/src/components/commerce/product-grid.tsx +14 -13
- package/dist/assets/storefront/src/components/commerce/product-image-carousel.tsx +10 -8
- package/dist/assets/storefront/src/components/commerce/product-info.tsx +118 -74
- package/dist/assets/storefront/src/components/commerce/product-list-expansion.tsx +102 -74
- package/dist/assets/storefront/src/components/commerce/product-list-view.tsx +1 -1
- package/dist/assets/storefront/src/components/commerce/product-sidebar.tsx +36 -11
- package/dist/assets/storefront/src/components/commerce/product-view-switcher.tsx +33 -21
- package/dist/assets/storefront/src/components/commerce/quote-action-buttons.tsx +54 -36
- package/dist/assets/storefront/src/components/commerce/quote-activity-timeline.tsx +126 -50
- package/dist/assets/storefront/src/components/commerce/quote-comment-form.tsx +9 -13
- package/dist/assets/storefront/src/components/commerce/quote-csv-export-button.tsx +6 -6
- package/dist/assets/storefront/src/components/commerce/quote-product-search.tsx +22 -18
- package/dist/assets/storefront/src/components/commerce/quote-request-form.tsx +28 -27
- package/dist/assets/storefront/src/components/commerce/quote-status-badge.tsx +26 -18
- package/dist/assets/storefront/src/components/commerce/quote-validity-indicator.tsx +7 -7
- package/dist/assets/storefront/src/components/commerce/quote-version-comparison.tsx +50 -30
- package/dist/assets/storefront/src/components/commerce/related-products.tsx +37 -28
- package/dist/assets/storefront/src/components/commerce/shared-cart-status-badge.tsx +12 -8
- package/dist/assets/storefront/src/components/commerce/shop-by-category.tsx +8 -7
- package/dist/assets/storefront/src/components/commerce/shopping-list-toggle.tsx +14 -20
- package/dist/assets/storefront/src/components/commerce/sort-dropdown.tsx +9 -16
- package/dist/assets/storefront/src/components/commerce/store-credit-summary.tsx +30 -32
- package/dist/assets/storefront/src/components/commerce/subcollection-tiles.tsx +11 -13
- package/dist/assets/storefront/src/components/layout/auth-page-shell.tsx +2 -2
- package/dist/assets/storefront/src/components/layout/draft-mode-indicator.tsx +2 -7
- package/dist/assets/storefront/src/components/layout/draft-mode-link.tsx +4 -2
- package/dist/assets/storefront/src/components/layout/footer.tsx +70 -28
- package/dist/assets/storefront/src/components/layout/navbar/actions.ts +9 -12
- package/dist/assets/storefront/src/components/layout/navbar/cart-icon.tsx +9 -9
- package/dist/assets/storefront/src/components/layout/navbar/channel-picker-wrapper.tsx +4 -9
- package/dist/assets/storefront/src/components/layout/navbar/channel-picker.tsx +13 -8
- package/dist/assets/storefront/src/components/layout/navbar/currency-picker-wrapper.tsx +4 -4
- package/dist/assets/storefront/src/components/layout/navbar/currency-picker.tsx +11 -6
- package/dist/assets/storefront/src/components/layout/navbar/language-picker.tsx +7 -7
- package/dist/assets/storefront/src/components/layout/navbar/login-button.tsx +24 -21
- package/dist/assets/storefront/src/components/layout/navbar/mobile-nav.tsx +8 -8
- package/dist/assets/storefront/src/components/layout/navbar/nav-menu-items.tsx +4 -6
- package/dist/assets/storefront/src/components/layout/navbar/navbar-cart.tsx +1 -1
- package/dist/assets/storefront/src/components/layout/navbar/navbar-collections.tsx +41 -42
- package/dist/assets/storefront/src/components/layout/navbar/navbar-link.tsx +7 -10
- package/dist/assets/storefront/src/components/layout/navbar/navbar-user.tsx +18 -23
- package/dist/assets/storefront/src/components/layout/navbar/theme-switcher.tsx +9 -9
- package/dist/assets/storefront/src/components/layout/navbar.tsx +36 -31
- package/dist/assets/storefront/src/components/layout/search-input.tsx +35 -32
- package/dist/assets/storefront/src/components/providers/awaiting-approval-banner.tsx +12 -10
- package/dist/assets/storefront/src/components/providers/cart-count-server.tsx +14 -12
- package/dist/assets/storefront/src/components/providers/company-context-guard.tsx +4 -4
- package/dist/assets/storefront/src/components/providers/company-permissions-server.tsx +2 -6
- package/dist/assets/storefront/src/components/providers/theme-provider.tsx +3 -3
- package/dist/assets/storefront/src/components/shared/breadcrumbs.tsx +4 -1
- package/dist/assets/storefront/src/components/shared/country-select.tsx +63 -67
- package/dist/assets/storefront/src/components/shared/pagination.tsx +15 -28
- package/dist/assets/storefront/src/components/shared/prefetch-link.tsx +1 -1
- package/dist/assets/storefront/src/components/shared/skeletons/search-input-skeleton.tsx +1 -3
- package/dist/assets/storefront/src/components/ui/accordion.tsx +46 -51
- package/dist/assets/storefront/src/components/ui/alert-dialog.tsx +94 -121
- package/dist/assets/storefront/src/components/ui/alert.tsx +48 -54
- package/dist/assets/storefront/src/components/ui/aspect-ratio.tsx +5 -7
- package/dist/assets/storefront/src/components/ui/avatar.tsx +29 -44
- package/dist/assets/storefront/src/components/ui/badge.tsx +28 -37
- package/dist/assets/storefront/src/components/ui/breadcrumb.tsx +82 -89
- package/dist/assets/storefront/src/components/ui/button.tsx +43 -49
- package/dist/assets/storefront/src/components/ui/calendar.tsx +157 -198
- package/dist/assets/storefront/src/components/ui/card.tsx +53 -76
- package/dist/assets/storefront/src/components/ui/carousel.tsx +194 -212
- package/dist/assets/storefront/src/components/ui/chart.tsx +274 -317
- package/dist/assets/storefront/src/components/ui/checkbox.tsx +24 -27
- package/dist/assets/storefront/src/components/ui/collapsible.tsx +9 -21
- package/dist/assets/storefront/src/components/ui/command.tsx +114 -159
- package/dist/assets/storefront/src/components/ui/context-menu.tsx +167 -199
- package/dist/assets/storefront/src/components/ui/dialog.tsx +97 -114
- package/dist/assets/storefront/src/components/ui/drawer.tsx +93 -107
- package/dist/assets/storefront/src/components/ui/dropdown-menu.tsx +171 -206
- package/dist/assets/storefront/src/components/ui/empty-state.tsx +5 -5
- package/dist/assets/storefront/src/components/ui/field.tsx +196 -208
- package/dist/assets/storefront/src/components/ui/form.tsx +115 -139
- package/dist/assets/storefront/src/components/ui/hover-card.tsx +27 -33
- package/dist/assets/storefront/src/components/ui/input-otp.tsx +50 -59
- package/dist/assets/storefront/src/components/ui/input.tsx +17 -17
- package/dist/assets/storefront/src/components/ui/kbd-shortcut.tsx +3 -1
- package/dist/assets/storefront/src/components/ui/label.tsx +16 -19
- package/dist/assets/storefront/src/components/ui/menubar.tsx +193 -223
- package/dist/assets/storefront/src/components/ui/navigation-menu.tsx +123 -130
- package/dist/assets/storefront/src/components/ui/pagination.tsx +87 -108
- package/dist/assets/storefront/src/components/ui/popover.tsx +29 -35
- package/dist/assets/storefront/src/components/ui/progress.tsx +19 -26
- package/dist/assets/storefront/src/components/ui/radio-group.tsx +32 -38
- package/dist/assets/storefront/src/components/ui/resizable.tsx +37 -42
- package/dist/assets/storefront/src/components/ui/scroll-area.tsx +41 -47
- package/dist/assets/storefront/src/components/ui/select.tsx +130 -152
- package/dist/assets/storefront/src/components/ui/separator.tsx +21 -21
- package/dist/assets/storefront/src/components/ui/sheet.tsx +90 -111
- package/dist/assets/storefront/src/components/ui/sidebar.tsx +611 -649
- package/dist/assets/storefront/src/components/ui/skeleton.tsx +10 -10
- package/dist/assets/storefront/src/components/ui/slider.tsx +50 -55
- package/dist/assets/storefront/src/components/ui/sonner.tsx +20 -20
- package/dist/assets/storefront/src/components/ui/switch.tsx +23 -26
- package/dist/assets/storefront/src/components/ui/table.tsx +65 -97
- package/dist/assets/storefront/src/components/ui/tabs.tsx +39 -55
- package/dist/assets/storefront/src/components/ui/textarea.tsx +14 -14
- package/dist/assets/storefront/src/components/ui/toggle-group.tsx +56 -62
- package/dist/assets/storefront/src/components/ui/toggle.tsx +37 -38
- package/dist/assets/storefront/src/components/ui/tooltip.tsx +38 -46
- package/dist/assets/storefront/src/config/scenario-meta.ts +2 -2
- package/dist/assets/storefront/src/config/scenario.ts +14 -16
- package/dist/assets/storefront/src/contexts/auth-context.tsx +5 -6
- package/dist/assets/storefront/src/graphql.ts +5 -5
- package/dist/assets/storefront/src/hooks/use-mobile.ts +13 -13
- package/dist/assets/storefront/src/i18n/locale-utils.ts +3 -3
- package/dist/assets/storefront/src/i18n/navigation.ts +4 -4
- package/dist/assets/storefront/src/i18n/request.ts +4 -4
- package/dist/assets/storefront/src/i18n/routing.ts +5 -5
- package/dist/assets/storefront/src/i18n/server.ts +3 -3
- package/dist/assets/storefront/src/lib/actions/switch-channel.ts +9 -9
- package/dist/assets/storefront/src/lib/actions/switch-currency.ts +7 -7
- package/dist/assets/storefront/src/lib/auth.ts +1 -1
- package/dist/assets/storefront/src/lib/backend-health.ts +3 -3
- package/dist/assets/storefront/src/lib/cart-count-context.tsx +10 -4
- package/dist/assets/storefront/src/lib/cart-guard-utils.ts +2 -1
- package/dist/assets/storefront/src/lib/cart-guard.ts +7 -6
- package/dist/assets/storefront/src/lib/channel-server.ts +4 -4
- package/dist/assets/storefront/src/lib/company-context.ts +1 -1
- package/dist/assets/storefront/src/lib/company-permissions-context.tsx +1 -5
- package/dist/assets/storefront/src/lib/currency-server.ts +4 -4
- package/dist/assets/storefront/src/lib/format.ts +16 -7
- package/dist/assets/storefront/src/lib/metadata.ts +39 -44
- package/dist/assets/storefront/src/lib/quantity.ts +2 -4
- package/dist/assets/storefront/src/lib/search-bar-context.tsx +7 -4
- package/dist/assets/storefront/src/lib/use-recent-searches.ts +8 -6
- package/dist/assets/storefront/src/lib/utils.ts +3 -3
- package/dist/assets/storefront/src/lib/vendure/actions.ts +18 -16
- package/dist/assets/storefront/src/lib/vendure/api.ts +36 -23
- package/dist/assets/storefront/src/lib/vendure/approval-utils.ts +9 -8
- package/dist/assets/storefront/src/lib/vendure/cached.ts +20 -15
- package/dist/assets/storefront/src/lib/vendure/queries.ts +15 -5
- package/dist/assets/storefront/src/middleware.ts +1 -1
- package/dist/assets/storefront/src/scenarios/customer/hero.tsx +2 -2
- package/dist/assets/storefront/src/scenarios/customer/meta.ts +1 -1
- package/dist/bin/run.js +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +1 -1
- package/dist/scaffold-storefront-only.js +1 -1
- package/dist/scaffolder.js +1 -1
- package/dist/template-renderer.js +1 -1
- 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
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
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 {
|
|
2
|
-
import {
|
|
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
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
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 {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
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 {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
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({
|
|
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"
|
|
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
|
|
92
|
+
<TableCell>
|
|
93
|
+
<OrderStatusBadge state={order.state} />
|
|
94
|
+
</TableCell>
|
|
82
95
|
<TableCell className="text-right">
|
|
83
|
-
<Price
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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 (
|
|
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
|
|
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={
|
|
195
|
-
|
|
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({
|
|
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
|
-
|
|
211
|
-
|
|
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: {
|
|
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
|
|
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({
|
|
269
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
}
|