| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 | 
							- // @flow
 - 
 - import { getCurrentConference } from '../base/conference';
 - import { JitsiConferenceEvents } from '../base/lib-jitsi-meet';
 - import { StateListenerRegistry } from '../base/redux';
 - import {
 -     NOTIFICATION_TIMEOUT,
 -     NOTIFICATION_TYPE,
 -     showNotification
 - } from '../notifications';
 - 
 - import { receiveAnswer, receivePoll } from './actions';
 - import { COMMAND_NEW_POLL, COMMAND_ANSWER_POLL, COMMAND_OLD_POLLS } from './constants';
 - import type { Answer, Poll } from './types';
 - 
 - 
 - const parsePollData = (pollData): Poll | null => {
 -     if (typeof pollData !== 'object' || pollData === null) {
 -         return null;
 -     }
 -     const { id, senderId, senderName, question, answers } = pollData;
 - 
 -     if (typeof id !== 'string' || typeof senderId !== 'string' || typeof senderName !== 'string'
 -         || typeof question !== 'string' || !(answers instanceof Array)) {
 -         return null;
 -     }
 - 
 -     const answersParsed = [];
 - 
 -     for (const answer of answers) {
 -         const voters = new Map();
 - 
 -         for (const [ voterId, voter ] of Object.entries(answer.voters)) {
 -             if (typeof voter !== 'string') {
 -                 return null;
 -             }
 -             voters.set(voterId, voter);
 -         }
 - 
 -         answersParsed.push({
 -             name: answer.name,
 -             voters
 -         });
 -     }
 - 
 -     return {
 -         senderId,
 -         senderName,
 -         question,
 -         showResults: true,
 -         lastVote: null,
 -         answers: answersParsed
 -     };
 - };
 - 
 - StateListenerRegistry.register(
 -     state => getCurrentConference(state),
 -     (conference, store, previousConference) => {
 -         if (conference && conference !== previousConference) {
 -             const receiveMessage = (_, data) => {
 -                 switch (data.type) {
 -                 case COMMAND_NEW_POLL: {
 -                     const { question, answers, pollId, senderId, senderName } = data;
 - 
 -                     const poll = {
 -                         senderId,
 -                         senderName,
 -                         showResults: false,
 -                         lastVote: null,
 -                         question,
 -                         answers: answers.map(answer => {
 -                             return {
 -                                 name: answer,
 -                                 voters: new Map()
 -                             };
 -                         })
 -                     };
 - 
 -                     store.dispatch(receivePoll(pollId, poll, true));
 -                     store.dispatch(showNotification({
 -                         appearance: NOTIFICATION_TYPE.NORMAL,
 -                         titleKey: 'polls.notification.title',
 -                         descriptionKey: 'polls.notification.description'
 -                     }, NOTIFICATION_TIMEOUT));
 -                     break;
 - 
 -                 }
 - 
 -                 case COMMAND_ANSWER_POLL: {
 -                     const { pollId, answers, voterId, voterName } = data;
 - 
 -                     const receivedAnswer: Answer = {
 -                         voterId,
 -                         voterName,
 -                         pollId,
 -                         answers
 -                     };
 - 
 -                     store.dispatch(receiveAnswer(pollId, receivedAnswer));
 -                     break;
 - 
 -                 }
 - 
 -                 case COMMAND_OLD_POLLS: {
 -                     const { polls } = data;
 - 
 -                     for (const pollData of polls) {
 -                         const poll = parsePollData(pollData);
 - 
 -                         if (poll === null) {
 -                             console.warn('[features/polls] Invalid old poll data');
 -                         } else {
 -                             store.dispatch(receivePoll(pollData.id, poll, false));
 -                         }
 -                     }
 -                     break;
 -                 }
 -                 }
 -             };
 - 
 -             conference.on(JitsiConferenceEvents.ENDPOINT_MESSAGE_RECEIVED, receiveMessage);
 -             conference.on(JitsiConferenceEvents.NON_PARTICIPANT_MESSAGE_RECEIVED, receiveMessage);
 -         }
 -     }
 - );
 
 
  |