1 import { Component } from "inferno";
4 GetPersonDetailsResponse,
10 } from "lemmy-js-client";
11 import { Subscription } from "rxjs";
12 import { i18n } from "../../i18next";
13 import { InitialFetchRequest } from "../../interfaces";
14 import { UserService, WebSocketService } from "../../services";
16 getRecipientIdFromProps,
24 import { HtmlTags } from "../common/html-tags";
25 import { Spinner } from "../common/icon";
26 import { PrivateMessageForm } from "./private-message-form";
28 interface CreatePrivateMessageState {
29 siteRes: GetSiteResponse;
30 recipientDetailsRes?: GetPersonDetailsResponse;
35 export class CreatePrivateMessage extends Component<
37 CreatePrivateMessageState
39 private isoData = setIsoData(this.context);
40 private subscription?: Subscription;
41 state: CreatePrivateMessageState = {
42 siteRes: this.isoData.site_res,
43 recipient_id: getRecipientIdFromProps(this.props),
47 constructor(props: any, context: any) {
48 super(props, context);
49 this.handlePrivateMessageCreate =
50 this.handlePrivateMessageCreate.bind(this);
52 this.parseMessage = this.parseMessage.bind(this);
53 this.subscription = wsSubscribe(this.parseMessage);
55 if (!UserService.Instance.myUserInfo && isBrowser()) {
56 toast(i18n.t("not_logged_in"), "danger");
57 this.context.router.history.push(`/login`);
60 // Only fetch the data if coming from another route
61 if (this.isoData.path == this.context.router.route.match.url) {
64 recipientDetailsRes: this.isoData
65 .routeData[0] as GetPersonDetailsResponse,
69 this.fetchPersonDetails();
73 fetchPersonDetails() {
74 let form: GetPersonDetails = {
75 person_id: this.state.recipient_id,
80 WebSocketService.Instance.send(wsClient.getPersonDetails(form));
83 static fetchInitialData(req: InitialFetchRequest): Promise<any>[] {
84 let person_id = Number(req.path.split("/").pop());
85 let form: GetPersonDetails = {
91 return [req.client.getPersonDetails(form)];
94 get documentTitle(): string {
95 let name_ = this.state.recipientDetailsRes?.person_view.person.name;
96 return name_ ? `${i18n.t("create_private_message")} - ${name_}` : "";
99 componentWillUnmount() {
101 this.subscription?.unsubscribe();
106 let res = this.state.recipientDetailsRes;
108 <div className="container-lg">
110 title={this.documentTitle}
111 path={this.context.router.route.match.url}
113 {this.state.loading ? (
119 <div className="row">
120 <div className="col-12 col-lg-6 offset-lg-3 mb-4">
121 <h5>{i18n.t("create_private_message")}</h5>
123 onCreate={this.handlePrivateMessageCreate}
124 recipient={res.person_view.person}
134 handlePrivateMessageCreate() {
135 toast(i18n.t("message_sent"));
137 // Navigate to the front
138 this.context.router.history.push("/");
141 parseMessage(msg: any) {
142 let op = wsUserOp(msg);
145 toast(i18n.t(msg.error), "danger");
146 this.setState({ loading: false });
148 } else if (op == UserOperation.GetPersonDetails) {
149 let data = wsJsonToRes<GetPersonDetailsResponse>(msg);
150 this.setState({ recipientDetailsRes: data, loading: false });