From b67baf2b1d467480e2b8727e3fe5fb8c79049948 Mon Sep 17 00:00:00 2001 From: Maciej <7597086+mdanilowicz@users.noreply.github.com> Date: Wed, 27 Nov 2024 13:11:40 +0100 Subject: [PATCH 1/4] fix(vue-demo): double opt in registration --- .changeset/funny-chicken-play.md | 5 +++++ .changeset/light-games-appear.md | 5 +++++ packages/composables/src/useUser/useUser.ts | 8 ++++++-- .../components/account/AccountRegisterForm.vue | 5 ++--- 4 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 .changeset/funny-chicken-play.md create mode 100644 .changeset/light-games-appear.md diff --git a/.changeset/funny-chicken-play.md b/.changeset/funny-chicken-play.md new file mode 100644 index 000000000..a4b6788e2 --- /dev/null +++ b/.changeset/funny-chicken-play.md @@ -0,0 +1,5 @@ +--- +"@shopware-pwa/composables-next": minor +--- + +Set user details when fully active diff --git a/.changeset/light-games-appear.md b/.changeset/light-games-appear.md new file mode 100644 index 000000000..ed5be16f4 --- /dev/null +++ b/.changeset/light-games-appear.md @@ -0,0 +1,5 @@ +--- +"vue-demo-store": minor +--- + +Fix registration form for the double opt in registration flow diff --git a/packages/composables/src/useUser/useUser.ts b/packages/composables/src/useUser/useUser.ts index dd7b54cff..318671e2f 100644 --- a/packages/composables/src/useUser/useUser.ts +++ b/packages/composables/src/useUser/useUser.ts @@ -180,8 +180,12 @@ export function useUser(): UseUserReturn { storefrontUrl: getStorefrontUrl(), }, }); - _user.value = data; - if (_user.value?.active) await refreshSessionContext(); + // Set data when uses is active and not double opt in + if (_user.value?.active && !_user.value?.doubleOptInRegistration) { + _user.value = data; + await refreshSessionContext(); + } + return data; } diff --git a/templates/vue-demo-store/components/account/AccountRegisterForm.vue b/templates/vue-demo-store/components/account/AccountRegisterForm.vue index 30f431b9e..fa1e1fd99 100644 --- a/templates/vue-demo-store/components/account/AccountRegisterForm.vue +++ b/templates/vue-demo-store/components/account/AccountRegisterForm.vue @@ -109,14 +109,13 @@ const invokeSubmit = async () => { try { loading.value = true; const response = await register(state); - if (response && response.active) router.push("/"); - else if (response && !response.active) { + if (response && response.doubleOptInRegistration) { Object.assign(state, JSON.parse(JSON.stringify(initialState))); showDoubleOptInBox.value = true; await nextTick(); doubleOptInBox.value?.scrollIntoView(); $v.value.$reset(); - } + } else if (response && response.active) router.push("/"); } catch (error) { if (error instanceof ApiClientError) { const errors = resolveApiErrors(error.details.errors); From eec17f8d8102f051dcf73abef8703e77eb3005c5 Mon Sep 17 00:00:00 2001 From: Maciej <7597086+mdanilowicz@users.noreply.github.com> Date: Wed, 27 Nov 2024 14:06:59 +0100 Subject: [PATCH 2/4] fix: changes after CR --- .changeset/funny-chicken-play.md | 2 +- .changeset/light-games-appear.md | 2 +- .../composables/src/useUser/useUser.test.ts | 25 +++++++++++++++++++ packages/composables/src/useUser/useUser.ts | 4 +-- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/.changeset/funny-chicken-play.md b/.changeset/funny-chicken-play.md index a4b6788e2..5ae4f44a2 100644 --- a/.changeset/funny-chicken-play.md +++ b/.changeset/funny-chicken-play.md @@ -2,4 +2,4 @@ "@shopware-pwa/composables-next": minor --- -Set user details when fully active +Changed `registration` method in the `useUser` composable. Because of changes in the double opt-in on registration flow in the Shopware backend we are adjusting this method on our side. In new approach we are checking `active` and `doubleOptInRegistration` properties that represents current status of the user. diff --git a/.changeset/light-games-appear.md b/.changeset/light-games-appear.md index ed5be16f4..bf9cd24f4 100644 --- a/.changeset/light-games-appear.md +++ b/.changeset/light-games-appear.md @@ -1,5 +1,5 @@ --- -"vue-demo-store": minor +"vue-demo-store": patch --- Fix registration form for the double opt in registration flow diff --git a/packages/composables/src/useUser/useUser.test.ts b/packages/composables/src/useUser/useUser.test.ts index 1c7502c72..3badbf0b5 100644 --- a/packages/composables/src/useUser/useUser.test.ts +++ b/packages/composables/src/useUser/useUser.test.ts @@ -98,6 +98,31 @@ describe("useUser", () => { expect(vm.isLoggedIn).toBe(true); }); + it("register function with double opt-in option", async () => { + const { vm, injections } = useSetup(() => useUser()); + injections.apiClient.invoke.mockResolvedValue({ + data: { + active: true, + doubleOptInRegistration: true, + id: "test123", + guest: false, + }, + }); + + await vm.register(REGISTRATION_DATA); + + expect(injections.apiClient.invoke).toHaveBeenCalledWith( + expect.stringContaining("register"), + expect.objectContaining({ + body: { + ...REGISTRATION_DATA, + storefrontUrl: "http://localhost:3000", // This is the default value from the useInternationalization + }, + }), + ); + expect(vm.isLoggedIn).toBe(false); + }); + it("logout", async () => { const { vm, injections } = useSetup(() => useUser()); injections.apiClient.invoke.mockResolvedValue({ data: {} }); diff --git a/packages/composables/src/useUser/useUser.ts b/packages/composables/src/useUser/useUser.ts index 318671e2f..1419ce587 100644 --- a/packages/composables/src/useUser/useUser.ts +++ b/packages/composables/src/useUser/useUser.ts @@ -180,8 +180,8 @@ export function useUser(): UseUserReturn { storefrontUrl: getStorefrontUrl(), }, }); - // Set data when uses is active and not double opt in - if (_user.value?.active && !_user.value?.doubleOptInRegistration) { + // Update the user data in the context if the user is active and not using double opt-in registration set in the Shopware Admin + if (data.active && !data.doubleOptInRegistration) { _user.value = data; await refreshSessionContext(); } From 9783fb4fd95ba14e36785eb095db2d0a26402bdf Mon Sep 17 00:00:00 2001 From: Maciej <7597086+mdanilowicz@users.noreply.github.com> Date: Fri, 29 Nov 2024 09:13:08 +0100 Subject: [PATCH 3/4] feat(vue-demo): add confirmation page --- .changeset/young-chicken-confess.md | 5 ++ .../composables/src/useUser/useUser.test.ts | 2 +- packages/composables/src/useUser/useUser.ts | 3 +- templates/vue-demo-store/assets/error.svg | 3 + templates/vue-demo-store/assets/spinner.svg | 11 ++++ .../account/AccountRegisterForm.vue | 3 +- templates/vue-demo-store/eslint.config.mjs | 5 ++ .../vue-demo-store/i18n/de-DE/account.json | 3 +- .../vue-demo-store/i18n/de-DE/errors.json | 3 +- .../vue-demo-store/i18n/en-GB/account.json | 3 +- .../vue-demo-store/i18n/en-GB/errors.json | 3 +- .../vue-demo-store/i18n/pl-PL/account.json | 3 +- .../vue-demo-store/i18n/pl-PL/errors.json | 3 +- .../pages/registration/confirm.vue | 57 +++++++++++++++++++ 14 files changed, 97 insertions(+), 10 deletions(-) create mode 100644 .changeset/young-chicken-confess.md create mode 100644 templates/vue-demo-store/assets/error.svg create mode 100644 templates/vue-demo-store/assets/spinner.svg create mode 100644 templates/vue-demo-store/pages/registration/confirm.vue diff --git a/.changeset/young-chicken-confess.md b/.changeset/young-chicken-confess.md new file mode 100644 index 000000000..06e6d296f --- /dev/null +++ b/.changeset/young-chicken-confess.md @@ -0,0 +1,5 @@ +--- +"vue-demo-store": minor +--- + +Added a confirmation page after the double opt-in option. The confirmation link is included in the email after registration. diff --git a/packages/composables/src/useUser/useUser.test.ts b/packages/composables/src/useUser/useUser.test.ts index 3badbf0b5..8eaaa61fa 100644 --- a/packages/composables/src/useUser/useUser.test.ts +++ b/packages/composables/src/useUser/useUser.test.ts @@ -98,7 +98,7 @@ describe("useUser", () => { expect(vm.isLoggedIn).toBe(true); }); - it("register function with double opt-in option", async () => { + it("register function with double opt-in option should not automatically log user in", async () => { const { vm, injections } = useSetup(() => useUser()); injections.apiClient.invoke.mockResolvedValue({ data: { diff --git a/packages/composables/src/useUser/useUser.ts b/packages/composables/src/useUser/useUser.ts index 1419ce587..0a744b191 100644 --- a/packages/composables/src/useUser/useUser.ts +++ b/packages/composables/src/useUser/useUser.ts @@ -183,9 +183,8 @@ export function useUser(): UseUserReturn { // Update the user data in the context if the user is active and not using double opt-in registration set in the Shopware Admin if (data.active && !data.doubleOptInRegistration) { _user.value = data; - await refreshSessionContext(); } - + await refreshSessionContext(); return data; } diff --git a/templates/vue-demo-store/assets/error.svg b/templates/vue-demo-store/assets/error.svg new file mode 100644 index 000000000..404e43a70 --- /dev/null +++ b/templates/vue-demo-store/assets/error.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/templates/vue-demo-store/assets/spinner.svg b/templates/vue-demo-store/assets/spinner.svg new file mode 100644 index 000000000..c38739738 --- /dev/null +++ b/templates/vue-demo-store/assets/spinner.svg @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/templates/vue-demo-store/components/account/AccountRegisterForm.vue b/templates/vue-demo-store/components/account/AccountRegisterForm.vue index fa1e1fd99..e6847f3a8 100644 --- a/templates/vue-demo-store/components/account/AccountRegisterForm.vue +++ b/templates/vue-demo-store/components/account/AccountRegisterForm.vue @@ -144,7 +144,8 @@ useBreadcrumbs([ {{ $t("account.messages.signUpSuccess") }}