]> Untitled Git - lemmy.git/blob - ui/src/components/create-private-message.tsx
Merge remote-tracking branch 'upstream/master' into cake-day
[lemmy.git] / ui / src / components / create-private-message.tsx
1 import { Component } from 'inferno';
2 import { Subscription } from 'rxjs';
3 import { retryWhen, delay, take } from 'rxjs/operators';
4 import { PrivateMessageForm } from './private-message-form';
5 import { WebSocketService } from '../services';
6 import {
7   UserOperation,
8   WebSocketJsonResponse,
9   GetSiteResponse,
10   PrivateMessageFormParams,
11 } from '../interfaces';
12 import { toast, wsJsonToRes } from '../utils';
13 import { i18n } from '../i18next';
14
15 export class CreatePrivateMessage extends Component<any, any> {
16   private subscription: Subscription;
17   constructor(props: any, context: any) {
18     super(props, context);
19     this.handlePrivateMessageCreate = this.handlePrivateMessageCreate.bind(
20       this
21     );
22
23     this.subscription = WebSocketService.Instance.subject
24       .pipe(retryWhen(errors => errors.pipe(delay(3000), take(10))))
25       .subscribe(
26         msg => this.parseMessage(msg),
27         err => console.error(err),
28         () => console.log('complete')
29       );
30
31     WebSocketService.Instance.getSite();
32   }
33
34   componentWillUnmount() {
35     this.subscription.unsubscribe();
36   }
37
38   render() {
39     return (
40       <div class="container">
41         <div class="row">
42           <div class="col-12 col-lg-6 offset-lg-3 mb-4">
43             <h5>{i18n.t('create_private_message')}</h5>
44             <PrivateMessageForm
45               onCreate={this.handlePrivateMessageCreate}
46               params={this.params}
47             />
48           </div>
49         </div>
50       </div>
51     );
52   }
53
54   get params(): PrivateMessageFormParams {
55     let urlParams = new URLSearchParams(this.props.location.search);
56     let params: PrivateMessageFormParams = {
57       recipient_id: Number(urlParams.get('recipient_id')),
58     };
59
60     return params;
61   }
62
63   handlePrivateMessageCreate() {
64     toast(i18n.t('message_sent'));
65
66     // Navigate to the front
67     this.props.history.push(`/`);
68   }
69
70   parseMessage(msg: WebSocketJsonResponse) {
71     console.log(msg);
72     let res = wsJsonToRes(msg);
73     if (msg.error) {
74       toast(i18n.t(msg.error), 'danger');
75       return;
76     } else if (res.op == UserOperation.GetSite) {
77       let data = res.data as GetSiteResponse;
78       document.title = `${i18n.t('create_private_message')} - ${
79         data.site.name
80       }`;
81     }
82   }
83 }