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

200 lines
5.1 KiB
JavaScript
Raw Normal View History

2019-05-21 00:43:31 +08:00
import _ from 'lodash';
import Captions from '/imports/api/captions';
import Users from '/imports/api/users';
import Auth from '/imports/ui/services/auth';
import { makeCall } from '/imports/ui/services/api';
import { Meteor } from 'meteor/meteor';
import { Session } from 'meteor/session';
const CAPTIONS_CONFIG = Meteor.settings.public.captions;
const CAPTIONS_TOKEN = '_cc_';
2019-05-21 01:39:04 +08:00
const LINE_BREAK = '\n';
const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator;
2019-05-23 22:51:01 +08:00
const getActiveCaptions = () => {
const activeCaptions = Session.get('activeCaptions');
if (!activeCaptions) return '';
return activeCaptions;
};
const getCaptions = locale => Captions.findOne({
meetingId: Auth.meetingID,
locale,
});
2019-05-23 22:51:01 +08:00
const getCaptionsData = () => {
const activeCaptions = getActiveCaptions();
let locale = '';
2019-05-21 00:43:31 +08:00
let revs = 0;
2019-05-29 22:31:27 +08:00
let data = '';
if (activeCaptions) {
2019-05-21 00:43:31 +08:00
const captions = getCaptions(activeCaptions);
if (!_.isEmpty(captions)) {
locale = activeCaptions;
2019-05-29 22:31:27 +08:00
revs = captions.revs; // eslint-disable-line prefer-destructuring
data = captions.data; // eslint-disable-line prefer-destructuring
2019-05-21 00:43:31 +08:00
}
}
return { locale, revs, data };
};
const getAvailableLocales = () => {
const { meetingID } = Auth;
2019-05-29 22:31:27 +08:00
const locales = [];
Captions.find({ meetingId: meetingID },
{ sort: { locale: 1 } },
{ fields: { ownerId: 1, locale: 1, name: 1 } })
.forEach((caption) => {
if (caption.ownerId === '') {
locales.push({
locale: caption.locale,
name: caption.name,
});
}
});
return locales;
};
const getOwnedLocales = () => {
const { meetingID } = Auth;
2019-05-29 22:31:27 +08:00
const locales = [];
Captions.find({ meetingId: meetingID },
{ fields: { ownerId: 1, locale: 1, name: 1 } })
.forEach((caption) => {
if (caption.ownerId !== '') {
locales.push({
locale: caption.locale,
name: caption.name,
});
}
});
return locales;
};
2019-05-29 22:31:27 +08:00
const takeOwnership = (locale) => {
makeCall('takeOwnership', locale);
};
const appendText = (text, locale) => {
if (typeof text !== 'string' || text.length === 0) return;
const formattedText = `${text.trim().replace(/^\w/, (c) => c.toUpperCase())}\n\n`;
makeCall('appendText', formattedText, locale);
};
2019-05-29 22:31:27 +08:00
const canIOwnThisPad = (ownerId) => {
const { userID } = Auth;
if (!CAPTIONS_CONFIG.takeOwnership) return false;
2019-05-29 22:31:27 +08:00
if (ownerId === '') return false;
return ownerId !== userID;
};
const getSpeechRecognitionAPI = () => window.SpeechRecognition || window.webkitSpeechRecognition;
const canIDictateThisPad = (ownerId) => {
const { userID } = Auth;
if (!CAPTIONS_CONFIG.enableDictation) return false;
if (ownerId === '') return false;
const SpeechRecognitionAPI = getSpeechRecognitionAPI();
if (!SpeechRecognitionAPI) return false;
return ownerId === userID;
};
const setActiveCaptions = (locale) => {
Session.set('activeCaptions', locale);
};
const setCaptionsSettings = (settings) => {
Session.set('captionsSettings', settings);
};
const getCaptionsSettings = () => {
const settings = Session.get('captionsSettings');
if (!settings) {
2019-05-29 22:31:27 +08:00
const {
backgroundColor, fontColor, fontFamily, fontSize,
} = CAPTIONS_CONFIG;
return {
backgroundColor, fontColor, fontFamily, fontSize,
};
}
return settings;
2019-05-21 01:39:04 +08:00
};
const isCaptionsEnabled = () => {
const captions = Captions.findOne({ meetingId: Auth.meetingID });
return CAPTIONS_CONFIG.enabled && captions;
};
const isCaptionsAvailable = () => {
if (isCaptionsEnabled) {
const ownedLocales = getOwnedLocales();
return (ownedLocales.length > 0);
}
return false;
2019-05-21 01:39:04 +08:00
};
const isCaptionsActive = () => {
const enabled = isCaptionsEnabled();
const activated = getActiveCaptions() !== '';
return (enabled && activated);
2019-05-21 01:39:04 +08:00
};
const deactivateCaptions = () => {
setActiveCaptions('');
2019-05-21 01:39:04 +08:00
};
const activateCaptions = (locale, settings) => {
setCaptionsSettings(settings);
setActiveCaptions(locale);
2019-05-21 01:39:04 +08:00
};
2019-05-29 22:31:27 +08:00
const formatCaptionsText = (text) => {
2019-05-21 01:39:04 +08:00
const splitText = text.split(LINE_BREAK);
const filteredText = splitText.filter((line, index) => {
2019-05-23 22:51:01 +08:00
const lastLine = index === (splitText.length - 1);
const emptyLine = line.length === 0;
2019-05-21 01:39:04 +08:00
return (!emptyLine || lastLine);
});
while (filteredText.length > CAPTIONS_CONFIG.lines) filteredText.shift();
return filteredText.join(LINE_BREAK);
};
const amIModerator = () => Users.findOne({ userId: Auth.userID },
{ fields: { role: 1 } }).role === ROLE_MODERATOR;
const initSpeechRecognition = (locale) => {
const SpeechRecognitionAPI = getSpeechRecognitionAPI();
let recognition = null;
if (SpeechRecognitionAPI) {
recognition = new SpeechRecognitionAPI();
recognition.continuous = true;
recognition.interimResults = true;
recognition.lang = locale;
}
return recognition;
};
export default {
CAPTIONS_TOKEN,
getCaptionsData,
getAvailableLocales,
getOwnedLocales,
takeOwnership,
appendText,
getCaptions,
canIOwnThisPad,
canIDictateThisPad,
getCaptionsSettings,
isCaptionsEnabled,
isCaptionsAvailable,
isCaptionsActive,
deactivateCaptions,
activateCaptions,
2019-05-21 01:39:04 +08:00
formatCaptionsText,
amIModerator,
initSpeechRecognition,
};