You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
425 lines
15 KiB
425 lines
15 KiB
<template>
|
|
<div class="setting xl:tw-max-w-[1246px] xl:tw-mx-auto">
|
|
<div class="xl:tw-flex xl:tw-justify-between xl:tw-items-start">
|
|
<userSidebar :userData="userData" :firstName="firstName" :lastName="lastName" class="tw-hidden xl:tw-block">
|
|
</userSidebar>
|
|
<!-- <div class="xl:tw-hidden"></div> -->
|
|
<div class="tw-bg-white xl:tw-p-[30px] xl:tw-rounded-[20px] xl:tw-min-w-[900px] xl:tw-max-w-[900px]">
|
|
<div class="tw-text-[20px] tw-font-bold tw-text-base-primary tw-mb-[20px] md:t24 md:tw-mb-[30px]">
|
|
<two-dots class="tw-mr-[30px]"></two-dots>{{ $t("userProfile.setting") }}
|
|
</div>
|
|
<div class="tw-mb-[30px] md:tw-max-w-[392px]">
|
|
<div class="tw-body-2 tw-font-bold tw-text-base-primary tw-mb-[15px] md:t16">
|
|
{{ $t('userProfile.account') }}
|
|
</div>
|
|
<input type="text"
|
|
class="tw-h-[40px] tw-w-full tw-border tw-bg-white tw-border-neutral-200 tw-border-solid tw-px-[20px] tw-py-[10px] tw-rounded-[5px] disabled:tw-text-base-disable"
|
|
:value="userData.account" disabled />
|
|
</div>
|
|
<Transition name="bounce">
|
|
<div v-show="SSOShow == 2" :class="['tw-mb-[50px] md:tw-mb-[30px]',SSOShow == 2 ? '':'tw-hidden']">
|
|
<div class="tw-body-2 tw-font-medium tw-text-base-primary tw-mb-[15px] md:t16">
|
|
{{ $t('userProfile.manageSSO')}}
|
|
</div>
|
|
<div class="md:tw-flex md:tw-flex-row">
|
|
<div
|
|
class="tw-w-full tw-border tw-border-solid tw-border-neutral-200 tw-rounded-[10px] tw-grid tw-grid-cols-[auto_71px] tw-items-center tw-gap-[50px] tw-px-[30px] tw-py-[14px] tw-mb-[20px] md:tw-mb-0 md:tw-mr-[20px] md:tw-py-[30px]">
|
|
<div class="tw-text-[16px] tw-text-base-primary md:tw-text-[14px]">
|
|
Facebook
|
|
</div>
|
|
<button v-if="facebook.social_schema" @click="openModal('facebook')"
|
|
class="tw-bg-warning-background tw-text-warning-default tw-rounded-[12px] tw-px-[16px] tw-py-[9px] tw-whitespace-nowrap">
|
|
{{$t('userProfile.SSOUnLink')}}
|
|
</button>
|
|
<button v-else @click="facebookLogin"
|
|
class="tw-bg-warning-default tw-text-white tw-rounded-[12px] tw-px-[16px] tw-py-[9px]">
|
|
{{$t('userProfile.SSOLink')}}
|
|
</button>
|
|
</div>
|
|
<div
|
|
class="tw-w-full tw-border tw-border-solid tw-border-neutral-200 tw-rounded-[10px] tw-grid tw-grid-cols-[auto_90px] tw-items-center tw-gap-[50px] tw-px-[30px] tw-py-[14px] md:tw-py-[30px]">
|
|
<div class="tw-text-[16px] tw-text-base-primary md:tw-text-[14px]">
|
|
Google
|
|
</div>
|
|
<button v-if="google.social_schema" @click.prevent="openModal('google')"
|
|
class="tw-bg-warning-background tw-text-warning-default tw-rounded-[12px] tw-px-[16px] tw-py-[9px]">
|
|
{{$t('userProfile.SSOUnLink')}}
|
|
</button>
|
|
<button v-else @click="googleLogin"
|
|
class="tw-bg-warning-default tw-text-white tw-rounded-[12px] tw-px-[16px] tw-py-[9px]">
|
|
{{$t('userProfile.SSOLink')}}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</Transition>
|
|
<Transition name="bounce">
|
|
<div v-show="SSOShow == 1">
|
|
<div class="tw-body-2 tw-font-bold tw-text-base-primary tw-mb-[20px] md:t16 md:tw-mb-[15px]">
|
|
{{$t('userProfile.resetPassword')}}
|
|
</div>
|
|
<div class="tw-mb-[20px] md:tw-max-w-[392px] md:tw-mb-[15px]">
|
|
<div class="tw-text-[16px] tw-text-base-primary tw-mb-[6px] md:tw-text-[14px]">
|
|
{{$t('userProfile.oldPassword')}}
|
|
</div>
|
|
<input v-model="userPass.user_old_pass" type="password"
|
|
class="tw-h-[40px] tw-w-full tw-border tw-border-neutral-200 tw-border-solid tw-px-[20px] tw-py-[10px] tw-rounded-[5px]" />
|
|
</div>
|
|
<div class="tw-mb-[20px] md:tw-max-w-[392px] md:tw-mb-[15px]">
|
|
<!-- <div
|
|
class="tw-text-[16px] tw-text-base-primary tw-mb-[6px] md:tw-text-[14px]"
|
|
>
|
|
New password
|
|
</div>
|
|
<input
|
|
type="text"
|
|
class="tw-h-[40px] tw-w-full tw-border tw-border-neutral-200 tw-border-solid tw-px-[20px] tw-py-[10px] tw-rounded-[5px] tw-mb-[6px]"
|
|
/> -->
|
|
<div>
|
|
<div class="tw-text-[16px] tw-text-base-primary tw-mb-[6px] md:tw-text-[14px]">
|
|
{{$t('userProfile.newPassword')}}
|
|
</div>
|
|
<v-text-field v-model="userPass.user_new_pass" :append-icon="showPass ? 'mdi-eye' : 'mdi-eye-off'"
|
|
@click:append="showPass = !showPass" @blur="checkPassword($event)"
|
|
:type="showPass ? 'text' : 'password'" :rules="[rules.checkPassword, rules.require]" hide-details
|
|
dense outlined validate-on-blur></v-text-field>
|
|
</div>
|
|
<div v-show="!isNewPassValid" class="tw-footer-body tw-w-full tw-leading-none tw-pt-1" :class="
|
|
isNewPassValid
|
|
? 'tw-text-neutrals-400'
|
|
: 'tw-text-error-default'
|
|
">
|
|
{{ $t('userProfile.passwordsHint') }}
|
|
</div>
|
|
</div>
|
|
<div class="tw-mb-[20px] md:tw-max-w-[392px] md:tw-mb-[15px]">
|
|
<div>
|
|
<div class="tw-text-[16px] tw-text-base-primary tw-mb-[6px] md:tw-text-[14px]">
|
|
{{$t('userProfile.confirmPassword')}}
|
|
</div>
|
|
<v-text-field v-model="confirmPass" :append-icon="showConfirmPass ? 'mdi-eye' : 'mdi-eye-off'"
|
|
@click:append="showConfirmPass = !showConfirmPass" :type="showConfirmPass ? 'text' : 'password'"
|
|
:rules="[rules.checkConfirmPassword, rules.require]" dense outlined validate-on-blur></v-text-field>
|
|
</div>
|
|
<!-- <div
|
|
class="tw-text-[16px] tw-text-base-primary tw-mb-[6px] md:tw-text-[14px]"
|
|
>
|
|
Confirm password
|
|
</div>
|
|
<input
|
|
type="text"
|
|
class="tw-h-[40px] tw-w-full tw-border tw-border-neutral-200 tw-border-solid tw-px-[20px] tw-py-[10px] tw-rounded-[5px] tw-mb-[6px]"
|
|
/>
|
|
<img
|
|
src="~/assets/svg/hidepassword.svg"
|
|
class="tw-absolute tw-top-[717px] tw-right-[20px] md:tw-top-[621px] md:tw-left-[359px] xl:tw-left-[777px] xl:tw-top-[650px]"
|
|
alt=""
|
|
/> -->
|
|
</div>
|
|
</div>
|
|
</Transition>
|
|
<Transition name="bounce">
|
|
<div v-show="SSOShow == 1"
|
|
:lass="['tw-mb-[64px] md:tw-flex md:tw-flex-row md:tw-items-center md:tw-mb-[40px]']">
|
|
<button @click="resetPassword"
|
|
class="tw-text-white tw-bg-primary-1 tw-text-[18px] tw-rounded-[16px] tw-w-full tw-py-[13px] tw-mb-[15px] md:tw-text-[16px] md:tw-w-fit md:tw-px-[16px] md:tw-py-[10px] md:tw-mr-[20px] md:tw-mb-0">
|
|
{{$t('userProfile.resetPassword')}}
|
|
</button>
|
|
<button
|
|
class="tw-text-primary-1 tw-bg-white tw-text-[18px] tw-rounded-[16px] tw-w-full tw-py-[13px] md:tw-text-[16px] md:tw-w-fit md:tw-px-[16px] md:tw-py-[10px]">
|
|
{{$t('userProfile.cancel')}}
|
|
</button>
|
|
</div>
|
|
</Transition>
|
|
<button @click="openDeleteModal()"
|
|
class="tw-text-error-default tw-text-[16px] tw-underline tw-mt-[44px] md:tw-mt-[99px] xl:tw-mt-[39px]">
|
|
{{$t('userProfile.deleteAccount')}}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
<Transition name="bounce">
|
|
<unLinkModal></unLinkModal>
|
|
</Transition>
|
|
<Transition name="bounce">
|
|
<deleteAccountModal></deleteAccountModal>
|
|
</Transition>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import SavedExhibitions from "../../components/user/savedExhibitions.vue";
|
|
import SavedExhibitionsDialog from "../../components/user/savedExhibitionsDialog.vue";
|
|
import Setting from "../../components/user/Setting.vue";
|
|
import SettingDialog from "../../components/user/settingDialog.vue";
|
|
import CropImageDialog from "../../components/user/cropImageDialog.vue";
|
|
import CompanyInfo from "../../components/user/companyInfo.vue";
|
|
import CompanyInfoDialog from "../../components/user/companyInfoDialog.vue";
|
|
import ContactInfo from "../../components/user/contactInfo.vue";
|
|
import vClickOutside from "v-click-outside";
|
|
import BookingList from "../../components/user/bookingList.vue";
|
|
import TwoDots from "@/components/TwoDots";
|
|
import userSidebar from "@/components/user/userSidebar.vue";
|
|
import unLinkModal from "@/components/newComponent/modal/unLinkModal.vue";
|
|
import deleteAccountModal from "@/components/newComponent/modal/deleteAccountModal.vue";
|
|
|
|
export default {
|
|
name: "setting",
|
|
layout: "profile",
|
|
directives: {
|
|
clickOutside: vClickOutside.directive,
|
|
},
|
|
components: {
|
|
SavedExhibitions,
|
|
SavedExhibitionsDialog,
|
|
Setting,
|
|
SettingDialog,
|
|
CropImageDialog,
|
|
CompanyInfo,
|
|
CompanyInfoDialog,
|
|
ContactInfo,
|
|
BookingList,
|
|
TwoDots,
|
|
userSidebar,
|
|
unLinkModal,
|
|
deleteAccountModal,
|
|
},
|
|
data() {
|
|
return {
|
|
google: {},
|
|
facebook: {},
|
|
deleteDialogActive: false,
|
|
valid: false,
|
|
showPass: false,
|
|
showConfirmPass: false,
|
|
userPass: {
|
|
user_old_pass: "",
|
|
user_new_pass: "",
|
|
},
|
|
isNewPassValid: true,
|
|
firstName: "",
|
|
lastName: "",
|
|
userData: {},
|
|
SSOShow: 0,
|
|
confirmPass: "",
|
|
deleteAccountImg: require("~/assets/img/deleteAccount.png"),
|
|
rules: {
|
|
require: (value) => !!value || this.$t("Required."),
|
|
email: (v) =>
|
|
/^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/.test(
|
|
v
|
|
) || this.$t("Invalid email"),
|
|
checkPassword: (v) =>
|
|
(/(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])/.test(v) &&
|
|
v.length >= 8 &&
|
|
v.length <= 20) ||
|
|
this.$t(
|
|
"Passwords must be 8-20 characters with at least 1 number, 1 lower case letter and 1 upper case letter"
|
|
),
|
|
checkConfirmPassword: (v) =>
|
|
this.confirmPass === this.userPass.user_new_pass ||
|
|
this.$t("Your password and confirmation password do not match"),
|
|
},
|
|
};
|
|
},
|
|
created() {
|
|
this.geiApiDemo();
|
|
//this.fetchUserData();
|
|
if (process.browser) {
|
|
window.addEventListener("resize", this.handleResize);
|
|
}
|
|
//this.handleResize();
|
|
},
|
|
mounted() {
|
|
this.$nextTick(() => {
|
|
window.addEventListener("resize", this.onResize);
|
|
});
|
|
},
|
|
destroyed() {
|
|
if (process.browser) {
|
|
window.removeEventListener("resize", this.handleResize);
|
|
}
|
|
},
|
|
computed: {
|
|
windowWidth() {
|
|
if (process.client) {
|
|
this.width = window.innerWidth;
|
|
}
|
|
return this.width;
|
|
},
|
|
},
|
|
methods: {
|
|
handleResize() {
|
|
if (process.browser) {
|
|
this.width = window.innerWidth;
|
|
}
|
|
},
|
|
geiApiDemo(){
|
|
this.$axios
|
|
.get(
|
|
`/trending/api/members/Info`
|
|
)
|
|
.then((res) => {
|
|
console.log(JSON.stringify(res));
|
|
})
|
|
.catch((err) => {
|
|
console.log(err);
|
|
});
|
|
},
|
|
fetchUserData() {
|
|
this.$axios
|
|
.get(
|
|
`/member/users/${this.$auth.$storage.getUniversal("jwt").user_id
|
|
}?jwt=${this.$auth.$storage.getUniversal("jwt").token}`
|
|
)
|
|
.then((res) => {
|
|
this.userData = res.data;
|
|
this.firstName = res.data.first_name;
|
|
this.lastName = res.data.last_name;
|
|
this.facebook =
|
|
res.data.UserSocialRelation.filter(
|
|
(item) => item.social_schema === "facebook"
|
|
)[0] || {};
|
|
this.google =
|
|
res.data.UserSocialRelation.filter(
|
|
(item) => item.social_schema === "google"
|
|
)[0] || {};
|
|
this.checkSSO();
|
|
})
|
|
.catch((err) => {
|
|
console.log(err);
|
|
});
|
|
},
|
|
removeSocialRelation(schema) {
|
|
delete schema.social_id;
|
|
this.$axios
|
|
.put(
|
|
`/member/users/social?jwt=${this.$auth.$storage.getUniversal("jwt").token || ""
|
|
}`,
|
|
schema
|
|
)
|
|
.then((result) => {
|
|
this.$emit("refetch-user");
|
|
})
|
|
.catch((err) => {
|
|
console.log(err);
|
|
});
|
|
this.$nextTick(() => {
|
|
schema.social_schema === "google"
|
|
? (this.google = {})
|
|
: (this.facebook = {});
|
|
});
|
|
},
|
|
facebookLogin() {
|
|
this.$auth.loginWith("facebook");
|
|
},
|
|
googleLogin() {
|
|
this.$auth.loginWith("google");
|
|
},
|
|
resetPassword() {
|
|
if (
|
|
this.isNewPassValid &&
|
|
this.userPass.user_old_pass !== this.userPass.user_new_pass
|
|
) {
|
|
this.$axios
|
|
.post(
|
|
`/member/users/pass?jwt=${this.$auth.$storage.getUniversal("jwt").token || ""
|
|
}`,
|
|
this.userPass
|
|
)
|
|
.then((result) => {
|
|
this.$auth.$storage.removeUniversal("jwt");
|
|
this.$auth.$storage.removeUniversal("userPicture");
|
|
this.$auth.$storage.removeUniversal("userLastName");
|
|
this.$notify({
|
|
type: "success",
|
|
title: "Awesome!",
|
|
text: "Your password has been updated successfully.",
|
|
});
|
|
setTimeout(() => {
|
|
this.$auth.logout();
|
|
this.$router.push(this.localePath("/user"));
|
|
}, 4000)
|
|
})
|
|
.catch((err) => {
|
|
console.log(err);
|
|
});
|
|
}
|
|
},
|
|
checkPassword(v) {
|
|
const pass = v.target.value;
|
|
this.isNewPassValid =
|
|
/(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])/.test(pass) &&
|
|
pass.length >= 8 &&
|
|
pass.length <= 20;
|
|
},
|
|
checkSSO() {
|
|
if (Object.keys(this.facebook).length == 0 && Object.keys(this.google).length == 0) {
|
|
this.SSOShow = 1;
|
|
} else {
|
|
this.SSOShow = 2;
|
|
}
|
|
},
|
|
openModal(type) {
|
|
if (type == 'google') {
|
|
if (Object.keys(this.facebook).length == 0) {
|
|
this.$modal.show('unLinkModal');
|
|
} else {
|
|
this.removeSocialRelation(this.google);
|
|
}
|
|
}
|
|
|
|
if (type == 'facebook') {
|
|
if (Object.keys(this.google).length == 0) {
|
|
this.$modal.show('unLinkModal');
|
|
} else {
|
|
this.removeSocialRelation(this.facebook);
|
|
}
|
|
}
|
|
},
|
|
openDeleteModal() {
|
|
this.$modal.show('deleteAccountModal');
|
|
}
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
:deep(.v-text-field.v-text-field--enclosed .v-text-field__details) {
|
|
padding: 0;
|
|
margin: 0;
|
|
}
|
|
|
|
:deep(.v-messages__message) {
|
|
font-size: 14px;
|
|
}
|
|
|
|
.v-text-field--outlined::v-deep {
|
|
fieldset {
|
|
border-color: #e5e5e5;
|
|
}
|
|
}
|
|
|
|
.bounce-enter-active {
|
|
animation: bounce-in 0.3s ease-out;
|
|
}
|
|
|
|
.bounce-leave-active {
|
|
animation: bounce-in 0.3s cubic-bezier(1, 0.5, 0.8, 1) reverse;
|
|
}
|
|
|
|
@keyframes bounce-in {
|
|
0% {
|
|
opacity: 0;
|
|
transform: translateY(-10px);
|
|
}
|
|
|
|
50% {
|
|
opacity: 0.5;
|
|
transform: translateY(-5px);
|
|
}
|
|
|
|
100% {
|
|
opacity: 1;
|
|
transform: translateY(0);
|
|
}
|
|
}
|
|
</style>
|