Advertisement
Konark

slider.js

Mar 16th, 2020
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const BaseFrontendHandler = require( 'cmsmasters-frontend/base-handler' );
  2. const Slider = require( 'cmsmasters-slider-module/frontend/slider' );
  3.  
  4. class SliderWidget extends BaseFrontendHandler {
  5.     getDefaultElements() {
  6.         const defaultElements = BaseFrontendHandler.prototype.getDefaultElements.apply( this, arguments ),
  7.             defaultSelectors = {
  8.                 $player: null,
  9.                 $sliderWidget: this.$element,
  10.                 $sliderSlide: this.findElement( '.swiper-slide' ),
  11.                 $swiperContainer: this.findElement( '.swiper-container' ),
  12.                 $backgroundVideoContainer: this.findElement( '.elementor-background-video-container' ),
  13.             };
  14.  
  15.         jQuery.each( defaultSelectors, ( key, value ) => {
  16.             defaultElements[ key ] = value;
  17.         } );
  18.  
  19.         return defaultElements;
  20.     }
  21.  
  22.     bindEvents() {
  23.         // this.bindElementChange( 'thumbnail_ratio', utils.debounce( this.slider.update ) );
  24.     }
  25.  
  26.     initElements() {
  27.         BaseFrontendHandler.prototype.initElements.apply( this, arguments );
  28.  
  29.         this.slider = new Slider( {
  30.             widget: this,
  31.         } );
  32.     }
  33.  
  34.     activateDefaultTab() {
  35.         if ( ! this.isEdit ) {
  36.             return;
  37.         }
  38.  
  39.         var activeSlide = this.getEditSettings( 'activeItemIndex' );
  40.         this.changeActiveSlide( activeSlide );
  41.     }
  42.  
  43.     activeSlide( slideIndex ) {
  44.         this.slider.swiper.slideTo( slideIndex, this.slider.swiper.params.speed );
  45.     }
  46.  
  47.     changeActiveSlide( slideIndex ) {
  48.         slideIndex = slideIndex - 1;
  49.         var isActiveSlide = this.isActiveSlide( slideIndex );
  50.  
  51.         if ( ! isActiveSlide ) {
  52.             this.activeSlide( slideIndex );
  53.         }
  54.     }
  55.  
  56.     isActiveSlide( slideIndex ) {
  57.         return this.elements.$sliderSlide.filter( '[data-swiper-slide-index="' + slideIndex + '"]' ).hasClass( 'swiper-slide-active' );
  58.     }
  59.  
  60.     onEditSettingsChange( propertyName ) {
  61.         if ( 'activeItemIndex' === propertyName ) {
  62.             this.activateDefaultTab();
  63.         }
  64.     }
  65.  
  66.     calcVideosSize( sliderID ) {
  67.         const containerWidth = this.elements.$swiperContainer.find( '.elementor-repeater-item-' + sliderID + ' .elementor-background-video-container' ).outerWidth(),
  68.             containerHeight = this.elements.$swiperContainer.find( '.elementor-repeater-item-' + sliderID + ' .elementor-background-video-container' ).outerHeight(),
  69.             aspectRatioSetting = '16:9',
  70.             aspectRatioArray = aspectRatioSetting.split( ':' ),
  71.             aspectRatio = aspectRatioArray[ 0 ] / aspectRatioArray[ 1 ],
  72.             ratioWidth = containerWidth / aspectRatio,
  73.             ratioHeight = containerHeight * aspectRatio,
  74.             isWidthFixed = containerWidth / containerHeight > aspectRatio;
  75.  
  76.         return {
  77.             width: isWidthFixed ? containerWidth : ratioHeight,
  78.             height: isWidthFixed ? ratioWidth : containerHeight,
  79.         };
  80.     }
  81.  
  82.     changeVideoSize( sliderID, type ) {
  83.         const size = this.calcVideosSize( sliderID );
  84.  
  85.         if ( 'hosted' !== type ) {
  86.             const $video = this.elements.$swiperContainer.find( '.elementor-repeater-item-' + sliderID + ' .elementor-video-iframe' );
  87.  
  88.             $video.width( size.width ).height( size.height );
  89.         } else {
  90.             const $video = this.elements.$swiperContainer.find( '.elementor-repeater-item-' + sliderID + ' .elementor-background-video-container' );
  91.  
  92.             $video.width( size.width ).height( size.height );
  93.         }
  94.     }
  95.  
  96.     videoBackground() {
  97.         var elementSettings = this.getElementSettings(),
  98.             self = this;
  99.  
  100.         elementSettings.slides.forEach( function( item ) {
  101.             var videoLink = item.slide_bg_video_link,
  102.                 videoID = self.getYoutubeIDFromURL( videoLink ),
  103.                 videoStart = item.slide_bg_video_start,
  104.                 videoEnd = item.slide_bg_video_end,
  105.                 sliderID = item._id,
  106.                 isVimeo = videoLink.indexOf( 'vimeo' ) + 1,
  107.                 isYouTube = videoLink.indexOf( 'youtube' ) + 1;
  108.            
  109.             if ( isYouTube ) {
  110.                 // elementorFrontend.utils.youtube.onApiReady( function( YT ) {
  111.                 //  setTimeout( function() {
  112.                 //      self.prepareYTVideo( YT, videoID, sliderID, videoStart, videoEnd );
  113.                 //  }, 1 );
  114.                 // } );
  115.                 self.elements.$swiperContainer.find( '.elementor-repeater-item-' + sliderID + ' .elementor-video-iframe' )
  116.                     .on( 'canplay', self.changeVideoSize( sliderID, 'youtube' ) );
  117.             } else if ( isVimeo ) {
  118.                 self.elements.$swiperContainer.find( '.elementor-repeater-item-' + sliderID + ' .elementor-video-iframe' )
  119.                     .on( 'canplay', self.changeVideoSize( sliderID, 'vimeo' ) );
  120.             } else {
  121.                 self.elements.$swiperContainer.find( '.elementor-repeater-item-' + sliderID + ' .elementor-background-video-hosted' )
  122.                     .attr( 'src', videoLink )
  123.                     .on( 'canplay', self.changeVideoSize( sliderID, 'hosted' ) );
  124.             }
  125.         } );
  126.  
  127.         // if ( 'video' === elementSettings.background_background && elementSettings.background_video_link ) {
  128.         //  this.activate();
  129.         // } else {
  130.         //  this.deactivate();
  131.         // }
  132.     }
  133.  
  134.     prepareYTVideo( YT, videoID, sliderID, videoStart, videoEnd ) {
  135.         var self = this,
  136.             player = this.elements.$player,
  137.             $embed = this.elements.$swiperContainer.find( '.elementor-repeater-item-' + sliderID + ' .elementor-background-video-embed' );
  138.  
  139.         var i = 0;
  140.         while ( i < $embed.length ) {
  141.             self.elements.$player = new YT.Player( this.elements.$swiperContainer.find( '.elementor-repeater-item-' + sliderID + ' .elementor-background-video-embed' )[ i ], {
  142.                 videoId: videoID,
  143.                 events: {
  144.                     'onReady': self.onPlayerReady,
  145.                 },
  146.                 playerVars: {
  147.                     controls: 0,
  148.                     rel: 0,
  149.                     autoplay: 1,
  150.                     loop: 1,
  151.                     start: videoStart,
  152.                     end: videoEnd,
  153.                 },
  154.             } );
  155.  
  156.             self.changeVideoSize( sliderID, 'youtube' );
  157.             i++;
  158.         }
  159.     }
  160.  
  161.     onPlayerReady( event ) {
  162.         event.target.mute();
  163.         event.target.playVideo();
  164.        
  165.     }
  166.  
  167.     startVideoLoop() {
  168.         var self = this;
  169.  
  170.         // If the section has been removed
  171.         if ( ! self.player.getIframe().contentWindow ) {
  172.             return;
  173.         }
  174.  
  175.         var elementSettings = self.getElementSettings(),
  176.             startPoint = elementSettings.background_video_start || 0,
  177.             endPoint = elementSettings.background_video_end;
  178.  
  179.         self.player.seekTo( startPoint );
  180.  
  181.         if ( endPoint ) {
  182.             var durationToEnd = endPoint - startPoint + 1;
  183.  
  184.             setTimeout( function() {
  185.                 self.startVideoLoop();
  186.             }, durationToEnd * 1000 );
  187.         }
  188.     }
  189.  
  190.     getYoutubeIDFromURL( url ) {
  191.         var videoIDParts = url.match( /^(?:https?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?vi?=|(?:embed|v|vi|user)\/))([^?&"'>]+)/ );
  192.  
  193.         return videoIDParts && videoIDParts[ 1 ];
  194.     }
  195.  
  196.     onEdit() {
  197.         if ( ! this.isEdit ) {
  198.             return;
  199.         }
  200.  
  201.         this.slider.swiper.autoplay.running = false;
  202.     }
  203.  
  204.     onInit() {
  205.         elementorModules.frontend.handlers.Base.prototype.onInit.apply( this, arguments );
  206.  
  207.         this.slider.init();
  208.         this.videoBackground();
  209.         this.onEdit();
  210.     }
  211.  
  212. }
  213.  
  214. module.exports = ( $element ) => {
  215.     elementorFrontend.elementsHandler.addHandler( SliderWidget, {
  216.         $element,
  217.     } );
  218. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement