import React, { useState, useEffect } from 'react';
import { PageActions, PlaylistPageActions } from '../utils/actions/';
import { MemberContext } from '../utils/contexts/';
import { usePopup } from '../utils/hooks/';
import { PlaylistPageStore } from '../utils/stores/';
import {
CircleIconButton,
MaterialIcon,
NavigationContentApp,
NavigationMenuList,
PopupMain,
} from '../components/_shared/';
import { PlaylistCreationForm } from '../components/playlist-form/PlaylistCreationForm';
import { PlaylistMediaList } from '../components/playlist-page/PlaylistMediaList';
import { Page } from './_Page';
import '../components/playlist-page/PlaylistPage.scss';
if (window.MediaCMS.site.devEnv) {
const extractUrlParams = () => {
let mediaId = null;
let playlistId = null;
const query = window.location.search.split('?')[1];
if (query) {
const params = query.split('&');
params.forEach((param) => {
if (0 === param.indexOf('m=')) {
mediaId = param.split('m=')[1];
} else if (0 === param.indexOf('pl=')) {
playlistId = param.split('pl=')[1];
}
});
}
return { mediaId, playlistId };
};
const { playlistId } = extractUrlParams();
if (playlistId) {
window.MediaCMS.playlistId = playlistId;
}
}
function PlayAllLink(props) {
let playAllUrl = props.media[0].url;
if (window.MediaCMS.site.devEnv && -1 < playAllUrl.indexOf('view?')) {
playAllUrl = '/media.html?' + playAllUrl.split('view?')[1];
}
playAllUrl += '&pl=' + props.id;
return !props.media || !props.media.length ? (
{props.children}
) : (
{props.children}
);
}
function PlaylistThumb(props) {
const [thumb, setThumb] = useState(null);
useEffect(() => {
if (!props.thumb || 'string' !== typeof props.thumb) {
setThumb(null);
} else {
const tb = props.thumb.trim();
setThumb('' !== tb ? tb : null);
}
}, [props.thumb]);
return (
{thumb ?
: null}
play_arrow
PLAY ALL
);
}
function PlaylistTitle(props) {
return (
{props.title}
);
}
function PlaylistMeta(props) {
return (
{props.totalItems} media
{/*
{ props.viewsCount } { 1 < formatViewsNumber( props.viewsCount ) ? 'views' : 'view' }
*/}
{!props.dateLabel ? null :
{props.dateLabel}
}
);
}
function playlistOptionsList() {
const items = {
deleteMedia: {
itemType: 'open-subpage',
text: 'Delete',
icon: 'delete',
buttonAttr: {
className: 'change-page',
'data-page-id': 'proceedPlaylistRemovalPopup',
},
},
};
return items;
}
function playlistOptionsPopupPages(proceedPlaylistRemoval, cancelPlaylistRemoval) {
const optionsList = playlistOptionsList();
return {
main: (
),
proceedPlaylistRemovalPopup: (
Playlist removal
You're willing to remove playlist permanently?
),
};
}
function PlaylistOptions(props) {
const [popupContentRef, PopupContent, PopupTrigger] = usePopup();
const [popupCurrentPage, setPopupCurrentPage] = useState('main');
function proceedPlaylistRemoval() {
PlaylistPageActions.removePlaylist();
popupContentRef.current.toggle();
}
function cancelPlaylistRemoval() {
popupContentRef.current.toggle();
}
return (
);
}
function PlaylistEdit(props) {
const [popupContentRef, PopupContent, PopupTrigger] = usePopup();
function onPlaylistSave() {
// Empty for now...
}
function onClickExit() {
popupContentRef.current.toggle();
}
function playlistUpdateCompleted(new_playlist_data) {
// FIXME: Without delay creates conflict [ Uncaught Error: Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch. ].
setTimeout(function () {
PageActions.addNotification('Playlist updated', 'playlistUpdateCompleted');
onClickExit();
}, 100);
}
function playlistUpdateFailed() {
// FIXME: Without delay creates conflict [ Uncaught Error: Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch. ].
setTimeout(function () {
PageActions.addNotification('Playlist update failed', 'playlistUpdateFailed');
onClickExit();
}, 100);
}
function playlistRemovalCompleted(playlistId) {
// FIXME: Without delay creates conflict [ Uncaught Error: Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch. ].
setTimeout(function () {
PageActions.addNotification('Playlist removed. Redirecting...', 'playlistDelete');
setTimeout(function () {
window.location.href = MemberContext._currentValue.pages.playlists;
}, 2000);
}, 100);
}
function playlistRemovalFailed(playlistId) {
// FIXME: Without delay creates conflict [ Uncaught Error: Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch. ].
setTimeout(function () {
PageActions.addNotification('Playlist removal failed', 'playlistDeleteFail');
}, 100);
}
useEffect(() => {
PlaylistPageStore.on('playlist_update_completed', playlistUpdateCompleted);
PlaylistPageStore.on('playlist_update_failed', playlistUpdateFailed);
PlaylistPageStore.on('playlist_removal_completed', playlistRemovalCompleted);
PlaylistPageStore.on('playlist_removal_failed', playlistRemovalFailed);
return () => {
PlaylistPageStore.removeListener('playlist_update_completed', playlistUpdateCompleted);
PlaylistPageStore.removeListener('playlist_update_failed', playlistUpdateFailed);
PlaylistPageStore.removeListener('playlist_removal_completed', playlistRemovalCompleted);
PlaylistPageStore.removeListener('playlist_removal_failed', playlistRemovalFailed);
};
}, []);
return (
);
}
function PlaylistActions(props) {
return props.loggedinUserPlaylist ? (
{props.loggedinUserPlaylist ?
: null}
) : null;
}
function PlaylistAuthor(props) {
return (
{props.loggedinUserPlaylist ?
: null}
);
}
export class PlaylistPage extends Page {
constructor(props) {
super(props, 'playlist-page');
this.state = {
thumb: PlaylistPageStore.get('thumb'),
media: PlaylistPageStore.get('playlist-media'),
savedPlaylist: PlaylistPageStore.get('saved-playlist'),
loggedinUserPlaylist: PlaylistPageStore.get('logged-in-user-playlist'),
title: PlaylistPageStore.get('title'),
description: PlaylistPageStore.get('description'),
};
this.onLoadPlaylistData = this.onLoadPlaylistData.bind(this);
PlaylistPageStore.on('loaded_playlist_data', this.onLoadPlaylistData);
/*this.onPlaylistSaveUpdate = this.onPlaylistSaveUpdate.bind(this);
PlaylistPageStore.on('saved-updated', this.onPlaylistSaveUpdate);*/
this.onMediaRemovedFromPlaylist = this.onMediaRemovedFromPlaylist.bind(this);
PlaylistPageStore.on('removed_media_from_playlist', this.onMediaRemovedFromPlaylist);
this.onMediaReorderedInPlaylist = this.onMediaReorderedInPlaylist.bind(this);
PlaylistPageStore.on('reordered_media_in_playlist', this.onMediaReorderedInPlaylist);
this.onCompletePlaylistUpdate = this.onCompletePlaylistUpdate.bind(this);
PlaylistPageStore.on('playlist_update_completed', this.onCompletePlaylistUpdate);
}
onCompletePlaylistUpdate() {
this.setState({
thumb: PlaylistPageStore.get('thumb'),
title: PlaylistPageStore.get('title'),
description: PlaylistPageStore.get('description'),
});
}
onLoadPlaylistData() {
this.setState({
thumb: PlaylistPageStore.get('thumb'),
title: PlaylistPageStore.get('title'),
description: PlaylistPageStore.get('description'),
media: PlaylistPageStore.get('playlist-media'),
savedPlaylist: PlaylistPageStore.get('saved-playlist'),
loggedinUserPlaylist: PlaylistPageStore.get('logged-in-user-playlist'),
});
}
componentDidMount() {
PlaylistPageActions.loadPlaylistData();
}
/*onPlaylistSaveUpdate(){
this.setState({
savedPlaylist: PlaylistPageStore.get('saved-playlist'),
}, () => {
if( this.state.savedPlaylist ){
PageActions.addNotification('Added to playlists library', 'added-to-playlists-lib');
}
else{
PageActions.addNotification('Removed from playlists library', 'removed-from-playlists-lib');
}
});
}*/
onMediaRemovedFromPlaylist() {
this.setState({
media: PlaylistPageStore.get('playlist-media'),
thumb: PlaylistPageStore.get('thumb'),
});
}
onMediaReorderedInPlaylist() {
this.setState({
media: PlaylistPageStore.get('playlist-media'),
thumb: PlaylistPageStore.get('thumb'),
});
}
pageContent() {
const playlistId = PlaylistPageStore.get('playlistId');
if (!playlistId) {
return null;
}
return [
{/*'public' === PlaylistPageStore.get('visibility') ? null :
{ PlaylistPageStore.get('visibility-icon') }
{ PlaylistPageStore.get('visibility') }
*/}
{this.state.description ?
{this.state.description}
: null}
,
,
];
}
}