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";
16 getRecipientIdFromProps,
24 import { HtmlTags } from "../common/html-tags";
25 import { Spinner } from "../common/icon";
26 import { PrivateMessageForm } from "./private-message-form";
28 interface CreatePrivateMessageData {
29 recipientDetailsResponse: GetPersonDetailsResponse;
32 interface CreatePrivateMessageState {
33 siteRes: GetSiteResponse;
34 recipientDetailsRes?: GetPersonDetailsResponse;
39 export class CreatePrivateMessage extends Component<
41 CreatePrivateMessageState
43 private isoData = setIsoData<CreatePrivateMessageData>(this.context);
44 private subscription?: Subscription;
45 state: CreatePrivateMessageState = {
46 siteRes: this.isoData.site_res,
47 recipient_id: getRecipientIdFromProps(this.props),
51 constructor(props: any, context: any) {
52 super(props, context);
53 this.handlePrivateMessageCreate =
54 this.handlePrivateMessageCreate.bind(this);
56 this.parseMessage = this.parseMessage.bind(this);
57 this.subscription = wsSubscribe(this.parseMessage);
59 // Only fetch the data if coming from another route
60 if (this.isoData.path === this.context.router.route.match.url) {
63 recipientDetailsRes: this.isoData.routeData.recipientDetailsResponse,
67 this.fetchPersonDetails();
71 fetchPersonDetails() {
72 let form: GetPersonDetails = {
73 person_id: this.state.recipient_id,
78 WebSocketService.Instance.send(wsClient.getPersonDetails(form));
81 static fetchInitialData(
82 req: InitialFetchRequest
83 ): WithPromiseKeys<CreatePrivateMessageData> {
84 const person_id = Number(req.path.split("/").pop());
86 const form: GetPersonDetails = {
94 recipientDetailsResponse: req.client.getPersonDetails(form),
98 get documentTitle(): string {
99 let name_ = this.state.recipientDetailsRes?.person_view.person.name;
100 return name_ ? `${i18n.t("create_private_message")} - ${name_}` : "";
103 componentWillUnmount() {
105 this.subscription?.unsubscribe();
110 let res = this.state.recipientDetailsRes;
112 <div className="container-lg">
114 title={this.documentTitle}
115 path={this.context.router.route.match.url}
117 {this.state.loading ? (
123 <div className="row">
124 <div className="col-12 col-lg-6 offset-lg-3 mb-4">
125 <h5>{i18n.t("create_private_message")}</h5>
127 onCreate={this.handlePrivateMessageCreate}
128 recipient={res.person_view.person}
138 handlePrivateMessageCreate() {
139 toast(i18n.t("message_sent"));
141 // Navigate to the front
142 this.context.router.history.push("/");
145 parseMessage(msg: any) {
146 let op = wsUserOp(msg);
149 toast(i18n.t(msg.error), "danger");
150 this.setState({ loading: false });
152 } else if (op == UserOperation.GetPersonDetails) {
153 let data = wsJsonToRes<GetPersonDetailsResponse>(msg);
154 this.setState({ recipientDetailsRes: data, loading: false });