Files
speckle-server/packages/frontend-2/components/settings/user/Emails.vue
T

93 lines
2.8 KiB
Vue

<template>
<section>
<div class="md:max-w-xl md:mx-auto">
<SettingsSectionHeader
title="Emails addresses"
text="Manage your email addresses"
/>
<SettingsSectionHeader title="Your emails" subheading />
<SettingsUserEmailList class="pt-6" :email-data="emailItems" />
<hr class="my-6 md:my-8" />
<SettingsSectionHeader title="Add new email" subheading />
<div class="flex flex-col md:flex-row w-full pt-4 md:pt-6 pb-6">
<div class="flex flex-col md:flex-row gap-x-2 w-full">
<FormTextInput
v-model="email"
color="foundation"
label-position="left"
label="Email address"
name="email"
:rules="[isEmail, isRequired]"
placeholder="Email address"
show-label
wrapper-classes="flex-1 py-3 md:py-0 w-full"
/>
<FormButton @click="onAddEmailSubmit">Add</FormButton>
</div>
</div>
</div>
</section>
</template>
<script setup lang="ts">
import { orderBy } from 'lodash-es'
import { graphql } from '~~/lib/common/generated/gql'
import { ToastNotificationType, useGlobalToast } from '~~/lib/common/composables/toast'
import { isEmail, isRequired } from '~~/lib/common/helpers/validation'
import { useForm } from 'vee-validate'
import { useQuery, useMutation } from '@vue/apollo-composable'
import { settingsUserEmailsQuery } from '~/lib/settings/graphql/queries'
import { settingsCreateUserEmailMutation } from '~/lib/settings/graphql/mutations'
import {
getFirstErrorMessage,
convertThrowIntoFetchResult
} from '~~/lib/common/helpers/graphql'
graphql(`
fragment SettingsUserEmails_User on User {
id
emails {
...SettingsUserEmailCards_UserEmail
}
}
`)
type FormValues = { email: string }
const { handleSubmit } = useForm<FormValues>()
const { triggerNotification } = useGlobalToast()
const { result: userEmailsResult } = useQuery(settingsUserEmailsQuery)
const { mutate: createMutation } = useMutation(settingsCreateUserEmailMutation)
const email = ref('')
// Mak sure primary email is always on top, followed by verified emails
const emailItems = computed(() =>
userEmailsResult.value?.activeUser?.emails
? orderBy(
userEmailsResult.value?.activeUser.emails,
['primary', 'verified'],
['desc', 'desc']
)
: []
)
const onAddEmailSubmit = handleSubmit(async () => {
const result = await createMutation({ input: { email: email.value } }).catch(
convertThrowIntoFetchResult
)
if (result?.data) {
triggerNotification({
type: ToastNotificationType.Success,
title: `${email.value} added`
})
} else {
const errorMessage = getFirstErrorMessage(result?.errors)
triggerNotification({
type: ToastNotificationType.Danger,
title: errorMessage
})
}
})
</script>