196 lines
5.1 KiB
Vue
196 lines
5.1 KiB
Vue
<template>
|
|
<div class="medium-10 column signup">
|
|
<div class="text-center medium-12 signup--hero">
|
|
<img
|
|
:src="globalConfig.logo"
|
|
:alt="globalConfig.installationName"
|
|
class="hero--logo"
|
|
/>
|
|
<h2 class="hero--title">
|
|
{{ $t('REGISTER.TRY_WOOT') }}
|
|
</h2>
|
|
</div>
|
|
<div class="row align-center">
|
|
<div class="small-12 medium-6 large-5 column">
|
|
<form class="signup--box login-box" @submit.prevent="submit">
|
|
<woot-input
|
|
v-model="credentials.fullName"
|
|
:class="{ error: $v.credentials.fullName.$error }"
|
|
:label="$t('REGISTER.FULL_NAME.LABEL')"
|
|
:placeholder="$t('REGISTER.FULL_NAME.PLACEHOLDER')"
|
|
:error="
|
|
$v.credentials.fullName.$error
|
|
? $t('REGISTER.FULL_NAME.ERROR')
|
|
: ''
|
|
"
|
|
@blur="$v.credentials.fullName.$touch"
|
|
/>
|
|
<woot-input
|
|
v-model="credentials.accountName"
|
|
:class="{ error: $v.credentials.accountName.$error }"
|
|
:label="$t('REGISTER.ACCOUNT_NAME.LABEL')"
|
|
:placeholder="$t('REGISTER.ACCOUNT_NAME.PLACEHOLDER')"
|
|
:error="
|
|
$v.credentials.accountName.$error
|
|
? $t('REGISTER.ACCOUNT_NAME.ERROR')
|
|
: ''
|
|
"
|
|
@blur="$v.credentials.accountName.$touch"
|
|
/>
|
|
<woot-input
|
|
v-model.trim="credentials.email"
|
|
type="email"
|
|
:class="{ error: $v.credentials.email.$error }"
|
|
:label="$t('REGISTER.EMAIL.LABEL')"
|
|
:placeholder="$t('REGISTER.EMAIL.PLACEHOLDER')"
|
|
:error="
|
|
$v.credentials.email.$error ? $t('REGISTER.EMAIL.ERROR') : ''
|
|
"
|
|
@blur="$v.credentials.email.$touch"
|
|
/>
|
|
<woot-submit-button
|
|
:disabled="isSignupInProgress"
|
|
:button-text="$t('REGISTER.SUBMIT')"
|
|
:loading="isSignupInProgress"
|
|
button-class="large expanded"
|
|
>
|
|
</woot-submit-button>
|
|
<p class="accept--terms" v-html="termsLink"></p>
|
|
</form>
|
|
<div class="column text-center sigin--footer">
|
|
<span>{{ $t('REGISTER.HAVE_AN_ACCOUNT') }}</span>
|
|
<router-link to="/app/login">
|
|
{{
|
|
useInstallationName(
|
|
$t('LOGIN.TITLE'),
|
|
globalConfig.installationName
|
|
)
|
|
}}
|
|
</router-link>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { required, minLength, email } from 'vuelidate/lib/validators';
|
|
import Auth from '../../api/auth';
|
|
import { mapGetters } from 'vuex';
|
|
import globalConfigMixin from 'shared/mixins/globalConfigMixin';
|
|
import alertMixin from 'shared/mixins/alertMixin';
|
|
import { DEFAULT_REDIRECT_URL } from '../../constants';
|
|
|
|
export default {
|
|
mixins: [globalConfigMixin, alertMixin],
|
|
data() {
|
|
return {
|
|
credentials: {
|
|
accountName: '',
|
|
fullName: '',
|
|
email: '',
|
|
},
|
|
isSignupInProgress: false,
|
|
error: '',
|
|
};
|
|
},
|
|
validations: {
|
|
credentials: {
|
|
accountName: {
|
|
required,
|
|
minLength: minLength(2),
|
|
},
|
|
fullName: {
|
|
required,
|
|
minLength: minLength(2),
|
|
},
|
|
email: {
|
|
required,
|
|
email,
|
|
},
|
|
},
|
|
},
|
|
computed: {
|
|
...mapGetters({
|
|
globalConfig: 'globalConfig/get',
|
|
}),
|
|
termsLink() {
|
|
return this.$t('REGISTER.TERMS_ACCEPT')
|
|
.replace('https://www.chatwoot.com/terms', this.globalConfig.termsURL)
|
|
.replace(
|
|
'https://www.chatwoot.com/privacy-policy',
|
|
this.globalConfig.privacyURL
|
|
);
|
|
},
|
|
},
|
|
methods: {
|
|
async submit() {
|
|
this.$v.$touch();
|
|
if (this.$v.$invalid) {
|
|
return;
|
|
}
|
|
this.isSignupInProgress = true;
|
|
try {
|
|
const response = await Auth.register(this.credentials);
|
|
if (response.status === 200) {
|
|
window.location = DEFAULT_REDIRECT_URL;
|
|
}
|
|
} catch (error) {
|
|
let errorMessage = this.$t('REGISTER.API.ERROR_MESSAGE');
|
|
if (error.response && error.response.data.message) {
|
|
errorMessage = error.response.data.message;
|
|
}
|
|
this.showAlert(errorMessage);
|
|
} finally {
|
|
this.isSignupInProgress = false;
|
|
}
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
<style scoped lang="scss">
|
|
.signup {
|
|
.signup--hero {
|
|
margin-bottom: var(--space-larger);
|
|
|
|
.hero--logo {
|
|
width: 180px;
|
|
}
|
|
|
|
.hero--title {
|
|
margin-top: var(--space-large);
|
|
font-weight: var(--font-weight-light);
|
|
}
|
|
}
|
|
|
|
.signup--box {
|
|
padding: var(--space-large);
|
|
|
|
label {
|
|
font-size: var(--font-size-default);
|
|
color: var(--b-600);
|
|
|
|
input {
|
|
padding: var(--space-slab);
|
|
height: var(--space-larger);
|
|
font-size: var(--font-size-default);
|
|
}
|
|
}
|
|
}
|
|
|
|
.sigin--footer {
|
|
padding: var(--space-medium);
|
|
font-size: var(--font-size-default);
|
|
|
|
> a {
|
|
font-weight: var(--font-weight-bold);
|
|
}
|
|
}
|
|
|
|
.accept--terms {
|
|
font-size: var(--font-size-small);
|
|
text-align: center;
|
|
margin: var(--space-normal) 0 0 0;
|
|
}
|
|
}
|
|
</style>
|