1 import { Component, linkEvent } from 'inferno';
2 import { Subscription } from 'rxjs';
3 import { retryWhen, delay, take } from 'rxjs/operators';
9 } from '../interfaces';
10 import { WebSocketService, UserService } from '../services';
11 import { wsJsonToRes, capitalizeFirstLetter, toast } from '../utils';
12 import { i18n } from '../i18next';
13 import { T } from 'inferno-i18next';
16 passwordChangeForm: PasswordChangeForm;
20 export class PasswordChange extends Component<any, State> {
21 private subscription: Subscription;
25 token: this.props.match.params.token,
27 password_verify: undefined,
32 constructor(props: any, context: any) {
33 super(props, context);
35 this.state = this.emptyState;
37 this.subscription = WebSocketService.Instance.subject
38 .pipe(retryWhen(errors => errors.pipe(delay(3000), take(10))))
40 msg => this.parseMessage(msg),
41 err => console.error(err),
42 () => console.log('complete')
46 componentWillUnmount() {
47 this.subscription.unsubscribe();
51 document.title = `${i18n.t('password_change')} - ${
52 WebSocketService.Instance.site.name
58 <div class="container">
60 <div class="col-12 col-lg-6 offset-lg-3 mb-4">
62 <T i18nKey="password_change">#</T>
64 {this.passwordChangeForm()}
71 passwordChangeForm() {
73 <form onSubmit={linkEvent(this, this.handlePasswordChangeSubmit)}>
74 <div class="form-group row">
75 <label class="col-sm-2 col-form-label">
76 <T i18nKey="new_password">#</T>
78 <div class="col-sm-10">
81 value={this.state.passwordChangeForm.password}
82 onInput={linkEvent(this, this.handlePasswordChange)}
88 <div class="form-group row">
89 <label class="col-sm-2 col-form-label">
90 <T i18nKey="verify_password">#</T>
92 <div class="col-sm-10">
95 value={this.state.passwordChangeForm.password_verify}
96 onInput={linkEvent(this, this.handleVerifyPasswordChange)}
102 <div class="form-group row">
103 <div class="col-sm-10">
104 <button type="submit" class="btn btn-secondary">
105 {this.state.loading ? (
106 <svg class="icon icon-spinner spin">
107 <use xlinkHref="#icon-spinner"></use>
110 capitalizeFirstLetter(i18n.t('save'))
119 handlePasswordChange(i: PasswordChange, event: any) {
120 i.state.passwordChangeForm.password = event.target.value;
124 handleVerifyPasswordChange(i: PasswordChange, event: any) {
125 i.state.passwordChangeForm.password_verify = event.target.value;
129 handlePasswordChangeSubmit(i: PasswordChange, event: any) {
130 event.preventDefault();
131 i.state.loading = true;
134 WebSocketService.Instance.passwordChange(i.state.passwordChangeForm);
137 parseMessage(msg: WebSocketJsonResponse) {
138 let res = wsJsonToRes(msg);
140 toast(i18n.t(msg.error), 'danger');
141 this.state.loading = false;
142 this.setState(this.state);
145 if (res.op == UserOperation.PasswordChange) {
146 let data = res.data as LoginResponse;
147 this.state = this.emptyState;
148 this.setState(this.state);
149 UserService.Instance.login(data);
150 this.props.history.push('/');