UNPKG

@syncfusion/react-base

Version:

A common package of core React base, methods and class definitions

335 lines (334 loc) 11.4 kB
import { isUndefined } from './util'; const REGX_MOBILE = /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini|mobile/i; const REGX_IE = /msie|trident/i; const REGX_IE11 = /Trident\/7\./; const REGX_IOS = /(ipad|iphone|ipod touch)/i; const REGX_IOS7 = /(ipad|iphone|ipod touch);.*os 7_\d|(ipad|iphone|ipod touch);.*os 8_\d/i; const REGX_ANDROID = /android/i; const REGX_WINDOWS = /trident|windows phone|edge/i; const REGX_VERSION = /(version)[ /]([\w.]+)/i; const REGX_BROWSER = { OPERA: /(opera|opr)(?:.*version|)[ /]([\w.]+)/i, EDGE: /(edge)(?:.*version|)[ /]([\w.]+)/i, CHROME: /(chrome|crios)[ /]([\w.]+)/i, PANTHOMEJS: /(phantomjs)[ /]([\w.]+)/i, SAFARI: /(safari)[ /]([\w.]+)/i, WEBKIT: /(webkit)[ /]([\w.]+)/i, MSIE: /(msie|trident) ([\w.]+)/i, MOZILLA: /(mozilla)(?:.*? rv:([\w.]+)|)/i }; /* istanbul ignore else */ if (typeof window !== 'undefined') { window.browserDetails = window.browserDetails || {}; } /** * Get configuration details for Browser * * @private */ export const Browser = (() => { const uA = typeof navigator !== 'undefined' ? navigator.userAgent : ''; /** * Extract browser detail. * * @returns {BrowserInfo} ? */ function extractBrowserDetail() { const browserInfo = { culture: {} }; const keys = Object.keys(REGX_BROWSER); let clientInfo = []; for (const key of keys) { clientInfo = Browser.userAgent.match(REGX_BROWSER[`${key}`]); if (clientInfo) { browserInfo.name = (clientInfo[1].toLowerCase() === 'opr' ? 'opera' : clientInfo[1].toLowerCase()); browserInfo.name = (clientInfo[1].toLowerCase() === 'crios' ? 'chrome' : browserInfo.name); browserInfo.version = clientInfo[2]; browserInfo.culture.name = browserInfo.culture.language = navigator.language; if (Browser.userAgent.match(REGX_IE11)) { browserInfo.name = 'msie'; break; } const version = Browser.userAgent.match(REGX_VERSION); if (browserInfo.name === 'safari' && version) { browserInfo.version = version[2]; } break; } } return browserInfo; } /** * To get events from the browser * * @param {EventTypes} event - type of event triggered. * @returns {string} ? */ function getEvent(event) { const events = { start: { isPointer: 'pointerdown', isTouch: 'touchstart', isDevice: 'mousedown' }, move: { isPointer: 'pointermove', isTouch: 'touchmove', isDevice: 'mousemove' }, end: { isPointer: 'pointerup', isTouch: 'touchend', isDevice: 'mouseup' }, cancel: { isPointer: 'pointercancel', isTouch: 'touchcancel', isDevice: 'mouseleave' } }; return Browser.isPointer ? events[`${event}`].isPointer : (Browser.isTouch ? events[`${event}`].isTouch + (!Browser.isDevice ? ' ' + events[`${event}`].isDevice : '') : events[`${event}`].isDevice); } /** * To get the Touch start event from browser * * @returns {string} ? */ function getTouchStartEvent() { return getEvent('start'); } /** * To get the Touch end event from browser * * @returns {string} ? */ function getTouchEndEvent() { return getEvent('end'); } /** * To get the Touch move event from browser * * @returns {string} ? */ function getTouchMoveEvent() { return getEvent('move'); } /** * To cancel the touch event from browser * * @returns {string} ? */ function getTouchCancelEvent() { return getEvent('cancel'); } /** * Check whether the browser on the iPad device is Safari or not * * @returns {boolean} ? */ function isSafari() { return (Browser.isDevice && Browser.isIos && Browser.isTouch && typeof window !== 'undefined' && window.navigator.userAgent.toLowerCase().indexOf('iphone') === -1 && window.navigator.userAgent.toLowerCase().indexOf('safari') > -1); } /** * To get the value based on provided key and regX * * @param {string} key ? * @param {RegExp} regX ? * @returns {Object} ? */ function getValue(key, regX) { const browserDetails = typeof window !== 'undefined' ? window.browserDetails : {}; if (typeof navigator !== 'undefined' && navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1 && Browser.isTouch === true && !REGX_BROWSER.CHROME.test(navigator.userAgent)) { browserDetails['isIos'] = true; browserDetails['isDevice'] = true; browserDetails['isTouch'] = true; browserDetails['isPointer'] = true; // Set 'isPointer' for pointer-enabled devices (e.g., iPad on Safari) browserDetails['isPointer'] = ('pointerEnabled' in window.navigator); } if (typeof window !== 'undefined' && window.Capacitor && window.Capacitor.getPlatform() === 'ios') { browserDetails['isPointer'] = false; } if ('undefined' === typeof browserDetails[`${key}`]) { return browserDetails[`${key}`] = regX.test(Browser.userAgent); } return browserDetails[`${key}`]; } return { // Properties /** * Property specifies the userAgent of the browser. Default userAgent value is based on the browser. * Also we can set our own userAgent. * * @param {string} uA ? */ set userAgent(uA) { Browser.uA = uA; window.browserDetails = {}; }, get userAgent() { return Browser.uA; }, //Read Only Properties /** * Property is to get the browser information like Name, Version and Language * * @returns {BrowserInfo} ? */ get info() { if (isUndefined(window.browserDetails.info)) { window.browserDetails.info = extractBrowserDetail(); } return window.browserDetails.info; }, /** * Property is to get whether the userAgent is based IE. * * @returns {boolean} ? */ get isIE() { return getValue('isIE', REGX_IE); }, /** * Property is to get whether the browser has touch support. * * @returns {boolean} ? */ get isTouch() { if (isUndefined(window.browserDetails.isTouch)) { window.browserDetails.isTouch = ('ontouchstart' in window.navigator) || (window && window.navigator && (window.navigator.maxTouchPoints > 0)) || ('ontouchstart' in window); } return window.browserDetails.isTouch; }, /** * Property is to get whether the browser has Pointer support. * * @returns {boolean} ? */ get isPointer() { if (isUndefined(window.browserDetails.isPointer)) { window.browserDetails.isPointer = ('pointerEnabled' in window.navigator); } return window.browserDetails.isPointer; }, /** * Property is to get whether the browser has MSPointer support. * * @returns {boolean} ? */ get isMSPointer() { if (isUndefined(window.browserDetails.isMSPointer)) { window.browserDetails.isMSPointer = ('msPointerEnabled' in window.navigator); } return window.browserDetails.isMSPointer; }, /** * Property is to get whether the userAgent is device based. * * @returns {boolean} ? */ get isDevice() { return getValue('isDevice', REGX_MOBILE); }, /** * Property is to get whether the userAgent is Ios. * * @returns {boolean} ? */ get isIos() { return getValue('isIos', REGX_IOS); }, /** * Property is to get whether the userAgent is Ios7. * * @returns {boolean} ? */ get isIos7() { return getValue('isIos7', REGX_IOS7); }, /** * Property is to get whether the userAgent is Android. * * @returns {boolean} ? */ get isAndroid() { return getValue('isAndroid', REGX_ANDROID); }, /** * Property is to identify whether application ran in web view. * * @returns {boolean} ? */ get isWebView() { if (isUndefined(window.browserDetails.isWebView)) { window.browserDetails.isWebView = !(isUndefined(window.cordova) && isUndefined(window.PhoneGap) && isUndefined(window.phonegap) && window.forge !== 'object'); } return window.browserDetails.isWebView; }, /** * Property is to get whether the userAgent is Windows. * * @returns {boolean} ? */ get isWindows() { return getValue('isWindows', REGX_WINDOWS); }, /** * Property is to get the touch start event. It returns event name based on browser. * * @returns {string} ? */ get touchStartEvent() { if (isUndefined(window.browserDetails.touchStartEvent)) { window.browserDetails.touchStartEvent = getTouchStartEvent(); } return window.browserDetails.touchStartEvent; }, /** * Property is to get the touch move event. It returns event name based on browser. * * @returns {string} ? */ get touchMoveEvent() { if (isUndefined(window.browserDetails.touchMoveEvent)) { window.browserDetails.touchMoveEvent = getTouchMoveEvent(); } return window.browserDetails.touchMoveEvent; }, /** * Property is to get the touch end event. It returns event name based on browser. * * @returns {string} ? */ get touchEndEvent() { if (isUndefined(window.browserDetails.touchEndEvent)) { window.browserDetails.touchEndEvent = getTouchEndEvent(); } return window.browserDetails.touchEndEvent; }, /** * Property is to cancel the touch end event. * * @returns {string} ? */ get touchCancelEvent() { if (isUndefined(window.browserDetails.touchCancelEvent)) { window.browserDetails.touchCancelEvent = getTouchCancelEvent(); } return window.browserDetails.touchCancelEvent; }, isSafari, uA }; })();