UNPKG

@project-sunbird/content-player

Version:

Which renders the contents in both web and devices

344 lines (321 loc) 15.3 kB
var endPage = angular.module("sunbird-endpage",[]); endPage.controller("endPageController", function($scope, $rootScope, $state,$element, $stateParams) { var globalConfig = EkstepRendererAPI.getGlobalConfig(); $scope.showEndPage = false; $rootScope.pageId = "sunbird-player-Endpage"; $scope.pluginManifest = {"id": "org.sunbird.player.endpage", "ver": "1.1"}; $scope.genieIcon; $scope.endpageBackground; $scope.replayIcon; $scope.userScore = undefined; $scope.totalScore = undefined; $scope.templateToRender = undefined; $scope.displayScore = true; $scope.currentPlayer = undefined; $scope.currentPlayerFirstChar = undefined; /** * @property - {Object} which holds previous content of current content */ $scope.previousContent = {}; /** * @property - {Object} which holds next content of current content */ $scope.nextContent = {}; $scope.isCordova = window.cordova ? true : false; $scope.pluginInstance = {}; $scope.arrayToString = function(array) { return (_.isString(array)) ? array : (!_.isEmpty(array) && _.isArray(array)) ? array.join(", ") : ""; }; $scope.setLicense = function(){ $scope.licenseAttribute = $scope.playerMetadata.license || 'Licensed under CC By 4.0 license' }; $scope.setCurrentUser = function() { if($scope.isCordova) { $scope.currentPlayer = (_.has($scope.currentUser,"handle"))? $scope.currentUser.handle : $scope.currentUser.name; } else { $scope.currentPlayer = (_.has(globalConfig.context, "userData")) ? globalConfig.context.userData.firstName : $scope.currentUser.handle; } $scope.currentPlayerFirstChar = $scope.currentPlayer.charAt(0).toUpperCase().slice(0); } $scope.getTotalScore = function(id) { var totalScore = 0, maxScore = 0; var teleEvents = org.ekstep.service.content.getTelemetryEvents(); if (!_.isEmpty(teleEvents) && !_.isUndefined(teleEvents.assess)) { _.forEach(teleEvents.assess, function(value) { if(value.edata.score) { totalScore = totalScore + value.edata.score; } if(value.edata.item.maxscore) { maxScore = maxScore + value.edata.item.maxscore; } else { maxScore = maxScore + 0; } }); $scope.userScore = $scope.convert(totalScore); $scope.totalScore = $scope.convert(maxScore); } }; // Job is to decide which template is assigned in config as part of endpage based on contenttype $scope.checkTemplate = function(contentType) { /* istanbul ignore else */ if (!_.isUndefined(globalConfig.config.endPage)) { // check if endpage Manifest/config exist var endpageManifest = globalConfig.config.endPage; var endpageObj = []; if (!Array.isArray(endpageManifest)) { // check if it a proper Array of Obj, if not convert endpageObj.push(endpageManifest) endpageManifest = endpageObj } _.each(endpageManifest, function(value, key) { // search content type in object and get template /* istanbul ignore else */ if (_.contains(value.contentType, contentType)) { $scope.templateToRender = (value.template).toLowerCase(); } }) } } $scope.replayContent = function() { //Generate Telemetry for redo button TelemetryService.interact("TOUCH", "redo_btn", "TOUCH", { stageId: "ContentApp-EndScreen", subtype: "ContentID" }); if(!isbrowserpreview && $rootScope.enableUserSwitcher && ($rootScope.users.length > 1)) { EkstepRendererAPI.dispatchEvent("event:openUserSwitchingModal", {'logGEEvent': $scope.pluginInstance._isAvailable}); }else if(!$scope.isCordova && content.primaryCategory && content.primaryCategory.toLowerCase() === 'course assessment'){ $scope.replayAssessment(); }else{ $scope.replayCallback(); } }; $scope.replayAssessment = function(){ content.currentAttempt = content.currentAttempt + 1; if (content.maxAttempt <= content.currentAttempt){ window.postMessage('renderer:maxLimitExceeded'); return; }else{ $scope.replayPlayer(); } }; $scope.replayCallback = function(){ if (content.primaryCategory && content.primaryCategory.toLowerCase() === 'course assessment'){ org.ekstep.service.content.checkMaxLimit(content).then(function(response){ if (response.isCloseButtonClicked){ return; } if(response.limitExceeded){ window.postMessage({ event: 'renderer:maxLimitExceeded', data: { } }) } else{ $scope.replayPlayer(); } }); }else{ $scope.replayPlayer(); } }; $scope.replayPlayer = function(){ EkstepRendererAPI.hideEndPage(); EkstepRendererAPI.dispatchEvent('renderer:content:replay'); }; $scope.setTotalTimeSpent = function() { var endEvent = _.filter(TelemetryService._data, function(event) { if (event) { return event.name == "OE_END"; } }) var startTime = endEvent.length > 0 ? endEvent[endEvent.length - 1].startTime : 0; if (startTime) { var totalTime = Math.round((new Date().getTime() - startTime) / 1000); var mm = Math.floor(totalTime / 60); var ss = Math.floor(totalTime % 60); $scope.totalTimeSpent = (mm > 9 ? mm : ("0" + mm)) + ":" + (ss > 9 ? ss : ("0" + ss)); } else { $scope.showFeedbackArea = false; } }; $scope.openGenie = function(){ EkstepRendererAPI.dispatchEvent('renderer:genie:click'); }; $scope.handleEndpage = function() { if(!_.isUndefined($scope.playerMetadata.displayScore)) { $scope.displayScore = $scope.playerMetadata.displayScore; } $scope.scoreDisplayConfig = $scope.playerMetadata.scoreDisplayConfig; !_.isUndefined($scope.playerMetadata.contentType) ? $scope.checkTemplate($scope.playerMetadata.contentType) : ''; $scope.setLicense(); if (_(TelemetryService.instance).isUndefined()) { var otherData = GlobalContext.config.otherData; !_.isUndefined(otherData.cdata) ? correlationData.push(otherData.cdata) : correlationData.push({"id": CryptoJS.MD5(Math.random().toString()).toString(),"type": "ContentSession"}); TelemetryService.init(tsObj._gameData, tsObj._user, correlationData, otherData); } TelemetryService.interact("TOUCH", $rootScope.content.identifier, "TOUCH", { stageId: "ContentApp-EndScreen", subtype: "ContentID" }); setTimeout(function() { $rootScope.$apply(); }, 1000); EkstepRendererAPI.dispatchEvent("renderer:splash:hide"); $scope.setCurrentUser(); $scope.setTotalTimeSpent(); $scope.getTotalScore($rootScope.content.identifier); $scope.getRelevantContent($rootScope.content.identifier); }; /** * @description - which helps to get previous and next content of current content */ $scope.getRelevantContent = function(contentId){ if (!isbrowserpreview) { if(!_.has($scope.previousContent, contentId) && !_.has($scope.nextContent, contentId)){ var requestBody = { "contentIdentifier": contentId, "hierarchyInfo": $rootScope.content.hierarchyInfo, "next": true, "prev": true }; if (window.ionic && window.ionic.Platform.isIOS()){ // Do nothing TODO: IOS - need to right the interfaces console.log('ios') }else { //Call getPreviousAndNextContent function which is present inside interfaceService.js by passing current content-id and user-id org.ekstep.service.content.getRelevantContent(JSON.stringify(requestBody)).then(function(response){ if(response){ $scope.previousContent[contentId] = response.prev; $scope.nextContent[contentId] = response.next; } else{ console.log('Error has occurred'); } }); } } } }; /** * @description - to play next or previous content */ $scope.contentLaunch = function(contentType, contentId) { var eleId = (contentType === 'previous') ? "gc_previousContent" : "gc_nextcontentContent"; TelemetryService.interact("TOUCH", eleId, "TOUCH", { stageId: "ContentApp-EndScreen", plugin: $scope.pluginManifest }, "GE_INTERACT"); var contentToPlay = (contentType === 'previous') ? $scope.previousContent[contentId] : $scope.nextContent[contentId]; var contentMetadata = {}; $scope.checkMaxLimit(contentToPlay, function(response){ if (response && response.isCloseButtonClicked){ return; } else if (response && response.limitExceeded) { window.postMessage({ event: 'renderer:maxLimitExceeded', data: { } }) return; } if (window.cordova && contentToPlay.content && !contentToPlay.content.isCompatible) { window.postMessage({ event: 'renderer:contentNotComaptible', data: { } }); return; } if (contentToPlay.content && contentToPlay.content.trackableParentInfo){ var trackableParentInfo = contentToPlay.content.trackableParentInfo; window.postMessage(JSON.stringify({ event: 'renderer:navigate', data: { identifier: trackableParentInfo.identifier, hierarchyInfo: trackableParentInfo.hierarchyInfo, trackable: 'Yes' } })); return; }else if (contentToPlay.content){ contentMetadata = contentToPlay.content.contentData; _.extend(contentMetadata, _.pick(contentToPlay.content, "hierarchyInfo", "isAvailableLocally", "basePath", "rollup")); contentMetadata.basepath = contentMetadata.basePath; $rootScope.content = window.content = content = contentMetadata; } if(content.mimeType === "video/x-youtube"){ contentToPlay.content.isAvailableLocally = false; } if (contentToPlay.content.isAvailableLocally) { EkstepRendererAPI.hideEndPage(); var object = { 'config': GlobalContext.config, 'data': undefined, 'metadata': contentMetadata } GlobalContext.config = mergeJSON(AppConfig, contentMetadata); window.globalConfig = GlobalContext.config; org.ekstep.contentrenderer.initializePreview(object) EkstepRendererAPI.dispatchEvent('renderer:player:show'); } else { if(contentMetadata.identifier && window.parent.hasOwnProperty('onContentNotFound')) { window.parent.onContentNotFound(contentMetadata.identifier, contentMetadata.hierarchyInfo); } else { console.warn('Content not Available'); } } }); }; $scope.checkMaxLimit = function(contentToPlay, callback) { var contentMetadata = contentToPlay.content.contentData if (contentToPlay.content && contentToPlay.content.primaryCategory.toLowerCase() === 'course assessment'){ org.ekstep.service.content.checkMaxLimit(contentMetadata).then(function(response){ if(response){ callback(response); } else{ console.log('Error has occurred'); callback(false); } }); }else{ callback(false); } } $scope.initEndpage = function() { $rootScope.content = $scope.playerMetadata = content; $scope.genieIcon = EkstepRendererAPI.resolvePluginResource($scope.pluginManifest.id, $scope.pluginManifest.ver, "renderer/assets/home.png"); $scope.scoreIcon = EkstepRendererAPI.resolvePluginResource($scope.pluginManifest.id, $scope.pluginManifest.ver, "renderer/assets/score.svg"); $scope.leftArrowIcon = EkstepRendererAPI.resolvePluginResource($scope.pluginManifest.id, $scope.pluginManifest.ver, "renderer/assets/left-arrow.svg"); $scope.rightArrowIcon = EkstepRendererAPI.resolvePluginResource($scope.pluginManifest.id, $scope.pluginManifest.ver, "renderer/assets/right-arrow.svg"); $scope.clockIcon = EkstepRendererAPI.resolvePluginResource($scope.pluginManifest.id, $scope.pluginManifest.ver, "renderer/assets/clock.svg"); $scope.replayIcon = EkstepRendererAPI.resolvePluginResource($scope.pluginManifest.id, $scope.pluginManifest.ver, "renderer/assets/replay.svg"); $scope.endpageBackground = EkstepRendererAPI.resolvePluginResource($scope.pluginManifest.id, $scope.pluginManifest.ver, "renderer/assets/endpageBackground.png"); $scope.handleEndpage(); }; EkstepRendererAPI.addEventListener('renderer:content:end', function() { $scope.initEndpage(); $scope.safeApply(); }); EkstepRendererAPI.addEventListener('renderer:endpage:show', function() { $scope.showEndPage = true; $scope.initEndpage(); if (document['webkitExitFullscreen']) { document['webkitExitFullscreen'](); } $scope.safeApply(); }); EkstepRendererAPI.addEventListener('renderer:endpage:hide',function() { $scope.showEndPage = false; org.ekstep.service.content.clearTelemetryEvents(); $scope.safeApply(); }); $scope.convert = function(num) { num = num.toString(); //If it's not already a String var index = num.indexOf("."); if(index > 0){ var floatVal = num.slice(index + 1, index + 3) var numSplitVal = num.split('.'); num = numSplitVal[0] + '.'+ floatVal; } return Number(num); //If you need it back as a Number }; });