From 0795c956fdae0fa67aeb86b7385f72428b667265 Mon Sep 17 00:00:00 2001 From: Kven Ho Date: Fri, 10 Nov 2017 09:28:11 +0800 Subject: [PATCH 1/5] Hide name in ranking [ISDK-84] --- src/assets/i18n-en.json | 6 +- src/pages/settings/settings.html | 22 +++--- src/pages/settings/settings.page.ts | 99 ++++++++++++++++++++++++--- src/shared/request/request.service.ts | 4 -- 4 files changed, 106 insertions(+), 25 deletions(-) diff --git a/src/assets/i18n-en.json b/src/assets/i18n-en.json index 057a04bc..4c219c0e 100644 --- a/src/assets/i18n-en.json +++ b/src/assets/i18n-en.json @@ -45,9 +45,9 @@ "RANKING": { "DETAIL": "Ranking Details", "ME": "Me", - "MONTHLYPOINTS": "Points(Monthly)", - "PAGETITLE": "Leaderboard", - "TOTALPOINTS": "Points(Total)" + "MONTHLYPOINTS": "Points (Monthly)", + "PAGETITLE": "Ranking (Monthly)", + "TOTALPOINTS": "Points (Total)" }, "RESETPASSWORD": { "PAGETITLE": "Reset Password" diff --git a/src/pages/settings/settings.html b/src/pages/settings/settings.html index 5b516ab6..799dc693 100644 --- a/src/pages/settings/settings.html +++ b/src/pages/settings/settings.html @@ -8,23 +8,29 @@ {{ 'SETTINGS.PROFILE' | translate }} ({{ getUserEmail() }}) + + + + + Hide name in rankings + + + + + + {{ 'SETTINGS.SUPPORT' | translate }} + - - - - - {{ 'SETTINGS.SUPPORT' | translate }} - {{ 'SETTINGS.HELP' | translate }} + + diff --git a/src/pages/settings/settings.page.ts b/src/pages/settings/settings.page.ts index 2fdf7e37..e69c08f0 100644 --- a/src/pages/settings/settings.page.ts +++ b/src/pages/settings/settings.page.ts @@ -1,15 +1,15 @@ import { Component } from '@angular/core'; -import { App, NavController, MenuController, LoadingController } from 'ionic-angular'; +import { App, NavController, MenuController, LoadingController, AlertController } from 'ionic-angular'; // services import { CacheService } from '../../shared/cache/cache.service'; +import { GameService } from '../../services/game.service'; // pages -import { LeaderboardSettingsPage } from '../settings/leaderboard/leaderboard-settings.page'; import { LoginPage } from '../../pages/login/login'; import { TutorialPage } from '../settings/tutorial/tutorial.page'; import { TermsConditionsPage } from '../registration/terms-conditions/terms-conditions.page'; // Others import { TranslationService } from '../../shared/translation/translation.service'; -import { loadingMessages, errMessages } from '../../app/messages'; +import { loadingMessages } from '../../app/messages'; @Component({ selector: 'settings-page', @@ -17,34 +17,113 @@ import { loadingMessages, errMessages } from '../../app/messages'; }) export class SettingsPage { helpline: string = "help@practera.com"; + hideName: boolean = false; logoutMessage: any = loadingMessages.Logout.logout; settings: any = []; + isLock: boolean = false; constructor( public appCtrl: App, + public alertCtrl: AlertController, + public cacheService: CacheService, + public gameService: GameService, public loadingCtrl: LoadingController, public menuCtrl: MenuController, public navCtrl: NavController, - public cache: CacheService, - public translationService: TranslationService) {} - getUserEmail() { - return this.cache.getLocal('email') || ''; + public translationService: TranslationService, + ) {} + + ionViewWillEnter(){ + this.preload(); + } + + preload() { + const loading = this.loadingCtrl.create({ + content: 'Loading' + }); + loading.present(); + + let gameId = this.cacheService.getLocal('game_id'); + this.gameService.getCharacters(gameId) + .subscribe((characters) => { + let me = characters.Characters[0]; + if(me.meta == null) { + this.hideName = false; + } + if(me.meta != null){ + if (me.meta.private === 0) { + this.hideName = false; + } else { + this.hideName = true; + } + } + loading.dismiss(); + }, (err) => { + loading.dismiss(); + }); + } + + triggerHideName() { + if (this.isLock) { + this.isLock = false; + } else { + const showAlert = (msg) => { + let alert = this.alertCtrl.create({ + subTitle: msg, + buttons: ['OK'] + }); + alert.present(); + } + + const loader = this.loadingCtrl.create({ + content: 'Updating' + }); + + loader.present().then(() => { + this.isLock = true; + this.gameService.postCharacter({ + Character: { + id: this.cacheService.getLocal('character_id'), + meta: { + private: (this.hideName) ? 1 : 0 + } + } + }) + .subscribe((result) => { + this.isLock = false; + loader.dismiss(); + let msg = 'You name will now be hidden if in the ranking'; + if (!this.hideName) { + msg = 'Your name will now be displayed if in the ranking'; + } + showAlert(msg); + }, (err) => { + this.hideName = !this.hideName; + showAlert('Unabled to change your privacy setting.'); + loader.dismiss(); + }); + }); + } } - goLeaderBoardSettings(){ - this.navCtrl.push(LeaderboardSettingsPage); + + getUserEmail() { + return this.cacheService.getLocal('email') || ''; } + goToTutorial() { this.navCtrl.push(TutorialPage); } + goToTermConditions() { this.navCtrl.push(TermsConditionsPage); } + logout() { let loader = this.loadingCtrl.create({ spinner: 'hide', content: this.logoutMessage }); loader.present().then(() => { - this.cache.clear().then(() => { + this.cacheService.clear().then(() => { localStorage.clear(); window.location.reload(); // the reason of doing this is because of we need to refresh page content instead of API data cache issue occurs loader.dismiss(); diff --git a/src/shared/request/request.service.ts b/src/shared/request/request.service.ts index 9fbb1bdb..5d890a48 100755 --- a/src/shared/request/request.service.ts +++ b/src/shared/request/request.service.ts @@ -149,10 +149,6 @@ export class RequestService { */ post(endPoint: string, data: any, header?: any) { let headers = this.appendHeader(); - - // @TODO: make sure if Content-Type is optional - headers = headers.delete('Content-Type'); - headers = headers.set('Content-Type', 'application/x-www-form-urlencoded'); return this.http.post(this.prefixUrl + endPoint, data, { headers }) .map(this.extractData) .catch(this.handleError); From a2d11b35b09181fbdf3e3ad8aee19d3dfee066bd Mon Sep 17 00:00:00 2001 From: Kven Ho Date: Fri, 10 Nov 2017 14:51:53 +0800 Subject: [PATCH 2/5] Fix content-type error [ISDK-84] --- src/services/assessment.service.ts | 4 +--- src/services/auth.service.ts | 8 ++++++-- src/services/character.service.ts | 5 +---- src/services/event.service.ts | 2 +- src/services/game.service.ts | 8 ++------ src/shared/request/request.service.ts | 26 +++++++++++++++----------- 6 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/services/assessment.service.ts b/src/services/assessment.service.ts index dbc0e492..1cf66486 100755 --- a/src/services/assessment.service.ts +++ b/src/services/assessment.service.ts @@ -98,9 +98,7 @@ export class AssessmentService { } post(assessmentAnswer: Submission) { - return this.request.post('api/assessment_submissions.json', assessmentAnswer, { - 'Content-Type': 'application/json' - }); + return this.request.post('api/assessment_submissions.json', assessmentAnswer); } /** diff --git a/src/services/auth.service.ts b/src/services/auth.service.ts index f922942d..cb0ca67e 100755 --- a/src/services/auth.service.ts +++ b/src/services/auth.service.ts @@ -11,7 +11,9 @@ export class AuthService { public request: RequestService, ) {} private postRequest(type, body) { - return this.request.post(AUTH_ENDPOINT + type, body); + return this.request.post(AUTH_ENDPOINT + type, body, { + 'Content-Type': 'application/x-www-form-urlencoded' + }); } verifyRegistration(data) { let params = new HttpParams(); @@ -43,7 +45,9 @@ export class AuthService { return this.postRequest('reset_password', { key, email, password, verify_password }); } magicLinkLogin(auth_token) { - return this.request.post('api/auths.json', { auth_token }); + return this.request.post('api/auths.json', { auth_token }, { + 'Content-Type': 'application/x-www-form-urlencoded' + }); } getUser() { return this.request.get('api/users.json'); diff --git a/src/services/character.service.ts b/src/services/character.service.ts index 7cc86058..90c9a279 100644 --- a/src/services/character.service.ts +++ b/src/services/character.service.ts @@ -33,9 +33,6 @@ export class CharacterService { * @param {object} data */ postCharacter(data) { - let headers = new HttpHeaders(); - headers = headers.set('Content-Type', 'application/json'); - - return this.request.post(this.charactersAPIEndpoint, data, { headers }); + return this.request.post(this.charactersAPIEndpoint, data); } } diff --git a/src/services/event.service.ts b/src/services/event.service.ts index cef12242..a789ad14 100755 --- a/src/services/event.service.ts +++ b/src/services/event.service.ts @@ -51,7 +51,7 @@ export class EventService { * @param {integer} eventId single event id */ bookEvent(eventId) { - return this.request.post(this.bookEventUrl, { event_id: eventId}); + return this.request.post(this.bookEventUrl, { event_id: eventId }); } cancelEventBooking(eventId){ diff --git a/src/services/game.service.ts b/src/services/game.service.ts index 9bfc2dcc..384f43a9 100644 --- a/src/services/game.service.ts +++ b/src/services/game.service.ts @@ -35,9 +35,7 @@ export class GameService { * @param {object} data */ postCharacter(data) { - return this.request.post('api/characters', data, { - headers: new HttpHeaders().set('Content-Type', 'application/json') - }); + return this.request.post('api/characters', data); } /** @@ -87,8 +85,6 @@ export class GameService { "id": null } }) { - return this.request.post('api/items.json', options, { - headers: new HttpHeaders().set('Content-Type', 'application/json') - }); + return this.request.post('api/items.json', options); } } diff --git a/src/shared/request/request.service.ts b/src/shared/request/request.service.ts index 5d890a48..958e8b84 100755 --- a/src/shared/request/request.service.ts +++ b/src/shared/request/request.service.ts @@ -71,30 +71,33 @@ export class RequestService { } // Inject required fields to header of API request - appendHeader(customHeader: any = { - 'contentType': 'application/json', - 'apikey': null - }): HttpHeaders { - let result:any; - let headers = new HttpHeaders(); + appendHeader(custom: object = {}): HttpHeaders { + // Define default header + custom = _.merge({ + 'content-type': 'application/json' + }, custom); - result = headers.set('Content-Type', customHeader.contentType); + let header: HttpHeaders = new HttpHeaders(); + + _.forEach(custom, (value, key) => { + header = header.set(key, value); + }); // Inject apiKey from cached let apiKey = this.cacheService.getCached('apikey') || this.cacheService.getLocal('apikey'); if (!_.isEmpty(apiKey)) { - result = result.set('apikey', apiKey.toString()); + header = header.set('apikey', apiKey.toString()); } // Inject timelineID from cached let timelineId = this.cacheService.getCached('timelineID') || this.cacheService.getLocal('timelineID'); if (timelineId) { - result = result.set('timelineID', timelineId.toString()); + header = header.set('timelineID', timelineId.toString()); } - return result; + return header; } // Set API request options @@ -148,7 +151,8 @@ export class RequestService { * @param {Object} header */ post(endPoint: string, data: any, header?: any) { - let headers = this.appendHeader(); + let headers = this.appendHeader(header); + return this.http.post(this.prefixUrl + endPoint, data, { headers }) .map(this.extractData) .catch(this.handleError); From 5388373726fc269c2b38e1abd47c93649b240a41 Mon Sep 17 00:00:00 2001 From: Kven Ho Date: Mon, 13 Nov 2017 10:51:18 +0800 Subject: [PATCH 3/5] Remove old cache [ISDK-84] --- src/shared/cache/cache.service.ts | 6 ++++++ src/shared/request/request.service.ts | 8 +++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/shared/cache/cache.service.ts b/src/shared/cache/cache.service.ts index e8f8129d..2caf19dc 100755 --- a/src/shared/cache/cache.service.ts +++ b/src/shared/cache/cache.service.ts @@ -32,6 +32,7 @@ export class CacheService { } /** + * DEPRECATED * get memory cached values by key * @param {object||string} */ @@ -43,6 +44,7 @@ export class CacheService { } /** + * DEPRECATED * Write data into local storage * @param {string} path - path to store data * @param {any} content - data to store @@ -58,6 +60,7 @@ export class CacheService { } /** + * DEPRECATED * Read data into local storage * @param {string} path - path to read data * @return {promise} @@ -93,6 +96,9 @@ export class CacheService { } } + /** + * DEPRECATED + */ public clear(): any { return this.storage.clear(); } diff --git a/src/shared/request/request.service.ts b/src/shared/request/request.service.ts index 958e8b84..35a04b1e 100755 --- a/src/shared/request/request.service.ts +++ b/src/shared/request/request.service.ts @@ -84,15 +84,13 @@ export class RequestService { }); // Inject apiKey from cached - let apiKey = this.cacheService.getCached('apikey') || - this.cacheService.getLocal('apikey'); + let apiKey = this.cacheService.getLocal('apikey'); if (!_.isEmpty(apiKey)) { header = header.set('apikey', apiKey.toString()); } // Inject timelineID from cached - let timelineId = this.cacheService.getCached('timelineID') || - this.cacheService.getLocal('timelineID'); + let timelineId = this.cacheService.getLocal('timelineID'); if (timelineId) { header = header.set('timelineID', timelineId.toString()); } @@ -103,7 +101,7 @@ export class RequestService { // Set API request options setOptions(options?): { headers?: HttpHeaders; - observe?: "body"; + observe?: 'body'; params?: HttpParams; reportProgress?: boolean; withCredentials?: boolean; From f03f127ff282e358eb1c976d791b5ad38052e233 Mon Sep 17 00:00:00 2001 From: Kven Ho Date: Mon, 13 Nov 2017 13:16:29 +0800 Subject: [PATCH 4/5] Remove useless code for character.service [ISDK-84] --- src/services/character.service.ts | 38 ------------------------------- 1 file changed, 38 deletions(-) delete mode 100644 src/services/character.service.ts diff --git a/src/services/character.service.ts b/src/services/character.service.ts deleted file mode 100644 index 90c9a279..00000000 --- a/src/services/character.service.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpHeaders, HttpParams } from '@angular/common/http'; - -// services -import { CacheService } from '../shared/cache/cache.service'; -import { RequestService } from '../shared/request/request.service'; - -@Injectable() -export class CharacterService { - charactersAPIEndpoint: any = 'api/characters.json'; - - constructor( - public cache: CacheService, - public request: RequestService - ) {} - - /** - * Get character - */ - getCharacter() { - let options:any = {}; - let game_id = this.cache.getLocal('game_id'); - - if (game_id) { - options['game_id'] = game_id; - } - - return this.request.get(this.charactersAPIEndpoint, { search: options }); - } - - /** - * Post character - * @param {object} data - */ - postCharacter(data) { - return this.request.post(this.charactersAPIEndpoint, data); - } -} From 42c79010a200d0c6defcf3d2bde4bd1cff6c6d22 Mon Sep 17 00:00:00 2001 From: Kven Ho Date: Tue, 14 Nov 2017 10:39:02 +0800 Subject: [PATCH 5/5] Prevent trigger the toggle when first load [ISDK-84] --- src/pages/settings/settings.page.ts | 11 +++++++++-- src/shared/request/request.service.ts | 8 ++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/pages/settings/settings.page.ts b/src/pages/settings/settings.page.ts index fdaa5ad0..774eed87 100644 --- a/src/pages/settings/settings.page.ts +++ b/src/pages/settings/settings.page.ts @@ -21,6 +21,7 @@ export class SettingsPage { logoutMessage: any = loadingMessages.Logout.logout; settings: any = []; isLock: boolean = false; + pageLoad: boolean = true; constructor( public appCtrl: App, public alertCtrl: AlertController, @@ -33,6 +34,7 @@ export class SettingsPage { ) {} ionViewWillEnter(){ + this.pageLoad = true; this.preload(); } @@ -46,10 +48,10 @@ export class SettingsPage { this.gameService.getCharacters(gameId) .subscribe((characters) => { let me = characters.Characters[0]; - if(me.meta == null) { + if (me.meta == null) { this.hideName = false; } - if(me.meta != null){ + if (me.meta != null){ if (me.meta.private === 0) { this.hideName = false; } else { @@ -63,6 +65,11 @@ export class SettingsPage { } triggerHideName() { + if (this.pageLoad) { + this.pageLoad = false; + return false; + } + if (this.isLock) { this.isLock = false; } else { diff --git a/src/shared/request/request.service.ts b/src/shared/request/request.service.ts index f2d98436..7c397880 100755 --- a/src/shared/request/request.service.ts +++ b/src/shared/request/request.service.ts @@ -74,18 +74,18 @@ export class RequestService { let header: HttpHeaders = new HttpHeaders(); _.forEach(custom, (value, key) => { - header = header.set(key, value); + header = header.set(key, _.toString(value)); }); // Inject apiKey from cached let apiKey = this.cacheService.getLocal('apikey'); if (!_.isEmpty(apiKey)) { - header = header.set('apikey', apiKey.toString()); + header = header.set('apikey', _.toString(apiKey)); } // Inject timelineID from cached let timelineId = this.cacheService.getLocal('timelineID'); if (timelineId) { - header = header.set('timelineID', timelineId.toString()); + header = header.set('timelineID', _.toString(timelineId)); } return header; @@ -104,7 +104,7 @@ export class RequestService { let params = (options && options.params) ? options.params : new HttpParams(); if (options && options.search) { _.each(options.search, (value, key) => { - params = params.set(key, value.toString()); + params = params.set(key, _.toString(value)); }); } let timelineId = this.cacheService.getLocal('timelineID');