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 { WebSocketService } from "../../services";
15 getRecipientIdFromProps,
23 import { HtmlTags } from "../common/html-tags";
24 import { Spinner } from "../common/icon";
25 import { PrivateMessageForm } from "./private-message-form";
27 interface CreatePrivateMessageState {
28 siteRes: GetSiteResponse;
29 recipientDetailsRes?: GetPersonDetailsResponse;
34 export class CreatePrivateMessage extends Component<
36 CreatePrivateMessageState
38 private isoData = setIsoData(this.context);
39 private subscription?: Subscription;
40 state: CreatePrivateMessageState = {
41 siteRes: this.isoData.site_res,
42 recipient_id: getRecipientIdFromProps(this.props),
46 constructor(props: any, context: any) {
47 super(props, context);
48 this.handlePrivateMessageCreate =
49 this.handlePrivateMessageCreate.bind(this);
51 this.parseMessage = this.parseMessage.bind(this);
52 this.subscription = wsSubscribe(this.parseMessage);
54 // Only fetch the data if coming from another route
55 if (this.isoData.path == this.context.router.route.match.url) {
58 recipientDetailsRes: this.isoData
59 .routeData[0] as GetPersonDetailsResponse,
63 this.fetchPersonDetails();
67 fetchPersonDetails() {
68 let form: GetPersonDetails = {
69 person_id: this.state.recipient_id,
74 WebSocketService.Instance.send(wsClient.getPersonDetails(form));
77 static fetchInitialData(req: InitialFetchRequest): Promise<any>[] {
78 let person_id = Number(req.path.split("/").pop());
79 let form: GetPersonDetails = {
85 return [req.client.getPersonDetails(form)];
88 get documentTitle(): string {
89 let name_ = this.state.recipientDetailsRes?.person_view.person.name;
90 return name_ ? `${i18n.t("create_private_message")} - ${name_}` : "";
93 componentWillUnmount() {
95 this.subscription?.unsubscribe();
100 let res = this.state.recipientDetailsRes;
102 <div className="container-lg">
104 title={this.documentTitle}
105 path={this.context.router.route.match.url}
107 {this.state.loading ? (
113 <div className="row">
114 <div className="col-12 col-lg-6 offset-lg-3 mb-4">
115 <h5>{i18n.t("create_private_message")}</h5>
117 onCreate={this.handlePrivateMessageCreate}
118 recipient={res.person_view.person}
128 handlePrivateMessageCreate() {
129 toast(i18n.t("message_sent"));
131 // Navigate to the front
132 this.context.router.history.push("/");
135 parseMessage(msg: any) {
136 let op = wsUserOp(msg);
139 toast(i18n.t(msg.error), "danger");
140 this.setState({ loading: false });
142 } else if (op == UserOperation.GetPersonDetails) {
143 let data = wsJsonToRes<GetPersonDetailsResponse>(msg);
144 this.setState({ recipientDetailsRes: data, loading: false });