{"version":3,"file":"layout-BLMAaBU7.js","sources":["../../src/generated/models/EngagementTrackingRequest.ts","../../src/generated/apis/EngagementApi.ts","../../src/models/content/ContentTypes.ts","../../src/services/engagementTracking/EngagementTrackingService.ts"],"sourcesContent":["/* tslint:disable */\n/* eslint-disable */\n/**\n * iCEV.SourceGen.App\n * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)\n *\n * The version of the OpenAPI document: 1.0\n * \n *\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\n\nimport { mapValues } from '../runtime';\n/**\n * \n * @export\n * @interface EngagementTrackingRequest\n */\nexport interface EngagementTrackingRequest {\n /**\n * \n * @type {string}\n * @memberof EngagementTrackingRequest\n */\n sessionId: string;\n /**\n * \n * @type {number}\n * @memberof EngagementTrackingRequest\n */\n teacherCourseId: number | null;\n /**\n * \n * @type {number}\n * @memberof EngagementTrackingRequest\n */\n lessonId: number | null;\n /**\n * \n * @type {number}\n * @memberof EngagementTrackingRequest\n */\n contentId: number | null;\n /**\n * \n * @type {number}\n * @memberof EngagementTrackingRequest\n */\n contentTypeId: number | null;\n /**\n * \n * @type {string}\n * @memberof EngagementTrackingRequest\n */\n startTime: string;\n /**\n * \n * @type {string}\n * @memberof EngagementTrackingRequest\n */\n endTime: string;\n /**\n * \n * @type {string}\n * @memberof EngagementTrackingRequest\n */\n quantityUOM: string | null;\n}\n\n/**\n * Check if a given object implements the EngagementTrackingRequest interface.\n */\nexport function instanceOfEngagementTrackingRequest(value: object): value is EngagementTrackingRequest {\n if (!('sessionId' in value) || value['sessionId'] === undefined) return false;\n if (!('teacherCourseId' in value) || value['teacherCourseId'] === undefined) return false;\n if (!('lessonId' in value) || value['lessonId'] === undefined) return false;\n if (!('contentId' in value) || value['contentId'] === undefined) return false;\n if (!('contentTypeId' in value) || value['contentTypeId'] === undefined) return false;\n if (!('startTime' in value) || value['startTime'] === undefined) return false;\n if (!('endTime' in value) || value['endTime'] === undefined) return false;\n if (!('quantityUOM' in value) || value['quantityUOM'] === undefined) return false;\n return true;\n}\n\nexport function EngagementTrackingRequestFromJSON(json: any): EngagementTrackingRequest {\n return EngagementTrackingRequestFromJSONTyped(json, false);\n}\n\nexport function EngagementTrackingRequestFromJSONTyped(json: any, ignoreDiscriminator: boolean): EngagementTrackingRequest {\n if (json == null) {\n return json;\n }\n return {\n \n 'sessionId': json['sessionId'],\n 'teacherCourseId': json['teacherCourseId'],\n 'lessonId': json['lessonId'],\n 'contentId': json['contentId'],\n 'contentTypeId': json['contentTypeId'],\n 'startTime': json['startTime'],\n 'endTime': json['endTime'],\n 'quantityUOM': json['quantityUOM'],\n };\n}\n\nexport function EngagementTrackingRequestToJSON(value?: EngagementTrackingRequest | null): any {\n if (value == null) {\n return value;\n }\n return {\n \n 'sessionId': value['sessionId'],\n 'teacherCourseId': value['teacherCourseId'],\n 'lessonId': value['lessonId'],\n 'contentId': value['contentId'],\n 'contentTypeId': value['contentTypeId'],\n 'startTime': value['startTime'],\n 'endTime': value['endTime'],\n 'quantityUOM': value['quantityUOM'],\n };\n}\n\n","/* tslint:disable */\r\n/* eslint-disable */\r\n/**\n * iCEV.SourceGen.App\n * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)\n *\n * The version of the OpenAPI document: 1.0\n * \n *\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\n\r\n\r\nimport * as runtime from '../runtime';\r\nimport type { EngagementTrackingRequest } from '../models/EngagementTrackingRequest';\r\n\r\nimport { EngagementTrackingRequestFromJSON, EngagementTrackingRequestToJSON } from '../models/EngagementTrackingRequest';\r\n\r\nexport interface TrackRequest {\r\n engagementTrackingRequest?: EngagementTrackingRequest;\r\n}\r\n\r\n/**\r\n * \r\n */\r\nexport class EngagementApi extends runtime.BaseAPI {\r\n\r\n /**\r\n */\r\n async trackRaw(requestParameters: TrackRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> {\r\n const queryParameters: any = {};\r\n\r\n const headerParameters: runtime.HTTPHeaders = {};\r\n\r\n headerParameters['Content-Type'] = 'application/json';\r\n\r\n const response = await this.request({\r\n path: `/api/engagement/track`,\r\n method: 'POST',\r\n headers: headerParameters,\r\n query: queryParameters,\r\n body: EngagementTrackingRequestToJSON(requestParameters['engagementTrackingRequest']),\r\n }, initOverrides);\r\n\r\n return new runtime.VoidApiResponse(response);\r\n }\r\n\r\n /**\r\n */\r\n async track(engagementTrackingRequest?: EngagementTrackingRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise {\r\n await this.trackRaw({ engagementTrackingRequest: engagementTrackingRequest }, initOverrides);\r\n }\r\n\r\n}\r\n","enum ContentTypes {\r\n Asset = 1,\r\n InteractiveAsset = 2,\r\n VideoPlaylist = 3,\r\n Test = 4,\r\n Certification = 5,\r\n TeacherCourseAssessment = 6\r\n}\r\n\r\nexport default ContentTypes;\r\n","import { EngagementApi } from \"@icev/app-scripts/generated/apis/EngagementApi\";\r\nimport type { EngagementTrackingRequest } from \"@icev/app-scripts/generated/models/EngagementTrackingRequest\";\r\nimport ContentTypes from \"@icev/app-scripts/models/content/ContentTypes\";\r\n\r\nconst ENGAGEMENT_SUBMIT_INTERVAL = 60000; // 1 minute\r\nconst ENGAGEMENT_TIMEOUT_INTERVAL = 900000; // 15 minutes\r\nconst UOM_MINUTES = \"Minutes\";\r\nconst UOM_COUNT = \"Count\";\r\n\r\nexport default class EngagementTrackingService {\r\n sessionId?: string;\r\n lastSubmitTime?: Date;\r\n tabActive = !document.hidden;\r\n\r\n constructor() {\r\n this.sessionId = sessionStorage.getItem(\"sessionId\") ?? undefined;\r\n if (this.sessionId === undefined) {\r\n this.sessionId = crypto.randomUUID();\r\n sessionStorage.setItem(\"sessionId\", this.sessionId);\r\n }\r\n this.lastSubmitTime = new Date(sessionStorage.getItem(\"lastSubmitTime\") ?? new Date().toISOString());\r\n }\r\n\r\n async beginTracking() {\r\n console.log(\"Engagement Tracking has begun\");\r\n setTimeout(\r\n () => {\r\n this.submit();\r\n setInterval(() => {\r\n if (this.tabActive) {\r\n this.submit();\r\n }\r\n }, ENGAGEMENT_SUBMIT_INTERVAL);\r\n },\r\n ENGAGEMENT_SUBMIT_INTERVAL - (new Date().getTime() - this.lastSubmitTime!.getTime())\r\n );\r\n\r\n document.addEventListener(\"visibilitychange\", () => {\r\n this.tabActive = !document.hidden;\r\n if (this.tabActive) {\r\n this.lastSubmitTime = new Date();\r\n sessionStorage.setItem(\"lastSubmitTime\", this.lastSubmitTime.toISOString());\r\n } else {\r\n this.submit();\r\n }\r\n });\r\n }\r\n\r\n private async submit() {\r\n const newSubmitTime = new Date();\r\n if (window.engagementTracking?.teacherCourseId && this.lastSubmitTime!.getTime() - newSubmitTime.getTime() < ENGAGEMENT_TIMEOUT_INTERVAL) {\r\n if (!window.engagementTracking?.contentId || !window.engagementTracking?.contentTypeId) {\r\n window.engagementTracking.contentId = undefined;\r\n window.engagementTracking.contentTypeId = undefined;\r\n }\r\n const request: EngagementTrackingRequest = {\r\n sessionId: this.sessionId!,\r\n teacherCourseId: window.engagementTracking?.teacherCourseId,\r\n lessonId: window.engagementTracking?.lessonId ?? null,\r\n contentId: window.engagementTracking?.contentId ?? null,\r\n contentTypeId: window.engagementTracking?.contentTypeId ?? null,\r\n startTime: this.lastSubmitTime!.toISOString(),\r\n endTime: newSubmitTime.toISOString(),\r\n quantityUOM: UOM_MINUTES\r\n };\r\n const engagementApi = new EngagementApi();\r\n await engagementApi.track(request);\r\n }\r\n this.lastSubmitTime = newSubmitTime;\r\n sessionStorage.setItem(\"lastSubmitTime\", newSubmitTime.toISOString());\r\n }\r\n\r\n async trackAssetAccess(contentId: number, contentTypeId: number) {\r\n if (window.engagementTracking?.teacherCourseId && contentId && contentTypeId) {\r\n const date = new Date().toISOString();\r\n const request: EngagementTrackingRequest = {\r\n sessionId: this.sessionId!,\r\n teacherCourseId: window.engagementTracking?.teacherCourseId,\r\n lessonId: window.engagementTracking?.lessonId ?? null,\r\n contentId: contentId,\r\n contentTypeId: contentTypeId,\r\n startTime: date,\r\n endTime: date,\r\n quantityUOM: UOM_COUNT\r\n };\r\n const engagementApi = new EngagementApi();\r\n await engagementApi.track(request);\r\n }\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n engagementTracking: {\r\n sessionId?: string;\r\n teacherCourseId?: number;\r\n lessonId?: number;\r\n contentId?: number;\r\n contentTypeId?: number;\r\n trackAssetAccess?: (contentId: number, contentTypeId: number) => void;\r\n };\r\n ContentTypes: typeof ContentTypes;\r\n }\r\n}\r\n\r\nwindow.engagementTracking = window.engagementTracking ?? {};\r\nwindow.ContentTypes = ContentTypes;\r\n\r\n(() => {\r\n const engagementTracking = new EngagementTrackingService();\r\n engagementTracking.beginTracking();\r\n window.engagementTracking.sessionId = engagementTracking.sessionId;\r\n window.engagementTracking.trackAssetAccess = engagementTracking.trackAssetAccess;\r\n})();\r\n"],"names":["EngagementTrackingRequestToJSON","value","EngagementApi","runtime","trackRaw","requestParameters","initOverrides","queryParameters","headerParameters","response","request","path","method","headers","query","body","track","engagementTrackingRequest","ContentTypes","Asset","InteractiveAsset","VideoPlaylist","Test","Certification","TeacherCourseAssessment","ENGAGEMENT_SUBMIT_INTERVAL","ENGAGEMENT_TIMEOUT_INTERVAL","UOM_MINUTES","UOM_COUNT","EngagementTrackingService","constructor","tabActive","document","hidden","sessionId","sessionStorage","getItem","undefined","crypto","randomUUID","setItem","lastSubmitTime","Date","toISOString","beginTracking","console","log","setTimeout","submit","setInterval","getTime","addEventListener","newSubmitTime","window","engagementTracking","teacherCourseId","contentId","contentTypeId","lessonId","startTime","endTime","quantityUOM","engagementApi","trackAssetAccess","date"],"mappings":"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"}