mirror of
https://github.com/Ocelot-Social-Community/Ocelot-Social.git
synced 2026-03-23 10:45:38 +00:00
59 lines
1.6 KiB
JavaScript
59 lines
1.6 KiB
JavaScript
import { debounce } from 'lodash'
|
|
import { checkSlugAvailableQuery } from '~/graphql/User.js'
|
|
|
|
export default function UniqueSlugForm({ translate, apollo, currentUser }) {
|
|
let pendingCallback = null
|
|
|
|
const debouncedSlugCheck = debounce((value, callback) => {
|
|
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()
|
|
}
|
|
})
|
|
.catch(() => {
|
|
callback()
|
|
})
|
|
}, 500)
|
|
|
|
return {
|
|
formSchema: {
|
|
slug: [
|
|
{
|
|
type: 'string',
|
|
required: true,
|
|
pattern: /^[a-z0-9_-]+$/,
|
|
message: translate('settings.validation.slug.regex'),
|
|
},
|
|
{
|
|
asyncValidator(rule, value, callback) {
|
|
// Resolve any pending callback from a previous debounced call
|
|
// that was cancelled, so async-validator doesn't hang
|
|
if (pendingCallback) {
|
|
pendingCallback()
|
|
}
|
|
pendingCallback = callback
|
|
debouncedSlugCheck(value, (error) => {
|
|
pendingCallback = null
|
|
if (error) {
|
|
callback(error)
|
|
} else {
|
|
callback()
|
|
}
|
|
})
|
|
},
|
|
},
|
|
],
|
|
},
|
|
}
|
|
}
|