@@ -402,39 +402,68 @@ export class DeckdeckgoDeck {
402402 }
403403
404404 private afterSlidesDidLoad ( ) : Promise < void > {
405+ return new Promise < void > ( async ( resolve ) => {
406+ const slidesDefinition : DeckdeckgoSlideDefinition [ ] = await this . getSlidesDefinition ( ) ;
407+
408+ if ( slidesDefinition && slidesDefinition . length > 0 ) {
409+ this . slidesDidLoad . emit ( slidesDefinition ) ;
410+
411+ await this . onAllSlidesDidLoadLazyAndClone ( ) ;
412+ }
413+
414+ resolve ( ) ;
415+ } ) ;
416+ }
417+
418+ private onAllSlidesDidLoadLazyAndClone ( ) : Promise < void > {
405419 return new Promise < void > ( async ( resolve ) => {
406420 const filteredSlides : HTMLElement [ ] = await this . getDefinedFilteredSlides ( ) ;
407421
422+ const promises : Promise < void > [ ] = [ ] ;
423+ promises . push ( this . lazyLoadFirstSlides ( ) ) ;
424+ promises . push ( DeckdeckgoDeckBackgroundUtils . cloneSlots ( this . el , filteredSlides , 'actions' ) ) ;
425+ promises . push ( DeckdeckgoDeckBackgroundUtils . cloneAndLoadBackground ( this . el , filteredSlides , this . cloneBackground ) ) ;
426+
427+ await Promise . all ( promises ) ;
428+
429+ resolve ( ) ;
430+ } ) ;
431+ }
432+
433+ @Method ( )
434+ getSlidesDefinition ( ) : Promise < DeckdeckgoSlideDefinition [ ] > {
435+ return new Promise < DeckdeckgoSlideDefinition [ ] | null > ( async ( resolve ) => {
408436 const loadedSlides : NodeListOf < HTMLElement > = this . el . querySelectorAll ( '.deckgo-slide-container' ) ;
409437
438+ if ( ! loadedSlides || loadedSlides . length <= 0 ) {
439+ resolve ( null ) ;
440+ return ;
441+ }
442+
443+ const filteredSlides : HTMLElement [ ] = await this . getDefinedFilteredSlides ( ) ;
444+
410445 const definedSlidesLength : number = filteredSlides ? filteredSlides . length : 0 ;
411446
412447 // Are all slides loaded?
413- if ( filteredSlides && loadedSlides && loadedSlides . length === definedSlidesLength && definedSlidesLength === this . length ) {
414- const orderedSlidesTagNames : DeckdeckgoSlideDefinition [ ] = [ ] ;
415-
416- Array . from ( loadedSlides ) . forEach ( ( slide : HTMLElement ) => {
417- const notes : HTMLElement = slide . querySelector ( '[slot=\'notes\']' ) ;
418- const title : HTMLElement = slide . querySelector ( '[slot=\'title\']' ) ;
419-
420- orderedSlidesTagNames . push ( {
421- name : slide . tagName ,
422- title : title ? title . innerHTML : null ,
423- notes : notes ? notes . innerHTML : null
424- } ) ;
425- } ) ;
448+ if ( loadedSlides . length !== definedSlidesLength ) {
449+ resolve ( null ) ;
450+ return ;
451+ }
426452
427- this . slidesDidLoad . emit ( orderedSlidesTagNames ) ;
453+ const orderedSlidesTagNames : DeckdeckgoSlideDefinition [ ] = [ ] ;
428454
429- const promises : Promise < void > [ ] = [ ] ;
430- promises . push ( this . lazyLoadFirstSlides ( ) ) ;
431- promises . push ( DeckdeckgoDeckBackgroundUtils . cloneSlots ( this . el , filteredSlides , 'actions' ) ) ;
432- promises . push ( DeckdeckgoDeckBackgroundUtils . cloneAndLoadBackground ( this . el , filteredSlides , this . cloneBackground ) ) ;
455+ Array . from ( loadedSlides ) . forEach ( ( slide : HTMLElement ) => {
456+ const notes : HTMLElement = slide . querySelector ( '[slot=\'notes\']' ) ;
457+ const title : HTMLElement = slide . querySelector ( '[slot=\'title\']' ) ;
433458
434- await Promise . all ( promises ) ;
435- }
459+ orderedSlidesTagNames . push ( {
460+ name : slide . tagName ,
461+ title : title ? title . innerHTML : null ,
462+ notes : notes ? notes . innerHTML : null
463+ } ) ;
464+ } ) ;
436465
437- resolve ( ) ;
466+ resolve ( orderedSlidesTagNames ) ;
438467 } ) ;
439468 }
440469
0 commit comments