forked from EVOgeek/Vmeda.Online
		
	MOBILE-3640 database: Location service improvements on error handling
This commit is contained in:
		
							parent
							
								
									1363951920
								
							
						
					
					
						commit
						bfbfd350b1
					
				| @ -11,7 +11,7 @@ | ||||
|             <ion-input type="text" [formControlName]="'f_'+field.id+'_1'" maxlength="10"></ion-input> | ||||
|             <span class="placeholder-icon" item-right>°E</span> | ||||
|         </div> | ||||
|         <div class="addon-data-latlong"> | ||||
|         <div class="addon-data-latlong" *ngIf="locationServicesEnabled"> | ||||
|             <ion-button (click)="getLocation($event)"> | ||||
|                 <ion-icon name="fas-crosshairs" slot="start"></ion-icon> | ||||
|                 {{ 'addon.mod_data.mylocation' | translate }} | ||||
|  | ||||
| @ -33,6 +33,7 @@ export class AddonModDataFieldLatlongComponent extends AddonModDataFieldPluginCo | ||||
| 
 | ||||
|     north?: number; | ||||
|     east?: number; | ||||
|     locationServicesEnabled = false; | ||||
| 
 | ||||
|     constructor( | ||||
|         fb: FormBuilder, | ||||
| @ -87,7 +88,7 @@ export class AddonModDataFieldLatlongComponent extends AddonModDataFieldPluginCo | ||||
|     /** | ||||
|      * @inheritdoc | ||||
|      */ | ||||
|     protected init(): void { | ||||
|     protected async init(): Promise<void> { | ||||
|         if (this.value) { | ||||
|             this.updateValue(this.value); | ||||
|         } | ||||
| @ -95,6 +96,8 @@ export class AddonModDataFieldLatlongComponent extends AddonModDataFieldPluginCo | ||||
|         if (this.editMode) { | ||||
|             this.addControl('f_' + this.field.id + '_0', this.north); | ||||
|             this.addControl('f_' + this.field.id + '_1', this.east); | ||||
|             this.locationServicesEnabled = await CoreGeolocation.canRequest(); | ||||
| 
 | ||||
|         } else if (this.searchMode) { | ||||
|             this.addControl('f_' + this.field.id); | ||||
|         } | ||||
| @ -136,7 +139,7 @@ export class AddonModDataFieldLatlongComponent extends AddonModDataFieldPluginCo | ||||
|      * | ||||
|      * @param error Location error. | ||||
|      */ | ||||
|     protected showLocationErrorModal(error: CoreAnyError): void { | ||||
|     protected showLocationErrorModal(error: CoreAnyError | CoreGeolocationError): void { | ||||
|         if (error instanceof CoreGeolocationError) { | ||||
|             CoreDomUtils.showErrorModal(this.getGeolocationErrorMessage(error), true); | ||||
| 
 | ||||
|  | ||||
| @ -16,8 +16,9 @@ import { Injectable } from '@angular/core'; | ||||
| import { Coordinates } from '@ionic-native/geolocation'; | ||||
| 
 | ||||
| import { CoreApp } from '@services/app'; | ||||
| import { CoreError } from '@classes/errors/error'; | ||||
| import { CoreAnyError, CoreError } from '@classes/errors/error'; | ||||
| import { Geolocation, Diagnostic, makeSingleton } from '@singletons'; | ||||
| import { CoreUtils } from './utils/utils'; | ||||
| 
 | ||||
| @Injectable({ providedIn: 'root' }) | ||||
| export class CoreGeolocationProvider { | ||||
| @ -89,7 +90,6 @@ export class CoreGeolocationProvider { | ||||
|      */ | ||||
|     protected async doAuthorizeLocation(failOnDeniedOnce: boolean = false): Promise<void> { | ||||
|         const authorizationStatus = await Diagnostic.getLocationAuthorizationStatus(); | ||||
| 
 | ||||
|         switch (authorizationStatus) { | ||||
|             case Diagnostic.permissionStatus.DENIED_ONCE: | ||||
|                 if (failOnDeniedOnce) { | ||||
| @ -116,9 +116,21 @@ export class CoreGeolocationProvider { | ||||
|      * | ||||
|      * @param error Error. | ||||
|      */ | ||||
|     // eslint-disable-next-line @typescript-eslint/no-explicit-any
 | ||||
|     protected isCordovaPermissionDeniedError(error?: any): boolean { | ||||
|         return error && 'code' in error && 'PERMISSION_DENIED' in error && error.code === error.PERMISSION_DENIED; | ||||
|     protected isCordovaPermissionDeniedError(error?: CoreAnyError | GeolocationPositionError): boolean { | ||||
|         return !!error && | ||||
|             typeof error == 'object' && | ||||
|             'code' in error && | ||||
|             'PERMISSION_DENIED' in error && | ||||
|             error.code === error.PERMISSION_DENIED; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prechecks if it can request location services. | ||||
|      * | ||||
|      * @return If location can be requested. | ||||
|      */ | ||||
|     async canRequest(): Promise<boolean> { | ||||
|         return CoreUtils.promiseWorks(Diagnostic.getLocationAuthorizationStatus()); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -141,3 +153,15 @@ export class CoreGeolocationError extends CoreError { | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Imported interface type from Web api. | ||||
|  * https://developer.mozilla.org/en-US/docs/Web/API/GeolocationPositionError
 | ||||
|  */ | ||||
| interface GeolocationPositionError { | ||||
|     code: number; | ||||
|     message: string; | ||||
|     PERMISSION_DENIED: number; // eslint-disable-line @typescript-eslint/naming-convention
 | ||||
|     POSITION_UNAVAILABLE: number; // eslint-disable-line @typescript-eslint/naming-convention
 | ||||
|     TIMEOUT: number; // eslint-disable-line @typescript-eslint/naming-convention
 | ||||
| }; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user