diff --git a/jam-ui/src/components/client/chat/JKChatMessage.js b/jam-ui/src/components/client/chat/JKChatMessage.js new file mode 100644 index 000000000..4f35da668 --- /dev/null +++ b/jam-ui/src/components/client/chat/JKChatMessage.js @@ -0,0 +1,87 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { formatTimestamp } from '../../../utils/formatTimestamp'; + +/** + * Get initials for avatar from sender name + * Returns first letter of first and last name, or just first letter if single name + * @param {string} name - Sender name + * @returns {string} Initials (e.g., "JD" for "John Doe") + */ +const getInitials = (name) => { + if (!name) return '?'; + const parts = name.trim().split(' '); + if (parts.length === 1) return parts[0][0].toUpperCase(); + return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase(); +}; + +/** + * JKChatMessage - Individual message display component + * + * Displays a single chat message with avatar, sender name, message text, and timestamp. + * + * Features: + * - Avatar with initials (first + last name) + * - Sender name in bold + * - Relative timestamp (via formatTimestamp utility) + * - Message text with word wrapping + * - React.memo for performance optimization + */ +const JKChatMessage = ({ message }) => { + const { senderName, message: text, createdAt } = message; + + return ( +
+ {/* Avatar */} +
+ {getInitials(senderName)} +
+ + {/* Message content */} +
+
+ + {senderName || 'Unknown'} + + + {formatTimestamp(createdAt)} + +
+
+ {text} +
+
+
+ ); +}; + +JKChatMessage.propTypes = { + message: PropTypes.shape({ + id: PropTypes.string.isRequired, + senderId: PropTypes.string.isRequired, + senderName: PropTypes.string, + message: PropTypes.string.isRequired, + createdAt: PropTypes.string.isRequired + }).isRequired +}; + +export default React.memo(JKChatMessage);