import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { defineMessages, injectIntl } from 'react-intl'; import { toast } from 'react-toastify'; import Icon from '/imports/ui/components/icon/component'; import Button from '/imports/ui/components/button/component'; import { ENTER } from '/imports/utils/keyCodes'; import toastStyles from '/imports/ui/components/toast/styles'; import { styles } from './styles'; import {Meteor} from "meteor/meteor"; const messages = defineMessages({ lowerHandsLabel: { id: 'app.statusNotifier.lowerHands', description: 'text displayed to clear all raised hands', }, raisedHandsTitle: { id: 'app.statusNotifier.raisedHandsTitle', description: 'heading for raised hands toast', }, raisedHandDesc: { id: 'app.statusNotifier.raisedHandDesc', description: 'label for multiple users with raised hands', }, raisedHandDescOneUser: { id: 'app.statusNotifier.raisedHandDescOneUser', description: 'label for a single user with raised hand', }, and: { id: 'app.statusNotifier.and', description: 'used as conjunction word', }, }); const MAX_AVATAR_COUNT = 3; class StatusNotifier extends Component { constructor(props) { super(props); this.statusNotifierId = null; this.audio = new Audio(`${Meteor.settings.public.app.cdn + Meteor.settings.public.app.basename + Meteor.settings.public.app.instanceId}/resources/sounds/bbb-handRaise.mp3`); this.renderRaisedHands = this.renderRaisedHands.bind(this); this.getRaisedHandNames = this.getRaisedHandNames.bind(this); this.raisedHandAvatars = this.raisedHandAvatars.bind(this); } componentDidUpdate(prevProps) { const { emojiUsers, raiseHandAudioAlert, raiseHandPushAlert, status, isViewer, } = this.props; if (isViewer) { if (this.statusNotifierId) toast.dismiss(this.statusNotifierId); return false; } switch (status) { case 'raiseHand': if (emojiUsers.length === 0) return toast.dismiss(this.statusNotifierId); if (raiseHandAudioAlert && emojiUsers.length > prevProps.emojiUsers.length) { this.audio.play(); } if (raiseHandPushAlert) { if (this.statusNotifierId) { return toast.update(this.statusNotifierId, { render: this.renderRaisedHands(), }); } this.statusNotifierId = toast(this.renderRaisedHands(), { onClose: () => { this.statusNotifierId = null; }, autoClose: false, closeOnClick: false, closeButton: false, className: toastStyles.actionToast, }); } break; default: break; } return true; } getRaisedHandNames() { const { emojiUsers, intl } = this.props; if (emojiUsers.length === 0) return ''; const _names = emojiUsers.map(u => u.name); const { length } = _names; const and = intl.formatMessage(messages.and); let formattedNames = ''; switch (length) { case 1: formattedNames = _names; break; case 2: formattedNames = _names.join(` ${and} `); break; case 3: formattedNames = _names.slice(0, length - 1).join(', '); formattedNames += ` ${and} ${_names.slice(length - 1)}`; break; default: formattedNames = _names.slice(0, MAX_AVATAR_COUNT).join(', '); formattedNames += ` ${and} ${length - MAX_AVATAR_COUNT}+ `; break; } const raisedHandMessageString = length === 1 ? messages.raisedHandDescOneUser : messages.raisedHandDesc; return intl.formatMessage(raisedHandMessageString, { 0: formattedNames }); } raisedHandAvatars() { const { emojiUsers, clearUserStatus } = this.props; let users = emojiUsers; if (emojiUsers.length > MAX_AVATAR_COUNT) users = users.slice(0, MAX_AVATAR_COUNT); const avatars = users.map(u => (