234 lines
6.2 KiB
Vue
234 lines
6.2 KiB
Vue
<template>
|
|
<div class="sign-up">
|
|
<div class="sign-up__title">{{ $t("Wellcome") }}</div>
|
|
<div class="sign-up__text">
|
|
{{ $t("CountryCodeAndMobileNumber") }}
|
|
</div>
|
|
<div class="sign-up__form">
|
|
<div class="sign-up__form-row">
|
|
<select id="single" class="select2-container--default form-control">
|
|
<option>ایران</option>
|
|
</select>
|
|
</div>
|
|
|
|
<div class="sign-up__form-row sign-up__number">
|
|
<div
|
|
class="form-group position-relative"
|
|
:class="{ 'form-group--error': $v.mobile.$error }"
|
|
>
|
|
<input
|
|
class="form-control"
|
|
type="tel"
|
|
name="mobile"
|
|
id="mobile"
|
|
v-model.trim="$v.mobile.$model"
|
|
placeholder="۹۱۰۰۰۰۰۰۰۰"
|
|
@input="resetErrors"
|
|
dir="ltr"
|
|
/>
|
|
<span>+98</span>
|
|
</div>
|
|
<div v-if="submitStatus === 'ERROR'">
|
|
<div class="error" v-if="!$v.mobile.required">
|
|
{{ $t("IsRequired") }}
|
|
</div>
|
|
<div class="error" v-if="!$v.mobile.minLength">
|
|
{{ $t("MinLength", { n: 10 }) }}
|
|
</div>
|
|
<div class="error" v-if="!$v.mobile.maxLength">
|
|
{{ $t("MaxLength", { n: 11 }) }}
|
|
</div>
|
|
<!-- <div class="error" v-if="!$v.mobile.between">
|
|
Must be between {{ $v.mobile.$params.between.min }} and
|
|
{{ $v.mobile.$params.between.max }}
|
|
</div> -->
|
|
</div>
|
|
|
|
<div class="sign-up__form-row sign-up__simple-input">
|
|
<div
|
|
class="form-group position-relative d-flex align-items-center"
|
|
:class="{ 'form-group--error': $v.captcha.$error }"
|
|
>
|
|
<input
|
|
class="form-control elem__placeholder-gray mb-0 flex-grow-1 p-3"
|
|
type="text"
|
|
name="captcha"
|
|
v-model.trim="$v.captcha.$model"
|
|
:placeholder="$t('SecurityCode')"
|
|
dir="ltr"
|
|
/>
|
|
<div class="d-flex border-1 p-2">
|
|
<div class="captcha-container" style="width: 7em">
|
|
<img
|
|
style="width: 100%; height: 100%; object-fit: contain"
|
|
:src="captchaImage"
|
|
alt=""
|
|
/>
|
|
</div>
|
|
<button-component
|
|
style="min-width: auto"
|
|
@click="resetCaptcha"
|
|
classes="border-0"
|
|
buttonText=""
|
|
:buttonLoading="loading"
|
|
>
|
|
<svg style="width: 1.3em" class="icon icon-reset-form">
|
|
<use xlink:href="#icon-reset-form"></use>
|
|
</svg>
|
|
</button-component>
|
|
</div>
|
|
</div>
|
|
<div v-if="submitStatus === 'ERROR'">
|
|
<div class="error" v-if="!$v.captcha.required">
|
|
{{ $t("IsRequired") }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sign-up__btn-container">
|
|
<RouterLink
|
|
class="sign-up__text text__gray"
|
|
:to="{ path: '/login' }"
|
|
>
|
|
{{ $t("LoginEmail") }}
|
|
</RouterLink>
|
|
<button :disabled="loading" v-on:click="getCode()">
|
|
{{ $t("ConfirmationNumber") }}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- <p class="typo__p" v-if="submitStatus === 'OK'">
|
|
Thanks for your submission!
|
|
</p>
|
|
<p class="typo__p" v-if="submitStatus === 'ERROR'">
|
|
Please fill the form correctly.
|
|
</p>
|
|
<p class="typo__p" v-if="submitStatus === 'PENDING'">Sending...</p> -->
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import authMixin from "~/mixins/authMixin";
|
|
import {
|
|
required,
|
|
minLength,
|
|
maxLength,
|
|
between,
|
|
} from "@vuelidate/validators";
|
|
|
|
import { mapState, mapActions } from "pinia";
|
|
import { useCommonStore } from "~/stores/commonStore";
|
|
import { useAuthStore } from "~/stores/authStore";
|
|
export default {
|
|
mounted(){
|
|
this.getCaptcha().then((res)=>{
|
|
this.captchaImage = `data:image/jpeg; charset=utf-8; base64, ${res}`;
|
|
}).catch(err=>{
|
|
this.captchaImage = (import(`assets/common/img/captcha.png`)).default;
|
|
})
|
|
},
|
|
validations: {
|
|
mobile: {
|
|
required,
|
|
minLength: minLength(10),
|
|
maxLength: maxLength(10),
|
|
},
|
|
captcha: {},
|
|
},
|
|
mixins: [authMixin],
|
|
|
|
data() {
|
|
return {
|
|
mobile: "",
|
|
enableResetPassword: false,
|
|
captcha: undefined,
|
|
captchaImage:""
|
|
};
|
|
},
|
|
computed: {
|
|
...mapState(useAuthStore,["getResetPasswordState"]),
|
|
},
|
|
methods: {
|
|
...mapActions(useCommonStore, ["SET_USER_FULL_NAME", "SET_USER_PHONE_NUMBER"]),
|
|
resetErrors() {
|
|
if (this.$v.$invalid) this.$v.$reset();
|
|
},
|
|
getCode() {
|
|
var vm = this;
|
|
this.$v.$touch();
|
|
|
|
if (this.$v.$invalid) {
|
|
this.submitStatus = "ERROR";
|
|
} else {
|
|
if (this.loading) return;
|
|
this.loading = true;
|
|
|
|
this.submitStatus = "PENDING";
|
|
|
|
this.phoneLogin({
|
|
mobile: parseInt(vm.mobile, 10),
|
|
captcha: vm.captcha,
|
|
})
|
|
.then((res) => {
|
|
this.submitStatus = "OK";
|
|
|
|
mySwalToast({
|
|
title: res.message,
|
|
});
|
|
|
|
this.SET_USER_FULL_NAME(res.data);
|
|
this.SET_USER_PHONE_NUMBER(this.mobile);
|
|
|
|
if (this.getResetPasswordState) this.redirectToResetPage(res.data);
|
|
else this.redirectToActivePage();
|
|
})
|
|
|
|
.finally(() => {
|
|
this.loading = false;
|
|
});
|
|
}
|
|
},
|
|
redirectToResetPage(data) {
|
|
var vm = this;
|
|
|
|
try {
|
|
this.$router.push({
|
|
name: "resetpassphone",
|
|
params: {
|
|
usernameemail: this.usernameemail,
|
|
mobile: parseInt(vm.mobile, 10),
|
|
userData: data,
|
|
},
|
|
});
|
|
} catch (err) {
|
|
}
|
|
},
|
|
redirectToActivePage() {
|
|
var vm = this;
|
|
|
|
try {
|
|
this.$router.push({
|
|
name: "activate",
|
|
params: {
|
|
mobile: parseInt(vm.mobile, 10),
|
|
},
|
|
});
|
|
} catch (err) {
|
|
}
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
<style scoped>
|
|
.blink_me {
|
|
animation: blinker 1s linear infinite;
|
|
}
|
|
@keyframes blinker {
|
|
50% {
|
|
opacity: 0;
|
|
}
|
|
}
|
|
</style>
|