11import sha256 from 'crypto-js/sha256' ;
22import Base64 from 'crypto-js/enc-base64' ;
3+ import PullStrategy from '../data-sync/pull-strategy' ;
4+ import {
5+ screenForPlaylistPreview ,
6+ screenForSlidePreview ,
7+ } from '../util/preview' ;
38import logger from '../logger/logger' ;
49import DataSync from '../data-sync/data-sync' ;
510import ScheduleService from './schedule-service' ;
@@ -81,14 +86,17 @@ class ContentService {
8186
8287 this . stopSyncHandler ( ) ;
8388
89+ logger . log (
90+ 'info' ,
91+ `Event received: Start data synchronization from ${ data ?. screenPath } `
92+ ) ;
8493 if ( data ?. screenPath ) {
8594 logger . info (
8695 `Event received: Start data synchronization from ${ data . screenPath } `
8796 ) ;
8897 this . startSyncing ( data . screenPath ) ;
8998 } else {
90- logger . info ( 'Event received: Start data synchronization' ) ;
91- this . startSyncing ( ) ;
99+ logger . log ( 'error' , 'Error: screenPath not set.' ) ;
92100 }
93101 }
94102
@@ -176,6 +184,7 @@ class ContentService {
176184 document . addEventListener ( 'content' , this . contentHandler ) ;
177185 document . addEventListener ( 'regionReady' , this . regionReadyHandler ) ;
178186 document . addEventListener ( 'regionRemoved' , this . regionRemovedHandler ) ;
187+ document . addEventListener ( 'startPreview' , this . startPreview ) ;
179188 }
180189
181190 /**
@@ -189,6 +198,93 @@ class ContentService {
189198 document . removeEventListener ( 'content' , this . contentHandler ) ;
190199 document . removeEventListener ( 'regionReady' , this . regionReadyHandler ) ;
191200 document . removeEventListener ( 'regionRemoved' , this . regionRemovedHandler ) ;
201+ document . removeEventListener ( 'startPreview' , this . startPreview ) ;
202+ }
203+
204+ /**
205+ * Start preview.
206+ *
207+ * @param {CustomEvent } event The event.
208+ */
209+ async startPreview ( event ) {
210+ const data = event . detail ;
211+ const { mode, id } = data ;
212+ logger . log ( 'info' , `Starting preview. Mode: ${ mode } , ID: ${ id } ` ) ;
213+
214+ const config = await ConfigLoader . loadConfig ( ) ;
215+
216+ if ( mode === 'screen' ) {
217+ this . startSyncing ( `/v2/screen/${ id } ` ) ;
218+ } else if ( mode === 'playlist' ) {
219+ const pullStrategy = new PullStrategy ( {
220+ endpoint : config . apiEndpoint ,
221+ } ) ;
222+
223+ const playlist = await pullStrategy . getPath ( `/v2/playlists/${ id } ` ) ;
224+
225+ const playlistSlidesResponse = await pullStrategy . getPath (
226+ playlist . slides
227+ ) ;
228+
229+ playlist . slidesData = playlistSlidesResponse [ 'hydra:member' ] . map (
230+ ( playlistSlide ) => playlistSlide . slide
231+ ) ;
232+
233+ // eslint-disable-next-line no-restricted-syntax
234+ for ( const slide of playlist . slidesData ) {
235+ // eslint-disable-next-line no-await-in-loop
236+ await ContentService . attachReferencesToSlide ( pullStrategy , slide ) ;
237+ }
238+
239+ const screen = screenForPlaylistPreview ( playlist ) ;
240+
241+ document . dispatchEvent (
242+ new CustomEvent ( 'content' , {
243+ detail : {
244+ screen,
245+ } ,
246+ } )
247+ ) ;
248+ } else if ( mode === 'slide' ) {
249+ const pullStrategy = new PullStrategy ( {
250+ endpoint : config . apiEndpoint ,
251+ } ) ;
252+
253+ const slide = await pullStrategy . getPath ( `/v2/slides/${ id } ` ) ;
254+
255+ // eslint-disable-next-line no-await-in-loop
256+ await ContentService . attachReferencesToSlide ( pullStrategy , slide ) ;
257+
258+ const screen = screenForSlidePreview ( slide ) ;
259+
260+ document . dispatchEvent (
261+ new CustomEvent ( 'content' , {
262+ detail : {
263+ screen,
264+ } ,
265+ } )
266+ ) ;
267+ } else {
268+ logger . error ( `Unsupported preview mode: ${ mode } .` ) ;
269+ }
270+ }
271+
272+ static async attachReferencesToSlide ( strategy , slide ) {
273+ /* eslint-disable no-param-reassign */
274+ slide . templateData = await strategy . getTemplateData ( slide ) ;
275+ slide . feedData = await strategy . getFeedData ( slide ) ;
276+
277+ slide . mediaData = { } ;
278+ // eslint-disable-next-line no-restricted-syntax
279+ for ( const media of slide . media ) {
280+ // eslint-disable-next-line no-await-in-loop
281+ slide . mediaData [ media ] = await strategy . getMediaData ( media ) ;
282+ }
283+
284+ if ( typeof slide . theme === 'string' || slide . theme instanceof String ) {
285+ slide . theme = await strategy . getPath ( slide . theme ) ;
286+ }
287+ /* eslint-enable no-param-reassign */
192288 }
193289
194290 /**
0 commit comments