docbrown/app/javascript/chat/message.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

148 lines
3.9 KiB
JavaScript

import { h } from 'preact';
import PropTypes from 'prop-types';
import { adjustTimestamp } from './util';
import ErrorMessage from './messages/errorMessage';
const Message = ({
currentUserId,
id,
user,
userID,
message,
color,
type,
editedAt,
timestamp,
profileImageUrl,
onContentTrigger,
onDeleteMessageTrigger,
onEditMessageTrigger,
}) => {
const spanStyle = { color };
if (type === 'error') {
return <ErrorMessage message={message} />;
}
const messageArea = (
<span
className="chatmessagebody__message"
// eslint-disable-next-line react/no-danger
dangerouslySetInnerHTML={{ __html: message }}
/>
);
return (
<div className="chatmessage">
<div className="chatmessage__profilepic">
<a
href={`/${user}`}
target="_blank"
rel="noopener noreferrer"
data-content={`users/${userID}`}
onClick={onContentTrigger}
>
<img
role="presentation"
className="chatmessagebody__profileimage"
src={profileImageUrl}
alt={`${user} profile`}
data-content={`users/${userID}`}
onClick={onContentTrigger}
/>
</a>
</div>
<div
role="presentation"
className="chatmessage__body"
onClick={onContentTrigger}
>
<div className="message__info__actions">
<div className="message__info">
<span className="chatmessagebody__username" style={spanStyle}>
<a
className="chatmessagebody__username--link"
href={`/${user}`}
target="_blank"
rel="noopener noreferrer"
data-content={`users/${userID}`}
onClick={onContentTrigger}
>
{user}
</a>
</span>
{editedAt ? (
<span className="chatmessage__timestamp edited_message">
{`${adjustTimestamp(editedAt)}`}
<i> (edited)</i>
</span>
) : (
' '
)}
{timestamp && !editedAt ? (
<span className="chatmessage__timestamp">
{`${adjustTimestamp(timestamp)}`}
</span>
) : (
' '
)}
</div>
{userID === currentUserId ? (
<div className="message__actions">
<span
role="button"
data-content={id}
onClick={onDeleteMessageTrigger}
tabIndex="0"
onKeyUp={e => {
if (e.keyCode === 13) onDeleteMessageTrigger();
}}
>
Delete
</span>
<span
role="button"
data-content={id}
onClick={onEditMessageTrigger}
tabIndex="0"
onKeyUp={e => {
if (e.keyCode === 13) onEditMessageTrigger();
}}
>
Edit
</span>
</div>
) : (
' '
)}
</div>
<div className="chatmessage__bodytext">{messageArea}</div>
</div>
</div>
);
};
Message.propTypes = {
currentUserId: PropTypes.number.isRequired,
id: PropTypes.number.isRequired,
user: PropTypes.string.isRequired,
userID: PropTypes.number.isRequired,
color: PropTypes.string.isRequired,
message: PropTypes.string.isRequired,
type: PropTypes.string,
timestamp: PropTypes.string,
editedAt: PropTypes.number.isRequired,
profileImageUrl: PropTypes.string,
onContentTrigger: PropTypes.func.isRequired,
onDeleteMessageTrigger: PropTypes.func.isRequired,
onEditMessageTrigger: PropTypes.func.isRequired,
};
Message.defaultProps = {
type: 'normalMessage',
timestamp: null,
profileImageUrl: '',
};
export default Message;