From 2655eee2d9d6cb3a16a469ce87e421fd3f15eae3 Mon Sep 17 00:00:00 2001 From: Artur Tagisow Date: Thu, 5 May 2022 12:05:16 +0200 Subject: [PATCH 01/19] refactor: add new myaccount layout with routes M2-544 --- packages/theme/components/AppHeader.vue | 2 +- .../theme/components/BottomNavigation.vue | 2 +- packages/theme/modules/catalog/index.ts | 5 +- .../customer/components/RoutePlaceholder.vue | 3 + packages/theme/modules/customer/index.ts | 83 +++++++- .../customer/pages/AddressesDetails.vue | 4 +- .../modules/customer/pages/MyAccount.vue | 195 ------------------ .../customer/pages/MyAccount/MyAccount.vue | 118 +++++++++++ .../pages/MyAccount/useSidebarLinkGroups.ts | 62 ++++++ 9 files changed, 262 insertions(+), 212 deletions(-) create mode 100644 packages/theme/modules/customer/components/RoutePlaceholder.vue delete mode 100644 packages/theme/modules/customer/pages/MyAccount.vue create mode 100644 packages/theme/modules/customer/pages/MyAccount/MyAccount.vue create mode 100644 packages/theme/modules/customer/pages/MyAccount/useSidebarLinkGroups.ts diff --git a/packages/theme/components/AppHeader.vue b/packages/theme/components/AppHeader.vue index 1b9d85599..28ce31e78 100644 --- a/packages/theme/components/AppHeader.vue +++ b/packages/theme/components/AppHeader.vue @@ -168,7 +168,7 @@ export default defineComponent({ const handleAccountClick = async () => { if (isAuthenticated.value) { - await router.push(`${app.localePath('/my-account/my-profile')}`); + await router.push(app.localeRoute({ name: 'customer-my-profile' })); } else { toggleLoginModal(); } diff --git a/packages/theme/components/BottomNavigation.vue b/packages/theme/components/BottomNavigation.vue index 41bad4bb1..8ea5eaf48 100644 --- a/packages/theme/components/BottomNavigation.vue +++ b/packages/theme/components/BottomNavigation.vue @@ -106,7 +106,7 @@ export default defineComponent({ const { app } = useContext(); const handleAccountClick = async () => { if (isAuthenticated.value) { - await router.push(`${app.localePath('/my-account')}`); + await router.push(app.localeRoute({ name: 'customer' })); } else { toggleLoginModal(); } diff --git a/packages/theme/modules/catalog/index.ts b/packages/theme/modules/catalog/index.ts index 2b6e7d439..1edc01a0f 100644 --- a/packages/theme/modules/catalog/index.ts +++ b/packages/theme/modules/catalog/index.ts @@ -1,11 +1,12 @@ import path from 'node:path'; import url from 'node:url'; -import { Module } from '@nuxt/types'; +import type { Module } from '@nuxt/types'; +import type { NuxtRouteConfig } from '@nuxt/types/config/router'; const nuxtModule : Module = function categoryModule() { const themeDir = path.dirname(url.fileURLToPath(import.meta.url)); - this.extendRoutes((routes) => { + this.extendRoutes((routes: NuxtRouteConfig[]) => { routes.unshift({ name: 'category', path: '/c/:slug_1/:slug_2?/:slug_3?/:slug_4?/:slug_5?', diff --git a/packages/theme/modules/customer/components/RoutePlaceholder.vue b/packages/theme/modules/customer/components/RoutePlaceholder.vue new file mode 100644 index 000000000..0354ff78d --- /dev/null +++ b/packages/theme/modules/customer/components/RoutePlaceholder.vue @@ -0,0 +1,3 @@ + diff --git a/packages/theme/modules/customer/index.ts b/packages/theme/modules/customer/index.ts index b25145512..5923f3f38 100644 --- a/packages/theme/modules/customer/index.ts +++ b/packages/theme/modules/customer/index.ts @@ -1,19 +1,80 @@ import path from 'node:path'; import url from 'node:url'; import { Module } from '@nuxt/types'; +import { NuxtRouteConfig } from '@nuxt/types/config/router'; -const nuxtModule : Module = function customerModule() { - this.extendRoutes((routes) => { - const component = path.resolve( - path.dirname(url.fileURLToPath(import.meta.url)), - 'pages/MyAccount.vue', - ); +const moduleDir = path.dirname(url.fileURLToPath(import.meta.url)); + +const stub = path.resolve(moduleDir, 'components/RoutePlaceholder.vue'); - routes.unshift({ - name: 'my-account', - path: '/my-account/:pageName?', - component, - }); +const moduleRoutes : NuxtRouteConfig = { + name: 'customer', + path: '/customer', + component: path.resolve(moduleDir, 'pages/MyAccount/MyAccount.vue'), + meta: { + titleLabel: 'My Account', + }, + children: [ + { + name: 'customer-my-profile', + path: 'my-profile', + // component: path.resolve(moduleDir, 'pages/MyProfile.vue'), + component: stub, + meta: { + titleLabel: 'My profile', + }, + }, + { + name: 'customer-addresses-details', + path: 'addresses-details', + // component: path.resolve(moduleDir, 'pages/AddressesDetails.vue'), + component: stub, + meta: { + titleLabel: 'Addresses details', + }, + }, + { + name: 'customer-my-newsletter', + path: 'my-newsletter', + // component: path.resolve(moduleDir, 'pages/MyNewsletter.vue'), + component: stub, + meta: { + titleLabel: 'My newsletter', + }, + }, + { + name: 'customer-my-wishlist', + path: 'my-wishlist', + // component: path.resolve(moduleDir, 'pages/MyWishlist.vue'), + component: stub, + meta: { + titleLabel: 'My wishlist', + }, + }, + { + name: 'customer-order-history', + path: 'order-history', + // component: path.resolve(moduleDir, 'pages/OrderHistory.vue'), + component: stub, + meta: { + titleLabel: 'Order history', + }, + }, + { + name: 'customer-my-reviews', + path: 'my-reviews', + // component: path.resolve(moduleDir, 'pages/MyReviews.vue'), + component: stub, + meta: { + titleLabel: 'My reviews', + }, + }, + ], +}; + +const nuxtModule : Module = function customerModule() { + this.extendRoutes((routes: NuxtRouteConfig[]) => { + routes.unshift(moduleRoutes); }); }; diff --git a/packages/theme/modules/customer/pages/AddressesDetails.vue b/packages/theme/modules/customer/pages/AddressesDetails.vue index fc7ed3503..b4d445591 100644 --- a/packages/theme/modules/customer/pages/AddressesDetails.vue +++ b/packages/theme/modules/customer/pages/AddressesDetails.vue @@ -134,7 +134,7 @@ export default defineComponent({ await router.push( `${app.localePath({ - path: `/my-account/${getTranslatedUrlAddress('Addresses details')}`, + path: `/customer/${getTranslatedUrlAddress('Addresses details')}`, query: { id: addressId }, })}`, ); @@ -154,7 +154,7 @@ export default defineComponent({ const data = await actionMethod({ address: form }); await router.push( app.localePath( - `/my-account/${getTranslatedUrlAddress('Addresses details')}`, + `/customer/${getTranslatedUrlAddress('Addresses details')}`, ), ); userAddresses.value = userAddressesGetters.getAddresses(data); diff --git a/packages/theme/modules/customer/pages/MyAccount.vue b/packages/theme/modules/customer/pages/MyAccount.vue deleted file mode 100644 index 3e2af4a2f..000000000 --- a/packages/theme/modules/customer/pages/MyAccount.vue +++ /dev/null @@ -1,195 +0,0 @@ - - - - diff --git a/packages/theme/modules/customer/pages/MyAccount/MyAccount.vue b/packages/theme/modules/customer/pages/MyAccount/MyAccount.vue new file mode 100644 index 000000000..0dd281acd --- /dev/null +++ b/packages/theme/modules/customer/pages/MyAccount/MyAccount.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/packages/theme/modules/customer/pages/MyAccount/useSidebarLinkGroups.ts b/packages/theme/modules/customer/pages/MyAccount/useSidebarLinkGroups.ts new file mode 100644 index 000000000..7f3032b2e --- /dev/null +++ b/packages/theme/modules/customer/pages/MyAccount/useSidebarLinkGroups.ts @@ -0,0 +1,62 @@ +import type { RawLocation } from 'vue-router'; +import { useRouter, useContext } from '@nuxtjs/composition-api'; +import { useUser } from '~/modules/customer/composables/useUser'; +import { useCart } from '~/modules/checkout/composables/useCart'; + +type LinkGroup = { title: string, items: LinkGroupItem[] }; +type LinkGroupItem = { label: string, link?: RawLocation, listeners?: Record (Promise | void)> }; + +export const useSidebarLinkGroups = () => { + const { localeRoute } = useContext(); + const { logout } = useUser(); + const { clear } = useCart(); + + const router = useRouter(); + const sidebarLinkGroups : LinkGroup[] = [ + { + title: 'Personal details', + items: [ + { + label: 'My profile', + link: { name: 'customer-my-profile' }, + }, + { + label: 'Addresses details', + link: { name: 'customer-addresses-details' }, + }, + { + label: 'My newsletter', + link: { name: 'customer-my-newsletter' }, + }, + { + label: 'My wishlist', + link: { name: 'customer-my-wishlist' }, + }, + ], + }, + { + title: 'Order details', + items: [ + { + label: 'Order history', + link: { name: 'customer-order-history' }, + }, + { + label: 'My reviews', + link: { name: 'customer-my-reviews' }, + }, + { + label: 'Log out', + listeners: { + click: async () => { + await Promise.all([logout({}), clear({})]); + await router.push(localeRoute({ name: 'home' })); + }, + }, + }, + ], + }, + ]; + + return { sidebarLinkGroups }; +}; From 251979407449b5b22a33f891bdd7f62a57cce098 Mon Sep 17 00:00:00 2001 From: Artur Tagisow Date: Fri, 6 May 2022 11:46:50 +0200 Subject: [PATCH 02/19] refactor: move forms and add typings M2-546 refactor: re-add component names refactor: remove unnecessary whitespace refactor: remove unnecessary whitespace chore: remove now empty profile update form file --- packages/theme/modules/customer/index.ts | 3 +-- .../customer/pages/MyAccount/MyAccount.vue | 1 + .../pages/{ => MyProfile}/MyProfile.vue | 20 ++++++++-------- .../MyProfile}/PasswordResetForm.vue | 13 ++++++----- .../MyProfile}/ProfileUpdateForm.vue | 23 +++++++++---------- .../modules/customer/pages/MyProfile/types.ts | 11 +++++++++ 6 files changed, 41 insertions(+), 30 deletions(-) rename packages/theme/modules/customer/pages/{ => MyProfile}/MyProfile.vue (84%) rename packages/theme/modules/customer/{components => pages/MyProfile}/PasswordResetForm.vue (92%) rename packages/theme/modules/customer/{components => pages/MyProfile}/ProfileUpdateForm.vue (91%) create mode 100644 packages/theme/modules/customer/pages/MyProfile/types.ts diff --git a/packages/theme/modules/customer/index.ts b/packages/theme/modules/customer/index.ts index 5923f3f38..12da9d219 100644 --- a/packages/theme/modules/customer/index.ts +++ b/packages/theme/modules/customer/index.ts @@ -18,8 +18,7 @@ const moduleRoutes : NuxtRouteConfig = { { name: 'customer-my-profile', path: 'my-profile', - // component: path.resolve(moduleDir, 'pages/MyProfile.vue'), - component: stub, + component: path.resolve(moduleDir, 'pages/MyProfile/MyProfile.vue'), meta: { titleLabel: 'My profile', }, diff --git a/packages/theme/modules/customer/pages/MyAccount/MyAccount.vue b/packages/theme/modules/customer/pages/MyAccount/MyAccount.vue index 0dd281acd..e8b186420 100644 --- a/packages/theme/modules/customer/pages/MyAccount/MyAccount.vue +++ b/packages/theme/modules/customer/pages/MyAccount/MyAccount.vue @@ -62,6 +62,7 @@ import { import { useSidebarLinkGroups } from './useSidebarLinkGroups'; export default defineComponent({ + name: 'MyAccount', components: { SfBar, SfList, diff --git a/packages/theme/modules/customer/pages/MyProfile.vue b/packages/theme/modules/customer/pages/MyProfile/MyProfile.vue similarity index 84% rename from packages/theme/modules/customer/pages/MyProfile.vue rename to packages/theme/modules/customer/pages/MyProfile/MyProfile.vue index c742c503b..464923be5 100644 --- a/packages/theme/modules/customer/pages/MyProfile.vue +++ b/packages/theme/modules/customer/pages/MyProfile/MyProfile.vue @@ -28,7 +28,7 @@ - + + diff --git a/packages/theme/modules/customer/components/AddressForm.vue b/packages/theme/modules/customer/pages/MyAccount/AddressesDetails/AddressForm.vue similarity index 92% rename from packages/theme/modules/customer/components/AddressForm.vue rename to packages/theme/modules/customer/pages/MyAccount/AddressesDetails/AddressForm.vue index 774a7ace4..80dd4524f 100644 --- a/packages/theme/modules/customer/components/AddressForm.vue +++ b/packages/theme/modules/customer/pages/MyAccount/AddressesDetails/AddressForm.vue @@ -140,7 +140,7 @@ required :valid="!errors[0]" :error-message="$t(errors[0])" - @input="reloadCountry({ id: $event })" + @input="updateCountry({ id: $event })" > - {{ isNew ? $t('Add the address') : $t('Update the address') }} + - + + diff --git a/packages/theme/modules/customer/pages/AddressesDetails.vue b/packages/theme/modules/customer/pages/MyAccount/AddressesDetails/AddressesDetails.vue similarity index 55% rename from packages/theme/modules/customer/pages/AddressesDetails.vue rename to packages/theme/modules/customer/pages/MyAccount/AddressesDetails/AddressesDetails.vue index b4d445591..113addad3 100644 --- a/packages/theme/modules/customer/pages/AddressesDetails.vue +++ b/packages/theme/modules/customer/pages/MyAccount/AddressesDetails/AddressesDetails.vue @@ -1,37 +1,11 @@ - + + diff --git a/packages/theme/plugins/fcPlugin.ts b/packages/theme/plugins/fcPlugin.ts index 759eb20db..97813cbb1 100644 --- a/packages/theme/plugins/fcPlugin.ts +++ b/packages/theme/plugins/fcPlugin.ts @@ -1,11 +1,19 @@ import { Plugin } from '@nuxt/types'; import formatCurrency from '~/helpers/formatCurrency'; +interface FormatCurrency { + $fc(value: number | string): string; + $fc(value: number | string, options?: Intl.NumberFormatOptions): string; + $fc(value: number | string, locale?: string, options?: Intl.NumberFormatOptions): string; +} + declare module 'vue/types/vue' { - interface Vue { - $fc(value: number | string): string; - $fc(value: number | string, options?: Intl.NumberFormatOptions): string; - $fc(value: number | string, locale?: string, options?: Intl.NumberFormatOptions): string; + interface Vue extends FormatCurrency { + } +} + +declare module '@nuxt/types' { + interface Context extends FormatCurrency { } } From ed603af3b91ca95bb81c497976806bcf710fa4b3 Mon Sep 17 00:00:00 2001 From: Artur Tagisow Date: Thu, 12 May 2022 09:15:28 +0200 Subject: [PATCH 10/19] fix: remove randomness from get order id --- packages/theme/modules/checkout/getters/orderGetters.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/theme/modules/checkout/getters/orderGetters.ts b/packages/theme/modules/checkout/getters/orderGetters.ts index 3933bcd6c..a5cd63824 100644 --- a/packages/theme/modules/checkout/getters/orderGetters.ts +++ b/packages/theme/modules/checkout/getters/orderGetters.ts @@ -3,7 +3,7 @@ import { CustomerOrder, OrderItemInterface } from '~/modules/GraphQL/types'; export const getDate = (order: CustomerOrder): string => new Date(order?.order_date).toLocaleDateString() || ''; -export const getId = (order: CustomerOrder): string => String(Number.parseInt(order?.number, 10) || Math.floor(Math.random() * 100)); +export const getId = (order: CustomerOrder): string => String(Number.parseInt(order?.number, 10) || ''); export const getStatus = (order: CustomerOrder): string => order?.status || 'Failed'; From fbdf7c5ca8cbb90686253ffda271fd3c0ad2628c Mon Sep 17 00:00:00 2001 From: Artur Tagisow Date: Thu, 12 May 2022 09:25:04 +0200 Subject: [PATCH 11/19] fix: replace deprecated created_at with order_date the orderGetters in the theme already try to get order_date property but fail because the api-client middleware doesn't return that in the response payload the created_at property is deprecated in magento --- packages/api-client/src/api/customerOrders/customerOrders.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api-client/src/api/customerOrders/customerOrders.ts b/packages/api-client/src/api/customerOrders/customerOrders.ts index c93411867..7b9ed5976 100644 --- a/packages/api-client/src/api/customerOrders/customerOrders.ts +++ b/packages/api-client/src/api/customerOrders/customerOrders.ts @@ -7,7 +7,7 @@ export default gql` items { order_number id - created_at + order_date grand_total total { discounts { From aff38dec3a78d54322459b264ba8dcffff714ea2 Mon Sep 17 00:00:00 2001 From: Artur Tagisow Date: Thu, 12 May 2022 13:56:36 +0200 Subject: [PATCH 12/19] refactor: move myreviews to myaccount subroute --- packages/theme/modules/customer/index.ts | 3 +-- .../customer/pages/{ => MyAccount}/MyReviews.vue | 15 +++++++-------- 2 files changed, 8 insertions(+), 10 deletions(-) rename packages/theme/modules/customer/pages/{ => MyAccount}/MyReviews.vue (91%) diff --git a/packages/theme/modules/customer/index.ts b/packages/theme/modules/customer/index.ts index f5dd5d088..99a60e60c 100644 --- a/packages/theme/modules/customer/index.ts +++ b/packages/theme/modules/customer/index.ts @@ -70,8 +70,7 @@ const moduleRoutes : NuxtRouteConfig = { { name: 'customer-my-reviews', path: 'my-reviews', - // component: path.resolve(moduleDir, 'pages/MyReviews.vue'), - component: stub, + component: path.resolve(moduleDir, 'pages/MyAccount/MyReviews.vue'), meta: { titleLabel: 'My reviews' }, }, ], diff --git a/packages/theme/modules/customer/pages/MyReviews.vue b/packages/theme/modules/customer/pages/MyAccount/MyReviews.vue similarity index 91% rename from packages/theme/modules/customer/pages/MyReviews.vue rename to packages/theme/modules/customer/pages/MyAccount/MyReviews.vue index 5c8b0b6e5..fdffbc3b9 100644 --- a/packages/theme/modules/customer/pages/MyReviews.vue +++ b/packages/theme/modules/customer/pages/MyAccount/MyReviews.vue @@ -1,8 +1,5 @@ -