Commit d220fc1c by Nabil Sadki

Merge v1.1.4.0

parents 595c9876 bb64ac75
......@@ -17,8 +17,9 @@ const routes: Routes = [
loadChildren: './pages/offres/offre-details/offre-details.module#OffreDetailsPageModule',
canActivate: [AuthGuardService]
},
{ path: 'login-help', loadChildren: './modals/login-help/login-help.module#LoginHelpPageModule' }, { path: 'offres-carte-filters', loadChildren: './modals/offres-carte-filters/offres-carte-filters.module#OffresCarteFiltersPageModule' },
{ path: 'login-help', loadChildren: './modals/login-help/login-help.module#LoginHelpPageModule' },
{ path: 'offres-carte-filters', loadChildren: './modals/offres-carte-filters/offres-carte-filters.module#OffresCarteFiltersPageModule' },
{ path: 'create-account', loadChildren: './pages/compte/create/create.module#CreatePageModule' },
];
......
......@@ -9,7 +9,6 @@ import { LocalNotifications } from '@ionic-native/local-notifications/ngx';
import { GoogleAnalytics } from '@ionic-native/google-analytics/ngx';
import { AppVersion } from '@ionic-native/app-version/ngx';
import { TripService } from './services/trip-service';
import { AuthService } from './services/auth.service';
// import { LocationService } from './services/location-service';
import * as Config from './constants';
......@@ -32,7 +31,6 @@ export class AppComponent {
private ga: GoogleAnalytics,
private appVersion: AppVersion,
private _AUTH: AuthService
// private _LOCAT: LocationService
) {
this.initializeApp();
}
......
......@@ -31,6 +31,7 @@ import { AuthService } from './services/auth.service';
import { AuthGuardService } from './services/auth-guard.service';
import { LoginHelpPageModule } from './modals/login-help/login-help.module';
import { OffresCarteFiltersPageModule } from './modals/offres-carte-filters/offres-carte-filters.module';
import { PipesModule } from './pipes/pipes.module';
// import { AngularFireAuthModule } from '@angular/fire/auth';
// import * as firebase from 'firebase';
......@@ -51,7 +52,8 @@ import { OffresCarteFiltersPageModule } from './modals/offres-carte-filters/offr
HttpClientModule,
LotsAGagnerFilterPageModule,
LoginHelpPageModule,
OffresCarteFiltersPageModule
OffresCarteFiltersPageModule,
PipesModule
],
providers: [
StatusBar,
......
export const WORDPRESS_URL = 'http://www.allo-testeurs.com/';
export const WORDPRESS_URL = 'http://allo-testeurs.test/';
// export const WORDPRESS_URL = 'http://www.allo-testeurs.com/';
export const WORDPRESS_REST_API_URL = WORDPRESS_URL + 'wp-json/wp/v2/';
export const GA_TRACKID = 'UA-129706772-2';
export const WORDPRESS_REST_API_ACF_USER_URL = WORDPRESS_URL + 'wp-json/acf/v3/users/';
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { Routes, RouterModule } from '@angular/router';
import { IonicModule } from '@ionic/angular';
import { CreatePage } from './create.page';
const routes: Routes = [
{
path: '',
component: CreatePage
}
];
@NgModule({
imports: [
CommonModule,
FormsModule,
IonicModule,
ReactiveFormsModule,
RouterModule.forChild(routes)
],
declarations: [CreatePage]
})
export class CreatePageModule {}
<ion-header>
<ion-toolbar color="primary" padding-right>
<ion-title>Créer un compte</ion-title>
</ion-toolbar>
</ion-header>
<ion-content color="primary" class="ion-padding">
<ion-card>
<form [formGroup]="vForm">
<ion-list>
<ion-list-header color="medium">Informations de base</ion-list-header>
<ion-item>
<ion-label position="floating">Prénom <ion-text color="danger">*</ion-text>
</ion-label>
<ion-input type="text" formControlName="prenom" clearInput></ion-input>
</ion-item>
<div class="validation-errors">
<ng-container *ngFor="let validation of vMessages.prenom">
<div class="error-message"
*ngIf="vForm.get('prenom').hasError(validation.type) && (vForm.get('prenom').dirty || vForm.get('prenom').touched)">
<ion-text color="danger">
<ion-icon name="information-circle-outline"></ion-icon> {{ validation.message }}
</ion-text>
</div>
</ng-container>
</div>
<ion-item>
<ion-label position="floating">Nom <ion-text color="danger">*</ion-text>
</ion-label>
<ion-input type="text" formControlName="nom" clearInput></ion-input>
</ion-item>
<div class="validation-errors">
<ng-container *ngFor="let validation of vMessages.nom">
<div class="error-message"
*ngIf="vForm.get('nom').hasError(validation.type) && (vForm.get('nom').dirty || vForm.get('nom').touched)">
<ion-text color="danger">
<ion-icon name="information-circle-outline"></ion-icon> {{ validation.message }}
</ion-text>
</div>
</ng-container>
</div>
<ion-item>
<ion-label position="floating">Email <ion-text color="danger">*</ion-text>
</ion-label>
<ion-input type="email" formControlName="email" clearInput></ion-input>
</ion-item>
<div class="validation-errors">
<ng-container *ngFor="let validation of vMessages.email">
<div class="error-message"
*ngIf="vForm.get('email').hasError(validation.type) && (vForm.get('email').dirty || vForm.get('email').touched)">
<ion-text color="danger">
<ion-icon name="information-circle-outline"></ion-icon> {{ validation.message }}
</ion-text>
</div>
</ng-container>
</div>
<ion-item>
<ion-label position="floating">Téléphone <ion-text color="danger">*</ion-text>
</ion-label>
<ion-input type="number" formControlName="tel" clearInput></ion-input>
</ion-item>
<div class="validation-errors">
<ng-container *ngFor="let validation of vMessages.tel">
<div class="error-message"
*ngIf="vForm.get('tel').hasError(validation.type) && (vForm.get('tel').dirty || vForm.get('tel').touched)">
<ion-text color="danger">
<ion-icon name="information-circle-outline"></ion-icon> {{ validation.message }}
</ion-text>
</div>
</ng-container>
</div>
<ion-list-header color="medium">Sécurité</ion-list-header>
<div formGroupName="matching_passwords">
<ion-item>
<ion-label position="floating">Mot de passe <ion-text color="danger">*</ion-text>
</ion-label>
<ion-input type="password" formControlName="password" clearInput></ion-input>
</ion-item>
<div class="validation-errors">
<ng-container *ngFor="let validation of vMessages.password">
<div class="error-message"
*ngIf="vForm.get('matching_passwords').get('password').hasError(validation.type) && (vForm.get('matching_passwords').get('password').dirty || vForm.get('matching_passwords').get('password').touched)">
<ion-text color="danger">
<ion-icon name="information-circle-outline"></ion-icon> {{ validation.message }}
</ion-text>
</div>
</ng-container>
</div>
<ion-item>
<ion-label position="floating">Confirmer le mot de passe <ion-text color="danger">*</ion-text>
</ion-label>
<ion-input type="password" formControlName="password_confirm" clearInput></ion-input>
</ion-item>
<div class="validation-errors">
<ng-container *ngFor="let validation of vMessages.password_confirm">
<div class="error-message"
*ngIf="vForm.get('matching_passwords').get('password_confirm').hasError(validation.type) && (vForm.get('matching_passwords').get('password_confirm').dirty || vForm.get('matching_passwords').get('password_confirm').touched)">
<ion-text color="danger">
<ion-icon name="information-circle-outline"></ion-icon> {{ validation.message }}
</ion-text>
</div>
</ng-container>
<ng-container *ngFor="let validation of vMessages.matching_passwords">
<div class="error-message"
*ngIf="vForm.get('matching_passwords').hasError(validation.type) && (vForm.get('matching_passwords').dirty || vForm.get('matching_passwords').touched)">
<ion-text color="danger">
<ion-icon name="information-circle-outline"></ion-icon> {{ validation.message }}
</ion-text>
</div>
</ng-container>
</div>
</div>
<ion-item lines="none" class="ion-text-end">
<ion-button class="ion-float-end" color="tertiary" routerLink="/login" routerDirection="backward" routerLinkActive="active">
Annuler</ion-button>
<ion-button class="ion-float-end" type="submit" [disabled]="!vForm.valid"
(click)="vForm.valid && onSubmit(vForm.value)">Créer mon compte</ion-button>
</ion-item>
</ion-list>
</form>
</ion-card>
</ion-content>
\ No newline at end of file
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { CreatePage } from './create.page';
describe('CreatePage', () => {
let component: CreatePage;
let fixture: ComponentFixture<CreatePage>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ CreatePage ],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(CreatePage);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { Validators, FormBuilder, FormGroup, FormControl } from '@angular/forms';
import { Storage } from '@ionic/storage';
import { PasswordValidator } from '../../../validators/password';
import { AlloService } from '../../../services/allo-service';
import { AuthService } from '../../../services/auth.service';
@Component({
selector: 'app-create',
templateUrl: './create.page.html',
styleUrls: ['./create.page.scss'],
})
export class CreatePage implements OnInit {
vForm: FormGroup;
matchingPasswordsGroup: FormGroup;
syncing = false;
vMessages = {
nom: [
{ type: 'required', message: 'Champs requis.' }
],
prenom: [
{ type: 'required', message: 'Champs requis.' }
],
email: [
{ type: 'required', message: 'Champs requis.' },
{ type: 'pattern', message: 'Adresse email non valide.' }
],
tel: [
{ type: 'required', message: 'Champs requis.' },
],
password: [
{ type: 'required', message: 'Champs requis.' },
{ type: 'minlength', message: 'Au moins 5 caractères.' },
{ type: 'pattern', message: 'Au moins une lettre minuscule, 1 lettre majuscule et un chiffre.' }
],
confirm_password: [
{ type: 'required', message: 'Champs requis.' }
],
matching_passwords: [
{ type: 'areEqual', message: 'Merci de mettre le même mot de passe.' }
],
};
constructor(
public formBuilder: FormBuilder,
public storage: Storage,
public _ALLO: AlloService,
public _AUTH: AuthService
) { }
ngOnInit() {
this.matchingPasswordsGroup = new FormGroup({
password: new FormControl('', Validators.compose([
Validators.minLength(5),
Validators.required,
Validators.pattern('^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]+$')
])),
password_confirm: new FormControl('', Validators.required)
}, (formGroup: FormGroup) => {
return PasswordValidator.areEqual(formGroup);
});
this.vForm = this.formBuilder.group({
nom: new FormControl('', Validators.required),
prenom: new FormControl('', Validators.required),
tel: new FormControl('', Validators.required),
// password: new FormControl('', Validators.required),
// password_confirm: new FormControl('', Validators.required),
email: new FormControl('', Validators.compose([
Validators.required,
Validators.pattern('^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,15}$')
])),
matching_passwords: this.matchingPasswordsGroup,
});
}
onSubmit(values) {
console.log(values);
this._ALLO.presentLoading();
this._AUTH.doUserRegister(values)
.then(
result => {
this._ALLO.dismissLoading();
console.log(result);
},
err => {
this._ALLO.dismissLoading();
console.log(err);
});
}
}
......@@ -65,7 +65,8 @@
</ion-button>
</ion-col>
<ion-col class="ion-no-padding">
<ion-button color="light" class="btn-g ion-no-margin">
<ion-button color="light" class="btn-g ion-no-margin" routerLink="/create-account" routerDirection="root"
routerLinkActive="active">
<ion-icon name="person-add"></ion-icon>
Créer un compte
</ion-button>
......
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { Routes, RouterModule } from '@angular/router';
import { IonicModule } from '@ionic/angular';
import { ProfilPage } from './profil.page';
import { PipesModule } from '../../../pipes/pipes.module';
const routes: Routes = [
{
......@@ -19,8 +20,10 @@ const routes: Routes = [
CommonModule,
FormsModule,
IonicModule,
RouterModule.forChild(routes)
ReactiveFormsModule,
RouterModule.forChild(routes),
PipesModule
],
declarations: [ProfilPage]
})
export class ProfilPageModule {}
export class ProfilPageModule { }
......@@ -6,41 +6,37 @@
<ion-title>
Mon profil
</ion-title>
<ion-buttons slot="end">
<ion-button fill="outline" color="light" *ngIf="!editMode" (click)="startEdit()">Modifier</ion-button>
<ion-spinner name="dots" color="light" *ngIf="syncing"></ion-spinner>
</ion-buttons>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-card class="alert-quests">
<ion-card color="primary" class="ion-text-center" padding no-margin>
Daily quests
</ion-card>
<ion-card padding>
<ion-grid no-padding>
<ion-row>
<ion-col no-padding>Quests</ion-col>
</ion-row>
</ion-grid>
</ion-card>
</ion-card>
<form [formGroup]="validationsForm">
<ion-grid>
<ion-row padding>
<ion-col size="4">
<ion-avatar>
<ion-img src="../assets/img/avatar.jpeg"></ion-img>
<ion-img [src]="_AUTH.userInfos.avatar"></ion-img>
<!-- <ion-chip color="primary" *ngIf="editMode">
<ion-icon name="camera" class="ion-no-margin"></ion-icon> Modifier
</ion-chip> -->
</ion-avatar>
</ion-col>
<ion-col size="8">
<ion-text>
<h2>Nabil Sadki</h2>
<ion-chip color="secondary" outline="true">
<h2 [hidden]="editMode">{{ _AUTH.userInfos.display_name }}</h2>
<ion-item [hidden]="!editMode">
<ion-input type="text" [value]="_AUTH.userInfos.display_name" formControlName="name"
clearInput>
</ion-input>
</ion-item>
<ion-chip [color]="editMode ? 'medium' : 'primary'" [outline]="editMode ? false : true">
<ion-icon name="star"></ion-icon>
<ion-label>Testeur</ion-label>
</ion-chip>
<ion-chip color="secondary" routerLink="/app/hauts-faits" routerDirection="forward"
routerLinkActive="active">
<ion-icon name="ribbon" color="secondary"></ion-icon>
<ion-label>10 542</ion-label>
</ion-chip>
</ion-text>
</ion-col>
</ion-row>
......@@ -54,35 +50,74 @@
<ion-col no-padding size="6" class="ion-text-end"> 1000 </ion-col>
</ion-row> -->
</ion-grid>
<ion-card>
<ion-item color="primary">
<ion-card *ngIf="_AUTH?.userInfos?.card_number">
<ion-item [color]="editMode ? 'dark' : 'primary'">
Ma carte testeur :
<ion-button slot="end" color="light" fill="outline">Quêtes</ion-button>
</ion-item>
<ion-item>
<ion-icon name="card" slot="start"></ion-icon> 2019 0108 0000 0001
<ion-item [color]="editMode ? 'medium' : ''">
<ion-icon name="card" slot="start"></ion-icon> {{ _AUTH.userInfos.card_number | cardNumber }}
</ion-item>
<ion-item>
<ion-icon name="stopwatch" slot="start"></ion-icon> 08/2020
<ion-item [color]="editMode ? 'medium' : ''">
<ion-icon name="stopwatch" slot="start"></ion-icon> {{ _AUTH.userInfos.expire_at | expireAt }}
</ion-item>
<ion-item lines="none">
<ion-icon name="person" slot="start"></ion-icon> G101010
<ion-item lines="none" [color]="editMode ? 'medium' : ''">
<ion-icon name="person" slot="start"></ion-icon> {{ _AUTH.userInfos.cni }}
</ion-item>
</ion-card>
<ion-card color="primary" *ngIf="!_AUTH?.userInfos?.card_number && !editMode">
<ion-text>
<h5 class="ion-text-center">Vous n'avez pas encore.</h5>
<h3 class="ion-text-center">la Carte Testeur.</h3>
<p class="ion-text-center">Le saviez-vous? la Carte Testeur vous permet de bénéficer de plusieurs offres
exclusives!</p>
<p class="ion-text-center">Des infos?</p>
<p class="ion-text-center">
<ion-button size="small" color="secondary" routerLink="/app/contact" routerDirection="forward"
routerLinkActive="active">Contactez-nous maintenant!</ion-button>
</p>
</ion-text>
</ion-card>
<ion-card>
<ion-item color="primary">
Infos :
<ion-button slot="end" color="light" fill="outline" routerLink="/app/profil-edit" routerDirection="forward"
routerLinkActive="active">Modifier</ion-button>
<!-- <ion-button slot="end" color="light" fill="outline" routerLink="/app/profil-edit" routerDirection="root"
routerLinkActive="active">Modifier</ion-button> -->
</ion-item>
<ion-item>
<ion-icon name="mail" slot="start"></ion-icon> monemail@allo-testeurs.com
<ion-icon name="mail" slot="start" [color]="editMode ? 'secondary' : ''"></ion-icon>
<ion-text [hidden]="editMode">{{ _AUTH.userInfos.user_email }}</ion-text>
<ion-input type="email" [hidden]="!editMode" [value]="_AUTH.userInfos.user_email"
formControlName="email" clearInput>
</ion-input>
</ion-item>
<ion-item>
<ion-icon name="pin" slot="start"></ion-icon> Lorem ipsum sit dolor amet
<ion-icon name="pin" slot="start" [color]="editMode ? 'secondary' : ''"></ion-icon>
<ion-text [hidden]="editMode">{{ _AUTH.userInfos.addresse }}</ion-text>
<ion-input type="text" [hidden]="!editMode" [value]="_AUTH.userInfos.addresse"
formControlName="addresse" clearInput>
</ion-input>
</ion-item>
<ion-item lines="none">
<ion-icon name="call" slot="start"></ion-icon> +212 661 20 30 40
<ion-icon name="call" slot="start" [color]="editMode ? 'secondary' : ''"></ion-icon>
<ion-text [hidden]="editMode">{{ _AUTH.userInfos.phone }}</ion-text>
<ion-input type="text" [hidden]="!editMode" [value]="_AUTH.userInfos.phone" formControlName="phone"
clearInput>
</ion-input>
</ion-item>
</ion-card>
</form>
</ion-content>
<ion-footer *ngIf="editMode">
<ion-toolbar color="primary">
<ion-buttons slot="end" *ngIf="!syncing">
<ion-button fill="outline" color="light" (click)="cancelEdit()">
<ion-icon name="close"></ion-icon> Annuler
</ion-button>
<ion-button fill="solid" color="success" type="submit" [disabled]="!validationsForm.valid"
(click)="validationsForm.valid && onSubmit(validationsForm.value)">
<ion-icon name="checkmark"></ion-icon> Valider
</ion-button>
</ion-buttons>
</ion-toolbar>
</ion-footer>
ion-avatar {
width: 100%;
height: 100%;
position: relative;
ion-chip {
position: absolute;
bottom: -37px;
left: 0;
width: 100%;
}
}
import { Component, OnInit } from '@angular/core';
import { AuthService } from '../../../services/auth.service';
import { Validators, FormBuilder, FormGroup, FormControl } from '@angular/forms';
import { Storage } from '@ionic/storage';
@Component({
selector: 'app-profil',
......@@ -7,9 +11,89 @@ import { Component, OnInit } from '@angular/core';
})
export class ProfilPage implements OnInit {
constructor() { }
validationsForm: FormGroup;
editMode = false;
syncing = false;
validationMessages = {
name: [
{ type: 'required', message: 'Champs requis.' }
],
email: [
{ type: 'required', message: 'Champs requis.' },
{ type: 'pattern', message: 'Adresse email non valide.' }
],
phone: [
{ type: 'required', message: 'Champs requis.' },
],
adresse: [
{ type: 'required', message: 'Champs requis.' },
],
};
constructor(
public formBuilder: FormBuilder,
public storage: Storage,
public _AUTH: AuthService
) { }
ngOnInit() {
this.validationsForm = this.formBuilder.group({
name: new FormControl('', Validators.required),
phone: new FormControl('', Validators.required),
addresse: new FormControl('', Validators.required),
email: new FormControl('', Validators.compose([
Validators.required,
Validators.pattern('^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,15}$')
]))
});
this.storage.get('wpUserInfos').then(wpUserInfos => {
if (wpUserInfos) {
this.validationsForm.controls['name'].setValue(wpUserInfos.display_name);
this.validationsForm.controls['email'].setValue(wpUserInfos.user_email);
this.validationsForm.controls['addresse'].setValue(wpUserInfos.addresse);
this.validationsForm.controls['phone'].setValue(wpUserInfos.phone);
}
});
}
onSubmit(values) {
this.syncing = true;
this.storage.get('wpUserInfos').then(wpUserInfos => {
if (wpUserInfos) {
wpUserInfos.display_name = values.name;
wpUserInfos.user_email = values.email;
wpUserInfos.addresse = values.addresse;
wpUserInfos.phone = values.phone;
this.storage.set('wpUserInfos', wpUserInfos).then(() => {
this._AUTH.userInfos = wpUserInfos;
const userData = {
name: values.name,
email: values.email,
addresse: values.addresse,
phone: values.phone,
context: 'edit',
meta: {
addresse: values.addresse,
phone: values.phone
}
};
this._AUTH.doUserUpdate(userData).then(
result => {
this.editMode = false;
this.syncing = false;
});
});
}
});
}
startEdit() {
this.editMode = true;
this.validationsForm.updateValueAndValidity();
}
cancelEdit() {
this.editMode = false;
}
}
......@@ -20,14 +20,14 @@
<ion-row>
<ion-col size="4">
<ion-avatar>
<img src="../assets/img/avatar.jpeg">
<ion-img [src]="_AUTH?.userInfos?.avatar"></ion-img>
</ion-avatar>
</ion-col>
<ion-col size="8">
<ion-text>
<h4>{{ _AUTH.infoFullname }}</h4>
<h4>{{ _AUTH?.userInfos?.display_name }}</h4>
</ion-text>
<ion-chip color="light" outline="true">
<ion-chip color="light">
<ion-icon name="star"></ion-icon>
<ion-label>Testeur</ion-label>
</ion-chip>
......
......@@ -4,7 +4,7 @@ import { FormsModule } from '@angular/forms';
import { Routes, RouterModule } from '@angular/router';
import { IonicModule } from '@ionic/angular';
import { SearchPipe } from '../../../pipes/search/search.pipe';
// import { SearchPipe } from '../../../pipes/search/search.pipe';
import { OffresCartePage } from './offres-carte.page';
......@@ -22,6 +22,6 @@ const routes: Routes = [
IonicModule,
RouterModule.forChild(routes)
],
declarations: [OffresCartePage, SearchPipe]
declarations: [OffresCartePage]
})
export class OffresCartePageModule {}
import { CardNumberPipe } from './card-number.pipe';
describe('CardNumberPipe', () => {
it('create an instance', () => {
const pipe = new CardNumberPipe();
expect(pipe).toBeTruthy();
});
});
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'cardNumber'
})
export class CardNumberPipe implements PipeTransform {
transform(value: any, args?: any): any {
return value.replace(/\s/g, '').replace(/(.{4})/g, '$1 ');
}
}
import { ExpireAtPipe } from './expire-at.pipe';
describe('ExpireAtPipe', () => {
it('create an instance', () => {
const pipe = new ExpireAtPipe();
expect(pipe).toBeTruthy();
});
});
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'expireAt'
})
export class ExpireAtPipe implements PipeTransform {
transform(value: any, args?: any): any {
return value.substr(4, 2) + '/' + value.substr(0, 4);
}
}
import { NgModule } from '@angular/core';
import { SearchPipe } from './search/search.pipe';
import { CardNumberPipe } from './card-number.pipe';
import { ExpireAtPipe } from './expire-at.pipe';
@NgModule({
declarations: [
SearchPipe
SearchPipe,
CardNumberPipe,
ExpireAtPipe
],
imports: [],
exports: [
SearchPipe
SearchPipe,
CardNumberPipe,
ExpireAtPipe
]
})
export class PipesModule {}
......@@ -96,7 +96,6 @@ export class AlloService {
// spinner: null,
duration: 0,
message: 'Chargement...',
translucent: true,
cssClass: 'custom-class custom-loading'
});
return await this.loading.present().then(() => {
......
......@@ -21,6 +21,10 @@ export class AuthService {
public infoNicename;
public infoFullname;
public infoEmail;
public infoAvatar;
public userId: any;
public userInfos: any;
public userToken: any;
authState = new BehaviorSubject(false);
public isAnonymous = false;
......@@ -37,9 +41,12 @@ export class AuthService {
this.platform.ready().then(() => {
this.storage.get('wpUser').then(wpUser => {
if (wpUser) {
this.infoNicename = wpUser.user_nicename;
this.infoFullname = wpUser.user_display_name;
this.infoEmail = wpUser.user_email;
this.userToken = wpUser.token;
}
});
this.storage.get('wpUserInfos').then(wpUserInfos => {
if (wpUserInfos) {
this.updateServiceProps(wpUserInfos);
}
});
this.isLoggedIn();
......@@ -47,6 +54,15 @@ export class AuthService {
});
}
updateServiceProps(wpUserInfos) {
this.infoNicename = wpUserInfos.user_nicename;
this.infoFullname = wpUserInfos.display_name;
this.infoEmail = wpUserInfos.user_email;
this.infoAvatar = wpUserInfos.avatar;
this.userInfos = wpUserInfos;
this.userId = wpUserInfos.ID;
}
isAuthenticated() {
return this.authState.value;
}
......@@ -81,6 +97,7 @@ export class AuthService {
this.infoNicename = user.user_nicename;
this.infoFullname = user.user_display_name;
this.infoEmail = user.user_email;
this.userToken = user.token;
this.authState.next(true);
return this.storage.set('wpUser', user);
......@@ -88,8 +105,16 @@ export class AuthService {
logOut() {
this.ga.trackEvent('Logout', 'Tapped button', 'Logout');
this.storage.remove('wpUser');
this.storage.remove('wpUserInfos');
this.infoNicename = null;
this.infoFullname = null;
this.infoEmail = null;
this.infoAvatar = null;
this.userId = null;
this.userInfos = null;
this.userToken = null;
this.authState.next(false);
return this.storage.remove('wpUser');
}
doLogin(values) {
......@@ -135,36 +160,123 @@ export class AuthService {
{},
{ headers: header }
).then(
res => {
console.log(res);
resolve(res);
userInfos => {
this.storage.set('wpUserInfos', userInfos).then(wpUserInfos => {
if (wpUserInfos) {
this.updateServiceProps(wpUserInfos);
}
});
resolve(userInfos);
},
err => reject(err)
);
} else {
this.http.get(
// Config.WORDPRESS_URL + 'wp-json/wp/v2/users/me',
Config.WORDPRESS_URL + 'wp-json/atapi/loggedinuser',
Config.WORDPRESS_URL + 'wp-json/atapi/userinfos',
{ headers: { Authorization: 'Bearer ' + token } }
).subscribe(
userInfos => {
this.storage.set('wpUserInfos', userInfos).then(wpUserInfos => {
if (wpUserInfos) {
this.updateServiceProps(wpUserInfos);
}
});
resolve(userInfos);
},
err => reject(err)
);
}
});
}
doUserRegister(userData) {
const authData = {
username: userData.email,
email: userData.email,
password: userData.matching_passwords.password,
name: userData.prenom + ' ' + userData.nom,
first_name: userData.prenom,
last_name: userData.nom,
};
return new Promise<any>((resolve, reject) => {
if (this.platform.is('cordova')) {
this.httpAdv.post(Config.WORDPRESS_URL + 'wp-json/wp/v2/users', authData, {}).then(
res => {
console.log(res);
const data = JSON.parse(res.data);
this.setUser(data);
this.setUserInfo(data.token);
this.authState.next(true);
resolve(res);
},
err => reject(err)
);
} else {
this.http.post(Config.WORDPRESS_URL + 'wp-json/wp/v2/users', authData).subscribe(
res => {
const data: any = res;
console.log(data);
// this.setUser(data);
// this.setUserInfo(data.token);
// this.authState.next(true);
resolve(data);
},
err => reject(err)
);
}
});
}
doRegister(user_data, token) {
return this.http.post(Config.WORDPRESS_REST_API_URL + 'users?token=' + token, user_data);
doUserUpdate(userData) {
return new Promise<any>((resolve, reject) => {
if (this.platform.is('cordova')) {
const header: Headers = new Headers();
header.append('Authorization', 'Bearer ' + this.userToken);
this.httpAdv.get(
Config.WORDPRESS_REST_API_URL + 'users/' + this.userId,
userData,
{ headers: header }
).then(
userInfos => {
resolve(userInfos);
},
err => reject(err)
);
} else {
this.http.post(
Config.WORDPRESS_REST_API_URL + 'users/' + this.userId,
userData,
{ headers: { Authorization: 'Bearer ' + this.userToken } }
).subscribe(
result => {
this.http.post(
Config.WORDPRESS_REST_API_ACF_USER_URL + this.userId,
{
fields: {
addresse: userData.addresse,
phone: userData.phone
}
},
{ headers: { Authorization: 'Bearer ' + this.userToken } }
).subscribe(
result => {
console.log('acf', result);
});
resolve(result);
},
err => reject(err)
);
}
});
}
validateAuthToken(token) {
this._ALLO.presentLoading();
if (this.platform.is('cordova')) {
let header: Headers = new Headers();
const header: Headers = new Headers();
header.append('Authorization', 'Bearer ' + token);
return this.httpAdv.post(
Config.WORDPRESS_URL + 'wp-json/jwt-auth/v1/token/validate',
......
......@@ -7,6 +7,8 @@ import { Router } from '@angular/router';
import { GoogleAnalytics } from '@ionic-native/google-analytics/ngx';
import { AlloService } from './allo-service';
import * as Config from '../constants';
@Injectable({ providedIn: 'root' })
export class TripService {
public products: Array<any> = [];
......@@ -37,14 +39,14 @@ export class TripService {
this.setData(REST_services);
}
else if (this.platform.is('cordova')) {
this.httpAdv.get('https://www.allo-testeurs.com/services.json?' + Math.random(), {}, {})
this.httpAdv.get(Config.WORDPRESS_URL + 'services.json?' + Math.random(), {}, {})
.then((response) => {
const json = JSON.parse(response.data);
this.storage.set('REST_services', json);
this.setData(json);
});
} else {
this.http.get('https://www.allo-testeurs.com/services.json?' + Math.random())
this.http.get(Config.WORDPRESS_URL + 'services.json?' + Math.random())
.subscribe((data) => {
this.storage.set('REST_services', data);
this.setData(data);
......@@ -91,9 +93,9 @@ export class TripService {
getRequest() {
if (this.platform.is('cordova')) {
return this.httpAdv.get('http://www.allo-testeurs.com/services.json?' + Math.random(), {}, {});
return this.httpAdv.get(Config.WORDPRESS_URL + 'services.json?' + Math.random(), {}, {});
} else {
return this.http.get('http://www.allo-testeurs.com/services.json?' + Math.random());
return this.http.get(Config.WORDPRESS_URL + 'services.json?' + Math.random());
}
}
......
import { Password } from './password';
describe('Password', () => {
it('should create an instance', () => {
expect(new Password()).toBeTruthy();
});
});
import { FormControl, FormGroup } from '@angular/forms';
export class PasswordValidator {
// Inspired on: http://plnkr.co/edit/Zcbg2T3tOxYmhxs7vaAm?p=preview
static areEqual(formGroup: FormGroup) {
let val;
let valid = true;
for (let key in formGroup.controls) {
if (formGroup.controls.hasOwnProperty(key)) {
let control: FormControl = <FormControl>formGroup.controls[key];
if (val === undefined) {
val = control.value
} else {
if (val !== control.value) {
valid = false;
break;
}
}
}
}
if (valid) {
return null;
}
return {
areEqual: true
};
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment