diff --git a/ui/src/components/ajax-bar/QAjaxBar.js b/ui/src/components/ajax-bar/QAjaxBar.js index 4d82e82d32f..753eced2653 100644 --- a/ui/src/components/ajax-bar/QAjaxBar.js +++ b/ui/src/components/ajax-bar/QAjaxBar.js @@ -119,7 +119,7 @@ export default createComponent({ const onScreen = ref(false) const animate = ref(true) - let sessions = 0, timer, speed + let sessions = 0, timer = null, speed const classes = computed(() => `q-loading-bar q-loading-bar--${ props.position }` @@ -171,19 +171,21 @@ export default createComponent({ if (oldSpeed === 0 && newSpeed > 0) { planNextStep() } - else if (oldSpeed > 0 && newSpeed <= 0) { + else if (timer !== null && oldSpeed > 0 && newSpeed <= 0) { clearTimeout(timer) + timer = null } return sessions } - clearTimeout(timer) + timer !== null && clearTimeout(timer) emit('start') progress.value = 0 timer = setTimeout(() => { + timer = null animate.value = true newSpeed > 0 && planNextStep() }, onScreen.value === true ? 500 : 1) @@ -210,13 +212,18 @@ export default createComponent({ return sessions } - clearTimeout(timer) + if (timer !== null) { + clearTimeout(timer) + timer = null + } + emit('stop') const end = () => { animate.value = true progress.value = 100 timer = setTimeout(() => { + timer = null onScreen.value = false }, 1000) } @@ -234,6 +241,7 @@ export default createComponent({ function planNextStep () { if (progress.value < 100) { timer = setTimeout(() => { + timer = null increment() planNextStep() }, speed) @@ -254,7 +262,7 @@ export default createComponent({ }) onBeforeUnmount(() => { - clearTimeout(timer) + timer !== null && clearTimeout(timer) hijacked === true && restoreAjax(start) }) diff --git a/ui/src/components/btn/QBtn.js b/ui/src/components/btn/QBtn.js index 812cf0da6ae..31efdf354da 100644 --- a/ui/src/components/btn/QBtn.js +++ b/ui/src/components/btn/QBtn.js @@ -46,7 +46,7 @@ export default createComponent({ const rootRef = ref(null) const blurTargetRef = ref(null) - let localTouchTargetEl = null, avoidMouseRipple, mouseTimer + let localTouchTargetEl = null, avoidMouseRipple, mouseTimer = null const hasLabel = computed(() => props.label !== void 0 && props.label !== null && props.label !== '' @@ -192,8 +192,9 @@ export default createComponent({ // avoid duplicated mousedown event // triggering another early ripple avoidMouseRipple = true - clearTimeout(mouseTimer) + mouseTimer !== null && clearTimeout(mouseTimer) mouseTimer = setTimeout(() => { + mouseTimer = null avoidMouseRipple = false }, 200) } diff --git a/ui/src/components/carousel/QCarousel.js b/ui/src/components/carousel/QCarousel.js index b2f68de3db2..8dc83c31dc8 100644 --- a/ui/src/components/carousel/QCarousel.js +++ b/ui/src/components/carousel/QCarousel.js @@ -68,7 +68,7 @@ export default createComponent({ const isDark = useDark(props, $q) - let timer, panelsLen + let timer = null, panelsLen const { updatePanelsList, getPanelContent, @@ -122,7 +122,6 @@ export default createComponent({ watch(() => props.modelValue, () => { if (props.autoplay) { - clearInterval(timer) startTimer() } }) @@ -131,20 +130,28 @@ export default createComponent({ if (val) { startTimer() } - else { - clearInterval(timer) + else if (timer !== null) { + clearTimeout(timer) + timer = null } }) function startTimer () { const duration = isNumber(props.autoplay) === true - ? props.autoplay + ? Math.abs(props.autoplay) : 5000 - timer = setTimeout( - duration >= 0 ? nextPanel : previousPanel, - Math.abs(duration) - ) + timer !== null && clearTimeout(timer) + timer = setTimeout(() => { + timer = null + + if (duration >= 0) { + nextPanel() + } + else { + previousPanel() + } + }, duration) } onMounted(() => { @@ -152,7 +159,7 @@ export default createComponent({ }) onBeforeUnmount(() => { - clearInterval(timer) + timer !== null && clearTimeout(timer) }) function getNavigationContainer (type, mapping) { diff --git a/ui/src/components/dialog/QDialog.js b/ui/src/components/dialog/QDialog.js index 078e0f73f6a..08d86efc717 100644 --- a/ui/src/components/dialog/QDialog.js +++ b/ui/src/components/dialog/QDialog.js @@ -84,7 +84,7 @@ export default createComponent({ const showing = ref(false) const animating = ref(false) - let shakeTimeout, refocusTarget = null, isMaximized, avoidAutoClose + let shakeTimeout = null, refocusTarget = null, isMaximized, avoidAutoClose const hideOnRouteChange = computed(() => props.persistent !== true @@ -266,8 +266,9 @@ export default createComponent({ if (node !== null) { node.classList.remove('q-animate--scale') node.classList.add('q-animate--scale') - clearTimeout(shakeTimeout) + shakeTimeout !== null && clearTimeout(shakeTimeout) shakeTimeout = setTimeout(() => { + shakeTimeout = null if (innerRef.value !== null) { node.classList.remove('q-animate--scale') // some platforms (like desktop Chrome) @@ -291,7 +292,10 @@ export default createComponent({ } function cleanup (hiding) { - clearTimeout(shakeTimeout) + if (shakeTimeout !== null) { + clearTimeout(shakeTimeout) + shakeTimeout = null + } if (hiding === true || showing.value === true) { updateMaximized(false) diff --git a/ui/src/components/drawer/QDrawer.js b/ui/src/components/drawer/QDrawer.js index 917f4d1f732..f80fec9e540 100644 --- a/ui/src/components/drawer/QDrawer.js +++ b/ui/src/components/drawer/QDrawer.js @@ -83,7 +83,7 @@ export default createComponent({ return emptyRenderFn } - let lastDesktopState, timerMini, layoutTotalWidthWatcher + let lastDesktopState, timerMini = null, layoutTotalWidthWatcher const belowBreakpoint = ref( props.behavior === 'mobile' @@ -458,7 +458,7 @@ export default createComponent({ } function animateMini () { - clearTimeout(timerMini) + timerMini !== null && clearTimeout(timerMini) if (vm.proxy && vm.proxy.$el) { // need to speed it up and apply it immediately, @@ -468,6 +468,7 @@ export default createComponent({ flagMiniAnimate.value = true timerMini = setTimeout(() => { + timerMini = null flagMiniAnimate.value = false if (vm && vm.proxy && vm.proxy.$el) { vm.proxy.$el.classList.remove('q-drawer--mini-animate') @@ -620,7 +621,11 @@ export default createComponent({ onBeforeUnmount(() => { layoutTotalWidthWatcher !== void 0 && layoutTotalWidthWatcher() - clearTimeout(timerMini) + + if (timerMini !== null) { + clearTimeout(timerMini) + timerMini = null + } showing.value === true && cleanup() diff --git a/ui/src/components/img/QImg.js b/ui/src/components/img/QImg.js index a45b1651bfe..6bcec35237c 100644 --- a/ui/src/components/img/QImg.js +++ b/ui/src/components/img/QImg.js @@ -69,7 +69,7 @@ export default createComponent({ const naturalRatio = ref(props.initialRatio) const ratioStyle = useRatio(props, naturalRatio) - let loadTimer + let loadTimer = null, isDestroyed = false const images = [ ref(null), @@ -120,7 +120,11 @@ export default createComponent({ } function addImage (imgProps) { - clearTimeout(loadTimer) + if (loadTimer !== null) { + clearTimeout(loadTimer) + loadTimer = null + } + hasError.value = false if (imgProps === null) { @@ -135,10 +139,12 @@ export default createComponent({ } function onLoad ({ target }) { - // if component has been already destroyed - if (loadTimer === null) { return } + if (isDestroyed === true) { return } - clearTimeout(loadTimer) + if (loadTimer !== null) { + clearTimeout(loadTimer) + loadTimer = null + } naturalRatio.value = target.naturalHeight === 0 ? 0.5 @@ -149,21 +155,21 @@ export default createComponent({ function waitForCompleteness (target, count) { // protect against running forever - if (loadTimer === null || count === 1000) { return } + if (isDestroyed === true || count === 1000) { return } if (target.complete === true) { onReady(target) } else { loadTimer = setTimeout(() => { + loadTimer = null waitForCompleteness(target, count + 1) }, 50) } } function onReady (img) { - // if component has been already destroyed - if (loadTimer === null) { return } + if (isDestroyed === true) { return } position.value = position.value ^ 1 images[ position.value ].value = null @@ -173,7 +179,11 @@ export default createComponent({ } function onError (err) { - clearTimeout(loadTimer) + if (loadTimer !== null) { + clearTimeout(loadTimer) + loadTimer = null + } + isLoading.value = false hasError.value = true images[ position.value ].value = null @@ -253,8 +263,12 @@ export default createComponent({ } onBeforeUnmount(() => { - clearTimeout(loadTimer) - loadTimer = null + isDestroyed = true + + if (loadTimer !== null) { + clearTimeout(loadTimer) + loadTimer = null + } }) } diff --git a/ui/src/components/input/QInput.js b/ui/src/components/input/QInput.js index bbfcb9f336f..73895f2405d 100644 --- a/ui/src/components/input/QInput.js +++ b/ui/src/components/input/QInput.js @@ -49,7 +49,7 @@ export default createComponent({ const { $q } = proxy const temp = {} - let emitCachedValue = NaN, typedNumber, stopValueWatcher, emitTimer, emitValueFn + let emitCachedValue = NaN, typedNumber, stopValueWatcher, emitTimer = null, emitValueFn const inputRef = ref(null) const nameProp = useFormInputNameAttr(props) @@ -261,6 +261,8 @@ export default createComponent({ function emitValue (val, stopWatcher) { emitValueFn = () => { + emitTimer = null + if ( props.type !== 'number' && temp.hasOwnProperty('value') === true @@ -288,7 +290,7 @@ export default createComponent({ } if (props.debounce !== void 0) { - clearTimeout(emitTimer) + emitTimer !== null && clearTimeout(emitTimer) temp.value = val emitTimer = setTimeout(emitValueFn, props.debounce) } @@ -322,7 +324,11 @@ export default createComponent({ function onChange (e) { onComposition(e) - clearTimeout(emitTimer) + if (emitTimer !== null) { + clearTimeout(emitTimer) + emitTimer = null + } + emitValueFn !== void 0 && emitValueFn() emit('change', e.target.value) @@ -331,7 +337,11 @@ export default createComponent({ function onFinishEditing (e) { e !== void 0 && stop(e) - clearTimeout(emitTimer) + if (emitTimer !== null) { + clearTimeout(emitTimer) + emitTimer = null + } + emitValueFn !== void 0 && emitValueFn() typedNumber = false diff --git a/ui/src/components/layout/QLayout.js b/ui/src/components/layout/QLayout.js index ee26ebc444f..84afcf4b23d 100644 --- a/ui/src/components/layout/QLayout.js +++ b/ui/src/components/layout/QLayout.js @@ -122,7 +122,7 @@ export default createComponent({ } } - let timer + let animateTimer = null const $layout = { instances: {}, @@ -153,16 +153,16 @@ export default createComponent({ scroll, animate () { - if (timer !== void 0) { - clearTimeout(timer) + if (animateTimer !== null) { + clearTimeout(animateTimer) } else { document.body.classList.add('q-body--layout-animate') } - timer = setTimeout(() => { + animateTimer = setTimeout(() => { + animateTimer = null document.body.classList.remove('q-body--layout-animate') - timer = void 0 }, 155) }, diff --git a/ui/src/components/pull-to-refresh/QPullToRefresh.js b/ui/src/components/pull-to-refresh/QPullToRefresh.js index eddba6c3ccb..1744678efdc 100644 --- a/ui/src/components/pull-to-refresh/QPullToRefresh.js +++ b/ui/src/components/pull-to-refresh/QPullToRefresh.js @@ -137,6 +137,8 @@ export default createComponent({ }) } + let $el, localScrollTarget, timer = null + function animateTo ({ pos, ratio }, done) { animating.value = true pullPosition.value = pos @@ -145,15 +147,14 @@ export default createComponent({ pullRatio.value = ratio } - clearTimeout(timer) + timer !== null && clearTimeout(timer) timer = setTimeout(() => { + timer = null animating.value = false done && done() }, 300) } - let $el, localScrollTarget, timer - function updateScrollTarget () { localScrollTarget = getScrollTarget($el, props.scrollTarget) } @@ -166,7 +167,7 @@ export default createComponent({ }) onBeforeUnmount(() => { - clearTimeout(timer) + timer !== null && clearTimeout(timer) }) // expose public methods diff --git a/ui/src/components/resize-observer/QResizeObserver.js b/ui/src/components/resize-observer/QResizeObserver.js index d28d566c1f5..01483081b3e 100644 --- a/ui/src/components/resize-observer/QResizeObserver.js +++ b/ui/src/components/resize-observer/QResizeObserver.js @@ -40,8 +40,10 @@ export default createComponent({ } function emitEvent () { - clearTimeout(timer) - timer = null + if (timer !== null) { + clearTimeout(timer) + timer = null + } if (targetEl) { const { offsetWidth: width, offsetHeight: height } = targetEl @@ -75,7 +77,7 @@ export default createComponent({ onMounted(() => { init() }) onBeforeUnmount(() => { - clearTimeout(timer) + timer !== null && clearTimeout(timer) if (observer !== void 0) { if (observer.disconnect !== void 0) { @@ -95,7 +97,10 @@ export default createComponent({ let curDocView function cleanup () { - clearTimeout(timer) + if (timer !== null) { + clearTimeout(timer) + timer = null + } if (curDocView !== void 0) { // iOS is fuzzy, need to check it first diff --git a/ui/src/components/scroll-area/QScrollArea.js b/ui/src/components/scroll-area/QScrollArea.js index 2d161d02295..4c254710c11 100644 --- a/ui/src/components/scroll-area/QScrollArea.js +++ b/ui/src/components/scroll-area/QScrollArea.js @@ -88,7 +88,7 @@ export default createComponent({ const isDark = useDark(props, proxy.$q) - let timer, panRefPos + let timer = null, panRefPos const targetRef = ref(null) @@ -337,14 +337,14 @@ export default createComponent({ } function startTimer () { - if (tempShowing.value === true) { - clearTimeout(timer) - } - else { - tempShowing.value = true - } + tempShowing.value = true + + timer !== null && clearTimeout(timer) + timer = setTimeout(() => { + timer = null + tempShowing.value = false + }, props.delay) - timer = setTimeout(() => { tempShowing.value = false }, props.delay) props.onScroll !== void 0 && emitScroll() } diff --git a/ui/src/components/select/QSelect.js b/ui/src/components/select/QSelect.js index 8c081c30c84..7f280d7fbd4 100755 --- a/ui/src/components/select/QSelect.js +++ b/ui/src/components/select/QSelect.js @@ -143,8 +143,8 @@ export default createComponent({ const dialogFieldFocused = ref(false) const innerLoadingIndicator = ref(false) - let inputTimer, innerValueCache, - hasDialog, userInputValue, filterId, defaultInputValue, + let inputTimer = null, innerValueCache, + hasDialog, userInputValue, filterId = null, defaultInputValue, transitionShowComputed, searchBuffer, searchBufferExp const inputRef = ref(null) @@ -650,7 +650,12 @@ export default createComponent({ } e.target.value = '' - clearTimeout(inputTimer) + + if (inputTimer !== null) { + clearTimeout(inputTimer) + inputTimer = null + } + resetInputValue() if (typeof value === 'string' && value.length > 0) { @@ -1015,7 +1020,10 @@ export default createComponent({ } function onInput (e) { - clearTimeout(inputTimer) + if (inputTimer !== null) { + clearTimeout(inputTimer) + inputTimer = null + } if (e && e.target && e.target.qComposing === true) { return @@ -1036,6 +1044,7 @@ export default createComponent({ if (props.onFilter !== void 0) { inputTimer = setTimeout(() => { + inputTimer = null filter(inputValue.value) }, props.inputDebounce) } @@ -1089,7 +1098,7 @@ export default createComponent({ menu.value === true && (menu.value = false) }, 10) - clearTimeout(filterId) + filterId !== null && clearTimeout(filterId) filterId = localFilterId emit( @@ -1281,8 +1290,10 @@ export default createComponent({ } if (state.focused.value === false) { - clearTimeout(filterId) - filterId = void 0 + if (filterId !== null) { + clearTimeout(filterId) + filterId = null + } if (state.innerLoading.value === true) { emit('filterAbort') @@ -1403,7 +1414,7 @@ export default createComponent({ updatePreState() onBeforeUnmount(() => { - clearTimeout(inputTimer) + inputTimer !== null && clearTimeout(inputTimer) }) // expose public methods diff --git a/ui/src/components/slide-item/QSlideItem.js b/ui/src/components/slide-item/QSlideItem.js index 906dae32f59..f2d003f71de 100644 --- a/ui/src/components/slide-item/QSlideItem.js +++ b/ui/src/components/slide-item/QSlideItem.js @@ -40,7 +40,7 @@ export default createComponent({ const contentRef = ref(null) - let timer, pan = {}, dirRefs = {}, dirContentRefs = {} + let timer = null, pan = {}, dirRefs = {}, dirContentRefs = {} const langDir = computed(() => ( $q.lang.rtl === true @@ -91,7 +91,9 @@ export default createComponent({ if (pan.scale === 1) { node.style.transform = `translate${ pan.axis }(${ pan.dir * 100 }%)` + timer !== null && clearTimeout(timer) timer = setTimeout(() => { + timer = null emit(pan.showing, { reset }) emit('action', { side: pan.showing, reset }) }, 230) @@ -162,7 +164,7 @@ export default createComponent({ }) onBeforeUnmount(() => { - clearTimeout(timer) + timer !== null && clearTimeout(timer) }) // expose public methods diff --git a/ui/src/components/slide-transition/QSlideTransition.js b/ui/src/components/slide-transition/QSlideTransition.js index 430637c1a4c..3d704710c24 100644 --- a/ui/src/components/slide-transition/QSlideTransition.js +++ b/ui/src/components/slide-transition/QSlideTransition.js @@ -17,15 +17,23 @@ export default createComponent({ setup (props, { slots, emit }) { let animating = false, doneFn, element - let timer, timerFallback, animListener, lastEvent + let timer = null, timerFallback = null, animListener, lastEvent function cleanup () { doneFn && doneFn() doneFn = null animating = false - clearTimeout(timer) - clearTimeout(timerFallback) + if (timer !== null) { + clearTimeout(timer) + timer = null + } + + if (timerFallback !== null) { + clearTimeout(timerFallback) + timerFallback = null + } + element !== void 0 && element.removeEventListener('transitionend', animListener) animListener = null } @@ -64,8 +72,11 @@ export default createComponent({ begin(el, pos, done) timer = setTimeout(() => { + timer = null el.style.height = `${ el.scrollHeight }px` animListener = evt => { + timerFallback = null + if (Object(evt) !== evt || evt.target === el) { end(el, 'show') } @@ -90,8 +101,11 @@ export default createComponent({ begin(el, pos, done) timer = setTimeout(() => { + timer = null el.style.height = 0 animListener = evt => { + timerFallback = null + if (Object(evt) !== evt || evt.target === el) { end(el, 'hide') } diff --git a/ui/src/components/tabs/QTabs.js b/ui/src/components/tabs/QTabs.js index eb8db670d42..7469ba00160 100644 --- a/ui/src/components/tabs/QTabs.js +++ b/ui/src/components/tabs/QTabs.js @@ -88,7 +88,7 @@ export default createComponent({ const tabDataListLen = ref(0) const hasFocus = ref(false) - let animateTimer, scrollTimer, unwatchRoute + let animateTimer = null, scrollTimer = null, unwatchRoute const tabProps = computed(() => ({ activeClass: props.activeClass, @@ -224,7 +224,10 @@ export default createComponent({ oldEl = oldTab.tabIndicatorRef.value, newEl = newTab.tabIndicatorRef.value - clearTimeout(animateTimer) + if (animateTimer !== null) { + clearTimeout(animateTimer) + animateTimer = null + } oldEl.style.transition = 'none' oldEl.style.transform = 'none' @@ -242,6 +245,7 @@ export default createComponent({ // allow scope updates to kick in (QRouteTab needs more time) registerAnimateTick(() => { animateTimer = setTimeout(() => { + animateTimer = null newEl.style.transition = 'transform .25s cubic-bezier(.4, 0, .2, 1)' newEl.style.transform = 'none' }, 70) @@ -294,7 +298,7 @@ export default createComponent({ } function animScrollTo (value) { - stopAnimScroll() + scrollTimer !== null && clearInterval(scrollTimer) scrollTimer = setInterval(() => { if (scrollTowards(value) === true) { stopAnimScroll() @@ -311,7 +315,10 @@ export default createComponent({ } function stopAnimScroll () { - clearInterval(scrollTimer) + if (scrollTimer !== null) { + clearInterval(scrollTimer) + scrollTimer = null + } } function onKbdNavigate (keyCode, fromEl) { @@ -615,7 +622,7 @@ export default createComponent({ provide(tabsKey, $tabs) function cleanup () { - clearTimeout(animateTimer) + animateTimer !== null && clearTimeout(animateTimer) stopAnimScroll() unwatchRoute !== void 0 && unwatchRoute() } diff --git a/ui/src/composables/private/use-anchor.js b/ui/src/composables/private/use-anchor.js index c5afb2a3196..b356323a0b9 100644 --- a/ui/src/composables/private/use-anchor.js +++ b/ui/src/composables/private/use-anchor.js @@ -21,7 +21,7 @@ export default function ({ const anchorEl = ref(null) - let touchTimer + let touchTimer = null function canShow (evt) { // abort with no parent configured or on multi-touch @@ -80,6 +80,7 @@ export default function ({ ]) touchTimer = setTimeout(() => { + touchTimer = null proxy.show(evt) evt.qAnchorHandled = true }, 300) @@ -87,7 +88,11 @@ export default function ({ mobileCleanup (evt) { anchorEl.value.classList.remove('non-selectable') - clearTimeout(touchTimer) + + if (touchTimer !== null) { + clearTimeout(touchTimer) + touchTimer = null + } if (showing.value === true && evt !== void 0) { clearSelection() @@ -201,7 +206,7 @@ export default function ({ }) onBeforeUnmount(() => { - clearTimeout(touchTimer) + touchTimer !== null && clearTimeout(touchTimer) unconfigureAnchorEl() }) diff --git a/ui/src/composables/private/use-field.js b/ui/src/composables/private/use-field.js index cd334a92091..11d1f22276c 100644 --- a/ui/src/composables/private/use-field.js +++ b/ui/src/composables/private/use-field.js @@ -122,7 +122,7 @@ export default function (state) { const { props, emit, slots, attrs, proxy } = getCurrentInstance() const { $q } = proxy - let focusoutTimer + let focusoutTimer = null if (state.hasValue === void 0) { state.hasValue = computed(() => fieldValueIsFilled(props.modelValue)) @@ -288,7 +288,11 @@ export default function (state) { } function onControlFocusin (e) { - clearTimeout(focusoutTimer) + if (focusoutTimer !== null) { + clearTimeout(focusoutTimer) + focusoutTimer = null + } + if (state.editable.value === true && state.focused.value === false) { state.focused.value = true emit('focus', e) @@ -296,8 +300,10 @@ export default function (state) { } function onControlFocusout (e, then) { - clearTimeout(focusoutTimer) + focusoutTimer !== null && clearTimeout(focusoutTimer) focusoutTimer = setTimeout(() => { + focusoutTimer = null + if ( document.hasFocus() === true && ( state.hasPopupOpen === true @@ -547,7 +553,7 @@ export default function (state) { }) onBeforeUnmount(() => { - clearTimeout(focusoutTimer) + focusoutTimer !== null && clearTimeout(focusoutTimer) }) // expose public methods diff --git a/ui/src/composables/private/use-timeout.js b/ui/src/composables/private/use-timeout.js index 5bf53401d83..83d2b735a7b 100644 --- a/ui/src/composables/private/use-timeout.js +++ b/ui/src/composables/private/use-timeout.js @@ -9,11 +9,14 @@ import { vmIsDestroyed } from '../../utils/private/vm' */ export default function () { - let timer + let timer = null const vm = getCurrentInstance() function removeTimeout () { - clearTimeout(timer) + if (timer !== null) { + clearTimeout(timer) + timer = null + } } onDeactivated(removeTimeout) @@ -23,7 +26,7 @@ export default function () { removeTimeout, registerTimeout (fn, delay) { - clearTimeout(timer) + removeTimeout(timer) if (vmIsDestroyed(vm) === false) { timer = setTimeout(fn, delay) diff --git a/ui/src/directives/TouchHold.js b/ui/src/directives/TouchHold.js index 868bc48beca..c15192a76fa 100644 --- a/ui/src/directives/TouchHold.js +++ b/ui/src/directives/TouchHold.js @@ -74,6 +74,7 @@ export default createDirective(__QUASAR_SSR_SERVER__ : ctx.touchSensitivity ctx.timer = setTimeout(() => { + ctx.timer = void 0 clearSelection() ctx.triggered = true @@ -90,10 +91,13 @@ export default createDirective(__QUASAR_SSR_SERVER__ move (evt) { const { top, left } = position(evt) if ( - Math.abs(left - ctx.origin.left) >= ctx.sensitivity - || Math.abs(top - ctx.origin.top) >= ctx.sensitivity + ctx.timer !== void 0 && ( + Math.abs(left - ctx.origin.left) >= ctx.sensitivity + || Math.abs(top - ctx.origin.top) >= ctx.sensitivity + ) ) { clearTimeout(ctx.timer) + ctx.timer = void 0 } }, @@ -106,8 +110,9 @@ export default createDirective(__QUASAR_SSR_SERVER__ if (ctx.triggered === true) { evt !== void 0 && stopAndPrevent(evt) } - else { + else if (ctx.timer !== void 0) { clearTimeout(ctx.timer) + ctx.timer = void 0 } } } @@ -159,7 +164,7 @@ export default createDirective(__QUASAR_SSR_SERVER__ cleanEvt(ctx, 'main') cleanEvt(ctx, 'temp') - clearTimeout(ctx.timer) + ctx.timer !== void 0 && clearTimeout(ctx.timer) ctx.styleCleanup !== void 0 && ctx.styleCleanup() delete el.__qtouchhold diff --git a/ui/src/directives/TouchRepeat.js b/ui/src/directives/TouchRepeat.js index 8486ce2a889..ddeb1aa6124 100644 --- a/ui/src/directives/TouchRepeat.js +++ b/ui/src/directives/TouchRepeat.js @@ -138,6 +138,8 @@ export default createDirective(__QUASAR_SSR_SERVER__ } const fn = () => { + ctx.timer = void 0 + if (ctx.event === void 0) { return } @@ -181,8 +183,9 @@ export default createDirective(__QUASAR_SSR_SERVER__ }, move (evt) { - if (ctx.event !== void 0 && shouldEnd(evt, ctx.origin) === true) { + if (ctx.event !== void 0 && ctx.timer !== void 0 && shouldEnd(evt, ctx.origin) === true) { clearTimeout(ctx.timer) + ctx.timer = void 0 } }, @@ -195,7 +198,11 @@ export default createDirective(__QUASAR_SSR_SERVER__ evt !== void 0 && ctx.event.repeatCount > 0 && stopAndPrevent(evt) cleanEvt(ctx, 'temp') - clearTimeout(ctx.timer) + + if (ctx.timer !== void 0) { + clearTimeout(ctx.timer) + ctx.timer = void 0 + } ctx.event = void 0 } @@ -244,7 +251,7 @@ export default createDirective(__QUASAR_SSR_SERVER__ const ctx = el.__qtouchrepeat if (ctx !== void 0) { - clearTimeout(ctx.timer) + ctx.timer !== void 0 && clearTimeout(ctx.timer) cleanEvt(ctx, 'main') cleanEvt(ctx, 'temp') diff --git a/ui/src/plugins/Loading.js b/ui/src/plugins/Loading.js index ae4b5ca66ab..305f9ea7168 100644 --- a/ui/src/plugins/Loading.js +++ b/ui/src/plugins/Loading.js @@ -11,7 +11,7 @@ let app, vm, uid = 0, - timeout, + timeout = null, props = {}, activeGroups = {} @@ -61,10 +61,10 @@ const Plugin = defineReactivePlugin({ } else { props.uid = ++uid - clearTimeout(timeout) + timeout !== null && clearTimeout(timeout) timeout = setTimeout(() => { - timeout = void 0 + timeout = null const el = createGlobalNode('q-loading') @@ -174,9 +174,9 @@ const Plugin = defineReactivePlugin({ } } - if (timeout !== void 0) { + if (timeout !== null) { clearTimeout(timeout) - timeout = void 0 + timeout = null } Plugin.isActive = false diff --git a/ui/src/plugins/Meta.js b/ui/src/plugins/Meta.js index cfdb82a5341..5877f15a71b 100644 --- a/ui/src/plugins/Meta.js +++ b/ui/src/plugins/Meta.js @@ -1,7 +1,7 @@ import { isRuntimeSsrPreHydration } from './Platform.js' import extend from '../utils/extend.js' -let updateId, currentClientMeta +let updateId = null, currentClientMeta export const clientList = [] function normalize (meta) { @@ -218,6 +218,8 @@ function injectServerMeta (ssrContext) { } function updateClientMeta () { + updateId = null + const data = { title: '', titleTemplate: null, @@ -243,7 +245,7 @@ function updateClientMeta () { } export function planClientUpdate () { - clearTimeout(updateId) + updateId !== null && clearTimeout(updateId) updateId = setTimeout(updateClientMeta, 50) } diff --git a/ui/src/plugins/Notify.js b/ui/src/plugins/Notify.js index 9194e2189f9..87655aacde6 100644 --- a/ui/src/plugins/Notify.js +++ b/ui/src/plugins/Notify.js @@ -225,7 +225,10 @@ function addNotification (config, $q, originalApi) { if (originalApi !== void 0) { // reset timeout if any - clearTimeout(originalApi.notif.meta.timer) + if (originalApi.notif.meta.timer) { + clearTimeout(originalApi.notif.meta.timer) + originalApi.notif.meta.timer = void 0 + } // retain uid notif.meta.uid = originalApi.notif.meta.uid @@ -261,7 +264,10 @@ function addNotification (config, $q, originalApi) { // ok, so it's NOT a new one else { // reset timeout if any - clearTimeout(original.meta.timer) + if (original.meta.timer) { + clearTimeout(original.meta.timer) + original.meta.timer = void 0 + } if (notif.badgePosition !== void 0) { if (badgePositions.includes(notif.badgePosition) === false) { @@ -291,6 +297,7 @@ function addNotification (config, $q, originalApi) { if (notif.timeout > 0) { notif.meta.timer = setTimeout(() => { + notif.meta.timer = void 0 dismiss() }, notif.timeout + /* show duration */ 1000) } @@ -339,7 +346,10 @@ function addNotification (config, $q, originalApi) { } function removeNotification (notif) { - clearTimeout(notif.meta.timer) + if (notif.meta.timer) { + clearTimeout(notif.meta.timer) + notif.meta.timer = void 0 + } const index = notificationsList[ notif.position ].value.indexOf(notif) if (index !== -1) { diff --git a/ui/src/utils/debounce.js b/ui/src/utils/debounce.js index e0fe682d585..1572d7596c0 100644 --- a/ui/src/utils/debounce.js +++ b/ui/src/utils/debounce.js @@ -1,25 +1,28 @@ export default function (fn, wait = 250, immediate) { - let timeout + let timer = null function debounced (/* ...args */) { const args = arguments const later = () => { - timeout = void 0 + timer = null if (immediate !== true) { fn.apply(this, args) } } - clearTimeout(timeout) - if (immediate === true && timeout === void 0) { + if (timer !== null) { + clearTimeout(timer) + } + else if (immediate === true) { fn.apply(this, args) } - timeout = setTimeout(later, wait) + + timer = setTimeout(later, wait) } debounced.cancel = () => { - clearTimeout(timeout) + timer !== null && clearTimeout(timer) } return debounced diff --git a/ui/src/utils/morph.js b/ui/src/utils/morph.js index 5cc3c3ad997..86e593ad5f5 100644 --- a/ui/src/utils/morph.js +++ b/ui/src/utils/morph.js @@ -950,12 +950,11 @@ export default function morph (_options) { : ( options.waitFor === 'transitionend' ? new Promise(resolve => { - const timer = setTimeout(() => { - endFn() - }, 400) - - const endFn = ev => { - clearTimeout(timer) + const endFn = () => { + if (timer !== null) { + clearTimeout(timer) + timer = null + } if (elTo) { elTo.removeEventListener('transitionend', endFn) @@ -965,6 +964,8 @@ export default function morph (_options) { resolve() } + let timer = setTimeout(endFn, 400) + elTo.addEventListener('transitionend', endFn) elTo.addEventListener('transitioncancel', endFn) }) diff --git a/ui/src/utils/prevent-scroll.js b/ui/src/utils/prevent-scroll.js index 615bb36056b..9c960e6f0fc 100644 --- a/ui/src/utils/prevent-scroll.js +++ b/ui/src/utils/prevent-scroll.js @@ -10,7 +10,7 @@ let vpPendingUpdate = false, bodyLeft, bodyTop, - closeTimer + closeTimer = null function onWheel (e) { if (shouldPreventScroll(e)) { @@ -157,9 +157,9 @@ export default function (state) { if (state === true) { registered++ - if (closeTimer !== void 0) { + if (closeTimer !== null) { clearTimeout(closeTimer) - closeTimer = void 0 + closeTimer = null return } @@ -181,11 +181,10 @@ export default function (state) { action = 'remove' if (client.is.ios === true && client.is.nativeMobile === true) { - clearTimeout(closeTimer) - + closeTimer !== null && clearTimeout(closeTimer) closeTimer = setTimeout(() => { apply(action) - closeTimer = void 0 + closeTimer = null }, 100) return } diff --git a/ui/src/utils/private/click-outside.js b/ui/src/utils/private/click-outside.js index 1dbec7b2eba..e3beb53e998 100644 --- a/ui/src/utils/private/click-outside.js +++ b/ui/src/utils/private/click-outside.js @@ -1,14 +1,17 @@ import { listenOpts } from '../event.js' import { portalProxyList } from '../private/portal.js' -let timer +let timer = null const { notPassiveCapture } = listenOpts, registeredList = [] function globalHandler (evt) { - clearTimeout(timer) + if (timer !== null) { + clearTimeout(timer) + timer = null + } const target = evt.target @@ -81,7 +84,11 @@ export function removeClickOutside (clickOutsideProps) { registeredList.splice(index, 1) if (registeredList.length === 0) { - clearTimeout(timer) + if (timer !== null) { + clearTimeout(timer) + timer = null + } + document.removeEventListener('mousedown', globalHandler, notPassiveCapture) document.removeEventListener('touchstart', globalHandler, notPassiveCapture) }