jellyfish-web/src/components/syncplay/groupSelectionMenu.js

182 lines
5.7 KiB
JavaScript
Raw Normal View History

2020-04-03 18:49:19 +02:00
import events from 'events';
import connectionManager from 'connectionManager';
import playbackManager from 'playbackManager';
import syncplayManager from 'syncplayManager';
import loading from 'loading';
import datetime from 'datetime';
import toast from 'toast';
import actionsheet from 'actionsheet';
import globalize from 'globalize';
2020-04-15 18:09:34 +02:00
import playbackPermissionManager from 'playbackPermissionManager';
2020-04-03 18:49:19 +02:00
/**
* Gets active player id.
* @returns {string} The player's id.
*/
function getActivePlayerId() {
var info = playbackManager.getPlayerInfo();
return info ? info.id : null;
}
/**
* Used to avoid console logs about uncaught promises
*/
function emptyCallback() {
// avoid console logs about uncaught promises
}
/**
* Used when user needs to join a group.
* @param {HTMLElement} button - Element where to place the menu.
* @param {Object} user - Current user.
* @param {Object} apiClient - ApiClient.
2020-04-03 18:49:19 +02:00
*/
function showNewJoinGroupSelection(button, user, apiClient) {
let sessionId = getActivePlayerId();
2020-04-03 18:49:19 +02:00
sessionId = sessionId ? sessionId : "none";
const inSession = sessionId !== "none";
const policy = user.localUser ? user.localUser.Policy : {};
2020-04-03 18:49:19 +02:00
apiClient.sendSyncplayCommand(sessionId, "ListGroups").then(function (response) {
response.json().then(function (groups) {
2020-04-03 18:49:19 +02:00
var menuItems = groups.map(function (group) {
var name = datetime.getDisplayRunningTime(group.PositionTicks);
if (!inSession) {
name = group.PlayingItemName;
2020-04-01 17:53:14 +02:00
}
2020-04-03 18:49:19 +02:00
return {
name: name,
icon: "group",
id: group.GroupId,
selected: false,
secondaryText: group.Partecipants.join(", ")
};
2020-04-01 17:53:14 +02:00
});
if (inSession && policy.SyncplayAccess === "CreateAndJoinGroups") {
2020-04-03 18:49:19 +02:00
menuItems.push({
name: globalize.translate('LabelSyncplayNewGroup'),
icon: "add",
id: "new-group",
selected: true,
secondaryText: globalize.translate('LabelSyncplayNewGroupDescription')
});
}
2020-04-01 17:53:14 +02:00
2020-04-03 18:49:19 +02:00
if (menuItems.length === 0) {
if (inSession && policy.SyncplayAccess === "JoinGroups") {
toast({
text: globalize.translate('MessageSyncplayPermissionRequired')
});
} else {
2020-04-03 18:49:19 +02:00
toast({
text: globalize.translate('MessageSyncplayNoGroupsAvailable')
});
}
2020-04-03 18:49:19 +02:00
loading.hide();
return;
}
2020-04-01 17:53:14 +02:00
var menuOptions = {
2020-04-03 18:49:19 +02:00
title: globalize.translate('HeaderSyncplaySelectGroup'),
2020-04-01 17:53:14 +02:00
items: menuItems,
positionTo: button,
resolveOnClick: true,
border: true
};
actionsheet.show(menuOptions).then(function (id) {
2020-04-03 18:49:19 +02:00
if (id == "new-group") {
apiClient.sendSyncplayCommand(sessionId, "NewGroup");
} else {
apiClient.sendSyncplayCommand(sessionId, "JoinGroup", {
GroupId: id
});
2020-04-01 17:53:14 +02:00
}
}, emptyCallback);
2020-04-03 18:49:19 +02:00
loading.hide();
2020-04-01 17:53:14 +02:00
});
2020-04-03 18:49:19 +02:00
}).catch(function (error) {
console.error(error);
loading.hide();
toast({
text: globalize.translate('MessageSyncplayNoGroupsAvailable')
});
2020-04-03 18:49:19 +02:00
});
}
/**
* Used when user has joined a group.
* @param {HTMLElement} button - Element where to place the menu.
* @param {Object} user - Current user.
* @param {Object} apiClient - ApiClient.
2020-04-03 18:49:19 +02:00
*/
function showLeaveGroupSelection(button, user, apiClient) {
2020-04-03 18:49:19 +02:00
const sessionId = getActivePlayerId();
const menuItems = [{
name: globalize.translate('LabelSyncplayLeaveGroup'),
icon: "meeting_room",
id: "leave-group",
selected: true,
secondaryText: globalize.translate('LabelSyncplayLeaveGroupDescription')
}];
var menuOptions = {
title: globalize.translate('HeaderSyncplayEnabled'),
items: menuItems,
positionTo: button,
resolveOnClick: true,
border: true
};
2020-04-01 17:53:14 +02:00
2020-04-03 18:49:19 +02:00
actionsheet.show(menuOptions).then(function (id) {
if (id == "leave-group") {
apiClient.sendSyncplayCommand(sessionId, "LeaveGroup");
2020-04-01 17:53:14 +02:00
}
2020-04-03 18:49:19 +02:00
}, emptyCallback);
2020-04-01 17:53:14 +02:00
2020-04-03 18:49:19 +02:00
loading.hide();
}
2020-04-01 17:53:14 +02:00
2020-04-03 18:49:19 +02:00
// Register to Syncplay events
let syncplayEnabled = false;
events.on(syncplayManager, 'SyncplayEnabled', function (e, enabled) {
syncplayEnabled = enabled;
2020-04-01 17:53:14 +02:00
});
2020-04-03 18:49:19 +02:00
/**
* Shows a menu to handle Syncplay groups.
* @param {HTMLElement} button - Element where to place the menu.
*/
export function show(button) {
loading.show();
2020-04-15 18:09:34 +02:00
// TODO: should feature be disabled if playback permission is missing?
playbackPermissionManager.check().then(() => {
console.debug("Playback is allowed.");
}).catch((error) => {
console.error("Playback not allowed!", error);
toast({
text: globalize.translate("MessageSyncplayPlaybackPermissionRequired")
});
});
const apiClient = connectionManager.currentApiClient();
connectionManager.user(apiClient).then((user) => {
if (syncplayEnabled) {
showLeaveGroupSelection(button, user, apiClient);
} else {
showNewJoinGroupSelection(button, user, apiClient);
}
}).catch((error) => {
console.error(error);
loading.hide();
toast({
text: globalize.translate('MessageSyncplayNoGroupsAvailable')
});
});
2020-04-03 18:49:19 +02:00
}