1 import { Component } from "inferno";
3 CreatePrivateMessage as CreatePrivateMessageI,
5 GetPersonDetailsResponse,
7 } from "lemmy-js-client";
8 import { i18n } from "../../i18next";
9 import { InitialFetchRequest } from "../../interfaces";
10 import { FirstLoadService } from "../../services/FirstLoadService";
11 import { HttpService, RequestState } from "../../services/HttpService";
13 getRecipientIdFromProps,
18 import { HtmlTags } from "../common/html-tags";
19 import { Spinner } from "../common/icon";
20 import { PrivateMessageForm } from "./private-message-form";
22 interface CreatePrivateMessageState {
23 siteRes: GetSiteResponse;
24 recipientRes: RequestState<GetPersonDetailsResponse>;
26 isIsomorphic: boolean;
29 export class CreatePrivateMessage extends Component<
31 CreatePrivateMessageState
33 private isoData = setIsoData(this.context);
34 state: CreatePrivateMessageState = {
35 siteRes: this.isoData.site_res,
36 recipientRes: { state: "empty" },
37 recipientId: getRecipientIdFromProps(this.props),
41 constructor(props: any, context: any) {
42 super(props, context);
43 this.handlePrivateMessageCreate =
44 this.handlePrivateMessageCreate.bind(this);
46 // Only fetch the data if coming from another route
47 if (FirstLoadService.isFirstLoad) {
50 recipientRes: this.isoData.routeData[0],
56 async componentDidMount() {
57 if (!this.state.isIsomorphic) {
58 await this.fetchPersonDetails();
62 async fetchPersonDetails() {
64 recipientRes: { state: "loading" },
68 recipientRes: await HttpService.client.getPersonDetails({
69 person_id: this.state.recipientId,
77 static fetchInitialData(
78 req: InitialFetchRequest
79 ): Promise<RequestState<any>>[] {
80 const person_id = Number(req.path.split("/").pop());
81 const form: GetPersonDetails = {
87 return [req.client.getPersonDetails(form)];
90 get documentTitle(): string {
91 if (this.state.recipientRes.state == "success") {
92 const name_ = this.state.recipientRes.data.person_view.person.name;
93 return `${i18n.t("create_private_message")} - ${name_}`;
99 renderRecipientRes() {
100 switch (this.state.recipientRes.state) {
108 const res = this.state.recipientRes.data;
110 <div className="row">
111 <div className="col-12 col-lg-6 offset-lg-3 mb-4">
112 <h5>{i18n.t("create_private_message")}</h5>
114 onCreate={this.handlePrivateMessageCreate}
115 recipient={res.person_view.person}
126 <div className="container-lg">
128 title={this.documentTitle}
129 path={this.context.router.route.match.url}
131 {this.renderRecipientRes()}
136 async handlePrivateMessageCreate(form: CreatePrivateMessageI) {
137 const res = await HttpService.client.createPrivateMessage(form);
139 if (res.state == "success") {
140 toast(i18n.t("message_sent"));
142 // Navigate to the front
143 this.context.router.history.push("/");