Validate Change Username

This commit is contained in:
Moriz Wahl 2021-06-14 21:05:09 +02:00
parent bdee28fde6
commit f39b2e2d39
5 changed files with 80 additions and 40 deletions

View File

@ -15,7 +15,7 @@ const apiGet = async (url) => {
if (result.status !== 200) { if (result.status !== 200) {
throw new Error('HTTP Status Error ' + result.status) throw new Error('HTTP Status Error ' + result.status)
} }
if (result.data.state !== 'success') { if (!['success', 'warning'].includes(result.data.state)) {
throw new Error(result.data.msg) throw new Error(result.data.msg)
} }
return { success: true, result } return { success: true, result }
@ -139,6 +139,9 @@ const loginAPI = {
} }
return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload)
}, },
checkUsername: async (username, groupId = 1) => {
return apiGet(CONFIG.LOGIN_API_URL + `checkUsername?username=${username}&group_id=${groupId}`)
},
} }
export default loginAPI export default loginAPI

View File

@ -57,9 +57,11 @@
"send_transaction_error":"Leider konnte die Transaktion nicht ausgeführt werden!", "send_transaction_error":"Leider konnte die Transaktion nicht ausgeführt werden!",
"validation": { "validation": {
"gddSendAmount": "Das Feld {_field_} muss eine Zahl zwischen {min} und {max} mit höchstens zwei Nachkommastellen sein", "gddSendAmount": "Das Feld {_field_} muss eine Zahl zwischen {min} und {max} mit höchstens zwei Nachkommastellen sein",
"is-not": "Du kannst dir selbst keine Gradidos überweisen" "is-not": "Du kannst dir selbst keine Gradidos überweisen",
"usernmae-unique": "Der Username ist bereits vergeben.",
"usernmae-regex": "Der Username muss mit einem Buchstaben beginnen auf den mindestens zwei alfanumerische Zeichen folgen müssen."
}, },
"change_username_info": "Das ändern des Usernamens bedarf mehrerer Schritte." "change_username_info": "Einmal gespeichert, kann der Username ncht mehr geändert werden!"
}, },
"error": { "error": {
"error":"Fehler" "error":"Fehler"

View File

@ -57,9 +57,11 @@
"send_transaction_error":"Unfortunately, the transaction could not be executed!", "send_transaction_error":"Unfortunately, the transaction could not be executed!",
"validation": { "validation": {
"gddSendAmount": "The {_field_} field must be a number between {min} and {max} with at most two digits", "gddSendAmount": "The {_field_} field must be a number between {min} and {max} with at most two digits",
"is-not": "You cannot send Gradidos to yourself" "is-not": "You cannot send Gradidos to yourself",
"usernmae-unique": "The username is already taken.",
"usernmae-regex": "The username must start with a letter, followed by at least two alphanumeric characters."
}, },
"change_username_info": "Changing the username requires several steps." "change_username_info": "Once saved, the username cannot be changed again!"
}, },
"error": { "error": {
"error":"Error" "error":"Error"

View File

@ -9,6 +9,8 @@ import { required, email, min, max, is_not } from 'vee-validate/dist/rules'
// store // store
import { store } from './store/store' import { store } from './store/store'
import loginAPI from './apis/loginAPI'
// router setup // router setup
import router from './routes/router' import router from './routes/router'
@ -64,6 +66,21 @@ extend('gddSendAmount', {
}, },
}) })
extend('gddUsernameUnique', {
async validate(value) {
const result = await loginAPI.checkUsername(value)
return result.result.data.state === 'success'
},
message: (_, values) => i18n.t('form.validation.usernmae-unique', values),
})
extend('gddUsernameRgex', {
validate(value) {
return !!value.match(/^[a-zA-Z][-_a-zA-Z0-9]{2,}$/)
},
message: (_, values) => i18n.t('form.validation.usernmae-regex', values),
})
// eslint-disable-next-line camelcase // eslint-disable-next-line camelcase
extend('is_not', { extend('is_not', {
// eslint-disable-next-line camelcase // eslint-disable-next-line camelcase

View File

@ -1,20 +1,19 @@
<template> <template>
<b-card id="formusername" class="bg-transparent" style="background-color: #ebebeba3 !important"> <b-card id="formusername" class="bg-transparent" style="background-color: #ebebeba3 !important">
<b-container> <b-container v-if="username === ''">
<b-row class="text-right"> <b-row class="text-right">
<b-col class="mb-3"> <b-col class="mb-3">
<b-icon <b-icon
v-if="editUsername" v-if="showUsername"
@click="editUsername = !editUsername" @click="showUsername = !showUsername"
class="pointer" class="pointer"
icon="pencil" icon="pencil"
> >
{{ $t('form.change') }} {{ $t('form.change') }}
</b-icon> </b-icon>
<b-icon <b-icon
v-else v-else
@click="editUsername = !editUsername" @click="cancelEdit"
class="pointer" class="pointer"
icon="x-circle" icon="x-circle"
variant="danger" variant="danger"
@ -22,40 +21,48 @@
</b-col> </b-col>
</b-row> </b-row>
</b-container> </b-container>
<b-container v-if="editUsername"> <b-container v-if="showUsername">
<b-row class="mb-3"> <b-row class="mb-3">
<b-col class="col-lg-3 col-md-10 col-sm-10 text-md-left text-lg-right"> <b-col class="col-lg-3 col-md-10 col-sm-10 text-md-left text-lg-right">
<small>{{ $t('form.username') }}</small> <small>{{ $t('form.username') }}</small>
</b-col> </b-col>
<b-col class="col-md-9 col-sm-10">@{{ username }}</b-col> <b-col class="col-md-9 col-sm-10">@{{ form.username }}</b-col>
</b-row> </b-row>
</b-container> </b-container>
<b-container v-else> <b-container v-else>
<validation-observer ref="formValidator" v-slot="{ handleSubmit, valid }">
<b-form role="form" @submit.stop.prevent="handleSubmit(onSubmit)">
<b-row class="mb-3"> <b-row class="mb-3">
<b-col class="col-lg-3 col-md-10 col-sm-10 text-md-left text-lg-right"> <b-col class="col-lg-3 col-md-10 col-sm-10 text-md-left text-lg-right">
<small>{{ $t('form.username') }}</small> <small>{{ $t('form.username') }}</small>
</b-col> </b-col>
<b-col class="col-md-9 col-sm-10"> <b-col class="col-md-9 col-sm-10">
<validation-observer ref="formValidator"> <validation-provider
<b-form role="form"> name="Username"
<b-form-input v-model="form.username" :placeholder="username"></b-form-input> :rules="{ gddUsernameRgex: true, gddUsernameUnique: true }"
v-slot="{ errors }"
>
<div v-if="errors" class="text-right p-3 p-sm-1">
<span v-for="error in errors" :key="error" class="errors">{{ error }}</span>
</div>
<b-form-input v-model="form.username" placeholder="Username"></b-form-input>
<div> <div>
{{ $t('form.change_username_info') }} {{ $t('form.change_username_info') }}
</div> </div>
</b-form> </validation-provider>
</validation-observer>
</b-col> </b-col>
</b-row> </b-row>
<b-row class="text-right"> <b-row class="text-right">
<b-col> <b-col>
<div class="text-right" ref="submitButton"> <div class="text-right" ref="submitButton">
<b-button variant="info" @click="onSubmit" class="mt-4"> <b-button variant="info" type="submit" class="mt-4" :disabled="!valid">
{{ $t('form.save') }} {{ $t('form.save') }}
</b-button> </b-button>
</div> </div>
</b-col> </b-col>
</b-row> </b-row>
</b-form>
</validation-observer>
</b-container> </b-container>
</b-card> </b-card>
</template> </template>
@ -66,7 +73,7 @@ export default {
name: 'FormUsername', name: 'FormUsername',
data() { data() {
return { return {
editUsername: true, showUsername: true,
username: this.$store.state.username, username: this.$store.state.username,
form: { form: {
username: this.$store.state.username, username: this.$store.state.username,
@ -74,6 +81,10 @@ export default {
} }
}, },
methods: { methods: {
cancelEdit() {
this.username = this.$store.state.username
this.showUsername = true
},
async onSubmit() { async onSubmit() {
const result = await loginAPI.changeUsernameProfile( const result = await loginAPI.changeUsernameProfile(
this.$store.state.sessionId, this.$store.state.sessionId,
@ -82,8 +93,9 @@ export default {
) )
if (result.success) { if (result.success) {
this.$store.commit('username', this.form.username) this.$store.commit('username', this.form.username)
this.editUserdata = this.editUsername = !this.editUsername this.username = this.form.username
alert('Dein Username wurde geändert.') this.showUsername = true
this.$toast.success(this.$t('site.profil.user-data.change-success'))
} else { } else {
alert(result.result.message) alert(result.result.message)
} }
@ -91,4 +103,8 @@ export default {
}, },
} }
</script> </script>
<style></style> <style>
span.errors {
color: red;
}
</style>