docbrown/app/javascript/chat/message.jsx
Mac Siri 7cb65649e4 Update chat app (#326)
* Fix spacing

* Update webpacker gem to 3.5

* Add custom preact-compact config

* Add babel-loader to resolve a weird issue

* Add react-textarea-autocomplete

* Move 2 dependencies into devDependencies

* Add babel-eslint & eslint-plugin-babel

* Refactor chat

* Add fixed width to chat's channels

* Add timestamp for chat

* Fix long word issue

* Add showTimestamp options to chat

* Add profile image to chat

* Make profile image in chat circle

* Improve message send logic

* Add proper user session handling for chat

* Choose profile user image source for chat

* Adjust user's text color

* Fix lint
2018-05-21 13:19:56 -04:00

95 lines
2.3 KiB
JavaScript

import { h } from 'preact';
import PropTypes from 'prop-types';
import { adjustTimestamp } from './util';
import ErrorMessage from './messages/errorMessage';
import Hiddenmessage from './messages/hiddenMessage';
const Message = ({
user,
message,
color,
type,
timestamp,
profileImageUrl,
}) => {
const spanStyle = { color };
if (type === 'error') {
return <ErrorMessage message={message} />;
} else if (type === 'hidden') {
return (
<Hiddenmessage
user={user}
color={color}
profileImageUrl={profileImageUrl}
/>
);
}
const re = new RegExp(`@${window.currentUser.username}`);
const match = re.exec(message);
let messageArea;
if (match) {
messageArea = (
<span className="chatmessagebody__message">
{message.substr(0, match.index)}
<span className="chatmessagebody__currentuser">
{`@${window.currentUser.username}`}
</span>
{message.substr(match.index + match[0].length)}
</span>
);
} else {
messageArea = <span className="chatmessagebody__message">{message}</span>;
}
return (
<div className="chatmessage">
<div className="chatmessage__body">
<a href={`/${user}`} target="_blank">
<img
className="chatmessagebody__profileimage"
src={profileImageUrl}
alt={`${user} profile`}
/>
</a>
<span className="chatmessagebody__username" style={spanStyle}>
<a
className="chatmessagebody__username--link"
href={`/${user}`}
target="_blank"
>
{user}
</a>
</span>
<span className="chatmessagebody__divider">: </span>
{messageArea}
</div>
{timestamp ? (
<span className="chatmessage__timestamp">
{`${adjustTimestamp(timestamp)}`}
</span>
) : (
<span />
)}
</div>
);
};
Message.propTypes = {
user: PropTypes.string.isRequired,
color: PropTypes.string.isRequired,
message: PropTypes.string.isRequired,
type: PropTypes.string,
timestamp: PropTypes.string,
profileImageUrl: PropTypes.string,
};
Message.defaultProps = {
type: 'normalMessage',
timestamp: null,
profileImageUrl: '',
};
export default Message;