import React from 'react';
import EventEmitter from 'events';
import { publishedOnDate, exportStore, getRequest, postRequest, deleteRequest, csrfToken } from '../helpers';
import { config as mediacmsConfig } from '../settings/config.js';
const PlaylistPageStoreData = {};
class PlaylistPageStore extends EventEmitter {
constructor() {
super();
this.mediacms_config = mediacmsConfig(window.MediaCMS);
PlaylistPageStoreData[
Object.defineProperty(this, 'id', {
value: 'PlaylistPageStoreData_' + Object.keys(PlaylistPageStoreData).length,
}).id
] = {
playlistId: null,
data: {},
};
this.data = {
savedPlaylist: false,
publishDate: new Date(2018, 3, 14, 1, 13, 22, 0),
publishDateLabel: null,
};
this.onPlaylistUpdateCompleted = this.onPlaylistUpdateCompleted.bind(this);
this.onPlaylistUpdateFailed = this.onPlaylistUpdateFailed.bind(this);
this.onPlaylistRemovalCompleted = this.onPlaylistRemovalCompleted.bind(this);
this.onPlaylistRemovalFailed = this.onPlaylistRemovalFailed.bind(this);
}
loadData() {
if (!PlaylistPageStoreData[this.id].playlistId) {
console.warn('Invalid playlist id:', PlaylistPageStoreData[this.id].playlistId);
return false;
}
this.playlistAPIUrl = this.mediacms_config.api.playlists + '/' + PlaylistPageStoreData[this.id].playlistId;
this.dataResponse = this.dataResponse.bind(this);
this.dataErrorResponse = this.dataErrorResponse.bind(this);
getRequest(this.playlistAPIUrl, !1, this.dataResponse, this.dataErrorResponse);
}
dataResponse(response) {
if (response && response.data) {
PlaylistPageStoreData[this.id].data = response.data;
this.emit('loaded_playlist_data');
}
}
dataErrorResponse(response) {
this.emit('loaded_playlist_error');
if (void 0 !== response.type) {
/*switch( response.type ){
case "network":
case "private":
case "unavailable":
MediaPageStoreData[this.id].loadErrorType = response.type;
MediaPageStoreData[this.id].loadErrorMessage = void 0 !== response.message ? response.message : "Αn error occurred while loading the media's data";
this.emit('loaded_media_error');
break;
}*/
}
}
get(type) {
switch (type) {
case 'playlistId':
return PlaylistPageStoreData[this.id].playlistId || null;
break;
case 'logged-in-user-playlist':
return (
!this.mediacms_config.member.is.anonymous &&
PlaylistPageStoreData[this.id].data.user === this.mediacms_config.member.username
);
case 'playlist-media':
return PlaylistPageStoreData[this.id].data.playlist_media || [];
case 'visibility':
return 'public';
case 'visibility-icon':
switch (this.get('visibility')) {
case 'unlisted':
return insert_link;
case 'private':
return lock;
}
return null;
case 'total-items':
return PlaylistPageStoreData[this.id].data.playlist_media.length || 0;
case 'views-count':
return 'N/A';
case 'title':
return PlaylistPageStoreData[this.id].data.title || null;
case 'edit-link':
return '#';
case 'thumb':
if (
PlaylistPageStoreData[this.id].data.playlist_media &&
PlaylistPageStoreData[this.id].data.playlist_media.length
) {
return PlaylistPageStoreData[this.id].data.playlist_media[0].thumbnail_url;
}
return null;
case 'description':
return PlaylistPageStoreData[this.id].data.description || null;
case 'author-username':
return PlaylistPageStoreData[this.id].data.user || null; // TODO: Recheck this, is this same with 'author-name'?
case 'author-name':
return PlaylistPageStoreData[this.id].data.user || null;
case 'author-link':
return PlaylistPageStoreData[this.id].data.user
? this.mediacms_config.site.url + '/user/' + PlaylistPageStoreData[this.id].data.user
: null;
case 'author-thumb':
if (!PlaylistPageStoreData[this.id].data.user_thumbnail_url) {
return null;
}
return (
this.mediacms_config.site.url +
'/' +
PlaylistPageStoreData[this.id].data.user_thumbnail_url.replace(/^\//g, '')
);
case 'saved-playlist':
return this.data.savedPlaylist;
case 'date-label':
if (!PlaylistPageStoreData[this.id].data || !PlaylistPageStoreData[this.id].data.add_date) {
return null;
}
this.data.publishDateLabel =
this.data.publishDateLabel ||
'Created on ' + publishedOnDate(new Date(PlaylistPageStoreData[this.id].data.add_date), 3);
return this.data.publishDateLabel;
}
return null;
}
onPlaylistUpdateCompleted(response) {
if (response && response.data) {
PlaylistPageStoreData[this.id].data.title = response.data.title;
PlaylistPageStoreData[this.id].data.description = response.data.description;
this.emit('playlist_update_completed', response.data);
}
}
onPlaylistUpdateFailed() {
this.emit('playlist_update_failed');
}
onPlaylistRemovalCompleted(response) {
if (response && void 0 !== response.status && 403 !== response.status) {
this.emit('playlist_removal_completed', response);
} else {
this.onPlaylistRemovalFailed();
}
}
onPlaylistRemovalFailed() {
this.emit('playlist_removal_failed');
}
actions_handler(action) {
switch (action.type) {
case 'LOAD_PLAYLIST_DATA':
PlaylistPageStoreData[this.id].playlistId =
window.MediaCMS.playlistId ||
(function (url) {
var arr = url.split('/');
return arr.length ? arr[arr.length - 1] : null;
})(window.location.href);
this.loadData();
break;
case 'TOGGLE_SAVE':
this.data.savedPlaylist = !this.data.savedPlaylist;
this.emit('saved-updated');
break;
case 'UPDATE_PLAYLIST':
postRequest(
this.playlistAPIUrl,
{
title: action.playlist_data.title,
description: action.playlist_data.description,
},
{
headers: {
'X-CSRFToken': csrfToken(),
},
},
false,
this.onPlaylistUpdateCompleted,
this.onPlaylistUpdateFailed
);
break;
case 'REMOVE_PLAYLIST':
deleteRequest(
this.playlistAPIUrl,
{
headers: {
'X-CSRFToken': csrfToken(),
},
},
false,
this.onPlaylistRemovalCompleted,
this.onPlaylistRemovalFailed
);
break;
case 'PLAYLIST_MEDIA_REORDERED':
PlaylistPageStoreData[this.id].data.playlist_media = action.playlist_media;
this.emit('reordered_media_in_playlist');
break;
case 'MEDIA_REMOVED_FROM_PLAYLIST':
const new_playlist_media = [];
let i = 0;
while (i < PlaylistPageStoreData[this.id].data.playlist_media.length) {
if (action.media_id !== PlaylistPageStoreData[this.id].data.playlist_media[i].url.split('=')[1]) {
new_playlist_media.push(PlaylistPageStoreData[this.id].data.playlist_media[i]);
}
i += 1;
}
PlaylistPageStoreData[this.id].data.playlist_media = new_playlist_media;
this.emit('removed_media_from_playlist');
break;
}
}
}
export default exportStore(new PlaylistPageStore(), 'actions_handler');