From 52c11c2480f4fef01ed8620512bfd7cad2846e95 Mon Sep 17 00:00:00 2001 From: Vadim Date: Thu, 12 Aug 2021 22:07:01 +0300 Subject: [PATCH 1/3] #56 : Update pausable handlers --- src/actions/pausable/pausable.js | 27 ++++++++++++++++++++++----- src/utils/event.js | 20 +++++++++++++++++++- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/actions/pausable/pausable.js b/src/actions/pausable/pausable.js index fdfd5d2..4e32f43 100644 --- a/src/actions/pausable/pausable.js +++ b/src/actions/pausable/pausable.js @@ -1,15 +1,14 @@ import { + addTouchableChangeEventListener, createDispatcher, - getIsTouchable, } from '../../utils/event' - import { focusable } from '../focusable' import { tappable } from '../tappable' -export function pausable(node) { +function getHandler(isTouchable, node) { const dispatch = createDispatcher(node) - - if (getIsTouchable()) { + + if (isTouchable) { return tappable(node, { dispatch: (_, payload) => { dispatch('pausedToggle', { @@ -28,3 +27,21 @@ export function pausable(node) { } }) } + +export function pausable(node) { + let destroy + + const handleTouchableChange = (isTouchable) => { + destroy && destroy() // destroy when touchable changed + destroy = getHandler(isTouchable, node).destroy + } + + // in order to change handlers when browser was switched to mobile view and vice versa + const removeTouchableChangeListener = addTouchableChangeEventListener(handleTouchableChange) + return { + destroy() { + removeTouchableChangeListener() + destroy() // destroy here in case if touchable was not changed + } + } +} diff --git a/src/utils/event.js b/src/utils/event.js index ac9119d..987b7d4 100644 --- a/src/utils/event.js +++ b/src/utils/event.js @@ -18,8 +18,26 @@ export function createDispatcher(source) { export function getIsTouchable() { return ( - ('ontouchstart' in window) || + // ('ontouchstart' in window) || // not changing value during browser view switching (mobile <-> desktop) (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0) ) } + +export function addTouchableChangeEventListener(cb) { + let isTouchable = getIsTouchable(); + cb(isTouchable) + + function handleResize() { + const isTouchableNext = getIsTouchable(); + if (isTouchable !== isTouchableNext) { + cb(isTouchableNext) + isTouchable = isTouchableNext + } + } + + addResizeEventListener(handleResize) + return () => { + removeResizeEventListener(handleResize) + } +} From d8cc22093cfc5e28239748c722109ec5a245c67b Mon Sep 17 00:00:00 2001 From: Vadim Date: Thu, 12 Aug 2021 22:14:22 +0300 Subject: [PATCH 2/3] #56 : Code cleanup --- src/actions/pausable/pausable.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/pausable/pausable.js b/src/actions/pausable/pausable.js index 4e32f43..b20fd2f 100644 --- a/src/actions/pausable/pausable.js +++ b/src/actions/pausable/pausable.js @@ -7,7 +7,7 @@ import { tappable } from '../tappable' function getHandler(isTouchable, node) { const dispatch = createDispatcher(node) - + if (isTouchable) { return tappable(node, { dispatch: (_, payload) => { From ee98f2cd791e2a21c3fabcba62f6a2b64d6a8531 Mon Sep 17 00:00:00 2001 From: Vadim Date: Sun, 15 Aug 2021 23:45:31 +0300 Subject: [PATCH 3/3] #56 : Update listener --- src/utils/event.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/utils/event.js b/src/utils/event.js index 987b7d4..93f1916 100644 --- a/src/utils/event.js +++ b/src/utils/event.js @@ -1,3 +1,5 @@ +import { setIntervalImmediate } from './interval' + // resize event export function addResizeEventListener(cb) { window.addEventListener('resize', cb) @@ -25,8 +27,7 @@ export function getIsTouchable() { } export function addTouchableChangeEventListener(cb) { - let isTouchable = getIsTouchable(); - cb(isTouchable) + let isTouchable = null function handleResize() { const isTouchableNext = getIsTouchable(); @@ -36,8 +37,9 @@ export function addTouchableChangeEventListener(cb) { } } - addResizeEventListener(handleResize) + const interval = setIntervalImmediate(handleResize, 500); + return () => { - removeResizeEventListener(handleResize) + clearInterval(interval) } }