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