11/* eslint n/no-unsupported-features/node-builtins: "off" */
22/* globals initPhotoSwipeFromDOM initRemoteBuzzerFromDOM processChromaImage remoteBuzzerClient rotaryController globalGalleryHandle photoboothTools photoboothPreview virtualKeyboard */
33
4+ /* global createScreensaver */
45const photoBooth = ( function ( ) {
56 const PhotoStyle = {
67 PHOTO : 'photo' ,
@@ -64,7 +65,7 @@ const photoBooth = (function () {
6465 config . preview . asBackground &&
6566 config . preview . mode === PreviewMode . DEVICE . valueOf ( ) &&
6667 ( ( config . commands . preview && ! config . preview . bsm ) || ! config . commands . preview ) ,
67- timeToLive = parseInt ( config . picture . time_to_live ) * 1000 ,
68+ timeToLive = parseInt ( config . picture . time_to_live , 10 ) * 1000 ,
6869 continuousCollageTime = config . collage . continuous_time * 1000 ,
6970 retryTimeout = config . picture . retry_timeout * 1000 ,
7071 notificationTimeout = config . ui . notification_timeout * 1000 ,
@@ -91,11 +92,7 @@ const photoBooth = (function () {
9192 command ,
9293 startTime ,
9394 endTime ,
94- totalTime ,
95- screensaverTimeout ,
96- screensaverSwitchTimeout ,
97- screensaverFlip = false ,
98- screensaverLastGallerySource = '' ;
95+ totalTime ;
9996
10097 const galleryFallbackSource = ( ) => config . screensaver . image_source || '' ;
10198
@@ -166,230 +163,24 @@ const photoBooth = (function () {
166163 api . screensaver . resetTimer ( ) ;
167164 } ;
168165
169- api . screensaver = {
170- resolveSource : function ( ) {
171- const base = environment . publicFolders . api ;
172- switch ( screensaverMode ) {
173- case 'video' :
174- return config . screensaver . video_source ;
175- case 'image' :
176- return config . screensaver . image_source ;
177- case 'folder' :
178- return base + '/randomImg.php?dir=' + encodeURIComponent ( 'screensavers' ) + '&t=' + Date . now ( ) ;
179- case 'gallery' :
180- return base + '/randomImg.php?dir=' + encodeURIComponent ( 'data/images' ) + '&t=' + Date . now ( ) ;
181- default :
182- return '' ;
183- }
184- } ,
185- hide : function ( ) {
186- if ( ! screensaverOverlay . length ) {
187- return ;
188- }
189- screensaverOverlay . removeClass ( 'screensaver-overlay--active' ) ;
190- screensaverOverlay . css ( 'display' , 'none' ) ;
191- startPage . removeClass ( 'stage--screensaver' ) ;
192- clearInterval ( screensaverSwitchTimeout ) ;
193-
194- if ( screensaverVideo . length ) {
195- const vid = screensaverVideo . get ( 0 ) ;
196- vid . pause ( ) ;
197- vid . currentTime = 0 ;
198- screensaverVideo . attr ( 'src' , '' ) ;
199- }
200- screensaverImage . hide ( ) . attr ( 'src' , '' ) ;
201- screensaverTextTop . text ( '' ) . hide ( ) ;
202- screensaverTextCenter . text ( '' ) . hide ( ) ;
203- screensaverTextBottom . text ( '' ) . hide ( ) ;
204- } ,
205- toggleGalleryText : function ( ) {
206- const screensaverText = config . screensaver . text ;
207- const eventText = [ config . event . textLeft , config . event . textRight ] . filter ( Boolean ) . join ( ' ' ) . trim ( ) ;
208- const showEvent = screensaverMode === 'gallery' ;
209- const hasScreensaver = ! ! screensaverText ;
210- const hasEvent = showEvent && ! ! eventText ;
211-
212- const position = config . screensaver . text_position || 'center' ;
213- const showTop = position === 'top-center' ;
214- const showCenter = position === 'center' ;
215- const showBottom = position === 'bottom-center' ;
216-
217- const resetSlots = ( ) => {
218- screensaverTextTop . removeClass ( 'screensaver-overlay__text--center' ) . hide ( ) . text ( '' ) ;
219- screensaverTextCenter . hide ( ) . text ( '' ) ;
220- screensaverTextBottom . hide ( ) . text ( '' ) ;
221- } ;
222-
223- const setSlot = ( text ) => {
224- resetSlots ( ) ;
225- if ( showCenter ) {
226- screensaverTextCenter . text ( text ) . show ( ) ;
227- return ;
228- }
229- if ( showTop ) {
230- screensaverTextTop . text ( text ) . show ( ) ;
231- }
232- if ( showBottom ) {
233- screensaverTextBottom . text ( text ) . show ( ) ;
234- }
235- } ;
236-
237- if ( hasScreensaver && hasEvent ) {
238- if ( screensaverFlip ) {
239- setSlot ( screensaverText ) ;
240- // place event in the opposite available slot
241- if ( showTop && showBottom ) {
242- screensaverTextBottom . text ( eventText ) . show ( ) ;
243- } else if ( showCenter ) {
244- screensaverTextBottom . text ( eventText ) . show ( ) ;
245- } else if ( showTop ) {
246- screensaverTextBottom . text ( eventText ) . show ( ) ;
247- } else {
248- screensaverTextTop . text ( eventText ) . show ( ) ;
249- }
250- } else {
251- setSlot ( eventText ) ;
252- if ( showTop && showBottom ) {
253- screensaverTextBottom . text ( screensaverText ) . show ( ) ;
254- } else if ( showCenter ) {
255- screensaverTextBottom . text ( screensaverText ) . show ( ) ;
256- } else if ( showTop ) {
257- screensaverTextBottom . text ( screensaverText ) . show ( ) ;
258- } else {
259- screensaverTextTop . text ( screensaverText ) . show ( ) ;
260- }
261- }
262- } else {
263- const singleText = hasScreensaver ? screensaverText : hasEvent ? eventText : '' ;
264- if ( singleText ) {
265- setSlot ( singleText ) ;
266- } else {
267- resetSlots ( ) ;
268- }
269- }
270-
271- screensaverFlip = ! screensaverFlip ;
272- } ,
273- stepScreensaver : function ( ) {
274- const mode = screensaverOverlay . data ( 'mode' ) || screensaverMode ;
275- photoboothTools . console . logDev ( 'Screensaver: step in mode \'' + mode + '\'' ) ;
276-
277- let nextSource = api . screensaver . resolveSource ( ) ;
278- if ( ! nextSource && mode === 'gallery' ) {
279- nextSource = galleryFallbackSource ( ) ;
280- }
281-
282- // Try to avoid immediate repeat
283- if ( mode === 'gallery' || mode === 'folder' ) {
284- let guard = 5 ;
285- while ( nextSource === screensaverLastGallerySource && guard > 0 ) {
286- nextSource = api . screensaver . resolveSource ( ) ;
287- guard -- ;
288- }
289- screensaverLastGallerySource = nextSource ;
290- }
291- photoboothTools . console . logDev ( 'Screensaver: next source \'' + nextSource + '\'' ) ;
292- if ( nextSource ) {
293- if ( mode === 'folder' ) {
294- screensaverOverlay . css ( 'background-image' , nextSource ? `url(${ urlSafe ( nextSource ) } )` : 'none' ) ;
295- } else if ( mode === 'gallery' ) {
296- screensaverImage
297- . one ( 'error' , function ( ) {
298- const fallback = galleryFallbackSource ( ) ;
299- if ( fallback && fallback !== nextSource ) {
300- screensaverLastGallerySource = fallback ;
301- $ ( this ) . attr ( 'src' , urlSafe ( fallback ) ) ;
302- }
303- } )
304- . attr ( 'src' , urlSafe ( nextSource ) )
305- . show ( ) ;
306- }
307- }
308- if ( mode === 'gallery' ) {
309- api . screensaver . toggleGalleryText ( ) ;
310- }
311- } ,
312- show : function ( ) {
313- if ( ! screensaverEnabled || ! screensaverOverlay . length ) {
314- return ;
315- }
316- const mode = screensaverMode ;
317- if ( ! startPage . hasClass ( 'stage--active' ) ) {
318- api . screensaver . resetTimer ( ) ;
319- return ;
320- }
321-
322- if ( mode === 'gallery' ) {
323- screensaverOverlay . addClass ( 'screensaver-overlay--gallery' ) ;
324- } else {
325- screensaverOverlay . removeClass ( 'screensaver-overlay--gallery' ) ;
326- }
327-
328- const source = api . screensaver . resolveSource ( ) ;
329- let finalSource = source ;
330- if ( ! source ) {
331- finalSource = galleryFallbackSource ( ) ;
332- }
333- if ( ! finalSource ) {
334- api . screensaver . resetTimer ( ) ;
335- return ;
336- }
337- if ( mode === 'gallery' ) {
338- screensaverLastGallerySource = finalSource ;
339- }
340-
341- if ( mode === 'video' ) {
342- screensaverOverlay . css ( 'background-image' , 'none' ) ;
343- screensaverVideo . attr ( 'src' , urlSafe ( finalSource ) ) ;
344- screensaverVideo . show ( ) ;
345- const vid = screensaverVideo . get ( 0 ) ;
346- vid . play ( ) . catch ( ( err ) => {
347- photoboothTools . console . logDev ( 'Idle video play failed: ' + err ) ;
348- } ) ;
349- screensaverImage . hide ( ) ;
350- api . screensaver . toggleGalleryText ( ) ;
351- } else if ( mode === 'gallery' ) {
352- screensaverVideo . hide ( ) ;
353- screensaverOverlay . css ( 'background-image' , 'none' ) ;
354- screensaverImage
355- . one ( 'error' , function ( ) {
356- const fallback = galleryFallbackSource ( ) ;
357- if ( fallback && fallback !== finalSource ) {
358- screensaverLastGallerySource = fallback ;
359- $ ( this ) . attr ( 'src' , urlSafe ( fallback ) ) ;
360- }
361- } )
362- . attr ( 'src' , urlSafe ( finalSource ) )
363- . show ( ) ;
364- api . screensaver . toggleGalleryText ( ) ;
365- } else {
366- screensaverVideo . hide ( ) ;
367- screensaverImage . hide ( ) ;
368- api . screensaver . toggleGalleryText ( ) ;
369- screensaverOverlay . css ( 'background-image' , finalSource ? `url(${ urlSafe ( finalSource ) } )` : 'none' ) ;
370- screensaverOverlay . css ( 'background-size' , 'cover' ) ;
371- }
372-
373- startPage . addClass ( 'stage--screensaver' ) ;
374- screensaverOverlay . addClass ( 'screensaver-overlay--active' ) ;
375- screensaverOverlay . css ( 'display' , 'flex' ) ;
376-
377- clearInterval ( screensaverSwitchTimeout ) ;
378- if ( ( mode === 'folder' || mode === 'gallery' ) && screensaverSwitchMs > 0 ) {
379- screensaverSwitchTimeout = setInterval ( function nextIdleFrame ( ) {
380- api . screensaver . stepScreensaver ( ) ;
381- } , screensaverSwitchMs ) ;
382- }
383- } ,
384- resetTimer : function ( ) {
385- if ( ! screensaverEnabled ) {
386- return ;
387- }
388- clearTimeout ( screensaverTimeout ) ;
389- api . screensaver . hide ( ) ;
390- screensaverTimeout = setTimeout ( api . screensaver . show , screensaverTimeoutMs ) ;
391- }
392- } ;
166+ api . screensaver = createScreensaver ( {
167+ config,
168+ environment,
169+ startPage,
170+ overlay : screensaverOverlay ,
171+ videoEl : screensaverVideo ,
172+ imageEl : screensaverImage ,
173+ textTop : screensaverTextTop ,
174+ textCenter : screensaverTextCenter ,
175+ textBottom : screensaverTextBottom ,
176+ screensaverEnabled,
177+ screensaverMode,
178+ screensaverTimeoutMs,
179+ screensaverSwitchMs,
180+ urlSafe,
181+ galleryFallbackSource,
182+ photoboothTools
183+ } ) ;
393184
394185 api . navbar = {
395186 open : function ( ) {
0 commit comments