summaryrefslogtreecommitdiffstats
path: root/client/lib/utils.js
diff options
context:
space:
mode:
Diffstat (limited to 'client/lib/utils.js')
-rw-r--r--client/lib/utils.js49
1 files changed, 49 insertions, 0 deletions
diff --git a/client/lib/utils.js b/client/lib/utils.js
index 1f44c60d..6b8e3524 100644
--- a/client/lib/utils.js
+++ b/client/lib/utils.js
@@ -95,6 +95,55 @@ Utils = {
increment,
};
},
+
+ // Detect touch device
+ isTouchDevice() {
+ const isTouchable = (() => {
+ const prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');
+ const mq = function(query) {
+ return window.matchMedia(query).matches;
+ };
+
+ if (('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch) {
+ return true;
+ }
+
+ // include the 'heartz' as a way to have a non matching MQ to help terminate the join
+ // https://git.io/vznFH
+ const query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');
+ return mq(query);
+ })();
+ Utils.isTouchDevice = () => isTouchable;
+ return isTouchable;
+ },
+
+ calculateTouchDistance(touchA, touchB) {
+ return Math.sqrt(
+ Math.pow(touchA.screenX - touchB.screenX, 2) +
+ Math.pow(touchA.screenY - touchB.screenY, 2)
+ );
+ },
+
+ enableClickOnTouch(selector) {
+ let touchStart = null;
+ let lastTouch = null;
+
+ $(document).on('touchstart', selector, function(e) {
+ touchStart = e.originalEvent.touches[0];
+ });
+ $(document).on('touchmove', selector, function(e) {
+ const touches = e.originalEvent.touches;
+ lastTouch = touches[touches.length - 1];
+ });
+ $(document).on('touchend', selector, function(e) {
+ if (touchStart && lastTouch && Utils.calculateTouchDistance(touchStart, lastTouch) <= 20) {
+ e.preventDefault();
+ const clickEvent = document.createEvent('MouseEvents');
+ clickEvent.initEvent('click', true, true);
+ e.target.dispatchEvent(clickEvent);
+ }
+ });
+ },
};
// A simple tracker dependency that we invalidate every time the window is