1 import { None, Option, Some } from "@sniptt/monads";
2 import { Component } from "inferno";
5 GetPersonDetailsResponse,
11 } from "lemmy-js-client";
12 import { Subscription } from "rxjs";
13 import { i18n } from "../../i18next";
14 import { InitialFetchRequest } from "../../interfaces";
15 import { UserService, WebSocketService } from "../../services";
18 getRecipientIdFromProps,
25 import { HtmlTags } from "../common/html-tags";
26 import { Spinner } from "../common/icon";
27 import { PrivateMessageForm } from "./private-message-form";
29 interface CreatePrivateMessageState {
30 siteRes: GetSiteResponse;
31 recipientDetailsRes: Option<GetPersonDetailsResponse>;
36 export class CreatePrivateMessage extends Component<
38 CreatePrivateMessageState
40 private isoData = setIsoData(this.context, GetPersonDetailsResponse);
41 private subscription: Subscription;
42 private emptyState: CreatePrivateMessageState = {
43 siteRes: this.isoData.site_res,
44 recipientDetailsRes: None,
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.isNone() && isBrowser()) {
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.recipientDetailsRes = Some(
65 this.isoData.routeData[0] as GetPersonDetailsResponse
67 this.state.loading = false;
69 this.fetchPersonDetails();
73 fetchPersonDetails() {
74 let form = new GetPersonDetails({
75 person_id: Some(this.state.recipient_id),
76 sort: Some(SortType.New),
77 saved_only: Some(false),
82 auth: auth(false).ok(),
84 WebSocketService.Instance.send(wsClient.getPersonDetails(form));
87 static fetchInitialData(req: InitialFetchRequest): Promise<any>[] {
88 let person_id = Some(Number(req.path.split("/").pop()));
89 let form = new GetPersonDetails({
91 sort: Some(SortType.New),
92 saved_only: Some(false),
99 return [req.client.getPersonDetails(form)];
102 get documentTitle(): string {
103 return this.state.recipientDetailsRes.match({
105 `${i18n.t("create_private_message")} - ${res.person_view.person.name}`,
110 componentWillUnmount() {
112 this.subscription.unsubscribe();
118 <div class="container">
120 title={this.documentTitle}
121 path={this.context.router.route.match.url}
125 {this.state.loading ? (
130 this.state.recipientDetailsRes.match({
133 <div class="col-12 col-lg-6 offset-lg-3 mb-4">
134 <h5>{i18n.t("create_private_message")}</h5>
136 privateMessageView={None}
137 onCreate={this.handlePrivateMessageCreate}
138 recipient={res.person_view.person}
150 handlePrivateMessageCreate() {
151 toast(i18n.t("message_sent"));
153 // Navigate to the front
154 this.context.router.history.push(`/`);
157 parseMessage(msg: any) {
158 let op = wsUserOp(msg);
161 toast(i18n.t(msg.error), "danger");
162 this.state.loading = false;
163 this.setState(this.state);
165 } else if (op == UserOperation.GetPersonDetails) {
166 let data = wsJsonToRes<GetPersonDetailsResponse>(
168 GetPersonDetailsResponse
170 this.state.recipientDetailsRes = Some(data);
171 this.state.loading = false;
172 this.setState(this.state);