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 (
EDIT
Edit playlist
); } function PlaylistActions(props) { return props.loggedinUserPlaylist ? (
{props.loggedinUserPlaylist ? : null}
) : null; } function PlaylistAuthor(props) { return (
{props.thumb ? ( ) : ( )}
{props.name}
{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}
, , ]; } }