1
1
import sha256 from 'crypto-js/sha256' ;
2
2
import Base64 from 'crypto-js/enc-base64' ;
3
+ import PullStrategy from '../data-sync/pull-strategy' ;
4
+ import {
5
+ screenForPlaylistPreview ,
6
+ screenForSlidePreview ,
7
+ } from '../util/preview' ;
3
8
import logger from '../logger/logger' ;
4
9
import DataSync from '../data-sync/data-sync' ;
5
10
import ScheduleService from './schedule-service' ;
@@ -81,14 +86,17 @@ class ContentService {
81
86
82
87
this . stopSyncHandler ( ) ;
83
88
89
+ logger . log (
90
+ 'info' ,
91
+ `Event received: Start data synchronization from ${ data ?. screenPath } `
92
+ ) ;
84
93
if ( data ?. screenPath ) {
85
94
logger . info (
86
95
`Event received: Start data synchronization from ${ data . screenPath } `
87
96
) ;
88
97
this . startSyncing ( data . screenPath ) ;
89
98
} else {
90
- logger . info ( 'Event received: Start data synchronization' ) ;
91
- this . startSyncing ( ) ;
99
+ logger . log ( 'error' , 'Error: screenPath not set.' ) ;
92
100
}
93
101
}
94
102
@@ -176,6 +184,7 @@ class ContentService {
176
184
document . addEventListener ( 'content' , this . contentHandler ) ;
177
185
document . addEventListener ( 'regionReady' , this . regionReadyHandler ) ;
178
186
document . addEventListener ( 'regionRemoved' , this . regionRemovedHandler ) ;
187
+ document . addEventListener ( 'startPreview' , this . startPreview ) ;
179
188
}
180
189
181
190
/**
@@ -189,6 +198,93 @@ class ContentService {
189
198
document . removeEventListener ( 'content' , this . contentHandler ) ;
190
199
document . removeEventListener ( 'regionReady' , this . regionReadyHandler ) ;
191
200
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 */
192
288
}
193
289
194
290
/**
0 commit comments