bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/presentation/service.js

193 lines
4.9 KiB
JavaScript
Raw Normal View History

import WhiteboardMultiUser from '/imports/api/whiteboard-multi-user/';
import PresentationPods from '/imports/api/presentation-pods';
import Presentations from '/imports/api/presentations';
import { Slides, SlidePositions } from '/imports/api/slides';
import Users from '/imports/api/users';
2016-11-12 03:02:46 +08:00
import Auth from '/imports/ui/services/auth';
const getCurrentPresentation = podId => Presentations.findOne({
podId,
2017-07-25 02:46:53 +08:00
current: true,
2016-11-12 03:02:46 +08:00
});
const downloadPresentationUri = (podId) => {
const currentPresentation = getCurrentPresentation(podId);
if (!currentPresentation) {
return null;
}
const uri = `https://${window.document.location.hostname}/bigbluebutton/presentation/download/`
+ `${currentPresentation.meetingId}/${currentPresentation.id}`
+ `?presFilename=${encodeURIComponent(currentPresentation.name)}`;
return uri;
};
const isPresentationDownloadable = (podId) => {
const currentPresentation = getCurrentPresentation(podId);
if (!currentPresentation) {
return null;
}
return currentPresentation.downloadable;
};
const getCurrentSlide = (podId) => {
const currentPresentation = getCurrentPresentation(podId);
2016-11-12 03:02:46 +08:00
if (!currentPresentation) {
return null;
}
2019-03-12 00:21:12 +08:00
return Slides.findOne({
podId,
presentationId: currentPresentation.id,
current: true,
}, {
fields: {
meetingId: 0,
thumbUri: 0,
swfUri: 0,
txtUri: 0,
},
2019-03-12 00:21:12 +08:00
});
2016-11-12 03:02:46 +08:00
};
2016-07-16 04:45:54 +08:00
const getSlidePosition = (podId, presentationId, slideId) => SlidePositions.findOne({
podId,
presentationId,
id: slideId,
});
2019-02-22 05:01:39 +08:00
const currentSlidHasContent = () => {
const currentSlide = getCurrentSlide('DEFAULT_PRESENTATION_POD');
if (!currentSlide) return false;
2019-03-12 00:21:12 +08:00
const {
content,
} = currentSlide;
2019-02-22 05:01:39 +08:00
return !!content.length;
};
const parseCurrentSlideContent = (yesValue, noValue, trueValue, falseValue) => {
const currentSlide = getCurrentSlide('DEFAULT_PRESENTATION_POD');
const quickPollOptions = [];
if (!currentSlide) return quickPollOptions;
2019-03-12 00:21:12 +08:00
const {
content,
} = currentSlide;
2019-02-22 05:01:39 +08:00
2019-10-25 02:46:19 +08:00
const pollRegex = /[1-6A-Fa-f][.)].*/g;
let optionsPoll = content.match(pollRegex) || [];
if (optionsPoll) optionsPoll = optionsPoll.map(opt => `\r${opt[0]}.`);
2019-10-25 02:46:19 +08:00
const excludePatt = '[^.)]';
const ynPollString = `(${excludePatt}${yesValue}\\s*\\/\\s*${noValue})|(${excludePatt}${noValue}\\s*\\/\\s*${yesValue})`;
2019-02-22 05:01:39 +08:00
const ynOptionsRegex = new RegExp(ynPollString, 'gi');
const ynPoll = content.match(ynOptionsRegex) || [];
const tfPollString = `(${excludePatt}${trueValue}\\s*\\/\\s*${falseValue})|(${excludePatt}${falseValue}\\s*\\/\\s*${trueValue})`;
2019-02-22 05:01:39 +08:00
const tgOptionsRegex = new RegExp(tfPollString, 'gi');
const tfPoll = content.match(tgOptionsRegex) || [];
optionsPoll.reduce((acc, currentValue) => {
const lastElement = acc[acc.length - 1];
if (!lastElement) {
acc.push({
options: [currentValue],
});
return acc;
}
2019-03-12 00:21:12 +08:00
const {
options,
} = lastElement;
2019-02-22 05:01:39 +08:00
const lastOption = options[options.length - 1];
const isLastOptionInteger = !!parseInt(lastOption.charAt(1), 10);
const isCurrentValueInteger = !!parseInt(currentValue.charAt(1), 10);
if (isLastOptionInteger === isCurrentValueInteger) {
if (currentValue.toLowerCase().charCodeAt(1) > lastOption.toLowerCase().charCodeAt(1)) {
options.push(currentValue);
} else {
acc.push({
options: [currentValue],
});
}
} else {
acc.push({
options: [currentValue],
});
}
return acc;
2019-03-12 00:21:12 +08:00
}, []).filter(({
options,
}) => options.length > 1 && options.length < 7).forEach(poll => quickPollOptions.push({
type: `A-${poll.options.length}`,
poll,
}));
ynPoll.forEach(poll => quickPollOptions.push({
type: 'YN',
poll,
}));
tfPoll.forEach(poll => quickPollOptions.push({
type: 'TF',
poll,
}));
return {
slideId: currentSlide.id,
quickPollOptions,
};
2019-02-22 05:01:39 +08:00
};
const isPresenter = (podId) => {
// a main presenter in the meeting always owns a default pod
if (podId === 'DEFAULT_PRESENTATION_POD') {
const options = {
filter: {
presenter: 1,
},
};
2019-03-12 00:21:12 +08:00
const currentUser = Users.findOne({
userId: Auth.userID,
}, options);
return currentUser ? currentUser.presenter : false;
}
// if a pod is not default, then we check whether this user owns a current pod
const selector = {
meetingId: Auth.meetingID,
podId,
};
const pod = PresentationPods.findOne(selector);
return pod.currentPresenterId === Auth.userID;
2016-11-22 23:46:08 +08:00
};
2016-11-12 03:02:46 +08:00
2018-04-10 07:18:49 +08:00
const getMultiUserStatus = (whiteboardId) => {
2019-03-12 00:21:12 +08:00
const data = WhiteboardMultiUser.findOne({
meetingId: Auth.meetingID,
whiteboardId,
});
2017-09-21 05:05:17 +08:00
return data ? data.multiUser : false;
};
export default {
2016-11-12 03:02:46 +08:00
getCurrentSlide,
getSlidePosition,
2016-11-12 03:02:46 +08:00
isPresenter,
isPresentationDownloadable,
downloadPresentationUri,
getMultiUserStatus,
2019-02-22 05:01:39 +08:00
currentSlidHasContent,
parseCurrentSlideContent,
getCurrentPresentation,
};