@robotical/webapp-types 3.16.13 → 3.16.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -41,6 +41,7 @@ import { RaftConnEvent, RaftPublishEvent, } from "@robotical/raftjs";
41
41
  import Logger from "../../services/logger/Logger";
42
42
  import randomHashGenerator from "../../utils/helpers/randomHashGenerator";
43
43
  import { addRobotNameToSerialNumber, isSerialNumberRegistered } from "../../utils/warranty-service/warranty-service-utils";
44
+ import { buildAnalyticsDeviceInfo } from "../../utils/analytics-device-info";
44
45
  var SHOW_LOGS = true;
45
46
  var TAG = "RAFT";
46
47
  var RAFT = /** @class */ (function () {
@@ -340,10 +341,11 @@ var RAFT = /** @class */ (function () {
340
341
  return [3 /*break*/, 6];
341
342
  case 1:
342
343
  new Promise(function (resolve) { return __awaiter(_this, void 0, void 0, function () {
343
- var robotId, raftType, raftName, raftSerialNumber, deviceInfo, sessionId, deviceId;
344
+ var robotId, raftType, raftName, raftSerialNumber, deviceInfo, _a, sessionId, deviceId, analyticsDeviceInfo, analyticsFacade;
344
345
  var _this = this;
345
- return __generator(this, function (_a) {
346
- switch (_a.label) {
346
+ var _b;
347
+ return __generator(this, function (_c) {
348
+ switch (_c.label) {
347
349
  case 0:
348
350
  robotId = this.id;
349
351
  raftType = this.type;
@@ -357,15 +359,24 @@ var RAFT = /** @class */ (function () {
357
359
  });
358
360
  window.applicationManager.AnalyticsFacade.setRaftType(raftType);
359
361
  window.applicationManager.AnalyticsFacade.setRobotId(robotId);
360
- if (!!window.applicationManager.analyticsSessionId) return [3 /*break*/, 2];
361
- return [4 /*yield*/, window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.GET_DEVICE_INFO, {})];
362
- case 1:
363
- deviceInfo = _a.sent();
362
+ if (!!window.applicationManager.analyticsSessionId) return [3 /*break*/, 4];
363
+ if (!((_b = window.applicationManager.deviceInfo) !== null && _b !== void 0)) return [3 /*break*/, 1];
364
+ _a = _b;
365
+ return [3 /*break*/, 3];
366
+ case 1: return [4 /*yield*/, window.wrapperCommunicator.sendMessageAndWait(AppSentMessage.GET_DEVICE_INFO, {})];
367
+ case 2:
368
+ _a = _c.sent();
369
+ _c.label = 3;
370
+ case 3:
371
+ deviceInfo = _a;
372
+ window.applicationManager.deviceInfo = deviceInfo;
364
373
  sessionId = randomHashGenerator();
365
374
  deviceId = deviceInfo.deviceId;
366
- window.applicationManager.AnalyticsFacade.startSession(sessionId, deviceId, robotId, raftType);
367
- _a.label = 2;
368
- case 2:
375
+ analyticsDeviceInfo = buildAnalyticsDeviceInfo(deviceInfo);
376
+ analyticsFacade = window.applicationManager.AnalyticsFacade;
377
+ analyticsFacade.startSession(sessionId, deviceId, robotId, raftType, analyticsDeviceInfo);
378
+ _c.label = 4;
379
+ case 4:
369
380
  resolve(void 0);
370
381
  return [2 /*return*/];
371
382
  }
@@ -0,0 +1,15 @@
1
+ import { UserDeviceInfo } from "../types/userDeviceInfo";
2
+ export type AnalyticsAppRuntimeValue = "web-app" | "phone-app" | "unknown";
3
+ export type AnalyticsDeviceFormFactorValue = "desktop" | "tablet" | "phone" | "unknown";
4
+ export type AnalyticsDevicePlatformValue = "web-desktop" | "web-tablet" | "web-phone" | "ipad" | "ios-phone" | "android-tablet" | "android-phone" | "unknown";
5
+ export type AnalyticsDeviceInfoPayload = {
6
+ runtime: AnalyticsAppRuntimeValue;
7
+ platform: AnalyticsDevicePlatformValue;
8
+ formFactor: AnalyticsDeviceFormFactorValue;
9
+ osName: string;
10
+ osVersionMajor?: string;
11
+ browserName?: string;
12
+ browserVersionMajor?: string;
13
+ appVersion?: string;
14
+ };
15
+ export declare function buildAnalyticsDeviceInfo(deviceInfo: Partial<UserDeviceInfo> | undefined, runningInPhoneApp?: boolean): AnalyticsDeviceInfoPayload;
@@ -0,0 +1,110 @@
1
+ import isPhoneApp from "./phone-app-communication/is-phone-app";
2
+ var UNKNOWN_OS_NAME = "Unknown";
3
+ export function buildAnalyticsDeviceInfo(deviceInfo, runningInPhoneApp) {
4
+ if (runningInPhoneApp === void 0) { runningInPhoneApp = isPhoneApp(); }
5
+ var runtime = runningInPhoneApp ? "phone-app" : "web-app";
6
+ var osName = normalizeOSName(deviceInfo === null || deviceInfo === void 0 ? void 0 : deviceInfo.systemName);
7
+ var isTablet = (deviceInfo === null || deviceInfo === void 0 ? void 0 : deviceInfo.isTablet) === true;
8
+ var platform = getDevicePlatform(runtime, osName, isTablet);
9
+ var formFactor = getFormFactor(platform, isTablet);
10
+ var parsedBrowser = runtime === "web-app" ? parseBrowser(deviceInfo === null || deviceInfo === void 0 ? void 0 : deviceInfo.version) : {};
11
+ return removeUndefinedFields({
12
+ runtime: runtime,
13
+ platform: platform,
14
+ formFactor: formFactor,
15
+ osName: osName,
16
+ osVersionMajor: parseMajorVersion(deviceInfo === null || deviceInfo === void 0 ? void 0 : deviceInfo.systemVersion),
17
+ browserName: parsedBrowser.browserName,
18
+ browserVersionMajor: parsedBrowser.browserVersionMajor,
19
+ appVersion: normalizeOptionalString(deviceInfo === null || deviceInfo === void 0 ? void 0 : deviceInfo.appVersion),
20
+ });
21
+ }
22
+ function getDevicePlatform(runtime, osName, isTablet) {
23
+ var isIOS = osName === "iOS" || osName === "iPadOS";
24
+ var isAndroid = osName === "Android";
25
+ if (runtime === "phone-app") {
26
+ if (isIOS && isTablet)
27
+ return "ipad";
28
+ if (isIOS)
29
+ return "ios-phone";
30
+ if (isAndroid && isTablet)
31
+ return "android-tablet";
32
+ if (isAndroid)
33
+ return "android-phone";
34
+ return "unknown";
35
+ }
36
+ if (runtime === "web-app") {
37
+ if (isTablet)
38
+ return "web-tablet";
39
+ if (isIOS || isAndroid)
40
+ return "web-phone";
41
+ if (osName === "Windows" || osName === "MacOS" || osName === "Linux")
42
+ return "web-desktop";
43
+ return "unknown";
44
+ }
45
+ return "unknown";
46
+ }
47
+ function getFormFactor(platform, isTablet) {
48
+ if (platform === "web-desktop")
49
+ return "desktop";
50
+ if (platform === "web-tablet" || platform === "ipad" || platform === "android-tablet")
51
+ return "tablet";
52
+ if (platform === "web-phone" || platform === "ios-phone" || platform === "android-phone")
53
+ return "phone";
54
+ if (isTablet)
55
+ return "tablet";
56
+ return "unknown";
57
+ }
58
+ function normalizeOSName(value) {
59
+ var normalized = normalizeOptionalString(value);
60
+ if (!normalized)
61
+ return UNKNOWN_OS_NAME;
62
+ var lower = normalized.toLowerCase();
63
+ if (lower.includes("ipad"))
64
+ return "iPadOS";
65
+ if (lower.includes("ios") || lower.includes("iphone"))
66
+ return "iOS";
67
+ if (lower.includes("android"))
68
+ return "Android";
69
+ if (lower.includes("windows"))
70
+ return "Windows";
71
+ if (lower.includes("mac"))
72
+ return "MacOS";
73
+ if (lower.includes("linux"))
74
+ return "Linux";
75
+ return normalized;
76
+ }
77
+ function parseMajorVersion(value) {
78
+ var normalized = normalizeOptionalString(value);
79
+ var match = normalized === null || normalized === void 0 ? void 0 : normalized.match(/\d+/);
80
+ return match === null || match === void 0 ? void 0 : match[0];
81
+ }
82
+ function parseBrowser(value) {
83
+ var normalized = normalizeOptionalString(value);
84
+ if (!normalized || normalized.toLowerCase() === "unknown browser") {
85
+ return {};
86
+ }
87
+ var match = normalized.match(/^([a-z]+)[\s/]+(\d+)/i);
88
+ if (!match) {
89
+ return {};
90
+ }
91
+ return {
92
+ browserName: match[1].toLowerCase(),
93
+ browserVersionMajor: match[2],
94
+ };
95
+ }
96
+ function normalizeOptionalString(value) {
97
+ if (typeof value !== "string")
98
+ return undefined;
99
+ var trimmed = value.trim();
100
+ return trimmed.length > 0 ? trimmed : undefined;
101
+ }
102
+ function removeUndefinedFields(value) {
103
+ return Object.entries(value).reduce(function (acc, _a) {
104
+ var key = _a[0], entryValue = _a[1];
105
+ if (entryValue !== undefined) {
106
+ acc[key] = entryValue;
107
+ }
108
+ return acc;
109
+ }, {});
110
+ }
@@ -1,4 +1,4 @@
1
1
  export declare const getOrGenerateDeviceId: () => string;
2
- export declare const getOSName: () => "Windows" | "MacOS" | "Linux" | "Android" | "iOS" | "Unknown OS";
2
+ export declare const getOSName: () => "Windows" | "Android" | "iOS" | "MacOS" | "Linux" | "Unknown OS";
3
3
  export declare const getBrowserVersion: () => string;
4
4
  export declare const isTablet: () => boolean;
@@ -13,16 +13,17 @@ export var getOrGenerateDeviceId = function () {
13
13
  };
14
14
  export var getOSName = function () {
15
15
  var userAgent = navigator.userAgent;
16
+ var isIPadOSBrowser = navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1;
16
17
  if (userAgent.includes("Windows"))
17
18
  return "Windows";
19
+ if (userAgent.includes("Android"))
20
+ return "Android";
21
+ if (/iPad|iPhone|iPod/i.test(userAgent) || userAgent.includes("like Mac") || isIPadOSBrowser)
22
+ return "iOS";
18
23
  if (userAgent.includes("Mac"))
19
24
  return "MacOS";
20
25
  if (userAgent.includes("Linux"))
21
26
  return "Linux";
22
- if (userAgent.includes("Android"))
23
- return "Android";
24
- if (userAgent.includes("like Mac"))
25
- return "iOS";
26
27
  return "Unknown OS";
27
28
  };
28
29
  export var getBrowserVersion = function () {
@@ -31,5 +32,6 @@ export var getBrowserVersion = function () {
31
32
  return match[1] ? "".concat(match[1], " ").concat(match[2]) : "Unknown Browser";
32
33
  };
33
34
  export var isTablet = function () {
34
- return /iPad|Tablet|Android(?!.*Mobile)/i.test(navigator.userAgent);
35
+ var isIPadOSBrowser = navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1;
36
+ return isIPadOSBrowser || /iPad|Tablet|Android(?!.*Mobile)/i.test(navigator.userAgent);
35
37
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robotical/webapp-types",
3
- "version": "3.16.13",
3
+ "version": "3.16.15",
4
4
  "description": "Type definitions for the Application Manager",
5
5
  "main": "dist/application-manager.d.ts",
6
6
  "types": "dist/application-manager.d.ts",