From 253bc3e0afb6adf64b79f334a8bc1f972aa45eba Mon Sep 17 00:00:00 2001 From: Dessalines Date: Wed, 22 Jan 2020 16:35:29 -0500 Subject: Adding private messaging, and matrix user ids. - Fixes #244 --- ui/src/components/private-message.tsx | 249 ++++++++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 ui/src/components/private-message.tsx (limited to 'ui/src/components/private-message.tsx') diff --git a/ui/src/components/private-message.tsx b/ui/src/components/private-message.tsx new file mode 100644 index 00000000..524b1a9d --- /dev/null +++ b/ui/src/components/private-message.tsx @@ -0,0 +1,249 @@ +import { Component, linkEvent } from 'inferno'; +import { Link } from 'inferno-router'; +import { + PrivateMessage as PrivateMessageI, + EditPrivateMessageForm, +} from '../interfaces'; +import { WebSocketService, UserService } from '../services'; +import { mdToHtml, pictshareAvatarThumbnail, showAvatars } from '../utils'; +import { MomentTime } from './moment-time'; +import { PrivateMessageForm } from './private-message-form'; +import { i18n } from '../i18next'; +import { T } from 'inferno-i18next'; + +interface PrivateMessageState { + showReply: boolean; + showEdit: boolean; + collapsed: boolean; + viewSource: boolean; +} + +interface PrivateMessageProps { + privateMessage: PrivateMessageI; +} + +export class PrivateMessage extends Component< + PrivateMessageProps, + PrivateMessageState +> { + private emptyState: PrivateMessageState = { + showReply: false, + showEdit: false, + collapsed: false, + viewSource: false, + }; + + constructor(props: any, context: any) { + super(props, context); + + this.state = this.emptyState; + this.handleReplyCancel = this.handleReplyCancel.bind(this); + this.handlePrivateMessageCreate = this.handlePrivateMessageCreate.bind( + this + ); + this.handlePrivateMessageEdit = this.handlePrivateMessageEdit.bind(this); + } + + get mine(): boolean { + return UserService.Instance.user.id == this.props.privateMessage.creator_id; + } + + render() { + let message = this.props.privateMessage; + return ( +
+
+
    +
  • + {this.mine ? i18n.t('to') : i18n.t('from')} +
  • +
  • + + {(this.mine + ? message.recipient_avatar + : message.creator_avatar) && + showAvatars() && ( + + )} + + {this.mine ? message.recipient_name : message.creator_name} + + +
  • +
  • + + + +
  • +
  • +
    + {this.state.collapsed ? '[+]' : '[-]'} +
    +
  • +
+ {this.state.showEdit && ( + + )} + {!this.state.showEdit && !this.state.collapsed && ( +
+ {this.state.viewSource ? ( +
{this.messageUnlessRemoved}
+ ) : ( +
+ )} +
    + {!this.mine && ( + <> +
  • + + {message.read + ? i18n.t('mark_as_unread') + : i18n.t('mark_as_read')} + +
  • +
  • + + # + +
  • + + )} + {this.mine && ( + <> +
  • + + # + +
  • +
  • + + {!message.deleted + ? i18n.t('delete') + : i18n.t('restore')} + +
  • + + )} +
  • +
  • + + # + +
  • +
+
+ )} +
+ {this.state.showReply && ( + + )} + {/* A collapsed clearfix */} + {this.state.collapsed &&
} +
+ ); + } + + get messageUnlessRemoved(): string { + let message = this.props.privateMessage; + return message.deleted ? `*${i18n.t('deleted')}*` : message.content; + } + + handleReplyClick(i: PrivateMessage) { + i.state.showReply = true; + i.setState(i.state); + } + + handleEditClick(i: PrivateMessage) { + i.state.showEdit = true; + i.setState(i.state); + } + + handleDeleteClick(i: PrivateMessage) { + let form: EditPrivateMessageForm = { + edit_id: i.props.privateMessage.id, + deleted: !i.props.privateMessage.deleted, + }; + WebSocketService.Instance.editPrivateMessage(form); + } + + handleReplyCancel() { + this.state.showReply = false; + this.state.showEdit = false; + this.setState(this.state); + } + + handleMarkRead(i: PrivateMessage) { + let form: EditPrivateMessageForm = { + edit_id: i.props.privateMessage.id, + read: !i.props.privateMessage.read, + }; + WebSocketService.Instance.editPrivateMessage(form); + } + + handleMessageCollapse(i: PrivateMessage) { + i.state.collapsed = !i.state.collapsed; + i.setState(i.state); + } + + handleViewSource(i: PrivateMessage) { + i.state.viewSource = !i.state.viewSource; + i.setState(i.state); + } + + handlePrivateMessageEdit() { + this.state.showEdit = false; + this.setState(this.state); + } + + handlePrivateMessageCreate() { + this.state.showReply = false; + this.setState(this.state); + alert(i18n.t('message_sent')); + } +} -- cgit v1.2.3