UNPKG

react-device-detect

Version:

Detect device type and render your component according to it

782 lines (686 loc) 22.8 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var React = require('react'); var React__default = _interopDefault(React); var UAParser = require('ua-parser-js/dist/ua-parser.min'); var UA = new UAParser(); var browser = UA.getBrowser(); var cpu = UA.getCPU(); var device = UA.getDevice(); var engine = UA.getEngine(); var os = UA.getOS(); var ua = UA.getUA(); var setDefaults = function setDefaults(p) { var d = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'none'; return p ? p : d; }; var getNavigatorInstance = function getNavigatorInstance() { if (typeof window !== 'undefined') { if (window.navigator || navigator) { return window.navigator || navigator; } } return false; }; var isIOS13Check = function isIOS13Check(type) { var nav = getNavigatorInstance(); return nav && (nav.platform.indexOf(type) !== -1 || nav.platform === 'MacIntel' && nav.maxTouchPoints > 1 && !window.MSStream); }; function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; } else { _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } var DEVICE_TYPES = { MOBILE: 'mobile', TABLET: 'tablet', SMART_TV: 'smarttv', CONSOLE: 'console', WEARABLE: 'wearable', BROWSER: undefined }; var BROWSER_TYPES = { CHROME: 'Chrome', FIREFOX: "Firefox", OPERA: "Opera", YANDEX: "Yandex", SAFARI: "Safari", INTERNET_EXPLORER: "Internet Explorer", EDGE: "Edge", CHROMIUM: "Chromium", IE: 'IE', MOBILE_SAFARI: "Mobile Safari" }; var OS_TYPES = { IOS: 'iOS', ANDROID: "Android", WINDOWS_PHONE: "Windows Phone" }; var initialData = { isMobile: false, isTablet: false, isBrowser: false, isSmartTV: false, isConsole: false, isWearable: false }; var checkType = function checkType(type) { switch (type) { case DEVICE_TYPES.MOBILE: return { isMobile: true }; case DEVICE_TYPES.TABLET: return { isTablet: true }; case DEVICE_TYPES.SMART_TV: return { isSmartTV: true }; case DEVICE_TYPES.CONSOLE: return { isConsole: true }; case DEVICE_TYPES.WEARABLE: return { isWearable: true }; case DEVICE_TYPES.BROWSER: return { isBrowser: true }; default: return initialData; } }; var broPayload = function broPayload(isBrowser, browser, engine, os, ua) { return { isBrowser: isBrowser, browserMajorVersion: setDefaults(browser.major), browserFullVersion: setDefaults(browser.version), browserName: setDefaults(browser.name), engineName: setDefaults(engine.name), engineVersion: setDefaults(engine.version), osName: setDefaults(os.name), osVersion: setDefaults(os.version), userAgent: setDefaults(ua) }; }; var mobilePayload = function mobilePayload(type, device, os, ua) { return _objectSpread2({}, type, { vendor: setDefaults(device.vendor), model: setDefaults(device.model), os: setDefaults(os.name), osVersion: setDefaults(os.version), ua: setDefaults(ua) }); }; var stvPayload = function stvPayload(isSmartTV, engine, os, ua) { return { isSmartTV: isSmartTV, engineName: setDefaults(engine.name), engineVersion: setDefaults(engine.version), osName: setDefaults(os.name), osVersion: setDefaults(os.version), userAgent: setDefaults(ua) }; }; var consolePayload = function consolePayload(isConsole, engine, os, ua) { return { isConsole: isConsole, engineName: setDefaults(engine.name), engineVersion: setDefaults(engine.version), osName: setDefaults(os.name), osVersion: setDefaults(os.version), userAgent: setDefaults(ua) }; }; var wearPayload = function wearPayload(isWearable, engine, os, ua) { return { isWearable: isWearable, engineName: setDefaults(engine.name), engineVersion: setDefaults(engine.version), osName: setDefaults(os.name), osVersion: setDefaults(os.version), userAgent: setDefaults(ua) }; }; var type = checkType(device.type); function deviceDetect() { var isBrowser = type.isBrowser, isMobile = type.isMobile, isTablet = type.isTablet, isSmartTV = type.isSmartTV, isConsole = type.isConsole, isWearable = type.isWearable; if (isBrowser) { return broPayload(isBrowser, browser, engine, os, ua); } if (isSmartTV) { return stvPayload(isSmartTV, engine, os, ua); } if (isConsole) { return consolePayload(isConsole, engine, os, ua); } if (isMobile) { return mobilePayload(type, device, os, ua); } if (isTablet) { return mobilePayload(type, device, os, ua); } if (isWearable) { return wearPayload(isWearable, engine, os, ua); } } var isMobileType = function isMobileType() { return device.type === DEVICE_TYPES.MOBILE; }; var isTabletType = function isTabletType() { return device.type === DEVICE_TYPES.TABLET; }; var isMobileAndTabletType = function isMobileAndTabletType() { switch (device.type) { case DEVICE_TYPES.MOBILE: case DEVICE_TYPES.TABLET: return true; default: return false; } }; var isSmartTVType = function isSmartTVType() { return device.type === DEVICE_TYPES.SMART_TV; }; var isBrowserType = function isBrowserType() { return device.type === DEVICE_TYPES.BROWSER; }; var isWearableType = function isWearableType() { return device.type === DEVICE_TYPES.WEARABLE; }; var isConsoleType = function isConsoleType() { return device.type === DEVICE_TYPES.CONSOLE; }; var isAndroidType = function isAndroidType() { return os.name === OS_TYPES.ANDROID; }; var isWinPhoneType = function isWinPhoneType() { return os.name === OS_TYPES.WINDOWS_PHONE; }; var isIOSType = function isIOSType() { return os.name === OS_TYPES.IOS; }; var isChromeType = function isChromeType() { return browser.name === BROWSER_TYPES.CHROME; }; var isFirefoxType = function isFirefoxType() { return browser.name === BROWSER_TYPES.FIREFOX; }; var isChromiumType = function isChromiumType() { return browser.name === BROWSER_TYPES.CHROMIUM; }; var isEdgeType = function isEdgeType() { return browser.name === BROWSER_TYPES.EDGE; }; var isYandexType = function isYandexType() { return browser.name === BROWSER_TYPES.YANDEX; }; var isSafariType = function isSafariType() { return browser.name === BROWSER_TYPES.SAFARI || browser.name === BROWSER_TYPES.MOBILE_SAFARI; }; var isMobileSafariType = function isMobileSafariType() { return browser.name === BROWSER_TYPES.MOBILE_SAFARI; }; var isOperaType = function isOperaType() { return browser.name === BROWSER_TYPES.OPERA; }; var isIEType = function isIEType() { return browser.name === BROWSER_TYPES.INTERNET_EXPLORER || browser.name === BROWSER_TYPES.IE; }; var isElectronType = function isElectronType() { var nav = getNavigatorInstance(); var ua = nav && nav.userAgent.toLowerCase(); return typeof ua === 'string' ? /electron/.test(ua) : false; }; var getIOS13 = function getIOS13() { var nav = getNavigatorInstance(); return nav && (/iPad|iPhone|iPod/.test(nav.platform) || nav.platform === 'MacIntel' && nav.maxTouchPoints > 1) && !window.MSStream; }; var getIPad13 = function getIPad13() { return isIOS13Check('iPad'); }; var getIphone13 = function getIphone13() { return isIOS13Check('iPhone'); }; var getIPod13 = function getIPod13() { return isIOS13Check('iPod'); }; var getBrowserFullVersion = function getBrowserFullVersion() { return setDefaults(browser.version); }; var getBrowserVersion = function getBrowserVersion() { return setDefaults(browser.major); }; var getOsVersion = function getOsVersion() { return setDefaults(os.version); }; var getOsName = function getOsName() { return setDefaults(os.name); }; var getBrowserName = function getBrowserName() { return setDefaults(browser.name); }; var getMobileVendor = function getMobileVendor() { return setDefaults(device.vendor); }; var getMobileModel = function getMobileModel() { return setDefaults(device.model); }; var getEngineName = function getEngineName() { return setDefaults(engine.name); }; var getEngineVersion = function getEngineVersion() { return setDefaults(engine.version); }; var getUseragent = function getUseragent() { return setDefaults(ua); }; var getDeviceType = function getDeviceType() { return setDefaults(device.type, 'browser'); }; var isSmartTV = isSmartTVType(); var isConsole = isConsoleType(); var isWearable = isWearableType(); var isMobileSafari = isMobileSafariType(); var isChromium = isChromiumType(); var isMobile = isMobileAndTabletType() || getIPad13(); var isMobileOnly = isMobileType(); var isTablet = isTabletType() || getIPad13(); var isBrowser = isBrowserType(); var isAndroid = isAndroidType(); var isWinPhone = isWinPhoneType(); var isIOS = isIOSType(); var isChrome = isChromeType(); var isFirefox = isFirefoxType(); var isSafari = isSafariType(); var isOpera = isOperaType(); var isIE = isIEType(); var osVersion = getOsVersion(); var osName = getOsName(); var fullBrowserVersion = getBrowserFullVersion(); var browserVersion = getBrowserVersion(); var browserName = getBrowserName(); var mobileVendor = getMobileVendor(); var mobileModel = getMobileModel(); var engineName = getEngineName(); var engineVersion = getEngineVersion(); var getUA = getUseragent(); var isEdge = isEdgeType(); var isYandex = isYandexType(); var deviceType = getDeviceType(); var isIOS13 = getIOS13(); var isIPad13 = getIPad13(); var isIPhone13 = getIphone13(); var isIPod13 = getIPod13(); var isElectron = isElectronType(); var AndroidView = function AndroidView(_ref) { var renderWithFragment = _ref.renderWithFragment, children = _ref.children, viewClassName = _ref.viewClassName, style = _ref.style; return isAndroid ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", { className: viewClassName, style: style }, children) : null; }; var BrowserView = function BrowserView(_ref2) { var renderWithFragment = _ref2.renderWithFragment, children = _ref2.children, viewClassName = _ref2.viewClassName, style = _ref2.style; return isBrowser ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", { className: viewClassName, style: style }, children) : null; }; var IEView = function IEView(_ref3) { var renderWithFragment = _ref3.renderWithFragment, children = _ref3.children, viewClassName = _ref3.viewClassName, style = _ref3.style; return isIE ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", { className: viewClassName, style: style }, children) : null; }; var IOSView = function IOSView(_ref4) { var renderWithFragment = _ref4.renderWithFragment, children = _ref4.children, viewClassName = _ref4.viewClassName, style = _ref4.style; return isIOS ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", { className: viewClassName, style: style }, children) : null; }; var MobileView = function MobileView(_ref5) { var renderWithFragment = _ref5.renderWithFragment, children = _ref5.children, viewClassName = _ref5.viewClassName, style = _ref5.style; return isMobile ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", { className: viewClassName, style: style }, children) : null; }; var TabletView = function TabletView(_ref6) { var renderWithFragment = _ref6.renderWithFragment, children = _ref6.children, viewClassName = _ref6.viewClassName, style = _ref6.style; return isTablet ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", { className: viewClassName, style: style }, children) : null; }; var WinPhoneView = function WinPhoneView(_ref7) { var renderWithFragment = _ref7.renderWithFragment, children = _ref7.children, viewClassName = _ref7.viewClassName, style = _ref7.style; return isWinPhone ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", { className: viewClassName, style: style }, children) : null; }; var MobileOnlyView = function MobileOnlyView(_ref8) { var renderWithFragment = _ref8.renderWithFragment, children = _ref8.children, viewClassName = _ref8.viewClassName, style = _ref8.style; return isMobileOnly ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", { className: viewClassName, style: style }, children) : null; }; var SmartTVView = function SmartTVView(_ref9) { var renderWithFragment = _ref9.renderWithFragment, children = _ref9.children, viewClassName = _ref9.viewClassName, style = _ref9.style; return isSmartTV ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", { className: viewClassName, style: style }, children) : null; }; var ConsoleView = function ConsoleView(_ref10) { var renderWithFragment = _ref10.renderWithFragment, children = _ref10.children, viewClassName = _ref10.viewClassName, style = _ref10.style; return isConsole ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", { className: viewClassName, style: style }, children) : null; }; var WearableView = function WearableView(_ref11) { var renderWithFragment = _ref11.renderWithFragment, children = _ref11.children, viewClassName = _ref11.viewClassName, style = _ref11.style; return isWearable ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", { className: viewClassName, style: style }, children) : null; }; var CustomView = function CustomView(_ref12) { var renderWithFragment = _ref12.renderWithFragment, children = _ref12.children, viewClassName = _ref12.viewClassName, style = _ref12.style, condition = _ref12.condition; return condition ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", { className: viewClassName, style: style }, children) : null; }; function withOrientationChange(WrappedComponent) { return ( /*#__PURE__*/ function (_React$Component) { _inherits(_class, _React$Component); function _class(props) { var _this; _classCallCheck(this, _class); _this = _possibleConstructorReturn(this, _getPrototypeOf(_class).call(this, props)); _this.isEventListenerAdded = false; _this.handleOrientationChange = _this.handleOrientationChange.bind(_assertThisInitialized(_this)); _this.onOrientationChange = _this.onOrientationChange.bind(_assertThisInitialized(_this)); _this.onPageLoad = _this.onPageLoad.bind(_assertThisInitialized(_this)); _this.state = { isLandscape: false, isPortrait: false }; return _this; } _createClass(_class, [{ key: "handleOrientationChange", value: function handleOrientationChange() { if (!this.isEventListenerAdded) { this.isEventListenerAdded = true; } var orientation = window.innerWidth > window.innerHeight ? 90 : 0; this.setState({ isPortrait: orientation === 0, isLandscape: orientation === 90 }); } }, { key: "onOrientationChange", value: function onOrientationChange() { this.handleOrientationChange(); } }, { key: "onPageLoad", value: function onPageLoad() { this.handleOrientationChange(); } }, { key: "componentDidMount", value: function componentDidMount() { if ((typeof window === "undefined" ? "undefined" : _typeof(window)) !== undefined && isMobile) { if (!this.isEventListenerAdded) { this.handleOrientationChange(); window.addEventListener("load", this.onPageLoad, false); } else { window.removeEventListener("load", this.onPageLoad, false); } window.addEventListener("resize", this.onOrientationChange, false); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { window.removeEventListener("resize", this.onOrientationChange, false); } }, { key: "render", value: function render() { return React__default.createElement(WrappedComponent, _extends({}, this.props, { isLandscape: this.state.isLandscape, isPortrait: this.state.isPortrait })); } }]); return _class; }(React__default.Component) ); } exports.AndroidView = AndroidView; exports.BrowserView = BrowserView; exports.ConsoleView = ConsoleView; exports.CustomView = CustomView; exports.IEView = IEView; exports.IOSView = IOSView; exports.MobileOnlyView = MobileOnlyView; exports.MobileView = MobileView; exports.SmartTVView = SmartTVView; exports.TabletView = TabletView; exports.WearableView = WearableView; exports.WinPhoneView = WinPhoneView; exports.browserName = browserName; exports.browserVersion = browserVersion; exports.deviceDetect = deviceDetect; exports.deviceType = deviceType; exports.engineName = engineName; exports.engineVersion = engineVersion; exports.fullBrowserVersion = fullBrowserVersion; exports.getUA = getUA; exports.isAndroid = isAndroid; exports.isBrowser = isBrowser; exports.isChrome = isChrome; exports.isChromium = isChromium; exports.isConsole = isConsole; exports.isEdge = isEdge; exports.isElectron = isElectron; exports.isFirefox = isFirefox; exports.isIE = isIE; exports.isIOS = isIOS; exports.isIOS13 = isIOS13; exports.isIPad13 = isIPad13; exports.isIPhone13 = isIPhone13; exports.isIPod13 = isIPod13; exports.isMobile = isMobile; exports.isMobileOnly = isMobileOnly; exports.isMobileSafari = isMobileSafari; exports.isOpera = isOpera; exports.isSafari = isSafari; exports.isSmartTV = isSmartTV; exports.isTablet = isTablet; exports.isWearable = isWearable; exports.isWinPhone = isWinPhone; exports.isYandex = isYandex; exports.mobileModel = mobileModel; exports.mobileVendor = mobileVendor; exports.osName = osName; exports.osVersion = osVersion; exports.withOrientationChange = withOrientationChange;