src/components/patials/registerComponent.vue
unknown
plain_text
2 years ago
18 kB
9
Indexable
<template>
<div class="pt-4">
<v-card flat class="mt-5">
<v-card-text>
<v-row>
<v-col cols="12" class="text-center">
<center>
<v-img src="/img/app_name.png" width="100" class="mb-3"></v-img>
<h3 class="font-weight-light">Create Your Built Account</h3>
</center>
</v-col>
</v-row>
<v-stepper
v-model="step"
elevation="0"
flat
style="box-shadow: none !important"
>
<v-stepper-header style="border: none !important">
<v-stepper-step
:color="step > 1 ? 'green' : 'blue'"
:complete="step > 1"
step="1"
>Personal Info.
</v-stepper-step>
<v-divider></v-divider>
<v-stepper-step
:color="step > 2 ? 'green' : 'blue'"
:complete="step > 2"
step="2"
>Account Info.
</v-stepper-step>
<v-divider></v-divider>
</v-stepper-header>
<v-stepper-items>
<v-stepper-content step="1">
<v-form
v-model="personal_infor"
ref="person_form"
@keyup.native.enter="personal_infor && goto_account($event)"
>
<v-row dense>
<v-col cols="12" sm="12">
<v-text-field
v-model="first_name"
:rules="first_name_rules"
label="First Name"
class="mt-2"
outlined
autofocus
></v-text-field>
</v-col>
<v-col cols="12" sm="12">
<v-text-field
v-model="last_name"
:rules="first_name_rules"
label="Last Name"
outlined
></v-text-field>
</v-col>
<v-col cols="12" sm="12">
<phone-number-input
:isEmailLogin="true"
@input="(ph) => (phone_number = ph)"
></phone-number-input>
</v-col>
</v-row>
</v-form>
<v-row>
<v-col cols="12" sm="6" offset="6">
<v-spacer></v-spacer>
<v-btn
color="blue darken-4"
@click="goto_account"
block
rounded
x-large
depressed
dark
:disabled="!Number(phone_number)"
>
Continue
<v-icon>mdi-arrow-right</v-icon>
</v-btn>
</v-col>
</v-row>
</v-stepper-content>
<v-stepper-content step="2">
<v-alert type="warning" v-if="exist"
>This email is already taken, if this is your email please log
in
</v-alert>
<v-form
v-model="account_infor"
ref="account_form"
@keyup.native.enter="account_infor && sign_up()"
>
<v-text-field
type="email"
label="E-Mail"
class="mt-2"
outlined
:rules="email_rules"
v-model="new_email"
@blur="check_exist()"
:loading="checking"
:autofocus="true"
:disabled="progress"
>
</v-text-field>
<v-text-field
v-model="new_password"
:rules="password_rules"
:type="show_pass1 ? 'text' : 'password'"
label="Password"
counter
outlined
hint="Must be at least 8 characters long"
persistent-hint
:disabled="progress"
></v-text-field>
<v-text-field
v-model="confirm_password"
:rules="password_rules"
:type="show_pass2 ? 'text' : 'password'"
label="Repeat Password"
counter
outlined
:disabled="progress"
></v-text-field>
<span v-if="!hasMediaToken">How did you hear about us?</span>
<v-autocomplete
v-if="!hasMediaToken"
label="Select option"
:items="filteredMedia"
item-value="media_name"
item-text="media_name"
v-model="media"
clearable
outlined
:disabled="progress"
>
</v-autocomplete>
</v-form>
<v-alert type="error" v-if="login_error">
<h5>{{ error_msg }}</h5>
</v-alert>
<v-row>
<v-col cols="12" sm="1" class="pl-4">
<v-checkbox
class="p-0 m-0"
color="blue darken-4"
v-model="read_terms"
></v-checkbox>
</v-col>
<v-col cols="12" sm="11">
Agree to Built Accounting's
<a
href="https://builtaccounting.com/terms-conditions/"
target="_blank"
>Terms</a
>
and
<a
target="_blank"
href=" https://builtaccounting.com/terms-conditions/"
>Conditions</a
>
</v-col>
</v-row>
<v-row dense>
<v-col cols="12" sm="6">
<v-btn color="primary" @click="step = step - 1" text>
<v-icon>mdi-arrow-left</v-icon>
Back
</v-btn>
</v-col>
<v-col cols="12" sm="6">
<v-btn
color="blue darken-4"
@click="sign_up"
:disabled="!read_terms"
:loading="progress"
x-large
rounded
dark
depressed
block
>
Sign Up Now
<v-icon>mdi-arrow-right</v-icon>
</v-btn>
</v-col>
</v-row>
</v-stepper-content>
<v-stepper-content step="3">
<center>
<h3 class="font-weight-light">
Verification code was sent to
<strong>{{ phone_number }}</strong>
</h3>
<h4>Enter the code to verify your phone number</h4>
</center>
<o-t-p-component
:phone_number="phone_number"
:id="otp_id"
v-if="!progress"
@done="VerificationDone"
></o-t-p-component>
<v-btn text v-if="!progress" @click="step = 2"
><v-icon>mdi-arrow-left</v-icon>Back</v-btn
>
<v-btn color="blue" text :loading="progress" @click="SendOTP"
>Resend code</v-btn
>
</v-stepper-content>
</v-stepper-items>
</v-stepper>
<center class="mt-5">
<h2 class="mt-3 mb-3">OR</h2>
<v-btn
class="mt-3 mb-3"
color="blue"
outlined
dark
x-large
rounded
depressed
block
style="text-decoration: none"
:href="$store.state.URL + 'login/google'"
>Sign up with google <v-icon>mdi-google</v-icon></v-btn
>
Already have a Built account?
<v-btn color="blue darken-4" dark text rounded to="/login"
>Login</v-btn
>
</center>
</v-card-text>
</v-card>
<v-snackbar v-model="show_error" color="error">{{
error_message
}}</v-snackbar>
</div>
</template>
<script>
import OTPComponent from "../agents/OTPComponent";
import PhoneNumberInput from "../agents/PhoneNumberInput";
import { getAccessToken, setAccessToken } from "../../utils";
export default {
name: "registerComponent",
components: { PhoneNumberInput, OTPComponent },
data() {
return {
error_message: "",
show_error: false,
otp_id: null,
media: null,
read_terms: true,
checking: false,
exist: false,
loggingin: false,
service_pop: false,
retail_pop: false,
success_msg: false,
success_message: "",
logo: [],
imgsrc: "/img/logo_place.png",
previewURL: "/img/logo_place.png",
logo_file: {},
business_name: "",
business_name_rules: [(value) => !!value || "Business Name is Required."],
invoice_id: "",
invoiceID_rules: [(value) => !!value || "Invoice ID is required"],
business_email: "",
business_email_rules: [
(v) => !!v || "E-mail is required",
(v) => /.+@.+/.test(v) || "E-mail must be valid",
],
business_phone: "",
business_phone_rules: [
(value) => !!value || "Business Phone Number is Required.",
],
business_bank_name: "",
business_bank_rules: [
(value) => !!value || "Business Bank Name is Required.",
],
business_account_name: "",
business_account_rules: [
(value) => !!value || "Business Bank account name is Required.",
],
business_account_number: "",
business_account_number_rules: [
(value) => !!value || "Business Bank Account Number is Required.",
],
business_address: "",
business_address_rules: [
(value) => !!value || "Business Address is Required.",
],
business_location: "",
business_valid: false,
account_infor: false,
personal_infor: false,
first_name: "",
last_name: "",
call_code: "",
flag: "",
phone_number: "",
new_password: "",
confirm_password: "",
new_email: "",
progress: false,
show_pass: false,
show_pass1: false,
show_pass2: false,
remember_me: true,
valid_form: false,
login_error: false,
error_msg: "",
countries: null,
password: "",
email: "",
step: 1,
is_service: false,
is_retail_wholesale: true,
preview: "",
password_rules: [
(value) => !!value || "Password is Required.",
(value) =>
value.length >= 8 || "Password must be at least 8 characters",
],
first_name_rules: [(value) => !!value || "Name is Required."],
country_rules: [(value) => !!value || "Country is Required."],
phone_number_rules: [(value) => !!value || "Phone number is Required."],
email_rules: [(value) => !!value || "E-mail is Required."],
show: false,
tab: null,
user: {},
platforms: [
{
value: "Telemarketing",
text: "Salesperson from Built",
},
{
value: "Facebook Post",
text: "Facebook Post",
},
{
value: "YouTube Advert",
text: "YouTube Advert",
},
{
value: "Blog Post",
text: "Blog Post",
},
{
value: "Google Search",
text: "Google Search",
},
{
value: "A Friend",
text: "A Friend",
},
{
value: "Co-worker",
text: "Co-worker",
},
{
value: "Twitter",
text: "Twitter",
},
{
value: "Linkedin",
text: "Linkedin",
},
{
value: "WhatsApp",
text: "WhatsApp",
},
{
value: "E-Mail",
text: "E-Mail",
},
{
value: "Radio",
text: "Radio",
},
{
value: "TV",
text: "TV",
},
{
value: "Newspaper",
text: "Newspaper",
},
{
value: "I cannot Remember",
text: "I cannot Remember",
},
{
value: "Others",
text: "Others",
},
],
};
},
computed: {
filteredMedia() {
return this.$store.state.mediaLinks.filter((item) => {
return item.status === "active";
});
},
hasMediaToken() {
return Boolean(localStorage.media_uuid);
},
},
mounted() {
this.getMedia();
if (this.$store.state.user.is_loged_in) {
this.$router.back();
}
},
methods: {
VerificationDone(otp) {
if (otp.status) {
this.otp_id = otp.id;
this.sign_up();
} else {
this.error_message = otp.message;
this.show_error = true;
this.progress = false;
return false;
}
},
SendOTP() {
if (!this.read_terms) {
this.error_msg = "You have not agreed to our terms and conditions";
this.login_error = true;
this.progress = false;
return false;
}
if (this.new_password !== this.confirm_password) {
this.error_msg = "Passwords do not match!";
this.login_error = true;
this.progress = false;
return false;
}
this.progress = true;
axios
.get("/api/auth/code/" + this.phone_number)
.then((res) => {
this.otp_id = res.data.id;
this.step = 3;
this.progress = false;
})
.catch((error) => {
this.progress = false;
this.error_msg =
error.response.status === 302
? error.response.data
: "Something went wrong, could not process your signup";
this.login_error = true;
});
},
getMedia() {
axios.get("/api/media").then((res) => {
this.$store.state.mediaLinks = res.data;
if (this.hasMediaToken) {
let media = this.$store.state.mediaLinks.find((link) => {
return link.uuid === localStorage.media_uuid;
});
this.media = media.media_name;
}
});
},
check_exist() {
if (this.new_email) {
this.checking = true;
axios.post("/api/checkemail", { email: this.new_email }).then((res) => {
this.checking = false;
this.exist = res.data.exist;
});
}
},
selectPass() {
let pass = document.getElementById("filepass");
pass.click();
},
passChange(e) {
this.progress = true;
this.logo = e.target.files[0];
if (this.logo.size < 532598) {
const fr = new FileReader();
let logo_file = fr.readAsDataURL(this.logo);
fr.onload = () => {
this.imgsrc = fr.result;
this.progress = false;
};
} else {
this.error_msg = "Image size too big please select a smaller image";
this.login_error = true;
}
},
getAddressData(addressData, placeResultData, id) {
if (addressData) {
this.business_location =
addressData.longitude + "," + addressData.latitude;
}
},
goto_account() {
if (this.$refs.person_form.validate()) {
this.step = 2;
}
},
sign_up(e) {
if (this.$refs.account_form.validate()) {
if (!this.read_terms) {
this.error_msg = "You have not agreed to our terms and conditions";
this.login_error = true;
this.progress = false;
return false;
}
if (this.new_password === this.confirm_password) {
axios
.post("/api/checkemail", { email: this.new_email })
.then((res) => {
this.checking = false;
this.exist = res.data.exist;
if (this.exist) {
return false;
}
this.progress = true;
let signup_form = new FormData();
signup_form.append("first_name", this.first_name);
signup_form.append("last_name", this.last_name);
signup_form.append("phone_number", this.phone_number);
signup_form.append("email", this.new_email);
signup_form.append("media", this.media);
signup_form.append("password", this.new_password);
signup_form.append("ticket", this.otp_id);
signup_form.append(
"password_confirmation",
this.confirm_password
);
axios
.post("/api/auth/signup", signup_form)
.then((res) => {
if (res.status === 302) {
this.exist = true;
return false;
}
setAccessToken(res.data.access_token);
this.$router.push({ path: "/onboard" });
location.reload();
})
.catch((err) => {
this.progress = false;
this.error_msg =
err.response.status === 302
? err.response.data
: "Something went wrong, please try again";
this.login_error = true;
});
});
} else {
this.login_error = true;
this.error_msg =
"Your passwords are not the same please check and try again";
}
}
},
},
};
</script>
<style scoped></style>
Editor is loading...