docbrown/app/javascript/chat/compose.jsx
Sarthak Sharma b602b7b91f 🚀Feature/ability to edit messages (#5139) [deploy]
* Feature 🚀 : Ability to delete messages in chat channels

- Sending message ID to frontend
- Deleting Message
- Use pusher to delete message realtime

* Minor Bug 🐞: Show message action only for current user

- User can delete or edit their own messages

* Test cases added

* Bug 🐞: Update message id for receiver

Message id was not sent to receiver by pusher

* Refactoring🛠: Message controller refactoring

* Test Cases📝 : Specs for Delete message added

* Feature 🚀 : Ability to edit messages

* Test Cases📝 : Specs for Edit message added

* Refactoring🔩: Refactoring for edit messages

* Refactoring🔩: Refactoring:2 for edit messages

* Refactoring🔩: Refactoring:2 for edit messages

* Test Cases📝 : Test Cases for edit message added

* Minor Bug 🐞: Show message action only for current user

- User can delete or edit their own messages

* Test cases added

* Bug 🐞: Update message id for receiver

Message id was not sent to receiver by pusher

* Feature 🚀 : Ability to edit messages

* Test Cases📝 : Specs for Edit message added

* Refactoring🔩: Refactoring for edit messages

* Refactoring🔩: Refactoring:2 for edit messages

* Refactoring🔩: Refactoring:2 for edit messages

* Bug Fix 🐞: Added space between edited and timestamp

Co-authored-by: Ben Halpern <bendhalpern@gmail.com>
2019-12-20 10:19:00 -05:00

106 lines
2.8 KiB
JavaScript

import { h, Component } from 'preact';
import PropTypes from 'prop-types';
export default class Chat extends Component {
static propTypes = {
handleKeyDown: PropTypes.func.isRequired,
handleKeyDownEdit: PropTypes.func.isRequired,
handleSubmitOnClick: PropTypes.func.isRequired,
handleSubmitOnClickEdit: PropTypes.func.isRequired,
startEditing: PropTypes.bool.isRequired,
editMessageHtml: PropTypes.string.isRequired,
editMessageMarkdown: PropTypes.string.isRequired,
handleEditMessageClose: PropTypes.func.isRequired,
};
constructor(props) {
super(props);
this.state = {
editMessageMarkdown: null,
};
}
componentWillReceiveProps(props) {
this.setState({
editMessageMarkdown: props.editMessageMarkdown,
editMessageHtml: props.editMessageHtml,
});
}
messageCompose = () => {
const {
handleSubmitOnClickEdit,
handleKeyDownEdit,
handleEditMessageClose,
} = this.props;
const { editMessageHtml, editMessageMarkdown } = this.state;
return (
<div className="messagecomposer">
<div className="messageToBeEdited">
<div className="message">
<span className="editHead">Edit Message</span>
<div
dangerouslySetInnerHTML={{
__html: editMessageHtml,
}}
/>
</div>
<div
className="closeEdit"
role="button"
onClick={handleEditMessageClose}
tabIndex="0"
onKeyUp={e => {
if (e.keyCode === 13) handleEditMessageClose();
}}
>
x
</div>
</div>
<textarea
className="messagecomposer__input"
id="messageform"
placeholder="Message goes here"
onKeyDown={handleKeyDownEdit}
maxLength="1000"
value={editMessageMarkdown}
/>
<button
type="button"
className="messagecomposer__submit"
onClick={handleSubmitOnClickEdit}
>
Save
</button>
</div>
);
};
render() {
const { handleSubmitOnClick, handleKeyDown, startEditing } = this.props;
return (
<div>
{!startEditing ? (
<div className="messagecomposer">
<textarea
className="messagecomposer__input"
id="messageform"
placeholder="Message goes here"
onKeyDown={handleKeyDown}
maxLength="1000"
/>
<button
type="button"
className="messagecomposer__submit"
onClick={handleSubmitOnClick}
>
SEND
</button>
</div>
) : (
this.messageCompose()
)}
</div>
);
}
}