2020-02-13 15:48:12 +01:00
< template >
2020-06-25 11:36:35 +02:00
< div >
< nav class = "breadcrumb" aria -label = " breadcrumbs " >
< ul >
< li >
< router -link : to = "{ name: RouteName.ACCOUNT_SETTINGS }" > { { $t ( "Account" ) } } < / r o u t e r - l i n k >
< / li >
< li class = "is-active" >
< router -link : to = "{ name: RouteName.ACCOUNT_SETTINGS_GENERAL }" > { {
$t ( "General" )
} } < / r o u t e r - l i n k >
< / li >
< / ul >
< / nav >
< section >
< div class = "setting-title" >
< h2 > { { $t ( "Email" ) } } < / h2 >
< / div >
< i18n
tag = "p"
class = "content"
v - if = "loggedUser"
path = "Your current email is {email}. You use it to log in."
2020-02-18 08:57:00 +01:00
>
2020-06-25 11:36:35 +02:00
< b slot = "email" > { { loggedUser . email } } < / b >
< / i18n >
< b -notification
type = "is-danger"
has - icon
aria - close - label = "Close notification"
role = "alert"
: key = "error"
v - for = "error in changeEmailErrors"
> { { error } } < / b - n o t i f i c a t i o n
2020-02-18 08:57:00 +01:00
>
2020-06-25 11:36:35 +02:00
< form @submit.prevent ="resetEmailAction" ref = "emailForm" class = "form" >
< b -field : label = "$t('New email')" >
< b -input aria -required = " true " required type = "email" v -model = " newEmail " / >
< / b - f i e l d >
< p class = "help" > { { $t ( "You'll receive a confirmation email." ) } } < / p >
< b -field :label ="$t('Password')" >
< b -input
aria - required = "true"
required
type = "password"
password - reveal
minlength = "6"
v - model = "passwordForEmailChange"
/ >
< / b - f i e l d >
< button
class = "button is-primary"
: disabled = "!($refs.emailForm && $refs.emailForm.checkValidity())"
>
{ { $t ( "Change my email" ) } }
< / button >
< / form >
< div class = "setting-title" >
< h2 > { { $t ( "Password" ) } } < / h2 >
< / div >
< b -notification
type = "is-danger"
has - icon
aria - close - label = "Close notification"
role = "alert"
: key = "error"
v - for = "error in changePasswordErrors"
> { { error } } < / b - n o t i f i c a t i o n
>
< form @submit.prevent ="resetPasswordAction" ref = "passwordForm" class = "form" >
< b -field : label = "$t('Old password')" >
< b -input
aria - required = "true"
required
type = "password"
password - reveal
minlength = "6"
v - model = "oldPassword"
/ >
< / b - f i e l d >
< b -field : label = "$t('New password')" >
< b -input
aria - required = "true"
required
type = "password"
password - reveal
minlength = "6"
v - model = "newPassword"
/ >
< / b - f i e l d >
< button
class = "button is-primary"
: disabled = "!($refs.passwordForm && $refs.passwordForm.checkValidity())"
>
{ { $t ( "Change my password" ) } }
< / button >
< / form >
< div class = "setting-title" >
< h2 > { { $t ( "Delete account" ) } } < / h2 >
< / div >
< p class = "content" > { { $t ( "Deleting my account will delete all of my identities." ) } } < / p >
< b -button @click ="openDeleteAccountModal" type = "is-danger" >
{ { $t ( "Delete my account" ) } }
< / b - b u t t o n >
2020-02-13 15:48:12 +01:00
2020-06-25 11:36:35 +02:00
< b -modal
: active . sync = "isDeleteAccountModalActive"
has - modal - card
full - screen
: can - cancel = "false"
>
< section class = "hero is-primary is-fullheight" >
< div class = "hero-body has-text-centered" >
< div class = "container" >
< div class = "columns" >
< div class = "column is-one-third-desktop is-offset-one-third-desktop" >
< h1 class = "title" > { { $t ( "Deleting your Mobilizon account" ) } } < / h1 >
< p class = "content" >
{ {
$t (
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever."
)
} }
< br / >
< b > { { $t ( "There will be no way to recover your data." ) } } < / b >
< / p >
< p class = "content" >
{ { $t ( "Please enter your password to confirm this action." ) } }
< / p >
< form @submit.prevent ="deleteAccount" >
< b -field >
< b -input
type = "password"
v - model = "passwordForAccountDeletion"
password - reveal
icon = "lock"
: placeholder = "$t('Password')"
/ >
< / b - f i e l d >
< b -button native -type = " submit " type = "is-danger" size = "is-large" >
{ { $t ( "Delete everything" ) } }
< / b - b u t t o n >
< / form >
< div class = "cancel-button" >
< b -button type = "is-light" @ click = "isDeleteAccountModalActive = false" >
{ { $t ( "Cancel" ) } }
< / b - b u t t o n >
< / div >
2020-02-13 15:48:12 +01:00
< / div >
2020-02-18 08:57:00 +01:00
< / div >
< / div >
< / div >
2020-06-25 11:36:35 +02:00
< / section >
< / b - m o d a l >
< / section >
< / div >
2020-02-13 15:48:12 +01:00
< / template >
< script lang = "ts" >
2020-02-18 08:57:00 +01:00
import { Component , Vue , Ref } from "vue-property-decorator" ;
import { CHANGE _EMAIL , CHANGE _PASSWORD , DELETE _ACCOUNT , LOGGED _USER } from "../../graphql/user" ;
import RouteName from "../../router/name" ;
import { ICurrentUser } from "../../types/current-user.model" ;
import { logout } from "../../utils/auth" ;
2020-02-13 15:48:12 +01:00
@ Component ( {
apollo : {
loggedUser : LOGGED _USER ,
} ,
} )
export default class AccountSettings extends Vue {
2020-02-18 08:57:00 +01:00
@ Ref ( "passwordForm" ) readonly passwordForm ! : HTMLElement ;
2020-02-13 15:48:12 +01:00
loggedUser ! : ICurrentUser ;
2020-02-18 08:57:00 +01:00
passwordForEmailChange = "" ;
newEmail = "" ;
2020-02-13 15:48:12 +01:00
changeEmailErrors : string [ ] = [ ] ;
2020-02-18 08:57:00 +01:00
oldPassword = "" ;
newPassword = "" ;
2020-02-13 15:48:12 +01:00
changePasswordErrors : string [ ] = [ ] ;
2020-02-18 08:57:00 +01:00
isDeleteAccountModalActive = false ;
passwordForAccountDeletion = "" ;
2020-02-13 15:48:12 +01:00
RouteName = RouteName ;
async resetEmailAction ( ) {
this . changeEmailErrors = [ ] ;
try {
await this . $apollo . mutate ( {
mutation : CHANGE _EMAIL ,
variables : {
email : this . newEmail ,
password : this . passwordForEmailChange ,
} ,
} ) ;
2020-02-18 08:57:00 +01:00
this . $notifier . info (
this . $t (
"The account's email address was changed. Check your emails to verify it."
) as string
) ;
this . newEmail = "" ;
this . passwordForEmailChange = "" ;
2020-02-13 15:48:12 +01:00
} catch ( err ) {
2020-02-18 08:57:00 +01:00
this . handleErrors ( "email" , err ) ;
2020-02-13 15:48:12 +01:00
}
}
async resetPasswordAction ( ) {
this . changePasswordErrors = [ ] ;
try {
await this . $apollo . mutate ( {
mutation : CHANGE _PASSWORD ,
variables : {
oldPassword : this . oldPassword ,
newPassword : this . newPassword ,
} ,
} ) ;
2020-02-18 08:57:00 +01:00
this . $notifier . success ( this . $t ( "The password was successfully changed" ) as string ) ;
2020-02-13 15:48:12 +01:00
} catch ( err ) {
2020-02-18 08:57:00 +01:00
this . handleErrors ( "password" , err ) ;
2020-02-13 15:48:12 +01:00
}
}
protected async openDeleteAccountModal ( ) {
2020-02-18 08:57:00 +01:00
this . passwordForAccountDeletion = "" ;
2020-02-13 15:48:12 +01:00
this . isDeleteAccountModalActive = true ;
}
async deleteAccount ( ) {
try {
await this . $apollo . mutate ( {
mutation : DELETE _ACCOUNT ,
variables : {
password : this . passwordForAccountDeletion ,
} ,
} ) ;
await logout ( this . $apollo . provider . defaultClient ) ;
this . $buefy . notification . open ( {
2020-02-18 08:57:00 +01:00
message : this . $t ( "Your account has been successfully deleted" ) as string ,
type : "is-success" ,
position : "is-bottom-right" ,
2020-02-13 15:48:12 +01:00
duration : 5000 ,
} ) ;
return await this . $router . push ( { name : RouteName . HOME } ) ;
} catch ( err ) {
2020-02-18 08:57:00 +01:00
this . handleErrors ( "delete" , err ) ;
2020-02-13 15:48:12 +01:00
}
}
private handleErrors ( type : string , err : any ) {
console . error ( err ) ;
if ( err . graphQLErrors !== undefined ) {
2020-02-18 08:57:00 +01:00
err . graphQLErrors . forEach ( ( { message } : { message : string } ) => {
2020-02-13 15:48:12 +01:00
switch ( type ) {
2020-02-18 08:57:00 +01:00
case "email" :
2020-02-13 15:48:12 +01:00
this . changeEmailErrors . push ( this . convertMessage ( message ) as string ) ;
break ;
2020-02-18 08:57:00 +01:00
case "password" :
2020-02-13 15:48:12 +01:00
this . changePasswordErrors . push ( this . convertMessage ( message ) as string ) ;
break ;
}
} ) ;
}
}
private convertMessage ( message : string ) {
switch ( message ) {
2020-02-18 08:57:00 +01:00
case "The password provided is invalid" :
return this . $t ( "The password provided is invalid" ) ;
case "The new email must be different" :
return this . $t ( "The new email must be different" ) ;
2020-02-13 15:48:12 +01:00
case "The new email doesn't seem to be valid" :
return this . $t ( "The new email doesn't seem to be valid" ) ;
2020-02-18 08:57:00 +01:00
case "The current password is invalid" :
return this . $t ( "The current password is invalid" ) ;
case "The new password must be different" :
return this . $t ( "The new password must be different" ) ;
2020-02-13 15:48:12 +01:00
}
}
}
< / script >
2020-06-05 15:37:45 +02:00
< style lang = "scss" >
2020-02-18 08:57:00 +01:00
@ import "@/variables.scss" ;
2020-02-13 15:48:12 +01:00
2020-02-18 08:57:00 +01:00
. setting - title {
2020-06-16 16:15:38 +02:00
margin - top : 2 rem ;
margin - bottom : 1 rem ;
2020-02-13 15:48:12 +01:00
2020-02-18 08:57:00 +01:00
h2 {
display : inline ;
background : $secondary ;
padding : 2 px 7.5 px ;
text - transform : uppercase ;
font - size : 1.25 rem ;
}
}
2020-06-05 15:37:45 +02:00
< / style >
2020-02-13 15:48:12 +01:00
2020-06-05 15:37:45 +02:00
< style lang = "scss" scoped >
2020-02-18 08:57:00 +01:00
. cancel - button {
margin - top : 2 rem ;
}
2020-02-13 15:48:12 +01:00
2020-02-18 08:57:00 +01:00
/deep/ . modal . modal - background {
background - color : initial ;
}
2020-02-13 15:48:12 +01:00
< / style >