diff --git a/webapp/components/utils/UniqueSlugForm.js b/webapp/components/utils/UniqueSlugForm.js new file mode 100644 index 000000000..935ef8f7e --- /dev/null +++ b/webapp/components/utils/UniqueSlugForm.js @@ -0,0 +1,30 @@ +import { debounce } from 'lodash' +import { checkSlugAvailableQuery } from '~/graphql/User.js' + +export default function UniqueSlugForm({ translate, apollo, currentUser }) { + return { + formSchema: { + slug: [ + { + asyncValidator(rule, value, callback) { + debounce(() => { + const variables = { slug: value } + apollo.query({ query: checkSlugAvailableQuery, variables }).then(response => { + const { + data: { User }, + } = response + const existingSlug = User && User[0] && User[0].slug + const available = !existingSlug || existingSlug === currentUser.slug + if (!available) { + callback(new Error(translate('settings.validation.slug.alreadyTaken'))) + } else { + callback() + } + }) + }, 500)() + }, + }, + ], + }, + } +} diff --git a/webapp/pages/settings/index.vue b/webapp/pages/settings/index.vue index 4cb94f313..d32d9a91b 100644 --- a/webapp/pages/settings/index.vue +++ b/webapp/pages/settings/index.vue @@ -1,56 +1,49 @@ @@ -59,8 +52,7 @@ import gql from 'graphql-tag' import { mapGetters, mapMutations } from 'vuex' import { CancelToken } from 'axios' -import { checkSlugAvailableQuery } from '~/graphql/User.js' -import { debounce } from 'lodash' +import UniqueSlugForm from '~/components/utils/UniqueSlugForm' let timeout const mapboxToken = process.env.MAPBOX_TOKEN @@ -98,13 +90,22 @@ export default { loadingData: false, loadingGeo: false, formData: {}, - slugAvailable: true, } }, computed: { ...mapGetters({ currentUser: 'auth/user', }), + formSchema() { + const uniqueSlugForm = UniqueSlugForm({ + apollo: this.$apollo, + currentUser: this.currentUser, + translate: this.$t, + }) + return { + ...uniqueSlugForm.formSchema, + } + }, form: { get: function() { const { name, slug, locationName, about } = this.currentUser @@ -115,16 +116,6 @@ export default { }, }, }, - created() { - this.validateSlug = debounce(async () => { - const variables = { slug: this.formData.slug } - const { - data: { User }, - } = await this.$apollo.query({ query: checkSlugAvailableQuery, variables }) - const existingSlug = User && User[0] && User[0].slug - this.slugAvailable = !existingSlug || existingSlug === this.currentUser.slug - }, 500) - }, methods: { ...mapMutations({ setCurrentUser: 'auth/SET_USER',