src/app/components/profile/profile.component.ts
Muestra y modifica los datos de perfil del usuario.
selector | app-profile |
styleUrls | ./profile.component.css |
templateUrl | ./profile.component.html |
Properties |
Methods |
cancelEdit |
cancelEdit()
|
Cancela la actualización de los datos de usuario.
Returns :
void
|
deleteImage | ||||
deleteImage(downloadUrl)
|
||||
Para eliminar la imagen a partir de una URL.
Parameters :
Returns :
any
|
editprofile | ||||||
editprofile(form: NgForm)
|
||||||
Para editar el perfil del usuario.
Parameters :
Returns :
void
|
getUserProfile |
getUserProfile()
|
Obtiene el perfil del usuario.
Returns :
void
|
ngOnInit |
ngOnInit()
|
Obtiene los datos del perfil al inicio.
Returns :
void
|
update | ||||||
update(template: TemplateRef
|
||||||
Modal editar un usuario.
Parameters :
Returns :
void
|
upload | ||||
upload(event)
|
||||
Carga la imagen de perfil en Firebase Storage.
Parameters :
Returns :
void
|
downloadURL |
Type : Observable<string>
|
URL de descarga de la imagen. |
imageUrl |
Type : string
|
Default value : null
|
URL para la imagen a cargar en Firebase Storage. |
oldimageUrl |
Type : string
|
Default value : null
|
URL para la imagen a eliminar de Firebase Storage. |
ref |
Type : AngularFireStorageReference
|
Referencia al Storage de Firebase. |
selectedUser |
Type : Customers
|
Default value : new Customers()
|
Usuario seleccionado actualemente. |
uploadProgress |
Type : Observable<number>
|
Progreso en la subida de la imagen. |
import { Component, OnInit, TemplateRef } from '@angular/core';
import { BsModalService, BsModalRef } from 'ngx-bootstrap/modal';
import {AuthenticationService} from '../../auth/authentication.service';
import { Router } from "@angular/router";
import { NgForm } from '@angular/forms';
import { Observable } from 'rxjs';
import { finalize } from 'rxjs/operators';
import { Customers } from '../../../models/customers';
import { AngularFireStorageReference, AngularFireStorage } from '@angular/fire/storage';
import { ToastrService } from 'ngx-toastr';
/**
*Muestra y modifica los datos de perfil del usuario.
**/
@Component({
selector: 'app-profile',
templateUrl: './profile.component.html',
styleUrls: ['./profile.component.css']
})
export class ProfileComponent implements OnInit
{
/**
*URL para la imagen a cargar en Firebase Storage.
**/
imageUrl: string = null;
/**
*URL para la imagen a eliminar de Firebase Storage.
**/
oldimageUrl: string = null;
/**
*Progreso en la subida de la imagen.
**/
uploadProgress: Observable<number>;
/**
*Referencia al Storage de Firebase.
**/
ref: AngularFireStorageReference;
/**
*URL de descarga de la imagen.
**/
downloadURL: Observable<string>;
/**
*Usuario seleccionado actualemente.
**/
selectedUser: Customers = new Customers();
/**
*@ignore
*/
descriptionValue;
/**
*@ignore
*/
modalRef1: BsModalRef;
/**
*@ignore
*/
constructor(private modalService: BsModalService, private auth: AuthenticationService,private router: Router, private storage: AngularFireStorage, private toastr: ToastrService)
{ }
/**
*Modal editar un usuario.
*/
update(template: TemplateRef<any>)
{
this.modalRef1 = this.modalService.show(template);
this.modalRef1.hide();
}
/**
*Obtiene el perfil del usuario.
*/
getUserProfile()
{
this.auth.getUser(this.auth.getUserDetails().id_user).subscribe(user=>{
this.selectedUser = user;
this.descriptionValue = this.selectedUser.description;
});
}
/**
*Para editar el perfil del usuario.
*/
editprofile(form: NgForm) {
if(this.imageUrl!=null)
{
this.oldimageUrl=this.selectedUser.image;
this.selectedUser.image=this.imageUrl;
if(this.oldimageUrl!=null)
{
this.deleteImage(this.oldimageUrl);
}
this.imageUrl=null;
}
this.selectedUser.description = form.value.description;
this.auth.editprofile(this.selectedUser).subscribe(
() => {
this.toastr.success('Se han editado los datos del usuario exitosamente');
this.ngOnInit();
},
err => {
this.toastr.error('Error al editar los datos del usuario');
}
);
}
/**
*Carga la imagen de perfil en Firebase Storage.
*/
upload(event)
{
// Obtiene la imagen:
const file = event.target.files[0];
// Genera un ID random para la imagen:
const randomId = Math.random().toString(36).substring(2);
const filepath = `Avatars/${randomId}`;
// Cargar imagen:
const task = this.storage.upload(filepath, file);
this.ref = this.storage.ref(filepath);
// Observa los cambios en el % de la barra de progresos:
this.uploadProgress = task.percentageChanges();
// Notifica cuando la URL de descarga está disponible:
task.snapshotChanges().pipe(
finalize(() => {
this.downloadURL = this.ref.getDownloadURL();
this.downloadURL.subscribe(url => {this.imageUrl = url} );
})
).subscribe();
}
/**
*Cancela la actualización de los datos de usuario.
*/
cancelEdit()
{
if(this.imageUrl!=null)
{
this.deleteImage(this.imageUrl);
}
this.imageUrl=null;
this.modalRef1.hide();
}
/**
*Para eliminar la imagen a partir de una URL.
*/
deleteImage(downloadUrl)
{
return this.storage.storage.refFromURL(downloadUrl).delete();
}
/**
*Obtiene los datos del perfil al inicio.
*/
ngOnInit()
{
this.getUserProfile();
}
}
<div class="container-fluid box">
<!--Imagen de Perfil-->
<div class="img-profile">
<img class="img-fluid img-circle img-thumbnail" *ngIf="this.selectedUser.image"
src="{{this.selectedUser.image}}">
<img class="img-fluid img-circle img-thumbnail" *ngIf="this.selectedUser.image == null"
src="/assets/images/sin-perfil.png">
</div>
<hr>
<h4>Nombre de Usuario:</h4>
<h6>{{this.selectedUser.username | titlecase}}</h6>
<br>
<h4>Correo:</h4>
<h6>{{this.selectedUser.email}}</h6>
<br>
<h4>Descripción:</h4>
<h6>{{this.selectedUser.description}}</h6>
<br>
<h4>Número de respuestas valoradas:</h4>
<h6>{{this.selectedUser.respuestas_valoradas}}</h6>
<br>
<h4>Rating promedio del usuario:</h4>
<div *ngIf="this.selectedUser.rating==0 || this.selectedUser.rating==null">
<i class="far fa-star"></i>
<i class="far fa-star"></i>
<i class="far fa-star"></i>
<i class="far fa-star"></i>
<i class="far fa-star"></i>
</div>
<div *ngIf="this.selectedUser.rating==1">
<i class="fas fa-star"></i>
<i class="far fa-star"></i>
<i class="far fa-star"></i>
<i class="far fa-star"></i>
<i class="far fa-star"></i>
</div>
<div *ngIf="this.selectedUser.rating==2">
<i class="fas fa-star"></i>
<i class="fas fa-star"></i>
<i class="far fa-star"></i>
<i class="far fa-star"></i>
<i class="far fa-star"></i>
</div>
<div *ngIf="this.selectedUser.rating==3">
<i class="fas fa-star"></i>
<i class="fas fa-star"></i>
<i class="fas fa-star"></i>
<i class="far fa-star"></i>
<i class="far fa-star"></i>
</div>
<div *ngIf="this.selectedUser.rating==4">
<i class="fas fa-star"></i>
<i class="fas fa-star"></i>
<i class="fas fa-star"></i>
<i class="fas fa-star"></i>
<i class="far fa-star"></i>
</div>
<div *ngIf="this.selectedUser.rating==5">
<i class="fas fa-star"></i>
<i class="fas fa-star"></i>
<i class="fas fa-star"></i>
<i class="fas fa-star"></i>
<i class="fas fa-star"></i>
</div>
<br>
<hr>
<button type="button" class="btn btn-primary" (click)="update(template1)"placement="bottom">
Actualizar datos
<i class="fas fa-edit"></i>
</button>
</div>
<!--Modal para actualizar los datos del usuario actual-->
<ng-template #template1>
<div class="modal-header">
<h4 class="modal-title pull-left">Actualizar datos de usuario</h4>
<button type="button" class="close pull-right" aria-label="Close" (click)="modalRef1.hide()">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div class="container text-center">
<div class="tab-content">
<form #f="ngForm" class="form" id="ProductForm">
<div class="img-profile">
<img class="img-fluid img-circle img-thumbnail" *ngIf="this.selectedUser.image && this.imageUrl==null" src="{{this.selectedUser.image}}">
<img class="img-fluid img-circle img-thumbnail" *ngIf="this.selectedUser.image == null && this.imageUrl==null" src="/assets/images/sin-perfil.png">
<img class="img-fluid profile-pic" *ngIf="this.imageUrl!=null" src={{this.imageUrl}} class="img-thumbnail img-circle img-fluid">
</div>
<br>
<div class="container">
<!--Barra de progreso-->
<progressbar [value]="uploadProgress| async" type="primary" [striped]="true" [animate]="true"></progressbar>
<!--Muestra el progreso de la barra-->
<div class="container">
Progress: {{ (uploadProgress | async) / 100 | percent }}
</div>
<br>
<div *ngIf="downloadURL | async; let downloadSrc" class="alert alert-info" role="alert">
<p>La foto se cargó correctamente</p>
</div>
<br>
<!--Se sube una nueva foto para el usuario-->
<div class="item">
<!--Selecciona un archivo .png o .jpg-->
<input #inputFile class="hidden" type="file" (change)="upload($event)" accept=".png,.jpg">
<!--Botón para poner en funcionamiento el input-->
<button type="button" class="btn btn-lg btn-success" (click)="inputFile.click()">
Subir foto
<i class="fas fa-upload"></i>
</button>
</div>
</div>
<hr>
<div class="form-group">
<div class="col-xs-6">
<label for="first_name"><h4>Nombre de Usuario</h4></label>
<input type="text" disabled
placeholder="{{this.selectedUser.username | titlecase}}">
</div>
</div>
<div class="form-group">
<div class="col-xs-6">
<label for="email"><h4>Email</h4></label>
<input type="text" disabled
placeholder="{{this.selectedUser.email}}">
</div>
</div>
<div class="form-group">
<div class="col-xs-6">
<label for="description"><h4>Descripción</h4></label>
<input #description type="text" class="form-control" name="description"
id="description" placeholder="{{this.selectedUser.description}}" [(ngModel)]="descriptionValue" >
</div>
</div>
<hr>
<div class="form-group text-center">
<div class="col-xs-12">
<br>
<button class="btn btn-primary" (click)="editprofile(f)" type="submit">Actualizar
<i class="fas fa-sync-alt"></i>
</button>
<br><br>
<button class="btn btn-cancelar btn-danger" (click)="cancelEdit()">Cancelar
<i class="far fa-times-circle"></i>
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</ng-template>
./profile.component.css
img
{
margin:3px;
padding:2px;
height: 250px;
width: 250px;
border-radius: 70%;
}
.box
{
text-align: center;
color: #151515;
background-color: #fafafa;
-webkit-box-shadow: 0 5px 8px -6px rgba(0,0,0,.2);
-moz-box-shadow: 0 5px 8px -6px rgba(0,0,0,.2);
box-shadow: 0 5px 8px -6px rgba(0,0,0,.2);
padding: 15px;
box-sizing: border-box;
}
input
{
width: 100%;
margin-bottom: 20px;
}
input[type="text"], input[type="password"]
{
outline: none;
height: 40px;
font-size: 16px;
}
input[type="submit"], input[type="button"]
{
border: none;
outline: none;
height: 40px;
color: azure;
font-size: 18px;
}
hr
{
background-color: azure;
}
.modal-header
{
background: #834d9b; /* fallback for old browsers */
background: -webkit-linear-gradient(to right, #d04ed6, #834d9b); /* Chrome 10-25, Safari 5.1-6 */
background: linear-gradient(to right, #d04ed6, #834d9b);
color: white;
}
.hidden
{
display: none;
}