Commit d220fc1c by Nabil Sadki

Merge v1.1.4.0

parents 595c9876 bb64ac75
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { PreloadAllModules, RouterModule, Routes } from '@angular/router'; import { PreloadAllModules, RouterModule, Routes } from '@angular/router';
import { AuthGuardService } from './services/auth-guard.service'; import { AuthGuardService } from './services/auth-guard.service';
const routes: Routes = [
{ path: '', redirectTo: 'start', pathMatch: 'full' },
{ path: 'start', loadChildren: './pages/start/start.module#StartPageModule' },
{ path: 'login', loadChildren: './pages/compte/login/login.module#LoginPageModule' },
{ path: 'mainslider', loadChildren: './pages/mainslider/mainslider.module#MainsliderPageModule' },
{
path: 'app',
loadChildren: './pages/menu/menu.module#MenuPageModule',
canActivate: [AuthGuardService]
},
{
path: 'offre-details',
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' },
const routes: Routes = [
{ path: '', redirectTo: 'start', pathMatch: 'full' },
]; { path: 'start', loadChildren: './pages/start/start.module#StartPageModule' },
{ path: 'login', loadChildren: './pages/compte/login/login.module#LoginPageModule' },
@NgModule({ { path: 'mainslider', loadChildren: './pages/mainslider/mainslider.module#MainsliderPageModule' },
imports: [ {
RouterModule.forRoot( path: 'app',
routes, loadChildren: './pages/menu/menu.module#MenuPageModule',
{ canActivate: [AuthGuardService]
preloadingStrategy: PreloadAllModules },
} {
) path: 'offre-details',
], loadChildren: './pages/offres/offre-details/offre-details.module#OffreDetailsPageModule',
exports: [RouterModule] canActivate: [AuthGuardService]
}) },
export class AppRoutingModule { } { 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' },
];
@NgModule({
imports: [
RouterModule.forRoot(
routes,
{
preloadingStrategy: PreloadAllModules
}
)
],
exports: [RouterModule]
})
export class AppRoutingModule { }
...@@ -9,7 +9,6 @@ import { LocalNotifications } from '@ionic-native/local-notifications/ngx'; ...@@ -9,7 +9,6 @@ import { LocalNotifications } from '@ionic-native/local-notifications/ngx';
import { GoogleAnalytics } from '@ionic-native/google-analytics/ngx'; import { GoogleAnalytics } from '@ionic-native/google-analytics/ngx';
import { AppVersion } from '@ionic-native/app-version/ngx'; import { AppVersion } from '@ionic-native/app-version/ngx';
import { TripService } from './services/trip-service';
import { AuthService } from './services/auth.service'; import { AuthService } from './services/auth.service';
// import { LocationService } from './services/location-service'; // import { LocationService } from './services/location-service';
import * as Config from './constants'; import * as Config from './constants';
...@@ -32,7 +31,6 @@ export class AppComponent { ...@@ -32,7 +31,6 @@ export class AppComponent {
private ga: GoogleAnalytics, private ga: GoogleAnalytics,
private appVersion: AppVersion, private appVersion: AppVersion,
private _AUTH: AuthService private _AUTH: AuthService
// private _LOCAT: LocationService
) { ) {
this.initializeApp(); this.initializeApp();
} }
......
...@@ -31,6 +31,7 @@ import { AuthService } from './services/auth.service'; ...@@ -31,6 +31,7 @@ import { AuthService } from './services/auth.service';
import { AuthGuardService } from './services/auth-guard.service'; import { AuthGuardService } from './services/auth-guard.service';
import { LoginHelpPageModule } from './modals/login-help/login-help.module'; import { LoginHelpPageModule } from './modals/login-help/login-help.module';
import { OffresCarteFiltersPageModule } from './modals/offres-carte-filters/offres-carte-filters.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 { AngularFireAuthModule } from '@angular/fire/auth';
// import * as firebase from 'firebase'; // import * as firebase from 'firebase';
...@@ -51,7 +52,8 @@ import { OffresCarteFiltersPageModule } from './modals/offres-carte-filters/offr ...@@ -51,7 +52,8 @@ import { OffresCarteFiltersPageModule } from './modals/offres-carte-filters/offr
HttpClientModule, HttpClientModule,
LotsAGagnerFilterPageModule, LotsAGagnerFilterPageModule,
LoginHelpPageModule, LoginHelpPageModule,
OffresCarteFiltersPageModule OffresCarteFiltersPageModule,
PipesModule
], ],
providers: [ providers: [
StatusBar, 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 WORDPRESS_REST_API_URL = WORDPRESS_URL + 'wp-json/wp/v2/';
export const GA_TRACKID = 'UA-129706772-2'; 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,8 +65,9 @@ ...@@ -65,8 +65,9 @@
</ion-button> </ion-button>
</ion-col> </ion-col>
<ion-col class="ion-no-padding"> <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"
<ion-icon name="person-add"></ion-icon> routerLinkActive="active">
<ion-icon name="person-add"></ion-icon>
Créer un compte Créer un compte
</ion-button> </ion-button>
</ion-col> </ion-col>
......
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { Routes, RouterModule } from '@angular/router'; import { Routes, RouterModule } from '@angular/router';
import { IonicModule } from '@ionic/angular'; import { IonicModule } from '@ionic/angular';
import { ProfilPage } from './profil.page'; import { ProfilPage } from './profil.page';
import { PipesModule } from '../../../pipes/pipes.module';
const routes: Routes = [ const routes: Routes = [
{ {
...@@ -19,8 +20,10 @@ const routes: Routes = [ ...@@ -19,8 +20,10 @@ const routes: Routes = [
CommonModule, CommonModule,
FormsModule, FormsModule,
IonicModule, IonicModule,
RouterModule.forChild(routes) ReactiveFormsModule,
RouterModule.forChild(routes),
PipesModule
], ],
declarations: [ProfilPage] declarations: [ProfilPage]
}) })
export class ProfilPageModule {} export class ProfilPageModule { }
...@@ -6,45 +6,41 @@ ...@@ -6,45 +6,41 @@
<ion-title> <ion-title>
Mon profil Mon profil
</ion-title> </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-toolbar>
</ion-header> </ion-header>
<ion-content> <ion-content>
<ion-card class="alert-quests"> <form [formGroup]="validationsForm">
<ion-card color="primary" class="ion-text-center" padding no-margin> <ion-grid>
Daily quests <ion-row padding>
</ion-card> <ion-col size="4">
<ion-card padding> <ion-avatar>
<ion-grid no-padding> <ion-img [src]="_AUTH.userInfos.avatar"></ion-img>
<ion-row> <!-- <ion-chip color="primary" *ngIf="editMode">
<ion-col no-padding>Quests</ion-col> <ion-icon name="camera" class="ion-no-margin"></ion-icon> Modifier
</ion-row> </ion-chip> -->
</ion-grid> </ion-avatar>
</ion-card> </ion-col>
</ion-card> <ion-col size="8">
<ion-grid> <ion-text>
<ion-row padding> <h2 [hidden]="editMode">{{ _AUTH.userInfos.display_name }}</h2>
<ion-col size="4"> <ion-item [hidden]="!editMode">
<ion-avatar> <ion-input type="text" [value]="_AUTH.userInfos.display_name" formControlName="name"
<ion-img src="../assets/img/avatar.jpeg"></ion-img> clearInput>
</ion-avatar> </ion-input>
</ion-col> </ion-item>
<ion-col size="8"> <ion-chip [color]="editMode ? 'medium' : 'primary'" [outline]="editMode ? false : true">
<ion-text> <ion-icon name="star"></ion-icon>
<h2>Nabil Sadki</h2> <ion-label>Testeur</ion-label>
<ion-chip color="secondary" outline="true"> </ion-chip>
<ion-icon name="star"></ion-icon> </ion-text>
<ion-label>Testeur</ion-label> </ion-col>
</ion-chip> </ion-row>
<ion-chip color="secondary" routerLink="/app/hauts-faits" routerDirection="forward" <!-- <ion-row no-padding padding-horizontal padding-top>
routerLinkActive="active">
<ion-icon name="ribbon" color="secondary"></ion-icon>
<ion-label>10 542</ion-label>
</ion-chip>
</ion-text>
</ion-col>
</ion-row>
<!-- <ion-row no-padding padding-horizontal padding-top>
<ion-col no-padding> <ion-col no-padding>
<ion-progress-bar color="primary" value="0.75"></ion-progress-bar> <ion-progress-bar color="primary" value="0.75"></ion-progress-bar>
</ion-col> </ion-col>
...@@ -53,36 +49,75 @@ ...@@ -53,36 +49,75 @@
<ion-col no-padding size="6" class="ion-text-start"> 0 </ion-col> <ion-col no-padding size="6" class="ion-text-start"> 0 </ion-col>
<ion-col no-padding size="6" class="ion-text-end"> 1000 </ion-col> <ion-col no-padding size="6" class="ion-text-end"> 1000 </ion-col>
</ion-row> --> </ion-row> -->
</ion-grid> </ion-grid>
<ion-card> <ion-card *ngIf="_AUTH?.userInfos?.card_number">
<ion-item color="primary"> <ion-item [color]="editMode ? 'dark' : 'primary'">
Ma carte testeur : Ma carte testeur :
<ion-button slot="end" color="light" fill="outline">Quêtes</ion-button> </ion-item>
</ion-item> <ion-item [color]="editMode ? 'medium' : ''">
<ion-item> <ion-icon name="card" slot="start"></ion-icon> {{ _AUTH.userInfos.card_number | cardNumber }}
<ion-icon name="card" slot="start"></ion-icon> 2019 0108 0000 0001 </ion-item>
</ion-item> <ion-item [color]="editMode ? 'medium' : ''">
<ion-item> <ion-icon name="stopwatch" slot="start"></ion-icon> {{ _AUTH.userInfos.expire_at | expireAt }}
<ion-icon name="stopwatch" slot="start"></ion-icon> 08/2020 </ion-item>
</ion-item> <ion-item lines="none" [color]="editMode ? 'medium' : ''">
<ion-item lines="none"> <ion-icon name="person" slot="start"></ion-icon> {{ _AUTH.userInfos.cni }}
<ion-icon name="person" slot="start"></ion-icon> G101010 </ion-item>
</ion-item> </ion-card>
</ion-card> <ion-card color="primary" *ngIf="!_AUTH?.userInfos?.card_number && !editMode">
<ion-card> <ion-text>
<ion-item color="primary"> <h5 class="ion-text-center">Vous n'avez pas encore.</h5>
Infos : <h3 class="ion-text-center">la Carte Testeur.</h3>
<ion-button slot="end" color="light" fill="outline" routerLink="/app/profil-edit" routerDirection="forward" <p class="ion-text-center">Le saviez-vous? la Carte Testeur vous permet de bénéficer de plusieurs offres
routerLinkActive="active">Modifier</ion-button> exclusives!</p>
</ion-item> <p class="ion-text-center">Des infos?</p>
<ion-item> <p class="ion-text-center">
<ion-icon name="mail" slot="start"></ion-icon> monemail@allo-testeurs.com <ion-button size="small" color="secondary" routerLink="/app/contact" routerDirection="forward"
</ion-item> routerLinkActive="active">Contactez-nous maintenant!</ion-button>
<ion-item> </p>
<ion-icon name="pin" slot="start"></ion-icon> Lorem ipsum sit dolor amet </ion-text>
</ion-item> </ion-card>
<ion-item lines="none"> <ion-card>
<ion-icon name="call" slot="start"></ion-icon> +212 661 20 30 40 <ion-item color="primary">
</ion-item> Infos :
</ion-card> <!-- <ion-button slot="end" color="light" fill="outline" routerLink="/app/profil-edit" routerDirection="root"
</ion-content> routerLinkActive="active">Modifier</ion-button> -->
\ No newline at end of file </ion-item>
<ion-item>
<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" [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" [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 { ion-avatar {
width: 100%;
height: 100%;
position: relative;
ion-chip {
position: absolute;
bottom: -37px;
left: 0;
width: 100%; width: 100%;
height: 100%; }
} }
\ No newline at end of file
import { Component, OnInit } from '@angular/core'; 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({ @Component({
selector: 'app-profil', selector: 'app-profil',
...@@ -7,9 +11,89 @@ import { Component, OnInit } from '@angular/core'; ...@@ -7,9 +11,89 @@ import { Component, OnInit } from '@angular/core';
}) })
export class ProfilPage implements OnInit { 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() { 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 @@ ...@@ -20,14 +20,14 @@
<ion-row> <ion-row>
<ion-col size="4"> <ion-col size="4">
<ion-avatar> <ion-avatar>
<img src="../assets/img/avatar.jpeg"> <ion-img [src]="_AUTH?.userInfos?.avatar"></ion-img>
</ion-avatar> </ion-avatar>
</ion-col> </ion-col>
<ion-col size="8"> <ion-col size="8">
<ion-text> <ion-text>
<h4>{{ _AUTH.infoFullname }}</h4> <h4>{{ _AUTH?.userInfos?.display_name }}</h4>
</ion-text> </ion-text>
<ion-chip color="light" outline="true"> <ion-chip color="light">
<ion-icon name="star"></ion-icon> <ion-icon name="star"></ion-icon>
<ion-label>Testeur</ion-label> <ion-label>Testeur</ion-label>
</ion-chip> </ion-chip>
......
...@@ -4,7 +4,7 @@ import { FormsModule } from '@angular/forms'; ...@@ -4,7 +4,7 @@ import { FormsModule } from '@angular/forms';
import { Routes, RouterModule } from '@angular/router'; import { Routes, RouterModule } from '@angular/router';
import { IonicModule } from '@ionic/angular'; 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'; import { OffresCartePage } from './offres-carte.page';
...@@ -22,6 +22,6 @@ const routes: Routes = [ ...@@ -22,6 +22,6 @@ const routes: Routes = [
IonicModule, IonicModule,
RouterModule.forChild(routes) RouterModule.forChild(routes)
], ],
declarations: [OffresCartePage, SearchPipe] declarations: [OffresCartePage]
}) })
export class OffresCartePageModule {} 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 { NgModule } from '@angular/core';
import { SearchPipe } from './search/search.pipe'; import { SearchPipe } from './search/search.pipe';
import { CardNumberPipe } from './card-number.pipe';
import { ExpireAtPipe } from './expire-at.pipe';
@NgModule({ @NgModule({
declarations: [ declarations: [
SearchPipe SearchPipe,
CardNumberPipe,
ExpireAtPipe
], ],
imports: [], imports: [],
exports: [ exports: [
SearchPipe SearchPipe,
CardNumberPipe,
ExpireAtPipe
] ]
}) })
export class PipesModule {} export class PipesModule {}
...@@ -96,7 +96,6 @@ export class AlloService { ...@@ -96,7 +96,6 @@ export class AlloService {
// spinner: null, // spinner: null,
duration: 0, duration: 0,
message: 'Chargement...', message: 'Chargement...',
translucent: true,
cssClass: 'custom-class custom-loading' cssClass: 'custom-class custom-loading'
}); });
return await this.loading.present().then(() => { return await this.loading.present().then(() => {
......
...@@ -21,6 +21,10 @@ export class AuthService { ...@@ -21,6 +21,10 @@ export class AuthService {
public infoNicename; public infoNicename;
public infoFullname; public infoFullname;
public infoEmail; public infoEmail;
public infoAvatar;
public userId: any;
public userInfos: any;
public userToken: any;
authState = new BehaviorSubject(false); authState = new BehaviorSubject(false);
public isAnonymous = false; public isAnonymous = false;
...@@ -37,9 +41,12 @@ export class AuthService { ...@@ -37,9 +41,12 @@ export class AuthService {
this.platform.ready().then(() => { this.platform.ready().then(() => {
this.storage.get('wpUser').then(wpUser => { this.storage.get('wpUser').then(wpUser => {
if (wpUser) { if (wpUser) {
this.infoNicename = wpUser.user_nicename; this.userToken = wpUser.token;
this.infoFullname = wpUser.user_display_name; }
this.infoEmail = wpUser.user_email; });
this.storage.get('wpUserInfos').then(wpUserInfos => {
if (wpUserInfos) {
this.updateServiceProps(wpUserInfos);
} }
}); });
this.isLoggedIn(); this.isLoggedIn();
...@@ -47,6 +54,15 @@ export class AuthService { ...@@ -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() { isAuthenticated() {
return this.authState.value; return this.authState.value;
} }
...@@ -81,6 +97,7 @@ export class AuthService { ...@@ -81,6 +97,7 @@ export class AuthService {
this.infoNicename = user.user_nicename; this.infoNicename = user.user_nicename;
this.infoFullname = user.user_display_name; this.infoFullname = user.user_display_name;
this.infoEmail = user.user_email; this.infoEmail = user.user_email;
this.userToken = user.token;
this.authState.next(true); this.authState.next(true);
return this.storage.set('wpUser', user); return this.storage.set('wpUser', user);
...@@ -88,8 +105,16 @@ export class AuthService { ...@@ -88,8 +105,16 @@ export class AuthService {
logOut() { logOut() {
this.ga.trackEvent('Logout', 'Tapped button', '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); this.authState.next(false);
return this.storage.remove('wpUser');
} }
doLogin(values) { doLogin(values) {
...@@ -135,36 +160,123 @@ export class AuthService { ...@@ -135,36 +160,123 @@ export class AuthService {
{}, {},
{ headers: header } { headers: header }
).then( ).then(
res => { userInfos => {
console.log(res); this.storage.set('wpUserInfos', userInfos).then(wpUserInfos => {
resolve(res); if (wpUserInfos) {
this.updateServiceProps(wpUserInfos);
}
});
resolve(userInfos);
}, },
err => reject(err) err => reject(err)
); );
} else { } else {
this.http.get( this.http.get(
// Config.WORDPRESS_URL + 'wp-json/wp/v2/users/me', // 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 } } { headers: { Authorization: 'Bearer ' + token } }
).subscribe( ).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 => { res => {
console.log(res); const data = JSON.parse(res.data);
this.setUser(data);
this.setUserInfo(data.token);
this.authState.next(true);
resolve(res); resolve(res);
}, },
err => reject(err) 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) { doUserUpdate(userData) {
return this.http.post(Config.WORDPRESS_REST_API_URL + 'users?token=' + token, user_data); 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) { validateAuthToken(token) {
this._ALLO.presentLoading(); this._ALLO.presentLoading();
if (this.platform.is('cordova')) { if (this.platform.is('cordova')) {
let header: Headers = new Headers(); const header: Headers = new Headers();
header.append('Authorization', 'Bearer ' + token); header.append('Authorization', 'Bearer ' + token);
return this.httpAdv.post( return this.httpAdv.post(
Config.WORDPRESS_URL + 'wp-json/jwt-auth/v1/token/validate', Config.WORDPRESS_URL + 'wp-json/jwt-auth/v1/token/validate',
......
...@@ -7,6 +7,8 @@ import { Router } from '@angular/router'; ...@@ -7,6 +7,8 @@ import { Router } from '@angular/router';
import { GoogleAnalytics } from '@ionic-native/google-analytics/ngx'; import { GoogleAnalytics } from '@ionic-native/google-analytics/ngx';
import { AlloService } from './allo-service'; import { AlloService } from './allo-service';
import * as Config from '../constants';
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class TripService { export class TripService {
public products: Array<any> = []; public products: Array<any> = [];
...@@ -37,14 +39,14 @@ export class TripService { ...@@ -37,14 +39,14 @@ export class TripService {
this.setData(REST_services); this.setData(REST_services);
} }
else if (this.platform.is('cordova')) { 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) => { .then((response) => {
const json = JSON.parse(response.data); const json = JSON.parse(response.data);
this.storage.set('REST_services', json); this.storage.set('REST_services', json);
this.setData(json); this.setData(json);
}); });
} else { } 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) => { .subscribe((data) => {
this.storage.set('REST_services', data); this.storage.set('REST_services', data);
this.setData(data); this.setData(data);
...@@ -91,9 +93,9 @@ export class TripService { ...@@ -91,9 +93,9 @@ export class TripService {
getRequest() { getRequest() {
if (this.platform.is('cordova')) { 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 { } 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