1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00
jellyfin-web/src/components/syncplay/groupSelectionMenu.js

190 lines
6.1 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 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 () {
2020-04-03 18:49:19 +02:00
var info = playbackManager.getPlayerInfo();
return info ? info.id : null;
}
/**
* 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) {
2020-05-05 12:01:43 +02:00
const sessionId = getActivePlayerId() || 'none';
const inSession = sessionId !== 'none';
const policy = user.localUser ? user.localUser.Policy : {};
let playingItemId;
try {
const playState = playbackManager.getPlayerState();
playingItemId = playState.NowPlayingItem.Id;
2020-05-05 12:01:43 +02:00
console.debug('Item', playingItemId, 'is currently playing.');
} catch (error) {
2020-05-05 12:01:43 +02:00
playingItemId = '';
console.debug('No item is currently playing.');
}
2020-04-03 18:49:19 +02:00
2020-05-05 12:01:43 +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) {
return {
2020-05-05 12:01:43 +02:00
name: group.PlayingItemName,
icon: 'group',
2020-04-03 18:49:19 +02:00
id: group.GroupId,
selected: false,
2020-05-05 12:01:43 +02:00
secondaryText: group.Participants.join(', ')
2020-04-03 18:49:19 +02:00
};
2020-04-01 17:53:14 +02:00
});
2020-05-05 12:01:43 +02:00
if (inSession && policy.SyncplayAccess === 'CreateAndJoinGroups') {
2020-04-03 18:49:19 +02:00
menuItems.push({
name: globalize.translate('LabelSyncplayNewGroup'),
2020-05-05 12:01:43 +02:00
icon: 'add',
id: 'new-group',
2020-04-03 18:49:19 +02:00
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) {
2020-05-05 12:01:43 +02:00
if (inSession && policy.SyncplayAccess === 'JoinGroups') {
toast({
2020-04-22 22:48:26 +02:00
text: globalize.translate('MessageSyncplayCreateGroupDenied')
});
} 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-05-05 12:01:43 +02:00
if (id == 'new-group') {
apiClient.sendSyncplayCommand(sessionId, 'NewGroup');
2020-04-03 18:49:19 +02:00
} else {
2020-05-05 12:01:43 +02:00
apiClient.sendSyncplayCommand(sessionId, 'JoinGroup', {
GroupId: id,
PlayingItemId: playingItemId
2020-04-03 18:49:19 +02:00
});
2020-04-01 17:53:14 +02:00
}
2020-05-05 12:01:43 +02:00
}).catch((error) => {
console.error('Syncplay: unexpected error listing groups:', error);
});
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({
2020-05-05 12:01:43 +02:00
text: globalize.translate('MessageSyncplayErrorAccessingGroups')
});
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();
if (!sessionId) {
syncplayManager.signalError();
toast({
2020-05-05 12:01:43 +02:00
text: globalize.translate('MessageSyncplayErrorNoActivePlayer')
});
2020-05-05 12:01:43 +02:00
showNewJoinGroupSelection(button, user, apiClient);
return;
}
2020-04-03 18:49:19 +02:00
const menuItems = [{
name: globalize.translate('LabelSyncplayLeaveGroup'),
2020-05-05 12:01:43 +02:00
icon: 'meeting_room',
id: 'leave-group',
2020-04-03 18:49:19 +02:00
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) {
2020-05-05 12:01:43 +02:00
if (id == 'leave-group') {
apiClient.sendSyncplayCommand(sessionId, 'LeaveGroup');
2020-04-01 17:53:14 +02:00
}
2020-05-05 12:01:43 +02:00
}).catch((error) => {
console.error('Syncplay: unexpected error showing group menu:', error);
});
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;
2020-05-05 12:01:43 +02:00
events.on(syncplayManager, 'enabled', function (e, enabled) {
2020-04-03 18:49:19 +02:00
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(() => {
2020-05-05 12:01:43 +02:00
console.debug('Playback is allowed.');
2020-04-15 18:09:34 +02:00
}).catch((error) => {
2020-05-05 12:01:43 +02:00
console.error('Playback not allowed!', error);
2020-04-15 18:09:34 +02:00
toast({
2020-05-05 12:01:43 +02:00
text: globalize.translate('MessageSyncplayPlaybackPermissionRequired')
2020-04-15 18:09:34 +02:00
});
});
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
}