import React, { Component } from "react"; import PropTypes from "prop-types"; import styles from "../assets/stylesheets/presence-log.scss"; import classNames from "classnames"; import { FormattedMessage } from "react-intl"; import ChatMessage from "./chat-message"; import PhotoMessage from "./photo-message"; export default class PresenceLog extends Component { static propTypes = { entries: PropTypes.array, inRoom: PropTypes.bool, hubId: PropTypes.string }; constructor(props) { super(props); } domForEntry = e => { const entryClasses = { [styles.presenceLogEntry]: true, [styles.presenceLogEntryWithButton]: e.type === "chat" && e.maySpawn, [styles.presenceLogChat]: e.type === "chat", [styles.expired]: !!e.expired }; switch (e.type) { case "join": case "entered": return ( <div key={e.key} className={classNames(entryClasses)}> <b>{e.name}</b> <FormattedMessage id={`presence.${e.type}_${e.presence}`} /> </div> ); case "leave": return ( <div key={e.key} className={classNames(entryClasses)}> <b>{e.name}</b> <FormattedMessage id={`presence.${e.type}`} /> </div> ); case "display_name_changed": return ( <div key={e.key} className={classNames(entryClasses)}> <b>{e.oldName}</b> <FormattedMessage id="presence.name_change" /> <b>{e.newName}</b>. </div> ); case "chat": return ( <ChatMessage key={e.key} name={e.name} className={classNames(entryClasses)} body={e.body} maySpawn={e.maySpawn} /> ); case "spawn": return ( <PhotoMessage key={e.key} name={e.name} className={classNames(entryClasses, styles.media)} body={e.body} maySpawn={e.maySpawn} hubId={this.props.hubId} /> ); case "log": return ( <div key={e.key} className={classNames(entryClasses)}> {e.body} </div> ); } }; render() { const presenceClasses = { [styles.presenceLog]: true, [styles.presenceLogInRoom]: this.props.inRoom }; return <div className={classNames(presenceClasses)}>{this.props.entries.map(this.domForEntry)}</div>; } }