From dca192b5e395c5fd81c49ff80c81a671a28ce59b Mon Sep 17 00:00:00 2001 From: subranil Date: Tue, 7 Jul 2020 18:20:08 +0530 Subject: [PATCH] Issue #SB-31 feat: added test-suites for telemetry changes --- src/app/app.component.ts | 1 + .../create-edit-group.page.spec.ts | 37 +++++++++++- .../create-edit-group.page.ts | 60 ++++++++++++++++++- .../group-details/group-details.page.spec.ts | 48 +++++++++++++-- .../group-details/group-details.page.ts | 13 +++- src/app/my-groups/my-groups.page.spec.ts | 52 ++++++++++++++-- src/app/my-groups/my-groups.page.ts | 59 +++++++++++++++++- src/app/resources/resources.component.ts | 7 ++- src/services/telemetry-constants.ts | 26 ++++++-- 9 files changed, 276 insertions(+), 27 deletions(-) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 37abea083f..4e344f555a 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -670,6 +670,7 @@ export class AppComponent implements OnInit, AfterViewInit { || (routeUrl.indexOf(RouterLinks.PERMISSION) !== -1) || (routeUrl.indexOf(RouterLinks.LANGUAGE_SETTING) !== -1) || (routeUrl.indexOf(RouterLinks.SHARE_USER_AND_GROUPS) !== -1) + || (routeUrl.indexOf(RouterLinks.MY_GROUPS) !== -1) ) { this.headerService.sidebarEvent($event); return; diff --git a/src/app/my-groups/create-edit-group/create-edit-group.page.spec.ts b/src/app/my-groups/create-edit-group/create-edit-group.page.spec.ts index 5fe06fa9ce..3807d6ee36 100644 --- a/src/app/my-groups/create-edit-group/create-edit-group.page.spec.ts +++ b/src/app/my-groups/create-edit-group/create-edit-group.page.spec.ts @@ -7,7 +7,15 @@ import { CommonUtilService } from '@app/services/common-util.service'; import { AppHeaderService } from '@app/services/app-header.service'; import { Location } from '@angular/common'; import { of, throwError } from 'rxjs'; -import { UtilityService } from '../../../services'; +import { + Environment, ID, + ImpressionSubtype, + ImpressionType, + InteractType, + PageId, + TelemetryGeneratorService, + UtilityService +} from '../../../services'; describe('CreateEditGroupPage', () => { let createEditGroupPage: CreateEditGroupPage; @@ -28,6 +36,7 @@ describe('CreateEditGroupPage', () => { const mockPlatform: Partial = { }; const mockTranslate: Partial = {}; + const mockTelemetryGeneratorService: Partial = {}; beforeAll(() => { createEditGroupPage = new CreateEditGroupPage( @@ -39,7 +48,8 @@ describe('CreateEditGroupPage', () => { mockLocation as Location, mockPlatform as Platform, mockAlertCtrl as AlertController, - mockUtilityService as UtilityService + mockUtilityService as UtilityService, + mockTelemetryGeneratorService as TelemetryGeneratorService ); }); @@ -73,9 +83,13 @@ describe('CreateEditGroupPage', () => { } as any; mockAlertCtrl.getTop = jest.fn(() => undefined); mockLocation.back = jest.fn(); + mockTelemetryGeneratorService.generateBackClickedTelemetry = jest.fn(); createEditGroupPage.handleBackButtonEvents(); setTimeout(() => { expect(mockPlatform.backButton).not.toBeUndefined(); + expect(mockTelemetryGeneratorService.generateBackClickedTelemetry).toHaveBeenCalledWith( + PageId.CREATE_GROUP, Environment.GROUP, false + ); done(); }, 0); }); @@ -83,13 +97,32 @@ describe('CreateEditGroupPage', () => { it('should return headers with backButton', () => { mockHeaderService.showHeaderWithBackButton = jest.fn(); + const data = jest.fn((fn => fn({name: 'sample-event'}))); + mockHeaderService.headerEventEmitted$ = { + subscribe: data + } as any; jest.spyOn(createEditGroupPage, 'handleBackButtonEvents').mockImplementation(() => { return; }); mockCommonUtilService.getAppName = jest.fn(() => Promise.resolve('Sunbird')); + mockTelemetryGeneratorService.generateImpressionTelemetry = jest.fn(); + mockTelemetryGeneratorService.generateInteractTelemetry = jest.fn(); createEditGroupPage.ionViewWillEnter(); expect(mockHeaderService.showHeaderWithBackButton).toHaveBeenCalled(); expect(mockCommonUtilService.getAppName).toHaveBeenCalled(); + expect(mockTelemetryGeneratorService.generateImpressionTelemetry).toHaveBeenCalledWith( + ImpressionType.VIEW, ImpressionSubtype.CREATE_GROUP_FORM, PageId.CREATE_GROUP, Environment.GROUP); + expect(mockTelemetryGeneratorService.generateInteractTelemetry).toHaveBeenCalledWith( + InteractType.INITIATED, + '', + Environment.GROUP, + PageId.CREATE_GROUP, + undefined, + undefined, + undefined, + undefined, + ID.CREATE_GROUP + ); }); describe('ionViewWillLeave', () => { diff --git a/src/app/my-groups/create-edit-group/create-edit-group.page.ts b/src/app/my-groups/create-edit-group/create-edit-group.page.ts index 1e08ddae22..b3ffbeb6d1 100644 --- a/src/app/my-groups/create-edit-group/create-edit-group.page.ts +++ b/src/app/my-groups/create-edit-group/create-edit-group.page.ts @@ -11,6 +11,8 @@ import { AppHeaderService } from '@app/services/app-header.service'; import { Location } from '@angular/common'; import { UtilityService } from '@app/services'; import { RouterLinks } from '@app/app/app.constant'; +import {Environment, ID, ImpressionSubtype, ImpressionType, InteractType, PageId, + TelemetryGeneratorService, InteractSubtype} from '@app/services'; @Component({ selector: 'app-create-edit-group', @@ -24,7 +26,6 @@ export class CreateEditGroupPage { createGroupForm: FormGroup; backButtonFunc: Subscription; hasFilledLocation = false; - errorMessages = { groupName: { message: 'GROUP_NAME_IS_REQUIRED' @@ -33,6 +34,7 @@ export class CreateEditGroupPage { message: 'GROUP_TERMS_IS_REQUIRED' } }; + headerObservable: Subscription; constructor( @Inject('GROUP_SERVICE') public groupService: GroupService, @@ -43,18 +45,45 @@ export class CreateEditGroupPage { private location: Location, private platform: Platform, private alertCtrl: AlertController, - private utilityService: UtilityService + private utilityService: UtilityService, + private telemetryGeneratorService: TelemetryGeneratorService ) { this.initializeForm(); } ionViewWillEnter() { this.headerService.showHeaderWithBackButton(); + + this.headerObservable = this.headerService.headerEventEmitted$.subscribe(eventName => { + this.handleHeaderEvents(eventName); + }); + this.handleBackButtonEvents(); this.commonUtilService.getAppName().then((res) => { this.appName = res; }); + + this.telemetryGeneratorService.generateImpressionTelemetry + (ImpressionType.VIEW, ImpressionSubtype.CREATE_GROUP_FORM, PageId.CREATE_GROUP, Environment.GROUP); + + this.telemetryGeneratorService.generateInteractTelemetry( + InteractType.INITIATED, + '', + Environment.GROUP, + PageId.CREATE_GROUP, + undefined, + undefined, + undefined, + undefined, + ID.CREATE_GROUP + ); } ionViewWillLeave() { + this.commonUtilService.getAppName().then((res) => { this.appName = res; }); + + if (this.headerObservable) { + this.headerObservable.unsubscribe(); + } + if (this.backButtonFunc) { this.backButtonFunc.unsubscribe(); } @@ -66,6 +95,7 @@ export class CreateEditGroupPage { if (activePortal) { activePortal.dismiss(); } else { + this.telemetryGeneratorService.generateBackClickedTelemetry(PageId.CREATE_GROUP, Environment.GROUP, false); this.location.back(); } }); @@ -102,6 +132,17 @@ export class CreateEditGroupPage { this.groupService.create(groupCreateRequest).toPromise().then(async (res) => { await loader.dismiss(); this.commonUtilService.showToast('GROUP_CREATED'); + this.telemetryGeneratorService.generateInteractTelemetry( + InteractType.SUCCESS, + '', + Environment.GROUP, + PageId.CREATE_GROUP, + undefined, + undefined, + undefined, + undefined, + ID.CREATE_GROUP + ); this.location.back(); }).catch(async (err) => { console.error(err); @@ -111,7 +152,12 @@ export class CreateEditGroupPage { } async openTermsOfUse() { - // this.generateInteractTelemetry(InteractType.TOUCH, InteractSubtype.TERMS_OF_USE_CLICKED); + this.telemetryGeneratorService.generateInteractTelemetry( + InteractType.TOUCH, + InteractSubtype.TERMS_OF_USE_CLICKED, + Environment.GROUP, + PageId.CREATE_GROUP + ); const baseUrl = await this.utilityService.getBuildConfigValue('TOU_BASE_URL'); const url = baseUrl + RouterLinks.TERM_OF_USE; const options @@ -120,4 +166,12 @@ export class CreateEditGroupPage { (window as any).cordova.InAppBrowser.open(url, '_blank', options); } + handleHeaderEvents($event) { + switch ($event.name) { + case 'back': + this.telemetryGeneratorService.generateBackClickedTelemetry(PageId.CREATE_GROUP, Environment.GROUP, true); + this.location.back(); + break; + } + } } diff --git a/src/app/my-groups/group-details/group-details.page.spec.ts b/src/app/my-groups/group-details/group-details.page.spec.ts index b2757f5227..2f7b069630 100644 --- a/src/app/my-groups/group-details/group-details.page.spec.ts +++ b/src/app/my-groups/group-details/group-details.page.spec.ts @@ -1,6 +1,12 @@ import { GroupDetailsPage } from './group-details.page'; import { GroupService } from '@project-sunbird/sunbird-sdk'; -import { AppHeaderService, FormAndFrameworkUtilService, CommonUtilService, AppGlobalService } from '../../../services'; +import { + AppHeaderService, + FormAndFrameworkUtilService, + CommonUtilService, + AppGlobalService, + TelemetryGeneratorService, ImpressionType, PageId, Environment, InteractType, InteractSubtype +} from '../../../services'; import { Router } from '@angular/router'; import { Platform, PopoverController } from '@ionic/angular'; import { FilterPipe } from '@app/pipes/filter/filter.pipe'; @@ -30,6 +36,7 @@ describe('GroupDetailsPage', () => { } })) as any }; + const mockTelemetryGeneratorService: Partial = {}; beforeAll(() => { groupDetailsPage = new GroupDetailsPage( @@ -42,7 +49,8 @@ describe('GroupDetailsPage', () => { mockPopoverCtrl as PopoverController, mockFormAndFrameworkUtilService as FormAndFrameworkUtilService, mockCommonUtilService as CommonUtilService, - mockFilterPipe as FilterPipe + mockFilterPipe as FilterPipe, + mockTelemetryGeneratorService as TelemetryGeneratorService ); }); @@ -93,7 +101,7 @@ describe('GroupDetailsPage', () => { expect(data.name).toBe('back'); }); - it('should returu header with back button', (done) => { + it('should return header with back button', (done) => { mockHeaderService.showHeaderWithBackButton = jest.fn(); mockHeaderService.headerEventEmitted$ = of({ subscribe: jest.fn(() => ({ @@ -108,10 +116,17 @@ describe('GroupDetailsPage', () => { }); mockGroupService.getById = jest.fn(() => of({ groupId: 'sample-group-id', members: [] })) as any; // act + mockTelemetryGeneratorService.generateImpressionTelemetry = jest.fn(); groupDetailsPage.ionViewWillEnter(); // assert expect(mockHeaderService.showHeaderWithBackButton).toHaveBeenCalled(); expect(mockHeaderService.headerEventEmitted$).not.toBeUndefined(); + expect(mockTelemetryGeneratorService.generateImpressionTelemetry).toHaveBeenCalledWith( + ImpressionType.VIEW, + '', + PageId.GROUP_DETAIL, + Environment.GROUP + ); setTimeout(() => { expect(mockGroupService.getById).toHaveBeenCalled(); expect(groupDetailsPage.memberList).toStrictEqual([]); @@ -119,7 +134,7 @@ describe('GroupDetailsPage', () => { }, 0); }); - it('should returu header with back button', (done) => { + it('should return header with back button in error case', (done) => { mockHeaderService.showHeaderWithBackButton = jest.fn(); mockHeaderService.headerEventEmitted$ = of({ subscribe: jest.fn(() => ({ @@ -133,11 +148,18 @@ describe('GroupDetailsPage', () => { return; }); mockGroupService.getById = jest.fn(() => throwError({ error: 'error' })) as any; + mockTelemetryGeneratorService.generateImpressionTelemetry = jest.fn(); // act groupDetailsPage.ionViewWillEnter(); // assert expect(mockHeaderService.showHeaderWithBackButton).toHaveBeenCalled(); expect(mockHeaderService.headerEventEmitted$).not.toBeUndefined(); + expect(mockTelemetryGeneratorService.generateImpressionTelemetry).toHaveBeenCalledWith( + ImpressionType.VIEW, + '', + PageId.GROUP_DETAIL, + Environment.GROUP + ); setTimeout(() => { expect(mockGroupService.getById).toHaveBeenCalled(); done(); @@ -146,9 +168,15 @@ describe('GroupDetailsPage', () => { it('should navigate To AddUserPage', () => { mockRouter.navigate = jest.fn(() => Promise.resolve(true)); + mockTelemetryGeneratorService.generateInteractTelemetry = jest.fn(); groupDetailsPage.navigateToAddUserPage(); expect(mockRouter.navigate).toHaveBeenCalledWith([`/${RouterLinks.MY_GROUPS}/${RouterLinks.ADD_MEMBER_TO_GROUP}`], { state: { groupId: 'sample-group-id' } }); + expect(mockTelemetryGeneratorService.generateInteractTelemetry).toHaveBeenCalledWith( + InteractType.TOUCH, + InteractSubtype.ADD_MEMBER_CLICKED, + Environment.GROUP, + PageId.GROUP_DETAIL); }); it('should unsubscribe registerBackButton', () => { @@ -464,9 +492,15 @@ describe('GroupDetailsPage', () => { mockCommonUtilService.translateMessage = jest.fn(() => 'Select activity'); mockCommonUtilService.translateMessage = jest.fn(() => 'Next'); mockRouter.navigate = jest.fn(() => Promise.resolve(true)); + mockTelemetryGeneratorService.generateInteractTelemetry = jest.fn(); // act groupDetailsPage.showAddActivityPopup().then(() => { // assert + expect(mockTelemetryGeneratorService.generateInteractTelemetry).toHaveBeenCalledWith( + InteractType.TOUCH, + InteractSubtype.ADD_ACTIVITY_CLICKED, + Environment.GROUP, + PageId.GROUP_DETAIL); expect(mockFormAndFrameworkUtilService.invokeSupportedGroupActivitiesFormApi).toHaveBeenCalled(); expect(mockPopoverCtrl.create).toHaveBeenCalled(); expect(mockCommonUtilService.translateMessage).toHaveBeenNthCalledWith(1, 'SELECT_ACTIVITY'); @@ -490,9 +524,15 @@ describe('GroupDetailsPage', () => { } as any))); mockCommonUtilService.translateMessage = jest.fn(() => 'Select activity'); mockCommonUtilService.translateMessage = jest.fn(() => 'Next'); + mockTelemetryGeneratorService.generateInteractTelemetry = jest.fn(); // act groupDetailsPage.showAddActivityPopup().then(() => { // assert + expect(mockTelemetryGeneratorService.generateInteractTelemetry).toHaveBeenCalledWith( + InteractType.TOUCH, + InteractSubtype.ADD_ACTIVITY_CLICKED, + Environment.GROUP, + PageId.GROUP_DETAIL); expect(mockFormAndFrameworkUtilService.invokeSupportedGroupActivitiesFormApi).toHaveBeenCalled(); expect(mockPopoverCtrl.create).toHaveBeenCalled(); expect(mockCommonUtilService.translateMessage).toHaveBeenNthCalledWith(1, 'SELECT_ACTIVITY'); diff --git a/src/app/my-groups/group-details/group-details.page.ts b/src/app/my-groups/group-details/group-details.page.ts index 1013d22280..6935ae0633 100644 --- a/src/app/my-groups/group-details/group-details.page.ts +++ b/src/app/my-groups/group-details/group-details.page.ts @@ -4,7 +4,7 @@ import { Location } from '@angular/common'; import { AppHeaderService, PageId, FormAndFrameworkUtilService, - CommonUtilService, AppGlobalService + CommonUtilService, AppGlobalService, TelemetryGeneratorService, InteractType, InteractSubtype, Environment, ImpressionType } from '../../../services'; import { Router, NavigationExtras } from '@angular/router'; import { RouterLinks, MenuOverflow } from '@app/app/app.constant'; @@ -49,7 +49,8 @@ export class GroupDetailsPage implements OnInit { private popoverCtrl: PopoverController, private formAndFrameworkUtilService: FormAndFrameworkUtilService, private commonUtilService: CommonUtilService, - private filterPipe: FilterPipe + private filterPipe: FilterPipe, + private telemetryGeneratorService: TelemetryGeneratorService ) { const extras = this.router.getCurrentNavigation().extras.state; this.groupId = extras.groupId; @@ -69,6 +70,8 @@ export class GroupDetailsPage implements OnInit { }); this.handleDeviceBackButton(); this.fetchGroupDetails(); + + this.telemetryGeneratorService.generateImpressionTelemetry(ImpressionType.VIEW, '', PageId.GROUP_DETAIL, Environment.GROUP); } handleDeviceBackButton() { @@ -92,6 +95,8 @@ export class GroupDetailsPage implements OnInit { } navigateToAddUserPage() { + this.telemetryGeneratorService.generateInteractTelemetry(InteractType.TOUCH, + InteractSubtype.ADD_MEMBER_CLICKED, Environment.GROUP, PageId.GROUP_DETAIL); const navigationExtras: NavigationExtras = { state: { groupId: this.groupId @@ -137,7 +142,7 @@ export class GroupDetailsPage implements OnInit { // Environment.DOWNLOADS, // PageId.GROUP_DETAIL); - let menuList = MenuOverflow.MENU_GROUP_ADMIN; + const menuList = MenuOverflow.MENU_GROUP_ADMIN; // TODO: Handle below condition while API intigration. // if (!isAdmin) { // menuList = MenuOverflow.MENU_GROUP_NON_ADMIN; @@ -464,6 +469,8 @@ export class GroupDetailsPage implements OnInit { } async showAddActivityPopup() { + this.telemetryGeneratorService.generateInteractTelemetry(InteractType.TOUCH, + InteractSubtype.ADD_ACTIVITY_CLICKED, Environment.GROUP, PageId.GROUP_DETAIL); try { const supportedActivityList = await this.formAndFrameworkUtilService.invokeSupportedGroupActivitiesFormApi(); diff --git a/src/app/my-groups/my-groups.page.spec.ts b/src/app/my-groups/my-groups.page.spec.ts index 77c10de77b..a47c0c7fca 100644 --- a/src/app/my-groups/my-groups.page.spec.ts +++ b/src/app/my-groups/my-groups.page.spec.ts @@ -1,13 +1,23 @@ import { MyGroupsPage } from './my-groups.page'; -import { AuthService, ClassRoomService, SharedPreferences, GroupService } from '@project-sunbird/sunbird-sdk'; +import {AuthService, ClassRoomService, SharedPreferences, GroupService} from '@project-sunbird/sunbird-sdk'; import { Router } from '@angular/router'; -import { PopoverController } from '@ionic/angular'; +import {Platform, PopoverController} from '@ionic/angular'; import { AppHeaderService } from '@app/services/app-header.service'; import { LoginHandlerService } from '@app/services/login-handler.service'; -import { CommonUtilService, AppGlobalService } from '@app/services'; +import { + CommonUtilService, + AppGlobalService, + TelemetryGeneratorService, + InteractType, + InteractSubtype, + Environment, + PageId +} from '@app/services'; import { of, throwError } from 'rxjs'; import { PreferenceKey, RouterLinks } from '../app.constant'; import { MyGroupsPopoverComponent } from '../components/popups/sb-my-groups-popover/sb-my-groups-popover.component'; +import {SbProgressLoader} from '@app/services/sb-progress-loader.service'; +import {Location} from '@angular/common'; describe('MyGroupsPage', () => { let myGroupsPage: MyGroupsPage; @@ -20,6 +30,10 @@ describe('MyGroupsPage', () => { const mockPreferences: Partial = {}; const mockRouter: Partial = {}; const mockGroupService: Partial = {}; + const mockSbProgressLoader: Partial = {}; + const mockTelemetryGeneratorService: Partial = {}; + const mockPlatform: Platform = {}; + const mockLocation: Partial = {}; beforeAll(() => { myGroupsPage = new MyGroupsPage( @@ -31,7 +45,11 @@ describe('MyGroupsPage', () => { mockRouter as Router, mockLoginHandlerService as LoginHandlerService, mockCommonUtilService as CommonUtilService, - mockPopoverCtrl as PopoverController + mockPopoverCtrl as PopoverController, + mockSbProgressLoader as SbProgressLoader, + mockTelemetryGeneratorService as TelemetryGeneratorService, + mockPlatform as Platform, + mockLocation as Location ); }); @@ -197,12 +215,24 @@ describe('MyGroupsPage', () => { jest.spyOn(myGroupsPage, 'fetchGroupList').mockImplementation(() => { return Promise.resolve(); }); + const subscribeWithPriorityData = jest.fn((_, fn) => fn()); + mockPlatform.backButton = { + subscribeWithPriority: subscribeWithPriorityData + } as any; + mockTelemetryGeneratorService.generateBackClickedTelemetry = jest.fn(); + mockLocation.back = jest.fn(); // act myGroupsPage.ionViewWillEnter(); // assert setTimeout(() => { + expect(subscribeWithPriorityData).toBeTruthy(); expect(mockHeaderService.showHeaderWithBackButton).toHaveBeenCalled(); expect(mockHeaderService.headerEventEmitted$).not.toBeUndefined(); + expect(mockTelemetryGeneratorService.generateBackClickedTelemetry).toHaveBeenCalledWith( + PageId.MY_GROUP, + Environment.GROUP, + false); + expect(mockLocation.back).toHaveBeenCalled(); done(); }, 0); }); @@ -234,13 +264,27 @@ describe('MyGroupsPage', () => { it('should navigate to CREATE_EDIT_GROUP', () => { mockRouter.navigate = jest.fn(() => Promise.resolve(true)); + mockTelemetryGeneratorService.generateInteractTelemetry = jest.fn(); myGroupsPage.createClassroom(); + expect(mockTelemetryGeneratorService.generateInteractTelemetry).toHaveBeenCalledWith( + InteractType.TOUCH, + InteractSubtype.CREATE_GROUP_CLICKED, + Environment.GROUP, + PageId.MY_GROUP + ); expect(mockRouter.navigate).toHaveBeenCalledWith([`/${RouterLinks.MY_GROUPS}/${RouterLinks.CREATE_EDIT_GROUP}`]); }); it('should return loggedIn user', () => { mockLoginHandlerService.signIn = jest.fn(() => Promise.resolve()); + mockTelemetryGeneratorService.generateInteractTelemetry = jest.fn(); myGroupsPage.login(); + expect(mockTelemetryGeneratorService.generateInteractTelemetry).toHaveBeenCalledWith( + InteractType.TOUCH, + InteractSubtype.LOGIN_CLICKED, + Environment.GROUP, + PageId.MY_GROUP + ); expect(mockLoginHandlerService.signIn).toHaveBeenCalledWith({ skipRootNavigation: true }); }); diff --git a/src/app/my-groups/my-groups.page.ts b/src/app/my-groups/my-groups.page.ts index a270a3c34e..ddb507c41d 100644 --- a/src/app/my-groups/my-groups.page.ts +++ b/src/app/my-groups/my-groups.page.ts @@ -7,11 +7,21 @@ import { GroupSearchCriteria, CachedItemRequestSourceFrom, SortOrder } from '@project-sunbird/sunbird-sdk'; import { LoginHandlerService } from '@app/services/login-handler.service'; -import { CommonUtilService, AppGlobalService } from '@app/services'; -import { PopoverController } from '@ionic/angular'; +import { + CommonUtilService, + AppGlobalService, + TelemetryGeneratorService, + ImpressionType, + PageId, + Environment, InteractType, InteractSubtype +} from '@app/services'; +import {Platform, PopoverController} from '@ionic/angular'; import { MyGroupsPopoverComponent } from '../components/popups/sb-my-groups-popover/sb-my-groups-popover.component'; import { animationGrowInTopRight } from '../animations/animation-grow-in-top-right'; import { animationShrinkOutTopRight } from '../animations/animation-shrink-out-top-right'; +import {SbProgressLoader} from '@app/services/sb-progress-loader.service'; +import {Subscription} from 'rxjs'; +import {Location} from '@angular/common'; interface GroupData extends Group { initial: string; @@ -27,6 +37,7 @@ export class MyGroupsPage implements OnInit, OnDestroy { groupListLoader = false; headerObservable: any; userId: string; + unregisterBackButton: Subscription; constructor( @Inject('AUTH_SERVICE') public authService: AuthService, @@ -37,7 +48,11 @@ export class MyGroupsPage implements OnInit, OnDestroy { private router: Router, private loginHandlerService: LoginHandlerService, private commonUtilService: CommonUtilService, - private popoverCtrl: PopoverController + private popoverCtrl: PopoverController, + private sbProgressLoader: SbProgressLoader, + private telemetryGeneratorService: TelemetryGeneratorService, + private platform: Platform, + private location: Location ) { } ngOnInit() { @@ -58,6 +73,7 @@ export class MyGroupsPage implements OnInit, OnDestroy { } ionViewWillEnter() { + this.handleBackButton(); this.headerService.showHeaderWithBackButton(['groupInfo']); this.headerObservable = this.headerService.headerEventEmitted$.subscribe(eventName => { this.handleHeaderEvents(eventName); @@ -65,13 +81,24 @@ export class MyGroupsPage implements OnInit, OnDestroy { } async ionViewDidEnter() { + this.sbProgressLoader.hide({id: 'login'}); this.fetchGroupList(); + this.telemetryGeneratorService.generateImpressionTelemetry( + ImpressionType.VIEW, + '', + PageId.MY_GROUP, + Environment.GROUP + ); } ngOnDestroy() { if (this.headerObservable) { this.headerObservable.unsubscribe(); } + + if (this.unregisterBackButton) { + this.unregisterBackButton.unsubscribe(); + } } handleHeaderEvents($event) { @@ -79,14 +106,30 @@ export class MyGroupsPage implements OnInit, OnDestroy { case 'groupInfo': this.openinfopopup(); break; + case 'back': + this.telemetryGeneratorService.generateBackClickedTelemetry(PageId.MY_GROUP, Environment.GROUP, true); + this.location.back(); + break; } } createClassroom() { + this.telemetryGeneratorService.generateInteractTelemetry( + InteractType.TOUCH, + InteractSubtype.CREATE_GROUP_CLICKED, + Environment.GROUP, + PageId.MY_GROUP + ); this.router.navigate([`/${RouterLinks.MY_GROUPS}/${RouterLinks.CREATE_EDIT_GROUP}`]); } login() { + this.telemetryGeneratorService.generateInteractTelemetry( + InteractType.TOUCH, + InteractSubtype.LOGIN_CLICKED, + Environment.GROUP, + PageId.MY_GROUP + ); this.loginHandlerService.signIn({ skipRootNavigation: true }); } @@ -147,4 +190,14 @@ export class MyGroupsPage implements OnInit, OnDestroy { } } + private handleBackButton() { + this.unregisterBackButton = this.platform.backButton.subscribeWithPriority(10, () => { + this.telemetryGeneratorService.generateBackClickedTelemetry( + PageId.MY_GROUP, + Environment.GROUP, + false); + this.location.back(); + }); + } + } diff --git a/src/app/resources/resources.component.ts b/src/app/resources/resources.component.ts index e3356f274d..1615967a3b 100644 --- a/src/app/resources/resources.component.ts +++ b/src/app/resources/resources.component.ts @@ -174,7 +174,7 @@ export class ResourcesComponent implements OnInit, AfterViewInit, OnDestroy { private eventSubscription: Subscription; toast: any; - headerObservable: any; + headerObservable: Subscription; scrollEventRemover: any; subjects: any; searchGroupingContents: any; @@ -429,7 +429,7 @@ export class ResourcesComponent implements OnInit, AfterViewInit, OnDestroy { this.router.navigate([RouterLinks.VIEW_MORE_ACTIVITY], resourcesParams); } - /** + /** * Load/get recently viewed content */ // hide recently viewed as part of school@home @@ -1295,6 +1295,9 @@ export class ResourcesComponent implements OnInit, AfterViewInit, OnDestroy { if (this.networkSubscription) { this.networkSubscription.unsubscribe(); } + if (this.headerObservable) { + this.headerObservable.unsubscribe(); + } } onCourseCardClick(event) { diff --git a/src/services/telemetry-constants.ts b/src/services/telemetry-constants.ts index fe6fd758fb..5b3d5f1863 100644 --- a/src/services/telemetry-constants.ts +++ b/src/services/telemetry-constants.ts @@ -6,7 +6,8 @@ export enum Environment { USER = 'user', SETTINGS = 'settings', ONBOARDING = 'onboarding', - NOTIFICATION = 'notification' + NOTIFICATION = 'notification', + GROUP = 'group' } export enum ErrorCode { @@ -25,11 +26,13 @@ export enum ObjectType { QUESTION = 'Question', QR = 'Qr' } + export enum Mode { PLAY = 'play', ONLINE = 'online', OFFLINE = 'offline' } + export enum PageId { SPLASH_SCREEN = 'splash', LOGIN = 'login', @@ -148,11 +151,14 @@ export enum PageId { QR_BOOK_RESULT = 'qr-book-result', QR_CONTENT_RESULT = 'qr-content-result', LOCATION = 'location', - MANUAL = 'manual' + MANUAL = 'manual', + MY_GROUP = 'my-group' } + export enum LogType { NOTIFICATION = 'notification' } + export enum LogLevel { TRACE = 'TRACE', DEBUG = 'DEBUG', @@ -178,6 +184,7 @@ export enum ImpressionType { SET_LANGUAGE = 'set-language', QR_REQUEST = 'qr-request' } + export enum ImpressionSubtype { QRCodeScanInitiate = 'qr-code-scan-initiate', RATING_POPUP = 'rating-popup', @@ -190,8 +197,10 @@ export enum ImpressionSubtype { RECOVERY_ACCOUNT_POPUP = 'recovery-account-popup', DISTRICT_LOCATION_MAPPING = 'district-location-mapping', UPGRADE_POPUP = 'upgrade-popup', - DEEPLINK = 'deeplink' + DEEPLINK = 'deeplink', + CREATE_GROUP_FORM = 'create-group-form' } + export enum InteractType { TOUCH = 'TOUCH', OTHER = 'OTHER', @@ -235,7 +244,9 @@ export enum InteractType { DOWNLOAD = 'download', SELECT_CLOSE = 'select-close', DOWNLOAD_COMPLETE = 'download-complete', - POPUP_LOADED = 'popup-loaded' + POPUP_LOADED = 'popup-loaded', + INITIATED = 'initiated', + SUCCESS = 'success' } @@ -384,7 +395,7 @@ export enum InteractSubtype { SORT_OPTION_SELECTED = 'sort-options-selected', ACTION_BUTTON_CLICKED = 'action-button-clicked', OUTSIDE_POPUP_AREA_CLICKED = 'outside-popup-area-clicked', - POPUP_DISMISSED= 'popup-dismissed', + POPUP_DISMISSED = 'popup-dismissed', DOWNLOAD_CANCEL_ALL_CLICKED = 'download-cancel-all-clicked', DOWNLOAD_CERTIFICATE_CLICKED = 'download-certificate-clicked', DOWNLOAD_CANCEL_CLICKED = 'download-cancel-clicked', @@ -476,6 +487,8 @@ export enum InteractSubtype { CLOSE_ICON = 'close-icon', OUTSIDE = 'outside', QR_NOT_LINKED = 'qr-not-linked', + ADD_MEMBER_CLICKED = 'add-member-clicked', + ADD_ACTIVITY_CLICKED = 'add-activity-clicked' } export enum ID { @@ -506,7 +519,8 @@ export enum ID { BTN_I_AM_A_TEACHER = 'btn-i-am-a-teacher', TEACHER_DECLARATION = 'teacher-declaration', MUA_USER_CREATION = 'mua-user-creation', - DATA_SHARING = 'data-sharing' + DATA_SHARING = 'data-sharing', + CREATE_GROUP = 'create-group' } export enum ActionButtonType {