| Current Path : /var/www/homesaver/www/bitrix/js/ui/vue3/components/socialvideo/dist/ |
| Current File : /var/www/homesaver/www/bitrix/js/ui/vue3/components/socialvideo/dist/socialvideo.bundle.js |
/* eslint-disable */
this.BX = this.BX || {};
this.BX.Vue3 = this.BX.Vue3 || {};
(function (exports,ui_fonts_opensans,main_polyfill_intersectionobserver,ui_vue3_directives_lazyload,main_core_events) {
'use strict';
/**
* Bitrix UI
* Social Video Vue component
*
* @package bitrix
* @subpackage ui
* @copyright 2001-2021 Bitrix
*/
const State = Object.freeze({
play: 'play',
pause: 'pause',
stop: 'stop',
none: 'none'
});
// @vue/component
const SocialVideo = {
name: 'SocialVideo',
directives: {
lazyload: ui_vue3_directives_lazyload.lazyload
},
props: {
id: {
type: [String, Number],
default: 0
},
src: {
type: String,
default: ''
},
preview: {
type: String,
default: ''
},
autoplay: {
type: Boolean,
default: true
},
containerClass: {
type: String,
default: null
},
containerStyle: {
type: Object,
default: null
},
elementStyle: {
type: Object,
default: null
},
showControls: {
type: Boolean,
default: true
},
playCallback: {
type: [Function, null],
default: null
}
},
data() {
return {
preload: 'none',
previewLoaded: false,
loaded: false,
loading: false,
playAfterLoad: false,
enterFullscreen: false,
playBeforeMute: 2,
state: State.none,
progress: 0,
timeCurrent: 0,
timeTotal: 0,
muteFlag: true
};
},
computed: {
State: () => State,
autoPlayDisabled() {
return !this.autoplay && this.state === State.none;
},
showStartButton() {
return this.autoPlayDisabled && this.previewLoaded;
},
showInterface() {
return this.previewLoaded && !this.showStartButton;
},
labelTime() {
if (!this.loaded && !this.timeTotal) {
return '--:--';
}
let time = 0;
if (this.state === State.play) {
time = this.timeTotal - this.timeCurrent;
} else {
time = this.timeTotal;
}
return this.formatTime(time);
},
isMobile() {
const UA = navigator.userAgent.toLowerCase();
return UA.includes('android') || UA.includes('iphone') || UA.includes('ipad') || UA.includes('bitrixmobile');
},
source() {
return this.$refs.source;
}
},
created() {
if (!this.preview) {
this.previewLoaded = true;
this.preload = 'metadata';
}
main_core_events.EventEmitter.subscribe('ui:socialvideo:play', this.onPlay);
main_core_events.EventEmitter.subscribe('ui:socialvideo:stop', this.onStop);
main_core_events.EventEmitter.subscribe('ui:socialvideo:pause', this.onPause);
},
mounted() {
this.getObserver().observe(this.$refs.body);
},
beforeUnmount() {
main_core_events.EventEmitter.unsubscribe('ui:socialvideo:play', this.onPlay);
main_core_events.EventEmitter.unsubscribe('ui:socialvideo:stop', this.onStop);
main_core_events.EventEmitter.unsubscribe('ui:socialvideo:pause', this.onPause);
this.getObserver().unobserve(this.$refs.body);
},
methods: {
loadFile(play = false) {
if (this.loaded) {
return true;
}
if (this.loading) {
return true;
}
this.preload = 'auto';
this.loading = true;
this.playAfterLoad = play;
return true;
},
clickToButton(event) {
if (!this.src) {
return;
}
if (this.state === State.play) {
this.getObserver().unobserve(this.$refs.body);
this.pause();
} else {
this.play();
}
event.stopPropagation();
},
clickToMute() {
if (!this.src) {
return;
}
if (this.muteFlag) {
this.unmute();
} else {
this.mute();
}
},
click(event) {
if (this.autoPlayDisabled) {
this.play();
event.stopPropagation();
return;
}
if (this.isMobile) {
if (this.source.webkitEnterFullscreen) {
this.unmute();
this.enterFullscreen = true;
this.source.webkitEnterFullscreen();
} else if (this.source.requestFullscreen) {
this.unmute();
this.enterFullscreen = true;
this.source.requestFullscreen();
} else {
this.$emit('click', event);
}
} else {
this.$emit('click', event);
}
event.stopPropagation();
},
play(event) {
if (this.playCallback) {
this.playCallback();
return;
}
if (!this.loaded) {
this.loadFile(true);
return;
}
if (!this.source) {
return;
}
this.source.play();
},
pause() {
if (!this.source) {
return;
}
this.playAfterLoad = false;
this.source.pause();
},
stop() {
if (!this.source) {
return;
}
this.state = State.stop;
this.source.pause();
},
mute() {
if (!this.source) {
return;
}
this.muteFlag = true;
this.playBeforeMute = 2;
this.source.muted = true;
},
unmute() {
if (!this.source) {
return;
}
this.muteFlag = false;
this.source.muted = false;
},
setProgress(percent) {
this.progress = percent;
},
formatTime(second) {
second = Math.floor(second);
const hour = Math.floor(second / 60 / 60);
if (hour > 0) {
second -= hour * 60 * 60;
}
const minute = Math.floor(second / 60);
if (minute > 0) {
second -= minute * 60;
}
return (hour > 0 ? hour + ':' : '') + (hour > 0 ? minute.toString().padStart(2, "0") + ':' : minute + ':') + second.toString().padStart(2, "0");
},
onPlay(event) {
const data = event.getData();
if (data.id !== this.id) {
return false;
}
if (data.start) {
this.stop();
}
this.play();
},
onStop(event) {
const data = event.getData();
if (data.initiator === this.id) {
return false;
}
this.stop();
},
onPause(event) {
const data = event.getData();
if (data.initiator === this.id) {
return false;
}
this.pause();
},
videoEventRouter(eventName, event) {
if (eventName === 'durationchange' || eventName === 'loadeddata') {
if (!this.source) {
return false;
}
this.timeTotal = this.source.duration;
} else if (eventName === 'loadedmetadata') {
if (!this.source) {
return false;
}
this.timeTotal = this.source.duration;
this.loaded = true;
if (this.playAfterLoad) {
this.play();
}
} else if (eventName === 'abort' || eventName === 'error') {
console.error('BxSocialVideo: load failed', this.id, event);
this.loading = false;
this.state = State.none;
this.timeTotal = 0;
this.preload = 'none';
} else if (eventName === 'canplaythrough') {
this.loading = false;
this.loaded = true;
if (this.playAfterLoad) {
this.play();
}
} else if (eventName === 'volumechange') {
if (!this.source) {
return false;
}
if (this.source.muted) {
this.mute();
} else {
this.unmute();
}
} else if (eventName === 'timeupdate') {
if (!this.source) {
return false;
}
this.timeCurrent = this.source.currentTime;
if (!this.muteFlag && !this.enterFullscreen && this.timeCurrent === 0) {
if (this.playBeforeMute <= 0) {
this.mute();
}
this.playBeforeMute -= 1;
}
this.setProgress(Math.round(100 / this.timeTotal * this.timeCurrent));
} else if (eventName === 'pause') {
if (this.state !== State.stop) {
this.state = State.pause;
}
if (this.enterFullscreen) {
this.enterFullscreen = false;
this.mute();
this.play();
}
} else if (eventName === 'play') {
this.state = State.play;
if (this.state === State.stop) {
this.progress = 0;
this.timeCurrent = 0;
}
if (this.enterFullscreen) {
this.enterFullscreen = false;
}
}
},
getObserver() {
if (this.observer) {
return this.observer;
}
this.observer = new IntersectionObserver((entries, observer) => {
if (this.autoPlayDisabled) {
return;
}
entries.forEach(entry => {
if (entry.isIntersecting) {
this.play();
} else {
this.pause();
}
});
}, {
threshold: [0, 1]
});
return this.observer;
},
lazyLoadCallback(element) {
this.previewLoaded = element.state === 'success';
}
},
template: `
<div :class="['ui-vue-socialvideo', containerClass, {
'ui-vue-socialvideo-mobile': isMobile,
}]" :style="containerStyle" @click="click">
<transition name="ui-vue-socialvideo-animation-fade">
<div v-if="showStartButton && showControls" class="ui-vue-socialvideo-button-start">
<span class="ui-vue-socialvideo-button-start-icon"></span>
</div>
</transition>
<transition name="ui-vue-socialvideo-animation-fade">
<div v-if="showInterface && showControls" class="ui-vue-socialvideo-overlay-container">
<div class="ui-vue-socialvideo-controls-container" @click="clickToButton">
<button :class="['ui-vue-socialvideo-control', {
'ui-vue-socialvideo-control-loader': loading,
'ui-vue-socialvideo-control-play': !loading && state !== State.play,
'ui-vue-socialvideo-control-pause': !loading && state === State.play,
}]"></button>
</div>
<div class="ui-vue-socialvideo-info-container" @click="clickToMute">
<span class="ui-vue-socialvideo-time-current">{{labelTime}}</span>
<span :class="['ui-vue-socialvideo-sound', {
'ui-vue-socialvideo-sound-on': state !== State.none && !muteFlag,
'ui-vue-socialvideo-sound-off': state !== State.none && muteFlag
}]"></span>
</div>
</div>
</transition>
<div v-if="!preview" class="ui-vue-socialvideo-background" :style="{position: (src? 'absolute': 'relative')}"></div>
<div class="ui-vue-socialvideo-container" ref="body">
<img
v-lazyload="{callback: lazyLoadCallback}"
data-lazyload-dont-hide
v-if="preview"
class="ui-vue-socialvideo-image-source"
:data-lazyload-src="preview"
:style="{position: (src? 'absolute': 'relative'), ...elementStyle}"
/>
<video
v-if="src" :src="src"
class="ui-vue-socialvideo-source"
ref="source"
:preload="preload"
playsinline
loop
muted
:style="{opacity: (loaded? 1: 0), ...elementStyle}"
@abort="videoEventRouter('abort', $event)"
@error="videoEventRouter('error', $event)"
@suspend="videoEventRouter('suspend', $event)"
@canplay="videoEventRouter('canplay', $event)"
@canplaythrough="videoEventRouter('canplaythrough', $event)"
@durationchange="videoEventRouter('durationchange', $event)"
@loadeddata="videoEventRouter('loadeddata', $event)"
@loadedmetadata="videoEventRouter('loadedmetadata', $event)"
@volumechange="videoEventRouter('volumechange', $event)"
@timeupdate="videoEventRouter('timeupdate', $event)"
@play="videoEventRouter('play', $event)"
@playing="videoEventRouter('playing', $event)"
@pause="videoEventRouter('pause', $event)"
></video>
</div>
</div>
`
};
exports.SocialVideoState = State;
exports.SocialVideo = SocialVideo;
}((this.BX.Vue3.Components = this.BX.Vue3.Components || {}),BX,BX,BX.Vue3.Directives,BX.Event));
//# sourceMappingURL=socialvideo.bundle.js.map