Skip to content
Snippets Groups Projects
presence-log.js 2.41 KiB
Newer Older
Greg Fodor's avatar
Greg Fodor committed
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";
netpro2k's avatar
netpro2k committed
import ChatMessage from "./chat-message";
import PhotoMessage from "./photo-message";
Greg Fodor's avatar
Greg Fodor committed
export default class PresenceLog extends Component {
  static propTypes = {
Greg Fodor's avatar
Greg Fodor committed
    entries: PropTypes.array,
    inRoom: PropTypes.bool,
    hubId: PropTypes.string
Greg Fodor's avatar
Greg Fodor committed
  };

  constructor(props) {
    super(props);
  }

  domForEntry = e => {
    const entryClasses = {
      [styles.presenceLogEntry]: true,
      [styles.presenceLogEntryWithButton]: e.type === "chat" && e.maySpawn,
Greg Fodor's avatar
Greg Fodor committed
      [styles.presenceLogChat]: e.type === "chat",
Greg Fodor's avatar
Greg Fodor committed
      [styles.expired]: !!e.expired
    };

    switch (e.type) {
      case "join":
      case "entered":
        return (
          <div key={e.key} className={classNames(entryClasses)}>
            <b>{e.name}</b>&nbsp;<FormattedMessage id={`presence.${e.type}_${e.presence}`} />
Greg Fodor's avatar
Greg Fodor committed
          </div>
        );
      case "leave":
        return (
          <div key={e.key} className={classNames(entryClasses)}>
            <b>{e.name}</b>&nbsp;<FormattedMessage id={`presence.${e.type}`} />
Greg Fodor's avatar
Greg Fodor committed
          </div>
        );
      case "display_name_changed":
        return (
          <div key={e.key} className={classNames(entryClasses)}>
Greg Fodor's avatar
Greg Fodor committed
            <b>{e.oldName}</b>&nbsp;<FormattedMessage id="presence.name_change" />&nbsp;<b>{e.newName}</b>.
Greg Fodor's avatar
Greg Fodor committed
          </div>
        );
Greg Fodor's avatar
Greg Fodor committed
        return (
Greg Fodor's avatar
Greg Fodor committed
          <ChatMessage
            key={e.key}
            name={e.name}
            className={classNames(entryClasses)}
            body={e.body}
            maySpawn={e.maySpawn}
          />
Greg Fodor's avatar
Greg Fodor committed
        );
Greg Fodor's avatar
Greg Fodor committed
      case "spawn":
netpro2k's avatar
netpro2k committed
          <PhotoMessage
            key={e.key}
            name={e.name}
            className={classNames(entryClasses, styles.media)}
            body={e.body}
            maySpawn={e.maySpawn}
            hubId={this.props.hubId}
Greg Fodor's avatar
Greg Fodor committed
      case "log":
        return (
          <div key={e.key} className={classNames(entryClasses)}>
            {e.body}
          </div>
        );
Greg Fodor's avatar
Greg Fodor committed
    }
  };

  render() {
Greg Fodor's avatar
Greg Fodor committed
    const presenceClasses = {
      [styles.presenceLog]: true,
      [styles.presenceLogInRoom]: this.props.inRoom
    };

    return <div className={classNames(presenceClasses)}>{this.props.entries.map(this.domForEntry)}</div>;
Greg Fodor's avatar
Greg Fodor committed
  }
}