diff --git a/css/_animations.scss b/css/_animations.scss index 1fcb06757e..c01676b69c 100644 --- a/css/_animations.scss +++ b/css/_animations.scss @@ -3,7 +3,7 @@ **/ /** - * START of slide in animation for extended toolbar. + * Slide in animation for extended toolbar. */ @include keyframes(slideInX) { 0% { transform: translateX(-100%); } @@ -26,12 +26,9 @@ } /** - * END of slide out animation for extended toolbar. + * Slide in / out animation for main toolbar. */ -/** - * START of slide in / out animation for main toolbar. - */ @include keyframes(slideInY) { 100% { transform: translateY(0%); } } @@ -42,11 +39,7 @@ } /** - * END of slide in / out animation for main toolbar. - */ - -/** - * START of slide in animation for extended toolbar (inner) panel. + * Slide in animation for extended toolbar (inner) panel. */ // FIX: Can't use percentage because of breaking animation when width is changed @@ -62,11 +55,7 @@ } /** - * END of slide in animation for extended toolbar (inner) panel. - */ - -/** -* START of slide in animation for extended toolbar container +* Slide in animation for extended toolbar container **/ @include keyframes(slideOutExtContainer) { @@ -80,5 +69,15 @@ } /** -* END of slide in animation for extended toolbar container -**/ \ No newline at end of file +* Fade in / out animations +**/ + +@include keyframes(fadeIn) { + from { opacity: 0; } + to { opacity: 1; } +} + +@include keyframes(fadeOut) { + from { opacity: 1; } + to { opacity: 0; } +} \ No newline at end of file diff --git a/css/_toolbars.scss b/css/_toolbars.scss index 22ac3f0499..81c4d69c8c 100644 --- a/css/_toolbars.scss +++ b/css/_toolbars.scss @@ -16,8 +16,7 @@ z-index: $toolbarZ; pointer-events: none; min-height: 100px; - transform: translateY(-100%); - -webkit-transform: translateY(-100%); + opacity: 0; } #subject { @@ -273,5 +272,13 @@ a.button>#avatar { } /** - * END of slide in animation for extended toolbar panel. + * START of fade in animation for main toolbar */ + +.fadeIn { + @include animation('fadeIn .3s forwards'); +} + +.fadeOut { + @include animation('fadeOut .3s forwards'); +} \ No newline at end of file diff --git a/modules/UI/UI.js b/modules/UI/UI.js index 64690b4116..3a8bfe01a5 100644 --- a/modules/UI/UI.js +++ b/modules/UI/UI.js @@ -22,6 +22,7 @@ import Profile from "./side_pannels/profile/Profile"; import Settings from "./../settings/Settings"; import RingOverlay from "./ring_overlay/RingOverlay"; import UIErrors from './UIErrors'; +import { debounce } from "../util/helpers"; var EventEmitter = require("events"); UI.messageHandler = require("./util/MessageHandler"); @@ -438,9 +439,10 @@ UI.start = function () { bindEvents(); sharedVideoManager = new SharedVideoManager(eventEmitter); if (!interfaceConfig.filmStripOnly) { - $("#videoconference_page").mousemove(function () { - return UI.showToolbar(); - }); + let debouncedShowToolbar = debounce(() => { + UI.showToolbar(); + }, 100, { leading: true, trailing: false }); + $("#videoconference_page").mousemove(debouncedShowToolbar); setupToolbars(); setupChat(); @@ -1046,7 +1048,7 @@ UI.updateDTMFSupport = function (isDTMFSupported) { * @returns {Promise} Resolved with value - false if the dialog is enabled and * resolved with true if the dialog is disabled or the feedback was already * submitted. Rejected if another dialog is already displayed. This values are - * used to display or not display the thank you dialog from + * used to display or not display the thank you dialog from * conference.maybeRedirectToWelcomePage method. */ UI.requestFeedbackOnHangup = function () { diff --git a/modules/UI/toolbars/Toolbar.js b/modules/UI/toolbars/Toolbar.js index 01c02b31fb..dd3c809e88 100644 --- a/modules/UI/toolbars/Toolbar.js +++ b/modules/UI/toolbars/Toolbar.js @@ -610,7 +610,7 @@ Toolbar = { * @return true if currently visible, false - otherwise */ isVisible() { - return this.toolbarSelector.hasClass("slideInY"); + return this.toolbarSelector.hasClass("fadeIn"); }, /** @@ -618,7 +618,9 @@ Toolbar = { * parameter. */ hide() { - this.toolbarSelector.toggleClass("slideInY").toggleClass("slideOutY"); + this.toolbarSelector + .removeClass("fadeIn") + .addClass("fadeOut"); let slideInAnimation = (SideContainerToggler.isVisible) ? "slideInExtX" @@ -636,8 +638,9 @@ Toolbar = { * parameter. */ show() { - if (this.toolbarSelector.hasClass("slideOutY")) - this.toolbarSelector.toggleClass("slideOutY"); + if (this.toolbarSelector.hasClass("fadeOut")) { + this.toolbarSelector.removeClass("fadeOut"); + } let slideInAnimation = (SideContainerToggler.isVisible) ? "slideInExtX" @@ -646,10 +649,11 @@ Toolbar = { ? "slideOutExtX" : "slideOutX"; - if (this.extendedToolbarSelector.hasClass(slideOutAnimation)) + if (this.extendedToolbarSelector.hasClass(slideOutAnimation)) { this.extendedToolbarSelector.toggleClass(slideOutAnimation); + } - this.toolbarSelector.toggleClass("slideInY"); + this.toolbarSelector.addClass("fadeIn"); this.extendedToolbarSelector.toggleClass(slideInAnimation); }, diff --git a/modules/util/helpers.js b/modules/util/helpers.js index 6296b0973e..50f92e579d 100644 --- a/modules/util/helpers.js +++ b/modules/util/helpers.js @@ -40,3 +40,39 @@ export function reportError (e, msg = "") { window.onerror(msg, null, null, null, e); } + +/** + * Creates a debounced function that delays invoking func until after wait + * milliseconds have elapsed since the last time the debounced + * function was invoked + * @param fn + * @param wait + * @param options + * @returns {function(...[*])} + */ +export function debounce(fn, wait = 0, options = {}) { + let leading = options.leading || false; + let trailing = true; + let isCalled = false; + + if (typeof options.trailing !== 'undefined') { + trailing = options.trailing; + } + + return (...args) => { + if(!isCalled) { + if (leading) { + fn(...args); + } + + setTimeout(() => { + isCalled = false; + if (trailing) { + fn(...args); + } + }, wait); + + isCalled = true; + } + }; +}