@akinon/projectzero 2.0.0-beta.9 → 2.0.0
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 +183 -17
- package/app-template/.env.example +3 -0
- package/app-template/.github/instructions/account.instructions.md +749 -0
- package/app-template/.github/instructions/checkout.instructions.md +678 -0
- package/app-template/.github/instructions/default.instructions.md +279 -0
- package/app-template/.github/instructions/edge-cases.instructions.md +73 -0
- package/app-template/.github/instructions/routing.instructions.md +603 -0
- package/app-template/.github/instructions/settings.instructions.md +338 -0
- package/app-template/.gitignore +3 -0
- package/app-template/AGENTS.md +7 -0
- package/app-template/CHANGELOG.md +2033 -232
- package/app-template/Procfile +1 -1
- package/app-template/akinon.json +1 -4
- package/app-template/build.sh +10 -0
- package/app-template/docs/advanced-usage.md +111 -0
- package/app-template/docs/plugins.md +60 -25
- package/app-template/docs/sentry-usage.md +35 -0
- package/app-template/jest.config.ts +2 -2
- package/app-template/next-env.d.ts +1 -0
- package/app-template/{next.config.ts → next.config.mjs} +6 -7
- package/app-template/package.json +58 -50
- package/app-template/postcss.config.mjs +1 -4
- package/app-template/public/amex.svg +12 -0
- package/app-template/public/apple-pay.svg +16 -0
- package/app-template/public/assets/images/product-placeholder-1.jpg +0 -0
- package/app-template/public/assets/images/product-placeholder-2.jpg +0 -0
- package/app-template/public/assets/images/product-placeholder-3.jpg +0 -0
- package/app-template/public/assets/images/product-placeholder-4.jpg +0 -0
- package/app-template/public/google-pay.svg +16 -0
- package/app-template/public/locales/en/account.json +9 -4
- package/app-template/public/locales/en/auth.json +6 -7
- package/app-template/public/locales/en/basket.json +6 -6
- package/app-template/public/locales/en/blog.json +7 -0
- package/app-template/public/locales/en/category.json +3 -1
- package/app-template/public/locales/en/checkout.json +17 -4
- package/app-template/public/locales/en/common.json +61 -3
- package/app-template/public/locales/en/forgot_password.json +6 -7
- package/app-template/public/locales/en/product.json +84 -4
- package/app-template/public/locales/tr/account.json +9 -4
- package/app-template/public/locales/tr/auth.json +16 -17
- package/app-template/public/locales/tr/basket.json +4 -4
- package/app-template/public/locales/tr/blog.json +7 -0
- package/app-template/public/locales/tr/category.json +3 -1
- package/app-template/public/locales/tr/checkout.json +48 -36
- package/app-template/public/locales/tr/common.json +60 -2
- package/app-template/public/locales/tr/forgot_password.json +12 -13
- package/app-template/public/locales/tr/product.json +82 -0
- package/app-template/public/logo.svg +3 -27
- package/app-template/public/mastercard.svg +14 -0
- package/app-template/public/masterpass-javascript-sdk-web.min.js +1 -0
- package/app-template/public/promotion-banner.jpg +0 -0
- package/app-template/public/shop-pay.svg +12 -0
- package/app-template/public/visa.svg +12 -0
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/[...prettyurl]/page.tsx +11 -11
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/layout.tsx +4 -3
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/cancellation/page.tsx +13 -10
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/page.tsx +73 -51
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/page.tsx +1 -1
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/profile/page.tsx +2 -2
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/address/stores/page.tsx +2 -2
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/auth/page.tsx +1 -1
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/basket/page.tsx +2 -2
- package/app-template/src/app/[pz]/blog/[slug]/page.tsx +120 -0
- package/app-template/src/app/[pz]/category/[pk]/page.tsx +37 -0
- package/app-template/src/app/[pz]/flat-page/[pk]/page.tsx +23 -0
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/forms/[pk]/generate/page.tsx +2 -3
- package/app-template/src/app/[pz]/group-product/[pk]/page.tsx +93 -0
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/landing-page/[pk]/page.tsx +2 -4
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/layout.tsx +6 -11
- package/app-template/src/app/[pz]/list/page.tsx +26 -0
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/not-found.tsx +5 -7
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/completed/[token]/page.tsx +6 -4
- package/app-template/src/app/[pz]/page.tsx +28 -0
- package/app-template/src/app/[pz]/pages/[slug]/page.tsx +19 -0
- package/app-template/src/app/[pz]/product/[pk]/page.tsx +102 -0
- package/app-template/src/app/[pz]/special-page/[pk]/page.tsx +35 -0
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/email-set-primary/[[...id]]/page.tsx +3 -4
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/registration/account-confirm-email/[[...id]]/page.tsx +3 -3
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/reset/[[...id]]/page.tsx +41 -5
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/xml-sitemap/[node]/route.ts +8 -6
- package/app-template/src/app/api/auth/[...nextauth]/route.ts +3 -0
- package/app-template/src/app/api/barcode-search/route.ts +1 -0
- package/app-template/src/app/api/cache/route.ts +1 -1
- package/app-template/src/app/api/form/[...id]/route.ts +1 -7
- package/app-template/src/app/api/image-proxy/route.ts +1 -0
- package/app-template/src/app/api/logout/route.ts +1 -1
- package/app-template/src/app/api/product-categories/route.ts +1 -0
- package/app-template/src/app/api/similar-product-list/route.ts +1 -0
- package/app-template/src/app/api/similar-products/route.ts +1 -0
- package/app-template/src/app/api/theme-settings/route.ts +12 -0
- package/app-template/src/app/api/virtual-try-on/limited-categories/route.ts +1 -0
- package/app-template/src/app/api/virtual-try-on/route.ts +1 -0
- package/app-template/src/app/api/web-vitals/route.ts +1 -1
- package/app-template/src/assets/fonts/pz-icon.css +211 -49
- package/app-template/src/assets/fonts/pz-icon.eot +0 -0
- package/app-template/src/assets/fonts/pz-icon.html +486 -0
- package/app-template/src/assets/fonts/pz-icon.scss +373 -49
- package/app-template/src/assets/fonts/pz-icon.svg +215 -53
- package/app-template/src/assets/fonts/pz-icon.ttf +0 -0
- package/app-template/src/assets/fonts/pz-icon.woff +0 -0
- package/app-template/src/assets/fonts/pz-icon.woff2 +0 -0
- package/app-template/src/assets/globals.scss +8 -133
- package/app-template/src/assets/icons/arrow-right.svg +3 -0
- package/app-template/src/assets/icons/cart.svg +4 -12
- package/app-template/src/assets/icons/check.svg +2 -18
- package/app-template/src/assets/icons/chevron-down.svg +2 -7
- package/app-template/src/assets/icons/delete.svg +3 -0
- package/app-template/src/assets/icons/facebook.svg +2 -8
- package/app-template/src/assets/icons/fav-off.svg +5 -0
- package/app-template/src/assets/icons/fav-on.svg +5 -0
- package/app-template/src/assets/icons/filter-and-sort.svg +3 -0
- package/app-template/src/assets/icons/heart.svg +3 -0
- package/app-template/src/assets/icons/instagram.svg +2 -13
- package/app-template/src/assets/icons/materials.svg +3 -0
- package/app-template/src/assets/icons/person.svg +4 -0
- package/app-template/src/assets/icons/pinterest.svg +5 -11
- package/app-template/src/assets/icons/ruler.svg +3 -0
- package/app-template/src/assets/icons/search.svg +8 -11
- package/app-template/src/assets/icons/share.svg +2 -9
- package/app-template/src/assets/icons/snapchat.svg +3 -0
- package/app-template/src/assets/icons/tiktok.svg +3 -0
- package/app-template/src/assets/icons/tumblr.svg +6 -0
- package/app-template/src/assets/icons/twitter.svg +2 -10
- package/app-template/src/assets/icons/vimeo.svg +3 -0
- package/app-template/src/assets/icons/youtube.svg +3 -0
- package/app-template/src/assets/icons/zoom.svg +8 -0
- package/app-template/src/auth.ts +3 -0
- package/app-template/src/components/__tests__/badge.test.tsx +2 -2
- package/app-template/src/components/__tests__/link.test.tsx +2 -0
- package/app-template/src/components/accordion.tsx +48 -23
- package/app-template/src/components/action-tooltip.tsx +160 -0
- package/app-template/src/components/button.tsx +1 -1
- package/app-template/src/components/carousel-core.tsx +4 -11
- package/app-template/src/components/checkbox.tsx +2 -1
- package/app-template/src/components/currency-select.tsx +150 -4
- package/app-template/src/components/file-input.tsx +27 -7
- package/app-template/src/components/generate-form-fields.tsx +49 -10
- package/app-template/src/components/icon.tsx +5 -6
- package/app-template/src/components/index.ts +4 -1
- package/app-template/src/components/input.tsx +11 -5
- package/app-template/src/components/language-select.tsx +88 -2
- package/app-template/src/components/modal.tsx +34 -16
- package/app-template/src/components/pagination.tsx +133 -20
- package/app-template/src/components/price.tsx +1 -1
- package/app-template/src/components/pwa-tags.tsx +1 -0
- package/app-template/src/components/quantity-input.tsx +63 -0
- package/app-template/src/components/quantity-selector.tsx +215 -0
- package/app-template/src/components/route-handler.tsx +50 -0
- package/app-template/src/components/select.tsx +86 -54
- package/app-template/src/components/shimmer.tsx +1 -1
- package/app-template/src/components/types/index.ts +51 -1
- package/app-template/src/components/widget-content.tsx +323 -0
- package/app-template/src/data/server/theme.ts +70 -0
- package/app-template/src/hooks/use-fav-button.tsx +9 -10
- package/app-template/src/hooks/use-product-cart.ts +80 -0
- package/app-template/src/hooks/use-stock-alert.ts +74 -0
- package/app-template/src/hooks/use-theme-settings.ts +42 -0
- package/app-template/src/lib/fonts.ts +149 -0
- package/app-template/src/plugins.js +12 -2
- package/app-template/src/{middleware.ts → proxy.ts} +3 -3
- package/app-template/src/redux/middlewares/category.ts +5 -4
- package/app-template/src/redux/store.ts +21 -1
- package/app-template/src/routes/index.ts +8 -7
- package/app-template/src/settings.js +6 -3
- package/app-template/src/types/hookform-resolvers-yup.d.ts +28 -0
- package/app-template/src/types/index.ts +74 -3
- package/app-template/src/types/next-auth.d.ts +2 -2
- package/app-template/src/types/widget.ts +169 -0
- package/app-template/src/utils/__tests__/theme-page-context.test.ts +145 -0
- package/app-template/src/utils/formatDate.ts +48 -0
- package/app-template/src/utils/styles.ts +71 -0
- package/app-template/src/utils/theme-page-context.ts +309 -0
- package/app-template/src/utils/variant-validation.ts +41 -0
- package/app-template/src/views/account/address-form.tsx +8 -4
- package/app-template/src/views/account/contact-form.tsx +148 -131
- package/app-template/src/views/account/content-header.tsx +4 -3
- package/app-template/src/views/account/faq/faq-tabs.tsx +8 -2
- package/app-template/src/views/account/favorite-item.tsx +1 -1
- package/app-template/src/views/account/order.tsx +11 -9
- package/app-template/src/views/account/orders/order-cancellation-item.tsx +1 -1
- package/app-template/src/views/account/orders/order-detail-header.tsx +1 -1
- package/app-template/src/views/anonymous-tracking/order-detail/index.tsx +45 -38
- package/app-template/src/views/basket/basket-item.tsx +6 -1
- package/app-template/src/views/basket/summary.tsx +16 -0
- package/app-template/src/views/breadcrumb.tsx +2 -2
- package/app-template/src/views/category/category-banner.tsx +4 -23
- package/app-template/src/views/category/category-info.tsx +2 -1
- package/app-template/src/views/category/filters/filter-item.tsx +138 -42
- package/app-template/src/views/category/filters/index.tsx +1 -1
- package/app-template/src/views/category/layout.tsx +1 -0
- package/app-template/src/views/checkout/auth.tsx +64 -40
- package/app-template/src/views/checkout/layout/header.tsx +10 -6
- package/app-template/src/views/checkout/steps/payment/options/credit-card/index.tsx +22 -6
- package/app-template/src/views/checkout/steps/payment/options/funds-transfer.tsx +25 -5
- package/app-template/src/views/checkout/steps/payment/options/loyalty.tsx +21 -2
- package/app-template/src/views/checkout/steps/payment/options/redirection.tsx +27 -5
- package/app-template/src/views/checkout/steps/payment/options/store-credit.tsx +464 -0
- package/app-template/src/views/checkout/steps/payment/payment-option-buttons.tsx +4 -4
- package/app-template/src/views/checkout/steps/shipping/address-box.tsx +33 -20
- package/app-template/src/views/checkout/steps/shipping/addresses.tsx +2 -2
- package/app-template/src/views/checkout/summary.tsx +12 -2
- package/app-template/src/views/find-in-store/index.tsx +2 -2
- package/app-template/src/views/guest-login/index.tsx +62 -58
- package/app-template/src/views/header/action-menu.tsx +1 -1
- package/app-template/src/views/header/band.tsx +2 -2
- package/app-template/src/views/header/index.tsx +1 -1
- package/app-template/src/views/header/mini-basket.tsx +3 -3
- package/app-template/src/views/header/mobile-hamburger-button.tsx +5 -8
- package/app-template/src/views/header/mobile-menu.tsx +18 -6
- package/app-template/src/views/header/navbar.tsx +1 -1
- package/app-template/src/views/header/pwa-back-button.tsx +1 -1
- package/app-template/src/views/header/search/index.tsx +13 -3
- package/app-template/src/views/header/search/results.tsx +1 -1
- package/app-template/src/views/header/user-menu.tsx +1 -3
- package/app-template/src/views/login/index.tsx +66 -57
- package/app-template/src/views/otp-login/index.tsx +11 -6
- package/app-template/src/views/product/index.ts +1 -0
- package/app-template/src/views/product/layout.tsx +26 -6
- package/app-template/src/views/product/price-wrapper.tsx +3 -24
- package/app-template/src/views/product/product-actions.tsx +165 -0
- package/app-template/src/views/product/product-info.tsx +76 -238
- package/app-template/src/views/product/product-share.tsx +58 -0
- package/app-template/src/views/product/product-variants.tsx +26 -0
- package/app-template/src/views/product/slider.tsx +22 -1
- package/app-template/src/views/product/variant.tsx +69 -41
- package/app-template/src/views/product-pointer-banner-item.tsx +1 -1
- package/app-template/src/views/register/index.tsx +31 -46
- package/app-template/src/views/sales-contract-modal/index.tsx +17 -17
- package/app-template/src/views/share/index.tsx +9 -6
- package/app-template/src/views/widgets/home-hero-slider-content.tsx +41 -39
- package/app-template/src/widgets/flatpages/about-us/index.tsx +78 -0
- package/app-template/src/widgets/flatpages/blog-list/index.tsx +129 -0
- package/app-template/src/widgets/footer-info.tsx +1 -1
- package/app-template/src/widgets/footer-menu.tsx +7 -3
- package/app-template/src/widgets/footer-subscription/footer-subscription-form.tsx +17 -14
- package/app-template/src/widgets/footer-subscription/index.tsx +1 -1
- package/app-template/src/widgets/home-stories-eng.tsx +43 -35
- package/app-template/src/widgets/index.ts +7 -0
- package/app-template/src/widgets/schemas/about-us.json +46 -0
- package/app-template/src/widgets/schemas/blog-list.json +37 -0
- package/app-template/src/widgets/schemas/blog.json +29 -0
- package/app-template/tailwind.config.js +155 -7
- package/app-template/tsconfig.json +29 -11
- package/codemods/migrate-auth-v5/index.js +339 -0
- package/codemods/migrate-auth-v5/transform.js +86 -0
- package/codemods/migrate-segments/index.js +591 -0
- package/codemods/update-tailwind-config/index.js +30 -0
- package/codemods/update-tailwind-config/transform.js +102 -0
- package/codemods/upgrade-to-2/index.js +549 -0
- package/commands/codemod.ts +0 -1
- package/commands/plugins.ts +111 -46
- package/dist/commands/codemod.js +0 -1
- package/dist/commands/plugins.js +104 -36
- package/package.json +3 -2
- package/app-template/src/app/[commerce]/[locale]/[currency]/category/[pk]/page.tsx +0 -22
- package/app-template/src/app/[commerce]/[locale]/[currency]/flat-page/[pk]/page.tsx +0 -20
- package/app-template/src/app/[commerce]/[locale]/[currency]/group-product/[pk]/page.tsx +0 -74
- package/app-template/src/app/[commerce]/[locale]/[currency]/list/page.tsx +0 -18
- package/app-template/src/app/[commerce]/[locale]/[currency]/page.tsx +0 -50
- package/app-template/src/app/[commerce]/[locale]/[currency]/product/[pk]/page.tsx +0 -84
- package/app-template/src/app/[commerce]/[locale]/[currency]/special-page/[pk]/page.tsx +0 -27
- package/app-template/src/pages/api/auth/[...nextauth].ts +0 -3
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/address/page.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/change-email/page.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/change-password/page.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/contact/page.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/coupons/page.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/email-verification/page.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/faq/page.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/favourite-products/page.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/my-quotations/page.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/[id]/layout.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/account/orders/page.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/anonymous-tracking/page.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/auth/oauth-login/page.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/basket-b2b/page.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/category/[pk]/loading.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/client-root.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/contact-us/page.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/error.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/flat-page/[pk]/loading.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/group-product/[pk]/loading.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/landing-page/[pk]/loading.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/list/loading.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/checkout/page.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/orders/completed/[token]/layout.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/special-page/[pk]/loading.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/template.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/users/password/reset/page.tsx +0 -0
- /package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/xml-sitemap/route.ts +0 -0
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
import clsx from 'clsx';
|
|
2
|
+
import {
|
|
3
|
+
useGetCheckoutLoyaltyBalanceQuery,
|
|
4
|
+
usePayWithLoyaltyBalanceMutation
|
|
5
|
+
} from '@akinon/next/data/client/checkout';
|
|
6
|
+
import { useAppSelector } from '@akinon/next/redux/hooks';
|
|
7
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
8
|
+
import { useLocalization } from '@akinon/next/hooks';
|
|
9
|
+
import { twMerge } from 'tailwind-merge';
|
|
10
|
+
import { Icon, Price } from '@theme/components';
|
|
11
|
+
import { Trans } from '@akinon/next/components';
|
|
12
|
+
import { LoaderSpinner } from '@theme/components';
|
|
13
|
+
import { AccountUsage, LoyaltyBalanceItem } from '@akinon/next/types';
|
|
14
|
+
|
|
15
|
+
export const StoreCredits = () => {
|
|
16
|
+
const { t } = useLocalization();
|
|
17
|
+
|
|
18
|
+
const [payWithLoyaltyBalance, { isLoading: isPayLoading }] =
|
|
19
|
+
usePayWithLoyaltyBalanceMutation();
|
|
20
|
+
|
|
21
|
+
const { loyaltyBalance, loyaltyBalances, preOrder } = useAppSelector(
|
|
22
|
+
(state) => state.checkout
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
const { data: checkoutLoyaltyData, isLoading: isLoyaltyBalanceLoading } =
|
|
26
|
+
useGetCheckoutLoyaltyBalanceQuery(undefined, {
|
|
27
|
+
refetchOnMountOrArgChange: true,
|
|
28
|
+
skip: !preOrder?.payment_option
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
// New approach: read accounts from LoyaltyMoneyUsagePage context
|
|
32
|
+
const loyaltyAccounts: LoyaltyBalanceItem[] = useMemo(() => {
|
|
33
|
+
const loyaltyContext = checkoutLoyaltyData?.context_list?.find(
|
|
34
|
+
(ctx) => ctx.page_name === 'LoyaltyMoneyUsagePage'
|
|
35
|
+
);
|
|
36
|
+
return (
|
|
37
|
+
(loyaltyContext?.page_context?.accounts as LoyaltyBalanceItem[]) ?? []
|
|
38
|
+
);
|
|
39
|
+
}, [checkoutLoyaltyData]);
|
|
40
|
+
|
|
41
|
+
const selectableAccounts = useMemo(() => {
|
|
42
|
+
return loyaltyAccounts.filter((account) => parseFloat(account.balance) > 0);
|
|
43
|
+
}, [loyaltyAccounts]);
|
|
44
|
+
|
|
45
|
+
// Determine which mode to use:
|
|
46
|
+
// - "accounts" mode: backend returns page_context.accounts (new)
|
|
47
|
+
// - "legacy" mode: Redux loyaltyBalance/loyaltyBalances from page_context.balance/balances (old)
|
|
48
|
+
const hasAccounts = selectableAccounts.length > 0;
|
|
49
|
+
const hasLegacyGrouped = !hasAccounts && loyaltyBalances?.length > 0;
|
|
50
|
+
const hasLegacySingle =
|
|
51
|
+
!hasAccounts && !hasLegacyGrouped && parseFloat(loyaltyBalance || '0') > 0;
|
|
52
|
+
|
|
53
|
+
const isLoyaltyBalanceUsed = useMemo(() => {
|
|
54
|
+
return parseFloat(preOrder?.loyalty_money ?? '0') > 0;
|
|
55
|
+
}, [preOrder?.loyalty_money]);
|
|
56
|
+
|
|
57
|
+
// --- Accounts mode state ---
|
|
58
|
+
const [selectedAccountIds, setSelectedAccountIds] = useState<Set<string>>(
|
|
59
|
+
new Set()
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
if (!hasAccounts) return;
|
|
64
|
+
const usages = preOrder?.loyalty_account_usages;
|
|
65
|
+
if (usages && Array.isArray(usages)) {
|
|
66
|
+
setSelectedAccountIds(
|
|
67
|
+
new Set(
|
|
68
|
+
usages
|
|
69
|
+
.filter((u) => parseFloat(String(u.amount)) > 0)
|
|
70
|
+
.map((u) => String(u.label_id))
|
|
71
|
+
)
|
|
72
|
+
);
|
|
73
|
+
} else if (
|
|
74
|
+
parseFloat(preOrder?.loyalty_money ?? '0') > 0 &&
|
|
75
|
+
selectableAccounts.length > 0
|
|
76
|
+
) {
|
|
77
|
+
setSelectedAccountIds(
|
|
78
|
+
new Set(selectableAccounts.map((a) => String(a.label_id)))
|
|
79
|
+
);
|
|
80
|
+
} else {
|
|
81
|
+
setSelectedAccountIds(new Set());
|
|
82
|
+
}
|
|
83
|
+
}, [
|
|
84
|
+
hasAccounts,
|
|
85
|
+
preOrder?.loyalty_account_usages,
|
|
86
|
+
preOrder?.loyalty_money,
|
|
87
|
+
selectableAccounts
|
|
88
|
+
]);
|
|
89
|
+
|
|
90
|
+
// --- Legacy grouped mode state ---
|
|
91
|
+
const [selectedLabels, setSelectedLabels] = useState<Record<string, boolean>>(
|
|
92
|
+
{}
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
96
|
+
|
|
97
|
+
const totalGroupedBalance = useMemo(() => {
|
|
98
|
+
if (!loyaltyBalances) return 0;
|
|
99
|
+
return loyaltyBalances.reduce(
|
|
100
|
+
(sum, item) => sum + parseFloat(item.balance || '0'),
|
|
101
|
+
0
|
|
102
|
+
);
|
|
103
|
+
}, [loyaltyBalances]);
|
|
104
|
+
|
|
105
|
+
// --- Handlers ---
|
|
106
|
+
const handleToggleAccount = async (account: LoyaltyBalanceItem) => {
|
|
107
|
+
if (isLoading) return;
|
|
108
|
+
setIsLoading(true);
|
|
109
|
+
|
|
110
|
+
try {
|
|
111
|
+
const key = String(account.label_id);
|
|
112
|
+
const newSelected = new Set(selectedAccountIds);
|
|
113
|
+
|
|
114
|
+
if (newSelected.has(key)) {
|
|
115
|
+
newSelected.delete(key);
|
|
116
|
+
} else {
|
|
117
|
+
newSelected.add(key);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
setSelectedAccountIds(newSelected);
|
|
121
|
+
|
|
122
|
+
const accountUsages: AccountUsage[] = selectableAccounts
|
|
123
|
+
.filter((acc) => newSelected.has(String(acc.label_id)))
|
|
124
|
+
.map((acc) => ({
|
|
125
|
+
label_id: acc.label_id,
|
|
126
|
+
amount: parseFloat(acc.balance)
|
|
127
|
+
}));
|
|
128
|
+
|
|
129
|
+
await payWithLoyaltyBalance({ account_usages: accountUsages });
|
|
130
|
+
} finally {
|
|
131
|
+
setIsLoading(false);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const handleToggleLegacyAll = async () => {
|
|
136
|
+
if (isLoading) return;
|
|
137
|
+
setIsLoading(true);
|
|
138
|
+
|
|
139
|
+
try {
|
|
140
|
+
if (isLoyaltyBalanceUsed) {
|
|
141
|
+
if (hasLegacyGrouped) {
|
|
142
|
+
const accountUsages: AccountUsage[] = loyaltyBalances.map((item) => ({
|
|
143
|
+
label_id: item.label_id,
|
|
144
|
+
amount: 0
|
|
145
|
+
}));
|
|
146
|
+
await payWithLoyaltyBalance({ account_usages: accountUsages });
|
|
147
|
+
setSelectedLabels({});
|
|
148
|
+
} else {
|
|
149
|
+
await payWithLoyaltyBalance('0');
|
|
150
|
+
}
|
|
151
|
+
} else {
|
|
152
|
+
if (hasLegacyGrouped) {
|
|
153
|
+
const accountUsages: AccountUsage[] = loyaltyBalances.map((item) => ({
|
|
154
|
+
label_id: item.label_id,
|
|
155
|
+
amount: parseFloat(item.balance)
|
|
156
|
+
}));
|
|
157
|
+
await payWithLoyaltyBalance({ account_usages: accountUsages });
|
|
158
|
+
const allSelected = loyaltyBalances.reduce(
|
|
159
|
+
(acc, item) => ({ ...acc, [String(item.label_id)]: true }),
|
|
160
|
+
{} as Record<string, boolean>
|
|
161
|
+
);
|
|
162
|
+
setSelectedLabels(allSelected);
|
|
163
|
+
} else {
|
|
164
|
+
await payWithLoyaltyBalance(loyaltyBalance);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
} finally {
|
|
168
|
+
setIsLoading(false);
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
const handleToggleLegacyLabel = async (item: LoyaltyBalanceItem) => {
|
|
173
|
+
if (isLoading) return;
|
|
174
|
+
setIsLoading(true);
|
|
175
|
+
|
|
176
|
+
try {
|
|
177
|
+
const key = String(item.label_id);
|
|
178
|
+
const isCurrentlySelected = selectedLabels[key] ?? false;
|
|
179
|
+
const newSelectedLabels = {
|
|
180
|
+
...selectedLabels,
|
|
181
|
+
[key]: !isCurrentlySelected
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
const accountUsages: AccountUsage[] = loyaltyBalances.map((b) => ({
|
|
185
|
+
label_id: b.label_id,
|
|
186
|
+
amount: newSelectedLabels[String(b.label_id)]
|
|
187
|
+
? parseFloat(b.balance)
|
|
188
|
+
: 0
|
|
189
|
+
}));
|
|
190
|
+
|
|
191
|
+
await payWithLoyaltyBalance({ account_usages: accountUsages });
|
|
192
|
+
setSelectedLabels(newSelectedLabels);
|
|
193
|
+
} finally {
|
|
194
|
+
setIsLoading(false);
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
// --- Early returns ---
|
|
199
|
+
if (preOrder?.is_guest) {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (isLoyaltyBalanceLoading) {
|
|
204
|
+
return (
|
|
205
|
+
<div className="mb-3 px-4 py-3 xs:px-0">
|
|
206
|
+
<LoaderSpinner />
|
|
207
|
+
</div>
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (!hasAccounts && !hasLegacyGrouped && !hasLegacySingle) {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// --- Accounts mode render (new: from page_context.accounts) ---
|
|
216
|
+
if (hasAccounts) {
|
|
217
|
+
return (
|
|
218
|
+
<div
|
|
219
|
+
className={twMerge(
|
|
220
|
+
'flex flex-col w-full mb-4 border border-solid border-gray-400 px-0 md:p-4',
|
|
221
|
+
isPayLoading && 'pointer-events-none opacity-30'
|
|
222
|
+
)}
|
|
223
|
+
>
|
|
224
|
+
{selectableAccounts.map((account) => {
|
|
225
|
+
const isSelected = selectedAccountIds.has(String(account.label_id));
|
|
226
|
+
|
|
227
|
+
return (
|
|
228
|
+
<div
|
|
229
|
+
key={String(account.label_id) ?? 'default'}
|
|
230
|
+
className="mb-3 flex w-full items-center"
|
|
231
|
+
>
|
|
232
|
+
<button onClick={() => handleToggleAccount(account)}>
|
|
233
|
+
<span
|
|
234
|
+
className={clsx(
|
|
235
|
+
'flex h-5 w-5 items-center justify-center rounded border border-solid border-primary',
|
|
236
|
+
isSelected ? 'bg-primary' : 'bg-white'
|
|
237
|
+
)}
|
|
238
|
+
>
|
|
239
|
+
<Icon
|
|
240
|
+
name={isSelected ? 'check' : ''}
|
|
241
|
+
size={10}
|
|
242
|
+
className={clsx({ 'text-white': isSelected })}
|
|
243
|
+
/>
|
|
244
|
+
</span>
|
|
245
|
+
</button>
|
|
246
|
+
|
|
247
|
+
<div className="w-full pl-4 rtl:pr-4">
|
|
248
|
+
<p
|
|
249
|
+
className="cursor-pointer text-sm"
|
|
250
|
+
onClick={() => handleToggleAccount(account)}
|
|
251
|
+
>
|
|
252
|
+
{account.label ??
|
|
253
|
+
t('checkout.payment.store_credit.use_my_store_credits')}
|
|
254
|
+
</p>
|
|
255
|
+
<p className="flex text-sm text-[#606060]">
|
|
256
|
+
{t('checkout.payment.store_credit.available_balance')}:
|
|
257
|
+
<Price
|
|
258
|
+
value={account.balance}
|
|
259
|
+
currencyCode={
|
|
260
|
+
account.currency?.toUpperCase() ||
|
|
261
|
+
preOrder?.currency_type_label
|
|
262
|
+
}
|
|
263
|
+
className="pe-1 font-bold"
|
|
264
|
+
/>
|
|
265
|
+
</p>
|
|
266
|
+
</div>
|
|
267
|
+
</div>
|
|
268
|
+
);
|
|
269
|
+
})}
|
|
270
|
+
|
|
271
|
+
{isLoyaltyBalanceUsed && parseFloat(preOrder?.unpaid_amount) > 0 && (
|
|
272
|
+
<p className="my-4 text-[15px] font-light italic text-[#707070] max-xs:text-xs">
|
|
273
|
+
<Trans
|
|
274
|
+
i18nKey="checkout.payment.store_credit.insufficient_balance"
|
|
275
|
+
components={{
|
|
276
|
+
Amount: (
|
|
277
|
+
<div className="inline-flex">
|
|
278
|
+
<Price
|
|
279
|
+
value={preOrder?.unpaid_amount}
|
|
280
|
+
currencyCode={preOrder?.currency_type_label}
|
|
281
|
+
className="text-primary"
|
|
282
|
+
/>
|
|
283
|
+
</div>
|
|
284
|
+
)
|
|
285
|
+
}}
|
|
286
|
+
/>
|
|
287
|
+
</p>
|
|
288
|
+
)}
|
|
289
|
+
</div>
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// --- Legacy grouped mode render (from Redux loyaltyBalances) ---
|
|
294
|
+
if (hasLegacyGrouped) {
|
|
295
|
+
return (
|
|
296
|
+
<div
|
|
297
|
+
className={twMerge(
|
|
298
|
+
'flex flex-col w-full mb-4 border border-solid border-gray-400 px-0 md:p-4',
|
|
299
|
+
isPayLoading && 'pointer-events-none opacity-30'
|
|
300
|
+
)}
|
|
301
|
+
>
|
|
302
|
+
<div className="flex w-full items-center mb-3">
|
|
303
|
+
<button onClick={handleToggleLegacyAll}>
|
|
304
|
+
<span
|
|
305
|
+
className={clsx(
|
|
306
|
+
'flex h-5 w-5 items-center justify-center rounded border border-solid border-primary',
|
|
307
|
+
isLoyaltyBalanceUsed ? 'bg-primary' : 'bg-white'
|
|
308
|
+
)}
|
|
309
|
+
>
|
|
310
|
+
<Icon
|
|
311
|
+
name={isLoyaltyBalanceUsed ? 'check' : ''}
|
|
312
|
+
size={10}
|
|
313
|
+
className={clsx({ 'text-white': isLoyaltyBalanceUsed })}
|
|
314
|
+
/>
|
|
315
|
+
</span>
|
|
316
|
+
</button>
|
|
317
|
+
|
|
318
|
+
<div className="w-full pl-4">
|
|
319
|
+
<p
|
|
320
|
+
className="cursor-pointer text-sm"
|
|
321
|
+
onClick={handleToggleLegacyAll}
|
|
322
|
+
>
|
|
323
|
+
{t('checkout.payment.store_credit.use_my_store_credits')}
|
|
324
|
+
</p>
|
|
325
|
+
<p className="flex text-sm text-[#606060]">
|
|
326
|
+
{t('checkout.payment.store_credit.total_balance')}:
|
|
327
|
+
<Price
|
|
328
|
+
value={String(totalGroupedBalance)}
|
|
329
|
+
currencyCode={preOrder?.currency_type_label}
|
|
330
|
+
className="pe-1 font-bold"
|
|
331
|
+
/>
|
|
332
|
+
</p>
|
|
333
|
+
</div>
|
|
334
|
+
</div>
|
|
335
|
+
|
|
336
|
+
<div className="ml-9 flex flex-col gap-2">
|
|
337
|
+
{loyaltyBalances.map((item) => {
|
|
338
|
+
const isSelected = selectedLabels[String(item.label_id)] ?? false;
|
|
339
|
+
return (
|
|
340
|
+
<div
|
|
341
|
+
key={String(item.label_id)}
|
|
342
|
+
className="flex items-center border border-solid border-gray-200 rounded p-2"
|
|
343
|
+
>
|
|
344
|
+
<button onClick={() => handleToggleLegacyLabel(item)}>
|
|
345
|
+
<span
|
|
346
|
+
className={clsx(
|
|
347
|
+
'flex h-4 w-4 items-center justify-center rounded border border-solid border-primary',
|
|
348
|
+
isSelected ? 'bg-primary' : 'bg-white'
|
|
349
|
+
)}
|
|
350
|
+
>
|
|
351
|
+
<Icon
|
|
352
|
+
name={isSelected ? 'check' : ''}
|
|
353
|
+
size={8}
|
|
354
|
+
className={clsx({ 'text-white': isSelected })}
|
|
355
|
+
/>
|
|
356
|
+
</span>
|
|
357
|
+
</button>
|
|
358
|
+
<div className="flex w-full items-center justify-between pl-3">
|
|
359
|
+
<span
|
|
360
|
+
className="cursor-pointer text-sm"
|
|
361
|
+
onClick={() => handleToggleLegacyLabel(item)}
|
|
362
|
+
>
|
|
363
|
+
{item.label ??
|
|
364
|
+
t('checkout.payment.store_credit.use_my_store_credits')}
|
|
365
|
+
</span>
|
|
366
|
+
<Price
|
|
367
|
+
value={item.balance}
|
|
368
|
+
currencyCode={
|
|
369
|
+
item.currency?.toUpperCase() ||
|
|
370
|
+
preOrder?.currency_type_label
|
|
371
|
+
}
|
|
372
|
+
className="text-sm font-bold"
|
|
373
|
+
/>
|
|
374
|
+
</div>
|
|
375
|
+
</div>
|
|
376
|
+
);
|
|
377
|
+
})}
|
|
378
|
+
</div>
|
|
379
|
+
|
|
380
|
+
{isLoyaltyBalanceUsed && parseFloat(preOrder?.unpaid_amount) > 0 && (
|
|
381
|
+
<p className="my-4 text-[15px] font-light italic text-[#707070] max-xs:text-xs">
|
|
382
|
+
<Trans
|
|
383
|
+
i18nKey="checkout.payment.store_credit.insufficient_balance"
|
|
384
|
+
components={{
|
|
385
|
+
Amount: (
|
|
386
|
+
<div className="inline-flex">
|
|
387
|
+
<Price
|
|
388
|
+
value={preOrder?.unpaid_amount}
|
|
389
|
+
currencyCode={preOrder?.currency_type_label}
|
|
390
|
+
className="text-primary"
|
|
391
|
+
/>
|
|
392
|
+
</div>
|
|
393
|
+
)
|
|
394
|
+
}}
|
|
395
|
+
/>
|
|
396
|
+
</p>
|
|
397
|
+
)}
|
|
398
|
+
</div>
|
|
399
|
+
);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// --- Legacy single balance mode render (from Redux loyaltyBalance) ---
|
|
403
|
+
return (
|
|
404
|
+
<div
|
|
405
|
+
className={twMerge(
|
|
406
|
+
'flex flex-col w-full mb-4 border border-solid border-gray-400 px-0 md:p-4',
|
|
407
|
+
isPayLoading && 'pointer-events-none opacity-30'
|
|
408
|
+
)}
|
|
409
|
+
>
|
|
410
|
+
<div className="flex w-full items-center">
|
|
411
|
+
<button onClick={handleToggleLegacyAll}>
|
|
412
|
+
<span
|
|
413
|
+
className={clsx(
|
|
414
|
+
'flex h-5 w-5 items-center justify-center rounded border border-solid border-primary',
|
|
415
|
+
isLoyaltyBalanceUsed ? 'bg-primary' : 'bg-white'
|
|
416
|
+
)}
|
|
417
|
+
>
|
|
418
|
+
<Icon
|
|
419
|
+
name={isLoyaltyBalanceUsed ? 'check' : ''}
|
|
420
|
+
size={10}
|
|
421
|
+
className={clsx({ 'text-white': isLoyaltyBalanceUsed })}
|
|
422
|
+
/>
|
|
423
|
+
</span>
|
|
424
|
+
</button>
|
|
425
|
+
|
|
426
|
+
<div className="w-full pl-4">
|
|
427
|
+
<p
|
|
428
|
+
className="cursor-pointer text-sm"
|
|
429
|
+
onClick={handleToggleLegacyAll}
|
|
430
|
+
>
|
|
431
|
+
{t('checkout.payment.store_credit.use_my_store_credits')}
|
|
432
|
+
</p>
|
|
433
|
+
<p className="flex text-sm text-[#606060]">
|
|
434
|
+
{t('checkout.payment.store_credit.available_balance')}:
|
|
435
|
+
<Price
|
|
436
|
+
value={loyaltyBalance}
|
|
437
|
+
currencyCode={preOrder?.currency_type_label}
|
|
438
|
+
className="pe-1 font-bold"
|
|
439
|
+
/>
|
|
440
|
+
</p>
|
|
441
|
+
</div>
|
|
442
|
+
</div>
|
|
443
|
+
|
|
444
|
+
{isLoyaltyBalanceUsed && parseFloat(preOrder?.unpaid_amount) > 0 && (
|
|
445
|
+
<p className="my-4 text-[15px] font-light italic text-[#707070] max-xs:text-xs">
|
|
446
|
+
<Trans
|
|
447
|
+
i18nKey="checkout.payment.store_credit.insufficient_balance"
|
|
448
|
+
components={{
|
|
449
|
+
Amount: (
|
|
450
|
+
<div className="inline-flex">
|
|
451
|
+
<Price
|
|
452
|
+
value={preOrder?.unpaid_amount}
|
|
453
|
+
currencyCode={preOrder?.currency_type_label}
|
|
454
|
+
className="text-primary"
|
|
455
|
+
/>
|
|
456
|
+
</div>
|
|
457
|
+
)
|
|
458
|
+
}}
|
|
459
|
+
/>
|
|
460
|
+
</p>
|
|
461
|
+
)}
|
|
462
|
+
</div>
|
|
463
|
+
);
|
|
464
|
+
};
|
|
@@ -44,7 +44,7 @@ const PaymentOptionButtons = () => {
|
|
|
44
44
|
{displayedPaymentOptions.map((option) => (
|
|
45
45
|
<label
|
|
46
46
|
key={`payment-option-${option.pk}`}
|
|
47
|
-
className="border
|
|
47
|
+
className="border px-4 py-3 mt-3 flex h-12"
|
|
48
48
|
onClick={scrollToTop}
|
|
49
49
|
>
|
|
50
50
|
<Radio
|
|
@@ -69,10 +69,10 @@ const PaymentOptionButtons = () => {
|
|
|
69
69
|
onClick={() => onClickHandler(option)}
|
|
70
70
|
className={clsx(
|
|
71
71
|
'flex items-center justify-center border-r border-b border-solid',
|
|
72
|
-
'border-gray-400 text-xs uppercase text-black-800
|
|
73
|
-
'bg-white h-11 px-5 transition-colors sm:h-15 sm:px-8 sm:py-8 hover:text-secondary',
|
|
72
|
+
'border-gray-400 text-xs uppercase text-black-800 font-medium',
|
|
73
|
+
'text-opacity-60 bg-white h-11 px-5 transition-colors sm:h-15 sm:px-8 sm:py-8 hover:text-secondary',
|
|
74
74
|
{
|
|
75
|
-
'text-
|
|
75
|
+
'text-opacity-100 border-b-transparent':
|
|
76
76
|
preOrder?.payment_option?.pk === option.pk
|
|
77
77
|
}
|
|
78
78
|
)}
|
|
@@ -85,7 +85,7 @@ const AddressBox = ({
|
|
|
85
85
|
};
|
|
86
86
|
|
|
87
87
|
const onSubmit = (data) => {
|
|
88
|
-
editAddress({ ...data, invalidateTag: '
|
|
88
|
+
editAddress({ ...data, invalidateTag: 'Checkout' })
|
|
89
89
|
.unwrap()
|
|
90
90
|
.then((editAddressResponse) => {
|
|
91
91
|
handleAddressClick(addressType, editAddressResponse);
|
|
@@ -96,7 +96,7 @@ const AddressBox = ({
|
|
|
96
96
|
};
|
|
97
97
|
|
|
98
98
|
const handleRemoveAddress = async (addressPk: number) => {
|
|
99
|
-
await removeAddress({ id: addressPk, invalidateTag: '
|
|
99
|
+
await removeAddress({ id: addressPk, invalidateTag: 'Checkout' });
|
|
100
100
|
setRemoveAddressModalOpen(false);
|
|
101
101
|
dispatch(resetCheckoutState());
|
|
102
102
|
|
|
@@ -130,7 +130,7 @@ const AddressBox = ({
|
|
|
130
130
|
onClick={() => handleAddressClick(addressType, address)}
|
|
131
131
|
key={address.pk}
|
|
132
132
|
className={clsx(
|
|
133
|
-
'cursor-pointer relative w-full border
|
|
133
|
+
'cursor-pointer relative w-full border shadow p-4 min-h-[8rem]',
|
|
134
134
|
"hover:after:content-[''] hover:after:border-4 hover:after:opacity-30 hover:after:transition-opacity",
|
|
135
135
|
'after:border-secondary-400 after:absolute after:inset-0 after:duration-150 after:-z-10',
|
|
136
136
|
{
|
|
@@ -167,8 +167,11 @@ const AddressBox = ({
|
|
|
167
167
|
<div className="text-xs flex justify-between">
|
|
168
168
|
<Button
|
|
169
169
|
appearance="ghost"
|
|
170
|
-
className="italic underline hover:text-secondary-500 hover
|
|
171
|
-
onClick={() =>
|
|
170
|
+
className="italic underline hover:text-secondary-500 hover:!bg-white hover:!border-white p-0 h-auto"
|
|
171
|
+
onClick={(e) => {
|
|
172
|
+
e.stopPropagation();
|
|
173
|
+
setIsEditAddressModalOpen(true);
|
|
174
|
+
}}
|
|
172
175
|
data-testid="checkout-address-edit"
|
|
173
176
|
>
|
|
174
177
|
{t('checkout.address.box.edit')}
|
|
@@ -180,21 +183,26 @@ const AddressBox = ({
|
|
|
180
183
|
setOpen={setIsEditAddressModalOpen}
|
|
181
184
|
className="w-full sm:w-[28rem] max-h-[90vh] overflow-y-auto"
|
|
182
185
|
>
|
|
183
|
-
<
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
186
|
+
<div onClick={(e) => e.stopPropagation()}>
|
|
187
|
+
<AddressForm
|
|
188
|
+
data={{
|
|
189
|
+
...address,
|
|
190
|
+
country: address.country?.pk,
|
|
191
|
+
city: address.city?.pk,
|
|
192
|
+
township: address.township?.pk,
|
|
193
|
+
district: address.district?.pk
|
|
194
|
+
}}
|
|
195
|
+
onSubmit={onSubmit}
|
|
196
|
+
/>
|
|
197
|
+
</div>
|
|
193
198
|
</Modal>
|
|
194
199
|
<Button
|
|
195
200
|
appearance="ghost"
|
|
196
|
-
className="italic underline hover:text-secondary-500 hover
|
|
197
|
-
onClick={() =>
|
|
201
|
+
className="italic underline hover:text-secondary-500 hover:!bg-white hover:!border-white p-0 h-auto"
|
|
202
|
+
onClick={(e) => {
|
|
203
|
+
e.stopPropagation();
|
|
204
|
+
setRemoveAddressModalOpen(true);
|
|
205
|
+
}}
|
|
198
206
|
data-testid="checkout-address-remove"
|
|
199
207
|
>
|
|
200
208
|
{t('checkout.address.box.remove')}
|
|
@@ -207,14 +215,18 @@ const AddressBox = ({
|
|
|
207
215
|
setOpen={setRemoveAddressModalOpen}
|
|
208
216
|
showCloseButton={false}
|
|
209
217
|
>
|
|
210
|
-
<div
|
|
218
|
+
<div
|
|
219
|
+
className="text-center px-6 py-10"
|
|
220
|
+
onClick={(e) => e.stopPropagation()}
|
|
221
|
+
>
|
|
211
222
|
<p className="mb-4">
|
|
212
223
|
{t('account.address_book.modal.delete_description')}
|
|
213
224
|
</p>
|
|
214
225
|
<div className="space-x-3 flex justify-center">
|
|
215
226
|
<Button
|
|
216
227
|
appearance="outlined"
|
|
217
|
-
onClick={() => {
|
|
228
|
+
onClick={(e) => {
|
|
229
|
+
e.stopPropagation();
|
|
218
230
|
setRemoveAddressModalOpen(false);
|
|
219
231
|
}}
|
|
220
232
|
data-testid="remove-address-modal-cancel"
|
|
@@ -224,7 +236,8 @@ const AddressBox = ({
|
|
|
224
236
|
<Button
|
|
225
237
|
appearance="filled"
|
|
226
238
|
disabled={removeAddressLoading}
|
|
227
|
-
onClick={() => {
|
|
239
|
+
onClick={(e) => {
|
|
240
|
+
e.stopPropagation();
|
|
228
241
|
handleRemoveAddress(address.pk);
|
|
229
242
|
}}
|
|
230
243
|
className={
|
|
@@ -77,7 +77,7 @@ const Addresses = () => {
|
|
|
77
77
|
}, [billing_and_shipping_same]);
|
|
78
78
|
|
|
79
79
|
const onSubmit = (data) => {
|
|
80
|
-
addAddress({ ...data, invalidateTag: '
|
|
80
|
+
addAddress({ ...data, invalidateTag: 'Checkout' })
|
|
81
81
|
.unwrap()
|
|
82
82
|
.then((addAddressResponse) => {
|
|
83
83
|
if (addressList.length === 0) {
|
|
@@ -153,7 +153,7 @@ const Addresses = () => {
|
|
|
153
153
|
role="button"
|
|
154
154
|
onClick={() => setIsModalOpen(true)}
|
|
155
155
|
className={clsx(
|
|
156
|
-
'relative cursor-pointer w-full min-h-[8rem] border
|
|
156
|
+
'relative cursor-pointer w-full min-h-[8rem] border shadow p-4',
|
|
157
157
|
"hover:after:content-[''] hover:after:border-4 hover:after:opacity-30 hover:after:transition-opacity",
|
|
158
158
|
'after:border-secondary-400 after:absolute after:inset-0 after:opacity-0 after:duration-150 after:-z-10',
|
|
159
159
|
{
|
|
@@ -8,6 +8,7 @@ import PluginModule, { Component } from '@akinon/next/components/plugin-module';
|
|
|
8
8
|
import { twMerge } from 'tailwind-merge';
|
|
9
9
|
import { Image } from '@akinon/next/components/image';
|
|
10
10
|
import { Trans } from '@akinon/next/components/trans';
|
|
11
|
+
import { StoreCredits } from './steps/payment/options/store-credit';
|
|
11
12
|
|
|
12
13
|
export const Summary = () => {
|
|
13
14
|
const { t } = useLocalization();
|
|
@@ -38,6 +39,7 @@ export const Summary = () => {
|
|
|
38
39
|
'flex flex-col w-full mb-4 border border-solid border-gray-400'
|
|
39
40
|
}}
|
|
40
41
|
/>
|
|
42
|
+
<StoreCredits />
|
|
41
43
|
<div className="flex flex-col w-full border border-solid border-gray-400">
|
|
42
44
|
<div className="flex justify-between items-center flex-row border-b border-solid border-gray-400 px-4 py-2 sm:px-5 sm:py-4 sm:min-h-15">
|
|
43
45
|
<span className="text-black-800 text-xl font-light sm:text-2xl">
|
|
@@ -118,6 +120,14 @@ export const Summary = () => {
|
|
|
118
120
|
<Price value={preOrder?.shipping_amount} />
|
|
119
121
|
</span>
|
|
120
122
|
</div>
|
|
123
|
+
{parseFloat(preOrder?.loyalty_money) > 0 && (
|
|
124
|
+
<div className="flex items-center justify-between w-full text-xs text-black-800 py-1 px-4 sm:px-5">
|
|
125
|
+
<span>{t('checkout.summary.loyalty_money_total')}</span>
|
|
126
|
+
<span>
|
|
127
|
+
<Price value={preOrder?.loyalty_money} />
|
|
128
|
+
</span>
|
|
129
|
+
</div>
|
|
130
|
+
)}
|
|
121
131
|
<div className="flex items-center justify-between w-full text-xs text-black-800 py-1 px-4 sm:px-5">
|
|
122
132
|
<span>{t('checkout.summary.discounts_total')}</span>
|
|
123
133
|
<span>
|
|
@@ -149,7 +159,7 @@ export const Summary = () => {
|
|
|
149
159
|
</div>
|
|
150
160
|
</div>
|
|
151
161
|
<div className="flex flex-col py-4 px-4 text-black-800 text-xs sm:px-5">
|
|
152
|
-
<div className="w-full overflow-hidden
|
|
162
|
+
<div className="w-full overflow-hidden overflow-ellipsis mb-1 last:mb-0">
|
|
153
163
|
<Trans
|
|
154
164
|
i18nKey="checkout.summary.info"
|
|
155
165
|
components={{
|
|
@@ -162,7 +172,7 @@ export const Summary = () => {
|
|
|
162
172
|
}}
|
|
163
173
|
/>
|
|
164
174
|
</div>
|
|
165
|
-
<div className="w-full overflow-hidden
|
|
175
|
+
<div className="w-full overflow-hidden overflow-ellipsis mb-1 last:mb-0">
|
|
166
176
|
{preOrder.shipping_address?.line}{' '}
|
|
167
177
|
{preOrder.shipping_address?.postcode}{' '}
|
|
168
178
|
{preOrder.shipping_address?.district && (
|
|
@@ -123,14 +123,14 @@ export const FindInStore = ({ productPk, productName, variants }) => {
|
|
|
123
123
|
className="w-full"
|
|
124
124
|
options={retailStoreOptions}
|
|
125
125
|
{...register('city_id')}
|
|
126
|
-
error={errors.city_id}
|
|
126
|
+
error={errors.city_id as any}
|
|
127
127
|
/>
|
|
128
128
|
{sizeOptions.length > 1 && (
|
|
129
129
|
<Select
|
|
130
130
|
className="w-full"
|
|
131
131
|
options={sizeOptions}
|
|
132
132
|
{...register('size')}
|
|
133
|
-
error={errors.size}
|
|
133
|
+
error={errors.size as any}
|
|
134
134
|
/>
|
|
135
135
|
)}
|
|
136
136
|
</div>
|