From c5ff7688ac8cc18cc3294641df4d0959c9b7cb4f Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Fri, 15 Dec 2023 11:51:43 +0200 Subject: [PATCH] feat: click on invite link autofills email in register form (#1919) --- .../components/auth/RegisterPanel.vue | 18 +++ .../auth/RegisterWithEmailBlock.vue | 22 +++- .../lib/common/generated/gql/gql.ts | 5 + .../lib/common/generated/gql/graphql.ts | 15 +++ .../typedefs/serverInvites.graphql | 5 + .../modules/core/graph/generated/graphql.ts | 8 ++ .../server/modules/core/helpers/userHelper.js | 2 +- .../graph/generated/graphql.ts | 7 ++ .../{serverInvites.js => serverInvites.ts} | 107 +++++++++--------- .../serverinvites/helpers/inviteHelper.js | 4 +- .../modules/serverinvites/helpers/types.ts | 6 + .../serverinvites/repositories/index.js | 40 +++---- .../services/inviteCreationService.js | 4 +- ...alService.js => inviteRetrievalService.ts} | 98 +++++++++------- .../serverinvites/services/management.ts | 2 +- .../server/test/graphql/generated/graphql.ts | 41 ++++--- 16 files changed, 239 insertions(+), 145 deletions(-) rename packages/server/modules/serverinvites/graph/resolvers/{serverInvites.js => serverInvites.ts} (71%) rename packages/server/modules/serverinvites/services/{inviteRetrievalService.js => inviteRetrievalService.ts} (50%) diff --git a/packages/frontend-2/components/auth/RegisterPanel.vue b/packages/frontend-2/components/auth/RegisterPanel.vue index eeb593a13..66499faa5 100644 --- a/packages/frontend-2/components/auth/RegisterPanel.vue +++ b/packages/frontend-2/components/auth/RegisterPanel.vue @@ -42,6 +42,7 @@ v-if="serverInfo && hasLocalStrategy" :challenge="challenge" :server-info="serverInfo" + :invite-email="inviteEmail" /> @@ -63,13 +64,30 @@ graphql(` } `) +const serverInviteQuery = graphql(` + query RegisterPanelServerInvite($token: String!) { + serverInviteByToken(token: $token) { + id + email + } + } +`) + const newsletterConsent = ref(false) provide('newsletterconsent', newsletterConsent) const { result } = useQuery(loginServerInfoQuery) const { appId, challenge, inviteToken } = useLoginOrRegisterUtils() +const { result: inviteMetadata } = useQuery( + serverInviteQuery, + () => ({ token: inviteToken.value || '' }), + { + enabled: computed(() => !!inviteToken.value?.length) + } +) +const inviteEmail = computed(() => inviteMetadata.value?.serverInviteByToken?.email) const serverInfo = computed(() => result.value?.serverInfo) const hasLocalStrategy = computed(() => (serverInfo.value?.authStrategies || []).some((s) => s.id === AuthStrategy.Local) diff --git a/packages/frontend-2/components/auth/RegisterWithEmailBlock.vue b/packages/frontend-2/components/auth/RegisterWithEmailBlock.vue index 757a6019c..126182828 100644 --- a/packages/frontend-2/components/auth/RegisterWithEmailBlock.vue +++ b/packages/frontend-2/components/auth/RegisterWithEmailBlock.vue @@ -15,6 +15,7 @@ auto-focus /> () const { handleSubmit } = useForm() const router = useRouter() +const { signUpWithEmail, inviteToken } = useAuthManager() +const { triggerNotification } = useGlobalToast() const loading = ref(false) const password = ref('') +const email = ref('') const emailRules = [isEmail] const nameRules = [isRequired] -const { signUpWithEmail, inviteToken } = useAuthManager() -const { triggerNotification } = useGlobalToast() - const newsletterConsent = inject>('newsletterconsent') const pwdFocused = ref(false) const { isSmallerOrEqualSm } = useIsSmallerOrEqualThanBreakpoint() +const isEmailDisabled = computed(() => !!props.inviteEmail?.length || loading.value) + const finalLoginRoute = computed(() => { const result = router.resolve({ path: loginRoute, @@ -149,6 +153,16 @@ const onSubmit = handleSubmit(async (fullUser) => { loading.value = false } }) + +watch( + () => props.inviteEmail, + (inviteEmail) => { + if (inviteEmail) { + email.value = inviteEmail + } + }, + { immediate: true } +)