react-device-detect
Version:
Detect device type and render your component according to it
782 lines (686 loc) • 22.8 kB
JavaScript
;
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;