1 import { Component } from "inferno";
4 GetPersonDetailsResponse,
9 } from "lemmy-js-client";
10 import { Subscription } from "rxjs";
11 import { i18n } from "../../i18next";
12 import { InitialFetchRequest } from "../../interfaces";
13 import { UserService, WebSocketService } from "../../services";
16 getRecipientIdFromProps,
25 import { HtmlTags } from "../common/html-tags";
26 import { Spinner } from "../common/icon";
27 import { PrivateMessageForm } from "./private-message-form";
29 interface CreatePrivateMessageState {
31 recipient: PersonViewSafe;
36 export class CreatePrivateMessage extends Component<
38 CreatePrivateMessageState
40 private isoData = setIsoData(this.context);
41 private subscription: Subscription;
42 private emptyState: CreatePrivateMessageState = {
43 site_view: this.isoData.site_res.site_view,
45 recipient_id: getRecipientIdFromProps(this.props),
48 constructor(props: any, context: any) {
49 super(props, context);
50 this.state = this.emptyState;
51 this.handlePrivateMessageCreate =
52 this.handlePrivateMessageCreate.bind(this);
54 this.parseMessage = this.parseMessage.bind(this);
55 this.subscription = wsSubscribe(this.parseMessage);
57 if (!UserService.Instance.myUserInfo) {
58 toast(i18n.t("not_logged_in"), "danger");
59 this.context.router.history.push(`/login`);
62 // Only fetch the data if coming from another route
63 if (this.isoData.path == this.context.router.route.match.url) {
64 this.state.recipient = this.isoData.routeData[0].user;
65 this.state.loading = false;
67 this.fetchPersonDetails();
71 fetchPersonDetails() {
72 let form: GetPersonDetails = {
73 person_id: this.state.recipient_id,
76 auth: authField(false),
78 WebSocketService.Instance.send(wsClient.getPersonDetails(form));
81 static fetchInitialData(req: InitialFetchRequest): Promise<any>[] {
82 let person_id = Number(req.path.split("/").pop());
83 let form: GetPersonDetails = {
89 return [req.client.getPersonDetails(form)];
92 get documentTitle(): string {
93 return `${i18n.t("create_private_message")} - ${
94 this.state.site_view.site.name
98 componentWillUnmount() {
100 this.subscription.unsubscribe();
106 <div class="container">
108 title={this.documentTitle}
109 path={this.context.router.route.match.url}
111 {this.state.loading ? (
117 <div class="col-12 col-lg-6 offset-lg-3 mb-4">
118 <h5>{i18n.t("create_private_message")}</h5>
120 onCreate={this.handlePrivateMessageCreate}
121 recipient={this.state.recipient.person}
130 handlePrivateMessageCreate() {
131 toast(i18n.t("message_sent"));
133 // Navigate to the front
134 this.context.router.history.push(`/`);
137 parseMessage(msg: any) {
138 let op = wsUserOp(msg);
141 toast(i18n.t(msg.error), "danger");
142 this.state.loading = false;
143 this.setState(this.state);
145 } else if (op == UserOperation.GetPersonDetails) {
146 let data = wsJsonToRes<GetPersonDetailsResponse>(msg).data;
147 this.state.recipient = data.person_view;
148 this.state.loading = false;
149 this.setState(this.state);