1 import { Component, InfernoNode, linkEvent } from "inferno";
2 import { T } from "inferno-i18next-dess";
8 } from "lemmy-js-client";
9 import { i18n } from "../../i18next";
11 capitalizeFirstLetter,
16 import { Icon, Spinner } from "../common/icon";
17 import { MarkdownTextArea } from "../common/markdown-textarea";
18 import NavigationPrompt from "../common/navigation-prompt";
19 import { PersonListing } from "../person/person-listing";
21 interface PrivateMessageFormProps {
23 privateMessageView?: PrivateMessageView; // If a pm is given, that means this is an edit
25 onCreate?(form: CreatePrivateMessage): void;
26 onEdit?(form: EditPrivateMessage): void;
29 interface PrivateMessageFormState {
33 showDisclaimer: boolean;
37 export class PrivateMessageForm extends Component<
38 PrivateMessageFormProps,
39 PrivateMessageFormState
41 state: PrivateMessageFormState = {
44 showDisclaimer: false,
45 content: this.props.privateMessageView
46 ? this.props.privateMessageView.private_message.content
51 constructor(props: any, context: any) {
52 super(props, context);
54 this.handleContentChange = this.handleContentChange.bind(this);
61 componentWillReceiveProps(
62 nextProps: Readonly<{ children?: InfernoNode } & PrivateMessageFormProps>
64 if (this.props != nextProps) {
65 this.setState({ loading: false, content: undefined, previewMode: false });
70 // when={!this.state.loading && this.state.content}
71 // message={i18n.t("block_leaving")}
77 className="private-message-form"
78 onSubmit={linkEvent(this, this.handlePrivateMessageSubmit)}
82 !this.state.loading && !!this.state.content && !this.state.submitted
85 {!this.props.privateMessageView && (
86 <div className="mb-3 row">
87 <label className="col-sm-2 col-form-label">
88 {capitalizeFirstLetter(i18n.t("to"))}
91 <div className="col-sm-10 form-control-plaintext">
92 <PersonListing person={this.props.recipient} />
96 <div className="mb-3 row">
97 <label className="col-sm-2 col-form-label">
100 className="btn btn-link text-warning d-inline-block"
101 onClick={linkEvent(this, this.handleShowDisclaimer)}
102 data-tippy-content={i18n.t("private_message_disclaimer")}
103 aria-label={i18n.t("private_message_disclaimer")}
105 <Icon icon="alert-triangle" classes="icon-inline" />
108 <div className="col-sm-10">
110 initialContent={this.state.content}
111 onContentChange={this.handleContentChange}
114 hideNavigationWarnings
119 {this.state.showDisclaimer && (
120 <div className="mb-3 row">
121 <div className="offset-sm-2 col-sm-10">
122 <div className="alert alert-danger" role="alert">
123 <T i18nKey="private_message_disclaimer">
126 className="alert-link"
128 href="https://element.io/get-started"
137 <div className="mb-3 row">
138 <div className="offset-sm-2 col-sm-10">
141 className="btn btn-secondary me-2"
142 disabled={this.state.loading}
144 {this.state.loading ? (
146 ) : this.props.privateMessageView ? (
147 capitalizeFirstLetter(i18n.t("save"))
149 capitalizeFirstLetter(i18n.t("send_message"))
152 {this.props.privateMessageView && (
155 className="btn btn-secondary"
156 onClick={linkEvent(this, this.handleCancel)}
161 <ul className="d-inline-block float-right list-inline mb-1 text-muted font-weight-bold">
162 <li className="list-inline-item"></li>
170 handlePrivateMessageSubmit(i: PrivateMessageForm, event: any) {
171 event.preventDefault();
172 i.setState({ loading: true, submitted: true });
173 const pm = i.props.privateMessageView;
174 const auth = myAuthRequired();
175 const content = i.state.content ?? "";
178 private_message_id: pm.private_message.id,
185 recipient_id: i.props.recipient.id,
191 handleContentChange(val: string) {
192 this.setState({ content: val });
195 handleCancel(i: PrivateMessageForm) {
196 i.props.onCancel?.();
199 handlePreviewToggle(i: PrivateMessageForm, event: any) {
200 event.preventDefault();
201 i.setState({ previewMode: !i.state.previewMode });
204 handleShowDisclaimer(i: PrivateMessageForm) {
205 i.setState({ showDisclaimer: !i.state.showDisclaimer });