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 { share } from "../utils/share"; function SpawnPhotoMessage({ name, body: { src: url }, className, maySpawn }) { const onShareClicked = share.bind(null, { url, title: "Check out this photo from #hubs" }); return ( <div className={className}> {maySpawn && <button className={classNames(styles.iconButton, styles.share)} onClick={onShareClicked} />} <div className={styles.mediaBody}> <span> <b>{name}</b> </span> <span> {"took a "} <b> <a href={url} target="_blank" rel="noopener noreferrer"> photo </a> </b>. </span> </div> <a href={url} target="_blank" rel="noopener noreferrer"> <img src={url} /> </a> </div> ); } SpawnPhotoMessage.propTypes = { name: PropTypes.string, maySpawn: PropTypes.bool, body: PropTypes.object, className: PropTypes.string }; function ChatBody(props) { return <div>{...props.children}</div>; } ChatBody.propTypes = { children: PropTypes.array }; export default class PresenceLog extends Component { static propTypes = { entries: PropTypes.array, inRoom: PropTypes.bool }; 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 ( <SpawnPhotoMessage key={e.key} name={e.name} className={classNames(entryClasses, styles.media)} body={e.body} maySpawn={e.maySpawn} /> ); } } }; render() { const presenceClasses = { [styles.presenceLog]: true, [styles.presenceLogInRoom]: this.props.inRoom }; return <div className={classNames(presenceClasses)}>{this.props.entries.map(this.domForEntry)}</div>; } }