From 2e62e4b0ebbcd211b22bdd110db2457bd42f6b8b Mon Sep 17 00:00:00 2001 From: Danel Kungla Date: Mon, 7 Jul 2025 13:46:22 +0300 Subject: [PATCH] move selfservice tables to medreport schema add base medusa store frontend --- .env | 5 +- .env.example | 4 +- README.md | 8 + .../(checkout)/checkout/page.tsx | 30 + app/store/[countryCode]/(checkout)/layout.tsx | 45 + .../[countryCode]/(checkout)/not-found.tsx | 20 + .../account/@dashboard/addresses/page.tsx | 38 + .../(main)/account/@dashboard/loading.tsx | 9 + .../@dashboard/orders/details/[id]/page.tsx | 35 + .../(main)/account/@dashboard/orders/page.tsx | 38 + .../(main)/account/@dashboard/page.tsx | 23 + .../account/@dashboard/profile/page.tsx | 54 + .../(main)/account/@login/page.tsx | 12 + .../[countryCode]/(main)/account/layout.tsx | 21 + .../[countryCode]/(main)/account/loading.tsx | 9 + .../[countryCode]/(main)/cart/loading.tsx | 5 + .../[countryCode]/(main)/cart/not-found.tsx | 21 + app/store/[countryCode]/(main)/cart/page.tsx | 23 + .../(main)/categories/[...category]/page.tsx | 90 + .../(main)/collections/[handle]/page.tsx | 95 + app/store/[countryCode]/(main)/layout.tsx | 46 + app/store/[countryCode]/(main)/not-found.tsx | 20 + .../(main)/order/[id]/confirmed/loading.tsx | 5 + .../(main)/order/[id]/confirmed/page.tsx | 25 + .../[id]/transfer/[token]/accept/page.tsx | 42 + .../[id]/transfer/[token]/decline/page.tsx | 42 + .../order/[id]/transfer/[token]/page.tsx | 39 + app/store/[countryCode]/(main)/page.tsx | 40 + .../(main)/products/[handle]/page.tsx | 108 + app/store/[countryCode]/(main)/store/page.tsx | 33 + app/store/not-found.tsx | 29 + app/store/opengraph-image.jpg | Bin 0 -> 234193 bytes app/store/twitter-image.jpg | Bin 0 -> 234193 bytes package.json | 6 + packages/billing/core/package.json | 3 +- packages/billing/gateway/package.json | 3 +- packages/billing/lemon-squeezy/package.json | 3 +- packages/billing/stripe/package.json | 3 +- packages/cms/keystatic/package.json | 3 +- packages/database-webhooks/package.json | 3 +- packages/features/accounts/package.json | 3 +- packages/features/admin/package.json | 3 +- packages/features/auth/package.json | 3 +- packages/features/medusa-storefront/README.md | 125 + .../medusa-storefront/check-env-variables.js | 39 + .../features/medusa-storefront/package.json | 60 + .../medusa-storefront/src/lib/config.ts | 14 + .../medusa-storefront/src/lib/constants.tsx | 68 + .../src/lib/context/modal-context.tsx | 34 + .../medusa-storefront/src/lib/data/cart.ts | 472 + .../src/lib/data/categories.ts | 49 + .../src/lib/data/collections.ts | 59 + .../medusa-storefront/src/lib/data/cookies.ts | 89 + .../src/lib/data/customer.ts | 261 + .../src/lib/data/fulfillment.ts | 70 + .../medusa-storefront/src/lib/data/index.ts | 11 + .../src/lib/data/onboarding.ts | 9 + .../medusa-storefront/src/lib/data/orders.ts | 112 + .../medusa-storefront/src/lib/data/payment.ts | 35 + .../src/lib/data/products.ts | 136 + .../medusa-storefront/src/lib/data/regions.ts | 66 + .../src/lib/hooks/use-in-view.tsx | 29 + .../src/lib/hooks/use-toggle-state.tsx | 46 + .../src/lib/util/compare-addresses.ts | 28 + .../medusa-storefront/src/lib/util/env.ts | 3 + .../src/lib/util/get-precentage-diff.ts | 6 + .../src/lib/util/get-product-price.ts | 79 + .../medusa-storefront/src/lib/util/index.ts | 10 + .../medusa-storefront/src/lib/util/isEmpty.ts | 11 + .../src/lib/util/medusa-error.ts | 22 + .../medusa-storefront/src/lib/util/money.ts | 26 + .../medusa-storefront/src/lib/util/product.ts | 5 + .../medusa-storefront/src/lib/util/repeat.ts | 5 + .../src/lib/util/sort-products.ts | 50 + .../medusa-storefront/src/middleware.ts | 160 + .../account/components/account-info/index.tsx | 139 + .../account/components/account-nav/index.tsx | 199 + .../account/components/address-book/index.tsx | 28 + .../components/address-card/add-address.tsx | 167 + .../address-card/edit-address-modal.tsx | 239 + .../src/modules/account/components/index.ts | 55 + .../account/components/login/index.tsx | 64 + .../account/components/order-card/index.tsx | 87 + .../components/order-overview/index.tsx | 45 + .../account/components/overview/index.tsx | 168 + .../profile-billing-address/index.tsx | 182 + .../components/profile-email/index.tsx | 75 + .../account/components/profile-name/index.tsx | 79 + .../components/profile-password/index.tsx | 70 + .../components/profile-phone/index.tsx | 74 + .../account/components/register/index.tsx | 106 + .../transfer-request-form/index.tsx | 81 + .../account/templates/account-layout.tsx | 43 + .../src/modules/account/templates/index.ts | 7 + .../account/templates/login-template.tsx | 25 + .../components/cart-item-select/index.tsx | 73 + .../components/empty-cart-message/index.tsx | 25 + .../modules/cart/components/item/index.tsx | 144 + .../cart/components/sign-in-prompt/index.tsx | 26 + .../src/modules/cart/templates/index.tsx | 51 + .../src/modules/cart/templates/items.tsx | 57 + .../src/modules/cart/templates/preview.tsx | 51 + .../src/modules/cart/templates/summary.tsx | 48 + .../modules/categories/templates/index.tsx | 97 + .../components/address-select/index.tsx | 116 + .../checkout/components/addresses/index.tsx | 184 + .../components/billing_address/index.tsx | 114 + .../components/country-select/index.tsx | 50 + .../components/discount-code/index.tsx | 175 + .../components/error-message/index.tsx | 13 + .../components/payment-button/index.tsx | 193 + .../components/payment-container/index.tsx | 129 + .../components/payment-test/index.tsx | 12 + .../components/payment-wrapper/index.tsx | 41 + .../payment-wrapper/stripe-wrapper.tsx | 54 + .../checkout/components/payment/index.tsx | 261 + .../checkout/components/review/index.tsx | 55 + .../components/shipping-address/index.tsx | 219 + .../checkout/components/shipping/index.tsx | 400 + .../components/submit-button/index.tsx | 32 + .../templates/checkout-form/index.tsx | 38 + .../templates/checkout-summary/index.tsx | 30 + .../modules/collections/templates/index.tsx | 47 + .../common/components/cart-totals/index.tsx | 96 + .../common/components/checkbox/index.tsx | 43 + .../common/components/delete-button/index.tsx | 42 + .../common/components/divider/index.tsx | 9 + .../components/filter-radio-group/index.tsx | 60 + .../src/modules/common/components/index.ts | 55 + .../modules/common/components/input/index.tsx | 76 + .../components/interactive-link/index.tsx | 33 + .../components/line-item-options/index.tsx | 26 + .../components/line-item-price/index.tsx | 64 + .../components/line-item-unit-price/index.tsx | 61 + .../localized-client-link/index.tsx | 32 + .../modules/common/components/modal/index.tsx | 118 + .../common/components/native-select/index.tsx | 74 + .../modules/common/components/radio/index.tsx | 27 + .../src/modules/common/icons/back.tsx | 37 + .../src/modules/common/icons/bancontact.tsx | 26 + .../src/modules/common/icons/chevron-down.tsx | 29 + .../src/modules/common/icons/eye-off.tsx | 37 + .../src/modules/common/icons/eye.tsx | 37 + .../modules/common/icons/fast-delivery.tsx | 65 + .../src/modules/common/icons/ideal.tsx | 26 + .../src/modules/common/icons/index.ts | 71 + .../src/modules/common/icons/map-pin.tsx | 37 + .../src/modules/common/icons/medusa.tsx | 27 + .../src/modules/common/icons/nextjs.tsx | 27 + .../src/modules/common/icons/package.tsx | 44 + .../src/modules/common/icons/paypal.tsx | 30 + .../common/icons/placeholder-image.tsx | 44 + .../src/modules/common/icons/refresh.tsx | 51 + .../src/modules/common/icons/spinner.tsx | 37 + .../src/modules/common/icons/trash.tsx | 51 + .../src/modules/common/icons/user.tsx | 37 + .../src/modules/common/icons/x.tsx | 37 + .../components/featured-products/index.tsx | 16 + .../featured-products/product-rail/index.tsx | 47 + .../modules/home/components/hero/index.tsx | 36 + .../layout/components/cart-button/index.tsx | 8 + .../layout/components/cart-dropdown/index.tsx | 230 + .../components/cart-mismatch-banner/index.tsx | 57 + .../components/country-select/index.tsx | 135 + .../src/modules/layout/components/index.ts | 23 + .../layout/components/medusa-cta/index.tsx | 21 + .../layout/components/side-menu/index.tsx | 108 + .../modules/layout/templates/footer/index.tsx | 157 + .../src/modules/layout/templates/index.tsx | 18 + .../modules/layout/templates/nav/index.tsx | 60 + .../modules/order/components/help/index.tsx | 25 + .../modules/order/components/item/index.tsx | 57 + .../modules/order/components/items/index.tsx | 44 + .../order/components/onboarding-cta/index.tsx | 28 + .../order/components/order-details/index.tsx | 63 + .../order/components/order-summary/index.tsx | 60 + .../components/payment-details/index.tsx | 63 + .../components/shipping-details/index.tsx | 75 + .../components/transfer-actions/index.tsx | 81 + .../order/components/transfer-image/index.tsx | 275 + .../templates/order-completed-template.tsx | 52 + .../templates/order-details-template.tsx | 46 + .../components/image-gallery/index.tsx | 41 + .../components/product-actions/index.tsx | 177 + .../product-actions/mobile-actions.tsx | 203 + .../product-actions/option-select.tsx | 56 + .../product-onboarding-cta/index.tsx | 30 + .../components/product-preview/index.tsx | 51 + .../components/product-preview/price.tsx | 29 + .../components/product-price/index.tsx | 58 + .../components/product-tabs/accordion.tsx | 100 + .../components/product-tabs/index.tsx | 121 + .../components/related-products/index.tsx | 69 + .../products/components/thumbnail/index.tsx | 70 + .../src/modules/products/templates/index.tsx | 69 + .../product-actions-wrapper/index.tsx | 25 + .../products/templates/product-info/index.tsx | 40 + .../free-shipping-price-nudge/index.tsx | 283 + .../components/skeleton-button/index.tsx | 5 + .../skeleton-card-details/index.tsx | 10 + .../components/skeleton-cart-item/index.tsx | 35 + .../components/skeleton-cart-totals/index.tsx | 30 + .../components/skeleton-code-form/index.tsx | 13 + .../components/skeleton-line-item/index.tsx | 35 + .../skeleton-order-confirmed-header/index.tsx | 14 + .../skeleton-order-information/index.tsx | 36 + .../components/skeleton-order-items/index.tsx | 43 + .../skeleton-order-summary/index.tsx | 15 + .../skeleton-product-preview/index.tsx | 15 + .../templates/skeleton-cart-page/index.tsx | 65 + .../skeleton-order-confirmed/index.tsx | 21 + .../templates/skeleton-product-grid/index.tsx | 23 + .../skeleton-related-products/index.tsx | 25 + .../store/components/pagination/index.tsx | 114 + .../components/refinement-list/index.tsx | 41 + .../refinement-list/sort-products/index.tsx | 48 + .../src/modules/store/templates/index.tsx | 43 + .../store/templates/paginated-products.tsx | 92 + .../medusa-storefront/src/styles/globals.css | 112 + .../medusa-storefront/src/types/global.ts | 24 + .../medusa-storefront/src/types/icon.ts | 4 + .../features/medusa-storefront/tsconfig.json | 15 + packages/features/team-accounts/package.json | 3 +- packages/mailers/core/package.json | 3 +- packages/mailers/nodemailer/package.json | 3 +- packages/mailers/resend/package.json | 3 +- packages/mailers/shared/package.json | 3 +- packages/monitoring/api/package.json | 3 +- packages/monitoring/baselime/package.json | 3 +- packages/next/package.json | 3 +- packages/otp/package.json | 5 +- packages/supabase/package.json | 3 +- packages/ui/package.json | 3 +- pnpm-lock.yaml | 15023 +++++++++++++++- supabase/config.toml | 4 +- .../20250703145757_add_medreport_schema.sql | 5556 ++++++ tsconfig.json | 7 +- 237 files changed, 33991 insertions(+), 189 deletions(-) create mode 100644 app/store/[countryCode]/(checkout)/checkout/page.tsx create mode 100644 app/store/[countryCode]/(checkout)/layout.tsx create mode 100644 app/store/[countryCode]/(checkout)/not-found.tsx create mode 100644 app/store/[countryCode]/(main)/account/@dashboard/addresses/page.tsx create mode 100644 app/store/[countryCode]/(main)/account/@dashboard/loading.tsx create mode 100644 app/store/[countryCode]/(main)/account/@dashboard/orders/details/[id]/page.tsx create mode 100644 app/store/[countryCode]/(main)/account/@dashboard/orders/page.tsx create mode 100644 app/store/[countryCode]/(main)/account/@dashboard/page.tsx create mode 100644 app/store/[countryCode]/(main)/account/@dashboard/profile/page.tsx create mode 100644 app/store/[countryCode]/(main)/account/@login/page.tsx create mode 100644 app/store/[countryCode]/(main)/account/layout.tsx create mode 100644 app/store/[countryCode]/(main)/account/loading.tsx create mode 100644 app/store/[countryCode]/(main)/cart/loading.tsx create mode 100644 app/store/[countryCode]/(main)/cart/not-found.tsx create mode 100644 app/store/[countryCode]/(main)/cart/page.tsx create mode 100644 app/store/[countryCode]/(main)/categories/[...category]/page.tsx create mode 100644 app/store/[countryCode]/(main)/collections/[handle]/page.tsx create mode 100644 app/store/[countryCode]/(main)/layout.tsx create mode 100644 app/store/[countryCode]/(main)/not-found.tsx create mode 100644 app/store/[countryCode]/(main)/order/[id]/confirmed/loading.tsx create mode 100644 app/store/[countryCode]/(main)/order/[id]/confirmed/page.tsx create mode 100644 app/store/[countryCode]/(main)/order/[id]/transfer/[token]/accept/page.tsx create mode 100644 app/store/[countryCode]/(main)/order/[id]/transfer/[token]/decline/page.tsx create mode 100644 app/store/[countryCode]/(main)/order/[id]/transfer/[token]/page.tsx create mode 100644 app/store/[countryCode]/(main)/page.tsx create mode 100644 app/store/[countryCode]/(main)/products/[handle]/page.tsx create mode 100644 app/store/[countryCode]/(main)/store/page.tsx create mode 100644 app/store/not-found.tsx create mode 100644 app/store/opengraph-image.jpg create mode 100644 app/store/twitter-image.jpg create mode 100644 packages/features/medusa-storefront/README.md create mode 100644 packages/features/medusa-storefront/check-env-variables.js create mode 100644 packages/features/medusa-storefront/package.json create mode 100644 packages/features/medusa-storefront/src/lib/config.ts create mode 100644 packages/features/medusa-storefront/src/lib/constants.tsx create mode 100644 packages/features/medusa-storefront/src/lib/context/modal-context.tsx create mode 100644 packages/features/medusa-storefront/src/lib/data/cart.ts create mode 100644 packages/features/medusa-storefront/src/lib/data/categories.ts create mode 100644 packages/features/medusa-storefront/src/lib/data/collections.ts create mode 100644 packages/features/medusa-storefront/src/lib/data/cookies.ts create mode 100644 packages/features/medusa-storefront/src/lib/data/customer.ts create mode 100644 packages/features/medusa-storefront/src/lib/data/fulfillment.ts create mode 100644 packages/features/medusa-storefront/src/lib/data/index.ts create mode 100644 packages/features/medusa-storefront/src/lib/data/onboarding.ts create mode 100644 packages/features/medusa-storefront/src/lib/data/orders.ts create mode 100644 packages/features/medusa-storefront/src/lib/data/payment.ts create mode 100644 packages/features/medusa-storefront/src/lib/data/products.ts create mode 100644 packages/features/medusa-storefront/src/lib/data/regions.ts create mode 100644 packages/features/medusa-storefront/src/lib/hooks/use-in-view.tsx create mode 100644 packages/features/medusa-storefront/src/lib/hooks/use-toggle-state.tsx create mode 100644 packages/features/medusa-storefront/src/lib/util/compare-addresses.ts create mode 100644 packages/features/medusa-storefront/src/lib/util/env.ts create mode 100644 packages/features/medusa-storefront/src/lib/util/get-precentage-diff.ts create mode 100644 packages/features/medusa-storefront/src/lib/util/get-product-price.ts create mode 100644 packages/features/medusa-storefront/src/lib/util/index.ts create mode 100644 packages/features/medusa-storefront/src/lib/util/isEmpty.ts create mode 100644 packages/features/medusa-storefront/src/lib/util/medusa-error.ts create mode 100644 packages/features/medusa-storefront/src/lib/util/money.ts create mode 100644 packages/features/medusa-storefront/src/lib/util/product.ts create mode 100644 packages/features/medusa-storefront/src/lib/util/repeat.ts create mode 100644 packages/features/medusa-storefront/src/lib/util/sort-products.ts create mode 100644 packages/features/medusa-storefront/src/middleware.ts create mode 100644 packages/features/medusa-storefront/src/modules/account/components/account-info/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/account/components/account-nav/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/account/components/address-book/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/account/components/address-card/add-address.tsx create mode 100644 packages/features/medusa-storefront/src/modules/account/components/address-card/edit-address-modal.tsx create mode 100644 packages/features/medusa-storefront/src/modules/account/components/index.ts create mode 100644 packages/features/medusa-storefront/src/modules/account/components/login/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/account/components/order-card/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/account/components/order-overview/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/account/components/overview/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/account/components/profile-billing-address/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/account/components/profile-email/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/account/components/profile-name/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/account/components/profile-password/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/account/components/profile-phone/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/account/components/register/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/account/components/transfer-request-form/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/account/templates/account-layout.tsx create mode 100644 packages/features/medusa-storefront/src/modules/account/templates/index.ts create mode 100644 packages/features/medusa-storefront/src/modules/account/templates/login-template.tsx create mode 100644 packages/features/medusa-storefront/src/modules/cart/components/cart-item-select/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/cart/components/empty-cart-message/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/cart/components/item/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/cart/components/sign-in-prompt/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/cart/templates/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/cart/templates/items.tsx create mode 100644 packages/features/medusa-storefront/src/modules/cart/templates/preview.tsx create mode 100644 packages/features/medusa-storefront/src/modules/cart/templates/summary.tsx create mode 100644 packages/features/medusa-storefront/src/modules/categories/templates/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/components/address-select/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/components/addresses/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/components/billing_address/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/components/country-select/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/components/discount-code/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/components/error-message/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/components/payment-button/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/components/payment-container/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/components/payment-test/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/components/payment-wrapper/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/components/payment-wrapper/stripe-wrapper.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/components/payment/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/components/review/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/components/shipping-address/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/components/shipping/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/components/submit-button/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/templates/checkout-form/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/checkout/templates/checkout-summary/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/collections/templates/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/components/cart-totals/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/components/checkbox/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/components/delete-button/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/components/divider/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/components/filter-radio-group/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/components/index.ts create mode 100644 packages/features/medusa-storefront/src/modules/common/components/input/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/components/interactive-link/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/components/line-item-options/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/components/line-item-price/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/components/line-item-unit-price/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/components/localized-client-link/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/components/modal/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/components/native-select/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/components/radio/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/back.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/bancontact.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/chevron-down.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/eye-off.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/eye.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/fast-delivery.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/ideal.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/index.ts create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/map-pin.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/medusa.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/nextjs.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/package.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/paypal.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/placeholder-image.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/refresh.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/spinner.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/trash.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/user.tsx create mode 100644 packages/features/medusa-storefront/src/modules/common/icons/x.tsx create mode 100644 packages/features/medusa-storefront/src/modules/home/components/featured-products/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/home/components/featured-products/product-rail/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/home/components/hero/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/layout/components/cart-button/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/layout/components/cart-dropdown/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/layout/components/cart-mismatch-banner/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/layout/components/country-select/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/layout/components/index.ts create mode 100644 packages/features/medusa-storefront/src/modules/layout/components/medusa-cta/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/layout/components/side-menu/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/layout/templates/footer/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/layout/templates/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/layout/templates/nav/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/order/components/help/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/order/components/item/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/order/components/items/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/order/components/onboarding-cta/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/order/components/order-details/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/order/components/order-summary/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/order/components/payment-details/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/order/components/shipping-details/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/order/components/transfer-actions/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/order/components/transfer-image/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/order/templates/order-completed-template.tsx create mode 100644 packages/features/medusa-storefront/src/modules/order/templates/order-details-template.tsx create mode 100644 packages/features/medusa-storefront/src/modules/products/components/image-gallery/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/products/components/product-actions/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/products/components/product-actions/mobile-actions.tsx create mode 100644 packages/features/medusa-storefront/src/modules/products/components/product-actions/option-select.tsx create mode 100644 packages/features/medusa-storefront/src/modules/products/components/product-onboarding-cta/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/products/components/product-preview/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/products/components/product-preview/price.tsx create mode 100644 packages/features/medusa-storefront/src/modules/products/components/product-price/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/products/components/product-tabs/accordion.tsx create mode 100644 packages/features/medusa-storefront/src/modules/products/components/product-tabs/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/products/components/related-products/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/products/components/thumbnail/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/products/templates/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/products/templates/product-actions-wrapper/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/products/templates/product-info/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/shipping/components/free-shipping-price-nudge/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/skeletons/components/skeleton-button/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/skeletons/components/skeleton-card-details/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/skeletons/components/skeleton-cart-item/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/skeletons/components/skeleton-cart-totals/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/skeletons/components/skeleton-code-form/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/skeletons/components/skeleton-line-item/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/skeletons/components/skeleton-order-confirmed-header/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/skeletons/components/skeleton-order-information/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/skeletons/components/skeleton-order-items/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/skeletons/components/skeleton-order-summary/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/skeletons/components/skeleton-product-preview/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/skeletons/templates/skeleton-cart-page/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/skeletons/templates/skeleton-order-confirmed/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/skeletons/templates/skeleton-product-grid/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/skeletons/templates/skeleton-related-products/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/store/components/pagination/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/store/components/refinement-list/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/store/components/refinement-list/sort-products/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/store/templates/index.tsx create mode 100644 packages/features/medusa-storefront/src/modules/store/templates/paginated-products.tsx create mode 100644 packages/features/medusa-storefront/src/styles/globals.css create mode 100644 packages/features/medusa-storefront/src/types/global.ts create mode 100644 packages/features/medusa-storefront/src/types/icon.ts create mode 100644 packages/features/medusa-storefront/tsconfig.json create mode 100644 supabase/migrations/20250703145757_add_medreport_schema.sql diff --git a/.env b/.env index 164e333..5808df9 100644 --- a/.env +++ b/.env @@ -49,4 +49,7 @@ LOGGER=pino NEXT_PUBLIC_DEFAULT_LOCALE=et NEXT_PUBLIC_TEAM_NAVIGATION_STYLE=custom -NEXT_PUBLIC_USER_NAVIGATION_STYLE=custom \ No newline at end of file +NEXT_PUBLIC_USER_NAVIGATION_STYLE=custom + +# MEDUSA +NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY= \ No newline at end of file diff --git a/.env.example b/.env.example index 2a3d662..1b78f4e 100644 --- a/.env.example +++ b/.env.example @@ -16,4 +16,6 @@ EMAIL_USER= # refer to your email provider's documentation EMAIL_PASSWORD= # refer to your email provider's documentation EMAIL_HOST= # refer to your email provider's documentation EMAIL_PORT= # or 465 for SSL -EMAIL_TLS= # or false for SSL (see provider documentation) \ No newline at end of file +EMAIL_TLS= # or false for SSL (see provider documentation) + +NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY= \ No newline at end of file diff --git a/README.md b/README.md index dde3485..21d54ba 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,8 @@ pnpm clean pnpm i ``` +if you get missing dependency error do `pnpm i --force` + ## Adding new dependency ```bash @@ -70,3 +72,9 @@ To update database types run: ```bash npm run supabase:typegen:app ``` + +## Medusa store + +To get medusa store working you need to update the env's to your running medusa app and migrate the tables from medusa project to your supabase project + +You can get `NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY` from your medusa app settings diff --git a/app/store/[countryCode]/(checkout)/checkout/page.tsx b/app/store/[countryCode]/(checkout)/checkout/page.tsx new file mode 100644 index 0000000..6244a1d --- /dev/null +++ b/app/store/[countryCode]/(checkout)/checkout/page.tsx @@ -0,0 +1,30 @@ +import { retrieveCart } from "@lib/data/cart" +import { retrieveCustomer } from "@lib/data/customer" +import PaymentWrapper from "@modules/checkout/components/payment-wrapper" +import CheckoutForm from "@modules/checkout/templates/checkout-form" +import CheckoutSummary from "@modules/checkout/templates/checkout-summary" +import { Metadata } from "next" +import { notFound } from "next/navigation" + +export const metadata: Metadata = { + title: "Checkout", +} + +export default async function Checkout() { + const cart = await retrieveCart() + + if (!cart) { + return notFound() + } + + const customer = await retrieveCustomer() + + return ( +
+ + + + +
+ ) +} diff --git a/app/store/[countryCode]/(checkout)/layout.tsx b/app/store/[countryCode]/(checkout)/layout.tsx new file mode 100644 index 0000000..dcbf3ff --- /dev/null +++ b/app/store/[countryCode]/(checkout)/layout.tsx @@ -0,0 +1,45 @@ +import { LocalizedClientLink } from '~/medusa/modules/common/components'; +import { ChevronDownIcon } from '~/medusa/modules/common/icons'; +import { MedusaCTA } from '~/medusa/modules/layout/components'; + +export default function CheckoutLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( +
+
+ +
+
+ {children} +
+
+ +
+
+ ); +} diff --git a/app/store/[countryCode]/(checkout)/not-found.tsx b/app/store/[countryCode]/(checkout)/not-found.tsx new file mode 100644 index 0000000..70a1c24 --- /dev/null +++ b/app/store/[countryCode]/(checkout)/not-found.tsx @@ -0,0 +1,20 @@ +import { Metadata } from 'next'; + +import InteractiveLink from '~/medusa/modules/common/components/interactive-link'; + +export const metadata: Metadata = { + title: '404', + description: 'Something went wrong', +}; + +export default async function NotFound() { + return ( +
+

Page not found

+

+ The page you tried to access does not exist. +

+ Go to frontpage +
+ ); +} diff --git a/app/store/[countryCode]/(main)/account/@dashboard/addresses/page.tsx b/app/store/[countryCode]/(main)/account/@dashboard/addresses/page.tsx new file mode 100644 index 0000000..c010411 --- /dev/null +++ b/app/store/[countryCode]/(main)/account/@dashboard/addresses/page.tsx @@ -0,0 +1,38 @@ +import { Metadata } from 'next'; + +import { notFound } from 'next/navigation'; + +import { retrieveCustomer } from '~/medusa/lib/data/customer'; +import { getRegion } from '~/medusa/lib/data/regions'; +import AddressBook from '~/medusa/modules/account/components/address-book'; + +export const metadata: Metadata = { + title: 'Addresses', + description: 'View your addresses', +}; + +export default async function Addresses(props: { + params: Promise<{ countryCode: string }>; +}) { + const params = await props.params; + const { countryCode } = params; + const customer = await retrieveCustomer(); + const region = await getRegion(countryCode); + + if (!customer || !region) { + notFound(); + } + + return ( +
+
+

Shipping Addresses

+

+ View and update your shipping addresses, you can add as many as you + like. Saving your addresses will make them available during checkout. +

+
+ +
+ ); +} diff --git a/app/store/[countryCode]/(main)/account/@dashboard/loading.tsx b/app/store/[countryCode]/(main)/account/@dashboard/loading.tsx new file mode 100644 index 0000000..207fc67 --- /dev/null +++ b/app/store/[countryCode]/(main)/account/@dashboard/loading.tsx @@ -0,0 +1,9 @@ +import Spinner from '~/medusa/modules/common/icons/spinner'; + +export default function Loading() { + return ( +
+ +
+ ); +} diff --git a/app/store/[countryCode]/(main)/account/@dashboard/orders/details/[id]/page.tsx b/app/store/[countryCode]/(main)/account/@dashboard/orders/details/[id]/page.tsx new file mode 100644 index 0000000..f51ac84 --- /dev/null +++ b/app/store/[countryCode]/(main)/account/@dashboard/orders/details/[id]/page.tsx @@ -0,0 +1,35 @@ +import { Metadata } from 'next'; + +import { notFound } from 'next/navigation'; + +import { retrieveOrder } from '~/medusa/lib/data/orders'; +import OrderDetailsTemplate from '~/medusa/modules/order/templates/order-details-template'; + +type Props = { + params: Promise<{ id: string }>; +}; + +export async function generateMetadata(props: Props): Promise { + const params = await props.params; + const order = await retrieveOrder(params.id).catch(() => null); + + if (!order) { + notFound(); + } + + return { + title: `Order #${order.display_id}`, + description: `View your order`, + }; +} + +export default async function OrderDetailPage(props: Props) { + const params = await props.params; + const order = await retrieveOrder(params.id).catch(() => null); + + if (!order) { + notFound(); + } + + return ; +} diff --git a/app/store/[countryCode]/(main)/account/@dashboard/orders/page.tsx b/app/store/[countryCode]/(main)/account/@dashboard/orders/page.tsx new file mode 100644 index 0000000..7e30118 --- /dev/null +++ b/app/store/[countryCode]/(main)/account/@dashboard/orders/page.tsx @@ -0,0 +1,38 @@ +import { Metadata } from 'next'; + +import { notFound } from 'next/navigation'; + +import { listOrders } from '~/medusa/lib/data/orders'; +import OrderOverview from '~/medusa/modules/account/components/order-overview'; +import TransferRequestForm from '~/medusa/modules/account/components/transfer-request-form'; +import Divider from '~/medusa/modules/common/components/divider'; + +export const metadata: Metadata = { + title: 'Orders', + description: 'Overview of your previous orders.', +}; + +export default async function Orders() { + const orders = await listOrders(); + + if (!orders) { + notFound(); + } + + return ( +
+
+

Orders

+

+ View your previous orders and their status. You can also create + returns or exchanges for your orders if needed. +

+
+
+ + + +
+
+ ); +} diff --git a/app/store/[countryCode]/(main)/account/@dashboard/page.tsx b/app/store/[countryCode]/(main)/account/@dashboard/page.tsx new file mode 100644 index 0000000..9af729b --- /dev/null +++ b/app/store/[countryCode]/(main)/account/@dashboard/page.tsx @@ -0,0 +1,23 @@ +import { Metadata } from 'next'; + +import { notFound } from 'next/navigation'; + +import { retrieveCustomer } from '~/medusa/lib/data/customer'; +import { listOrders } from '~/medusa/lib/data/orders'; +import Overview from '~/medusa/modules/account/components/overview'; + +export const metadata: Metadata = { + title: 'Account', + description: 'Overview of your account activity.', +}; + +export default async function OverviewTemplate() { + const customer = await retrieveCustomer().catch(() => null); + const orders = (await listOrders().catch(() => null)) || null; + + if (!customer) { + notFound(); + } + + return ; +} diff --git a/app/store/[countryCode]/(main)/account/@dashboard/profile/page.tsx b/app/store/[countryCode]/(main)/account/@dashboard/profile/page.tsx new file mode 100644 index 0000000..d140f03 --- /dev/null +++ b/app/store/[countryCode]/(main)/account/@dashboard/profile/page.tsx @@ -0,0 +1,54 @@ +import { Metadata } from 'next'; + +import { notFound } from 'next/navigation'; + +import { retrieveCustomer } from '~/medusa/lib/data/customer'; +import { listRegions } from '~/medusa/lib/data/regions'; +import ProfilePhone from '~/medusa/modules/account//components/profile-phone'; +import ProfileBillingAddress from '~/medusa/modules/account/components/profile-billing-address'; +import ProfileEmail from '~/medusa/modules/account/components/profile-email'; +import ProfileName from '~/medusa/modules/account/components/profile-name'; +import ProfilePassword from '~/medusa/modules/account/components/profile-password'; + +export const metadata: Metadata = { + title: 'Profile', + description: 'View and edit your Medusa Store profile.', +}; + +export default async function Profile() { + const customer = await retrieveCustomer(); + const regions = await listRegions(); + + if (!customer || !regions) { + notFound(); + } + + return ( +
+
+

Profile

+

+ View and update your profile information, including your name, email, + and phone number. You can also update your billing address, or change + your password. +

+
+
+ + + + + + + {/* + */} + +
+
+ ); +} + +const Divider = () => { + return
; +}; +``; diff --git a/app/store/[countryCode]/(main)/account/@login/page.tsx b/app/store/[countryCode]/(main)/account/@login/page.tsx new file mode 100644 index 0000000..405b31b --- /dev/null +++ b/app/store/[countryCode]/(main)/account/@login/page.tsx @@ -0,0 +1,12 @@ +import { Metadata } from 'next'; + +import LoginTemplate from '~/medusa/modules/account/templates/login-template'; + +export const metadata: Metadata = { + title: 'Sign in', + description: 'Sign in to your Medusa Store account.', +}; + +export default function Login() { + return ; +} diff --git a/app/store/[countryCode]/(main)/account/layout.tsx b/app/store/[countryCode]/(main)/account/layout.tsx new file mode 100644 index 0000000..04d05e4 --- /dev/null +++ b/app/store/[countryCode]/(main)/account/layout.tsx @@ -0,0 +1,21 @@ +import { Toaster } from '@medusajs/ui'; + +import { retrieveCustomer } from '~/medusa/lib/data'; +import { AccountLayout } from '~/medusa/modules/account/templates'; + +export default async function AccountPageLayout({ + dashboard, + login, +}: { + dashboard?: React.ReactNode; + login?: React.ReactNode; +}) { + const customer = await retrieveCustomer().catch(() => null); + + return ( + + {customer ? dashboard : login} + + + ); +} diff --git a/app/store/[countryCode]/(main)/account/loading.tsx b/app/store/[countryCode]/(main)/account/loading.tsx new file mode 100644 index 0000000..207fc67 --- /dev/null +++ b/app/store/[countryCode]/(main)/account/loading.tsx @@ -0,0 +1,9 @@ +import Spinner from '~/medusa/modules/common/icons/spinner'; + +export default function Loading() { + return ( +
+ +
+ ); +} diff --git a/app/store/[countryCode]/(main)/cart/loading.tsx b/app/store/[countryCode]/(main)/cart/loading.tsx new file mode 100644 index 0000000..f093295 --- /dev/null +++ b/app/store/[countryCode]/(main)/cart/loading.tsx @@ -0,0 +1,5 @@ +import SkeletonCartPage from '~/medusa/modules/skeletons/templates/skeleton-cart-page'; + +export default function Loading() { + return ; +} diff --git a/app/store/[countryCode]/(main)/cart/not-found.tsx b/app/store/[countryCode]/(main)/cart/not-found.tsx new file mode 100644 index 0000000..a2f02bd --- /dev/null +++ b/app/store/[countryCode]/(main)/cart/not-found.tsx @@ -0,0 +1,21 @@ +import { Metadata } from 'next'; + +import InteractiveLink from '~/medusa/modules/common/components/interactive-link'; + +export const metadata: Metadata = { + title: '404', + description: 'Something went wrong', +}; + +export default function NotFound() { + return ( +
+

Page not found

+

+ The cart you tried to access does not exist. Clear your cookies and try + again. +

+ Go to frontpage +
+ ); +} diff --git a/app/store/[countryCode]/(main)/cart/page.tsx b/app/store/[countryCode]/(main)/cart/page.tsx new file mode 100644 index 0000000..72fc72b --- /dev/null +++ b/app/store/[countryCode]/(main)/cart/page.tsx @@ -0,0 +1,23 @@ +import { Metadata } from 'next'; + +import { notFound } from 'next/navigation'; + +import { retrieveCart } from '~/medusa/lib/data/cart'; +import { retrieveCustomer } from '~/medusa/lib/data/customer'; +import CartTemplate from '~/medusa/modules/cart/templates'; + +export const metadata: Metadata = { + title: 'Cart', + description: 'View your cart', +}; + +export default async function Cart() { + const cart = await retrieveCart().catch((error) => { + console.error(error); + return notFound(); + }); + + const customer = await retrieveCustomer(); + + return ; +} diff --git a/app/store/[countryCode]/(main)/categories/[...category]/page.tsx b/app/store/[countryCode]/(main)/categories/[...category]/page.tsx new file mode 100644 index 0000000..ca873ab --- /dev/null +++ b/app/store/[countryCode]/(main)/categories/[...category]/page.tsx @@ -0,0 +1,90 @@ +import { Metadata } from 'next'; + +import { notFound } from 'next/navigation'; + +import { StoreRegion } from '@medusajs/types'; + +import { + getCategoryByHandle, + listCategories, +} from '~/medusa/lib/data/categories'; +import { listRegions } from '~/medusa/lib/data/regions'; +import CategoryTemplate from '~/medusa/modules/categories/templates'; +import { SortOptions } from '~/medusa/modules/store/components/refinement-list/sort-products'; + +type Props = { + params: Promise<{ category: string[]; countryCode: string }>; + searchParams: Promise<{ + sortBy?: SortOptions; + page?: string; + }>; +}; + +export async function generateStaticParams() { + const product_categories = await listCategories(); + + if (!product_categories) { + return []; + } + + const countryCodes = await listRegions().then((regions: StoreRegion[]) => + regions?.map((r) => r.countries?.map((c) => c.iso_2)).flat(), + ); + + const categoryHandles = product_categories.map( + (category: any) => category.handle, + ); + + const staticParams = countryCodes + ?.map((countryCode: string | undefined) => + categoryHandles.map((handle: any) => ({ + countryCode, + category: [handle], + })), + ) + .flat(); + + return staticParams; +} + +export async function generateMetadata(props: Props): Promise { + const params = await props.params; + try { + const productCategory = await getCategoryByHandle(params.category); + + const title = productCategory.name + ' | Medusa Store'; + + const description = productCategory.description ?? `${title} category.`; + + return { + title: `${title} | Medusa Store`, + description, + alternates: { + canonical: `${params.category.join('/')}`, + }, + }; + } catch (error) { + notFound(); + } +} + +export default async function CategoryPage(props: Props) { + const searchParams = await props.searchParams; + const params = await props.params; + const { sortBy, page } = searchParams; + + const productCategory = await getCategoryByHandle(params.category); + + if (!productCategory) { + notFound(); + } + + return ( + + ); +} diff --git a/app/store/[countryCode]/(main)/collections/[handle]/page.tsx b/app/store/[countryCode]/(main)/collections/[handle]/page.tsx new file mode 100644 index 0000000..1b01743 --- /dev/null +++ b/app/store/[countryCode]/(main)/collections/[handle]/page.tsx @@ -0,0 +1,95 @@ +import { Metadata } from 'next'; + +import { notFound } from 'next/navigation'; + +import { StoreCollection, StoreRegion } from '@medusajs/types'; + +import { + getCollectionByHandle, + listCollections, +} from '~/medusa/lib/data/collections'; +import { listRegions } from '~/medusa/lib/data/regions'; +import CollectionTemplate from '~/medusa/modules/collections/templates'; +import { SortOptions } from '~/medusa/modules/store/components/refinement-list/sort-products'; + +type Props = { + params: Promise<{ handle: string; countryCode: string }>; + searchParams: Promise<{ + page?: string; + sortBy?: SortOptions; + }>; +}; + +export const PRODUCT_LIMIT = 12; + +export async function generateStaticParams() { + const { collections } = await listCollections({ + fields: '*products', + }); + + if (!collections) { + return []; + } + + const countryCodes = await listRegions().then( + (regions: StoreRegion[]) => + regions + ?.map((r) => r.countries?.map((c) => c.iso_2)) + .flat() + .filter(Boolean) as string[], + ); + + const collectionHandles = collections.map( + (collection: StoreCollection) => collection.handle, + ); + + const staticParams = countryCodes + ?.map((countryCode: string) => + collectionHandles.map((handle: string | undefined) => ({ + countryCode, + handle, + })), + ) + .flat(); + + return staticParams; +} + +export async function generateMetadata(props: Props): Promise { + const params = await props.params; + const collection = await getCollectionByHandle(params.handle); + + if (!collection) { + notFound(); + } + + const metadata = { + title: `${collection.title} | Medusa Store`, + description: `${collection.title} collection`, + } as Metadata; + + return metadata; +} + +export default async function CollectionPage(props: Props) { + const searchParams = await props.searchParams; + const params = await props.params; + const { sortBy, page } = searchParams; + + const collection = await getCollectionByHandle(params.handle).then( + (collection: StoreCollection) => collection, + ); + + if (!collection) { + notFound(); + } + + return ( + + ); +} diff --git a/app/store/[countryCode]/(main)/layout.tsx b/app/store/[countryCode]/(main)/layout.tsx new file mode 100644 index 0000000..31d1512 --- /dev/null +++ b/app/store/[countryCode]/(main)/layout.tsx @@ -0,0 +1,46 @@ +import { Metadata } from 'next'; + +import { StoreCartShippingOption } from '@medusajs/types'; + +import { listCartOptions, retrieveCart } from '~/medusa/lib/data/cart'; +import { retrieveCustomer } from '~/medusa/lib/data/customer'; +import { getBaseURL } from '~/medusa/lib/util/env'; +import CartMismatchBanner from '~/medusa/modules/layout/components/cart-mismatch-banner'; +import Footer from '~/medusa/modules/layout/templates/footer'; +import Nav from '~/medusa/modules/layout/templates/nav'; +import FreeShippingPriceNudge from '~/medusa/modules/shipping/components/free-shipping-price-nudge'; + +export const metadata: Metadata = { + metadataBase: new URL(getBaseURL()), +}; + +export default async function PageLayout(props: { children: React.ReactNode }) { + const customer = await retrieveCustomer(); + const cart = await retrieveCart(); + let shippingOptions: StoreCartShippingOption[] = []; + + if (cart) { + const { shipping_options } = await listCartOptions(); + + shippingOptions = shipping_options; + } + + return ( + <> +