2018-10-10 23:49:58 +08:00
|
|
|
import React, { Component } from 'react';
|
|
|
|
import _ from 'lodash';
|
2018-10-16 03:05:50 +08:00
|
|
|
import { defineMessages, injectIntl } from 'react-intl';
|
2018-10-10 23:49:58 +08:00
|
|
|
import { styles } from './styles';
|
|
|
|
|
2018-10-16 03:05:50 +08:00
|
|
|
const intlMessages = defineMessages({
|
|
|
|
usersTitle: {
|
|
|
|
id: 'app.poll.liveResult.usersTitle',
|
|
|
|
description: 'heading label for poll users',
|
|
|
|
},
|
|
|
|
responsesTitle: {
|
|
|
|
id: 'app.poll.liveResult.responsesTitle',
|
|
|
|
description: 'heading label for poll responses',
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2018-10-10 23:49:58 +08:00
|
|
|
class LiveResult extends Component {
|
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
|
|
|
|
this.getUnresponsive = this.getUnresponsive.bind(this);
|
|
|
|
this.getRespondents = this.getRespondents.bind(this);
|
|
|
|
this.getPollStats = this.getPollStats.bind(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
getPollStats() {
|
|
|
|
const { currentPoll } = this.props;
|
|
|
|
|
|
|
|
const pollStats = [];
|
|
|
|
|
|
|
|
if (currentPoll) {
|
|
|
|
const {
|
|
|
|
answers,
|
|
|
|
numRespondents,
|
|
|
|
} = currentPoll;
|
|
|
|
|
|
|
|
if (answers) {
|
|
|
|
answers.map((obj) => {
|
|
|
|
const pct = Math.round(obj.numVotes / numRespondents * 100);
|
|
|
|
|
|
|
|
return pollStats.push(<div className={styles.main} key={_.uniqueId('stats-')}>
|
|
|
|
<div className={styles.left}>
|
|
|
|
{obj.key}
|
|
|
|
</div>
|
|
|
|
<div className={styles.center}>
|
|
|
|
{obj.numVotes}
|
|
|
|
</div>
|
|
|
|
<div className={styles.right}>
|
|
|
|
{`${isNaN(pct) ? 0 : pct}%`}
|
|
|
|
</div>
|
|
|
|
</div>);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return pollStats;
|
|
|
|
}
|
|
|
|
|
|
|
|
getRespondents() {
|
|
|
|
const { currentPoll, getUser } = this.props;
|
|
|
|
|
|
|
|
if (!currentPoll) return null;
|
|
|
|
|
|
|
|
const respondedUsers = [];
|
|
|
|
|
|
|
|
if (currentPoll) {
|
|
|
|
const {
|
|
|
|
answers,
|
|
|
|
responses,
|
|
|
|
} = currentPoll;
|
|
|
|
|
|
|
|
if (responses && answers) {
|
|
|
|
responses.map((ur) => {
|
|
|
|
const user = getUser(ur.userId);
|
|
|
|
if (user) {
|
|
|
|
answers.map((obj) => {
|
|
|
|
if (obj.id === ur.answerId) {
|
|
|
|
respondedUsers.push(<div className={styles.item} key={_.uniqueId('stats-')}>{user.name}</div>);
|
|
|
|
respondedUsers.push(<div className={styles.itemR} key={_.uniqueId('stats-')}>{obj.key}</div>);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return respondedUsers;
|
|
|
|
}
|
|
|
|
|
|
|
|
getUnresponsive() {
|
|
|
|
const { currentPoll, getUser } = this.props;
|
|
|
|
|
|
|
|
if (!currentPoll) return null;
|
|
|
|
|
|
|
|
const {
|
|
|
|
users,
|
|
|
|
} = currentPoll;
|
|
|
|
|
|
|
|
const usersToRespond = [];
|
|
|
|
|
|
|
|
const usersList = _.compact(users);
|
|
|
|
|
|
|
|
if (usersList) {
|
|
|
|
usersList.map((userId) => {
|
|
|
|
const user = getUser(userId);
|
|
|
|
|
|
|
|
if (user) {
|
|
|
|
usersToRespond.push(<div className={styles.item} key={_.uniqueId('stats-')}>{user.name}</div>);
|
|
|
|
usersToRespond.push(<div className={styles.itemR} key={_.uniqueId('stats-')}>^</div>);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return usersToRespond;
|
|
|
|
}
|
|
|
|
|
|
|
|
render() {
|
2018-10-16 03:05:50 +08:00
|
|
|
const { intl } = this.props;
|
|
|
|
|
2018-10-10 23:49:58 +08:00
|
|
|
return (
|
|
|
|
<div>
|
|
|
|
<div className={styles.stats}>
|
|
|
|
{this.getPollStats()}
|
|
|
|
</div>
|
|
|
|
<div className={styles.container}>
|
2018-10-16 03:05:50 +08:00
|
|
|
<div className={styles.usersHeading}>{intl.formatMessage(intlMessages.usersTitle)}</div>
|
|
|
|
<div className={styles.responseHeading}>{intl.formatMessage(intlMessages.responsesTitle)}</div>
|
2018-10-10 23:49:58 +08:00
|
|
|
{this.getRespondents()}
|
|
|
|
{this.getUnresponsive()}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-16 03:05:50 +08:00
|
|
|
export default injectIntl(LiveResult);
|