diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 21390dadf3e5e06d0b8526f9d1652b0b3d0dea6a..fea6c640131c02fba963823048b256722bee5e33 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -26,7 +26,7 @@ import { PedidoComponent } from './mi-cuenta/perfil-cuenta/pedidos/pedido/pedido import { PedidoGuardService } from './shared/servicios/pedido-guard.service'; import { ContrasenaOlvidadaComponent } from './mi-cuenta/contrasena-olvidada/contrasena-olvidada.component'; import { RestablecerPasswordComponent } from './mi-cuenta/restablecer-password/restablecer-password.component'; - +/* Rutas de la aplicacion */ const appRoutes: Routes = [ { path: '', redirectTo: '/homepage', pathMatch: 'full' }, { path: 'homepage', component: HomepageComponent }, diff --git a/src/app/app.component.ts b/src/app/app.component.ts index cc5cc3e5149168a4dc0f46862b887bc4a2a4c803..e7a73e7e61aa4c0b7d6276d53d988b8eccb7285d 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -14,7 +14,7 @@ export class AppComponent implements OnInit { private authService: AuthService, private cestaService: CestaCompraService ) {} - + /* Realiza una llamada al AuthService para tratar de hacer autologin al usuario y otra al cesta service para recuperar la cesta de la compra */ ngOnInit(): void { this.authService.autoLogin(); this.cestaService.recuperarCestaFromLocalStorage(); diff --git a/src/app/contacto/contacto.component.ts b/src/app/contacto/contacto.component.ts index 02bfccb4b2b5b71ba1870336759814faf9762ac2..7203e6e3281f0378e53f6462056a8e7f06420c05 100644 --- a/src/app/contacto/contacto.component.ts +++ b/src/app/contacto/contacto.component.ts @@ -26,7 +26,6 @@ export class ContactoComponent { .then( (resolve) => { this.envioCorrecto = true; - console.log(resolve); form.reset(); }, (reject) => {} diff --git a/src/app/mi-cuenta/completar-registro/completar-registro.component.ts b/src/app/mi-cuenta/completar-registro/completar-registro.component.ts index 6415d0392268d8058b49ccba8edbc6c8627256be..83b586e8fa0f57f7eac375d91aca23a0982bf60a 100644 --- a/src/app/mi-cuenta/completar-registro/completar-registro.component.ts +++ b/src/app/mi-cuenta/completar-registro/completar-registro.component.ts @@ -61,7 +61,6 @@ export class CompletarRegistroComponent implements OnInit { this.router.navigate(['/homepage']); }, (error) => { - console.log(error.message); if (error.message.indexOf('auth/email-already-in-use')) { this.loading = false; this.errorMessage = diff --git a/src/app/mi-cuenta/perfil-cuenta/cerrar-sesion/cerrar-sesion.component.ts b/src/app/mi-cuenta/perfil-cuenta/cerrar-sesion/cerrar-sesion.component.ts index 5b8abb2b509760f043eca20c0216abecf27cabb2..1c6d77e99222c2512d7294073ea5b9197a27dc18 100644 --- a/src/app/mi-cuenta/perfil-cuenta/cerrar-sesion/cerrar-sesion.component.ts +++ b/src/app/mi-cuenta/perfil-cuenta/cerrar-sesion/cerrar-sesion.component.ts @@ -8,10 +8,10 @@ import { AuthService } from 'src/app/shared/servicios/auth.service'; }) export class CerrarSesionComponent implements OnInit { constructor(private authService: AuthService) {} - + /* crea una cuenta atras para, de forma ficticia, dar la sensación al usuario de que se está cerrando la sesión */ ngOnInit(): void { setTimeout(() => { this.authService.logOut(); - }, 2000); + }, 1500); } } diff --git a/src/app/mi-cuenta/perfil-cuenta/datos-pago/datos-pago.component.ts b/src/app/mi-cuenta/perfil-cuenta/datos-pago/datos-pago.component.ts index f437d343b8614f3e13548140243b232b547e7fb8..fc21dd8b1787d3de61cf07ef3edb5fcb5c5a36c2 100644 --- a/src/app/mi-cuenta/perfil-cuenta/datos-pago/datos-pago.component.ts +++ b/src/app/mi-cuenta/perfil-cuenta/datos-pago/datos-pago.component.ts @@ -3,13 +3,10 @@ import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-datos-pago', templateUrl: './datos-pago.component.html', - styleUrls: ['./datos-pago.component.css'] + styleUrls: ['./datos-pago.component.css'], }) export class DatosPagoComponent implements OnInit { - - constructor() { } - - ngOnInit(): void { - } - + constructor() {} + /* no tiene lógica porque no se han implementado los pagos, solo se simulan */ + ngOnInit(): void {} } diff --git a/src/app/mi-cuenta/perfil-cuenta/datos-personales/datos-personales.component.ts b/src/app/mi-cuenta/perfil-cuenta/datos-personales/datos-personales.component.ts index 1f52b0d7ad34e1a3e6d10a4678eeb07a4f86da61..c2e16dbf137f1fbabdc7819b08c4eafb0369db3b 100644 --- a/src/app/mi-cuenta/perfil-cuenta/datos-personales/datos-personales.component.ts +++ b/src/app/mi-cuenta/perfil-cuenta/datos-personales/datos-personales.component.ts @@ -57,16 +57,13 @@ export class DatosPersonalesComponent implements OnInit { this.cambioEmailText = 'Cambiar correo'; }) .catch((err) => { - console.log(err); this.emailFail = true; this.email = this.authService.credential.user.email; }); this.user.email = this.email; this.databaseService .updateUserInDatabase(this.user, this.authService.credential.user.uid) - .subscribe((ok) => { - console.log(ok); - }); + .subscribe((ok) => {}); } } /* habilita el formulario para cambiar el telefono y, en caso de estar habilitado diff --git a/src/app/mi-cuenta/perfil-cuenta/direcciones/direcciones.component.ts b/src/app/mi-cuenta/perfil-cuenta/direcciones/direcciones.component.ts index a44aab87de0b2dc91e7e4d0d06633dc7d4b43741..dd638ef22c9dc4f2edcf59fe00b11c5480094c79 100644 --- a/src/app/mi-cuenta/perfil-cuenta/direcciones/direcciones.component.ts +++ b/src/app/mi-cuenta/perfil-cuenta/direcciones/direcciones.component.ts @@ -11,19 +11,26 @@ import { DatabaseService } from 'src/app/shared/servicios/database.service'; providers: [DatabaseService], }) export class DireccionesComponent implements OnInit, OnDestroy { - user: Usuario; - cambioEnvio = false; - cambioEnvioText = 'Modificar direccion de envío'; - envioSuccess = false; - cambioFacturacion = false; - cambioFacturacionText = 'Modificar direccion de facturacion'; - facturacionSuccess = false; + user: Usuario; /* el usuario del que se van a mostrar las direcciones */ + cambioEnvio = + false; /* variable que permite controlar los textos y la accion del botón "cambiar direccion de envio" */ + cambioEnvioText = + 'Modificar direccion de envío'; /* el texto que se muestra en el boton de "cambiar direccion de envio" */ + envioSuccess = + false; /* true si se ha cambiado correctamente la direccion de envio del usuario en base de datos. Permite mostrar una alerta al usuario en caso de exito */ + cambioFacturacion = + false; /* variable que permite controlar los textos y la accion del botón "cambiar direccion de facturacion" */ + cambioFacturacionText = + 'Modificar direccion de facturacion'; /* el texto que se muestra en el boton de "cambiar direccion de facturacion" */ + facturacionSuccess = + false; /* true si se ha cambiado correctamente la direccion de facturacion del usuario en base de datos. Permite mostrar una alerta al usuario en caso de exito */ private userSubscription: Subscription; constructor( private authService: AuthService, private databaseService: DatabaseService ) {} + /* recupera el usuario que hay ahora mismo en la aplicacion con la sesion iniciada */ ngOnInit(): void { this.userSubscription = this.authService.userBS.subscribe((user) => { this.user = user; @@ -32,6 +39,7 @@ export class DireccionesComponent implements OnInit, OnDestroy { ngOnDestroy(): void { this.userSubscription.unsubscribe(); } + /* modifica el texto del boton cambiar direccion de envio y procesa la solicitud del cambio */ cambioEnvioActivate() { if (!this.cambioEnvio) { this.cambioEnvio = true; @@ -46,6 +54,7 @@ export class DireccionesComponent implements OnInit, OnDestroy { }); } } + /* modifica el texto del boton cambiar direccion de facturacion y procesa la solicitud del cambio */ cambioFacturacionActivate() { if (!this.cambioFacturacion) { this.cambioFacturacion = true; diff --git a/src/app/mi-cuenta/perfil-cuenta/pedidos/card-pedido-resumen-perfil/card-pedido-resumen-perfil.component.ts b/src/app/mi-cuenta/perfil-cuenta/pedidos/card-pedido-resumen-perfil/card-pedido-resumen-perfil.component.ts index 3c1390f92f8a36de0d7b7b2257658ca4462d8169..f9cf0032080a5d4d949a743d20b352fcf2b2423b 100644 --- a/src/app/mi-cuenta/perfil-cuenta/pedidos/card-pedido-resumen-perfil/card-pedido-resumen-perfil.component.ts +++ b/src/app/mi-cuenta/perfil-cuenta/pedidos/card-pedido-resumen-perfil/card-pedido-resumen-perfil.component.ts @@ -10,11 +10,14 @@ import { DatabaseService } from 'src/app/shared/servicios/database.service'; providers: [DatabaseService], }) export class CardPedidoResumenPerfilComponent implements OnInit { - @Input('pedido') numeroPedido: string; - pedido: Pedido = new Pedido(); - pedidoSubscription: Subscription; - fechaPedido: string; - estadoColor = ''; + @Input('pedido') + numeroPedido: string; /* el numero del pedido que se muestra en el compomemte */ + pedido: Pedido = + new Pedido(); /* el pedido que se muestar resumido en el componente */ + pedidoSubscription: Subscription; /* la subscripcion al pedido recuperado de abse de datos */ + fechaPedido: string; /* la fecha del pedido en formato texto */ + estadoColor = + ''; /* el color que recibirá el estado del pedido mostrrado en el compnonente */ constructor(private databaseService: DatabaseService) {} ngOnInit(): void { diff --git a/src/app/mi-cuenta/perfil-cuenta/pedidos/pedido/pedido-item/pedido-perfil-item.component.ts b/src/app/mi-cuenta/perfil-cuenta/pedidos/pedido/pedido-item/pedido-perfil-item.component.ts index 0bf84e6479550634542f92ed6ce56f1cfd46f440..8ad4b681a70cc25831530cfcba754516d2747f2a 100644 --- a/src/app/mi-cuenta/perfil-cuenta/pedidos/pedido/pedido-item/pedido-perfil-item.component.ts +++ b/src/app/mi-cuenta/perfil-cuenta/pedidos/pedido/pedido-item/pedido-perfil-item.component.ts @@ -12,15 +12,16 @@ export class PedidoItemComponent implements OnInit { @Input('productoUnidades') productoUnidades: { productoID: string; unidades: number; - } = { - productoID: '', - unidades: 0, - }; - public producto: Producto; + } = + { + productoID: '', + unidades: 0, + }; /* el identificados del producto que va a mostrar el componente y las unidades de ese producto en el pedido */ + public producto: Producto; /* el producto que muestra el componente */ - imagen: Observable<any>; + imagen: Observable<any>; /* la imagen del producto que se muestra en el componente */ constructor(private databaseService: DatabaseService) {} - + /* recupera el pedido que se va a mostrar de base de datos y su imagen */ ngOnInit(): void { this.databaseService .getProductoFromDatabase(this.productoUnidades.productoID) diff --git a/src/app/mi-cuenta/perfil-cuenta/pedidos/pedido/pedido.component.ts b/src/app/mi-cuenta/perfil-cuenta/pedidos/pedido/pedido.component.ts index 002d8b6d7952826b7564c298baecbb986450b95c..4e16283464bf4cd1d031110b31b6b67100a0a36e 100644 --- a/src/app/mi-cuenta/perfil-cuenta/pedidos/pedido/pedido.component.ts +++ b/src/app/mi-cuenta/perfil-cuenta/pedidos/pedido/pedido.component.ts @@ -11,18 +11,19 @@ import { DatabaseService } from 'src/app/shared/servicios/database.service'; providers: [DatabaseService], }) export class PedidoComponent implements OnInit, OnDestroy { - private paramsSubscription: Subscription; - public pedido: Pedido; - public numeroPedido: string; - public imagen; - fechaPedido: string; - estadoColor: string; + private paramsSubscription: Subscription; /* subscripcion a los parametros de la ruta para poder saber que pedido mostrar en el componente */ + public pedido: Pedido; /* el pedido a mostrar en el componente */ + public numeroPedido: string; /* el numeor del pedido que se muestra */ + fechaPedido: string; /* la feche en formato texto en la que fue realizado el pedido */ + estadoColor: string; /* el color a mostrar en el estado del pedido */ constructor( private route: ActivatedRoute, private databaseService: DatabaseService, private router: Router ) {} + /* recupera de base de datos el pedido que se recibe via los parametros de la ruta y procesa sus datos para saber de qué color mostrar el estado del pedido + y compone el string de la fecha del pedido*/ ngOnInit(): void { this.paramsSubscription = this.route.params.subscribe((params: Params) => { this.databaseService diff --git a/src/app/mi-cuenta/perfil-cuenta/pedidos/pedidos.component.ts b/src/app/mi-cuenta/perfil-cuenta/pedidos/pedidos.component.ts index 5a7ce094f976c8351605173208d1d0ec9e360042..f3757d944efabbbc8d145a1e7f3fe5d7f3205702 100644 --- a/src/app/mi-cuenta/perfil-cuenta/pedidos/pedidos.component.ts +++ b/src/app/mi-cuenta/perfil-cuenta/pedidos/pedidos.component.ts @@ -11,13 +11,14 @@ import { DatabaseService } from 'src/app/shared/servicios/database.service'; providers: [DatabaseService], }) export class PedidosComponent implements OnInit { - pedidos: string[]; - pedidosSubscription: Subscription; + pedidos: string[]; /* pedidios a mostrar en la vista */ + pedidosSubscription: Subscription; /* subscripcion a los pedidos en base de datos */ constructor( private databaseService: DatabaseService, private authService: AuthService ) {} - + /* recupera los pedidos de un usuario en base de datos y los ordena por fecha de pedido, dejando los mas antiguos en la parte más baja y los más recientes en + la parte mas alta */ ngOnInit(): void { this.pedidosSubscription = this.databaseService .getPedidosDeUsuarioFromDatabase(this.authService.credential.user.uid) @@ -38,7 +39,6 @@ export class PedidosComponent implements OnInit { this.pedidos = paresPedidoFecha.map((par) => { return par.pid; }); - console.log(paresPedidoFecha); }); } } diff --git a/src/app/mi-cuenta/perfil-cuenta/perfil-cuenta.component.ts b/src/app/mi-cuenta/perfil-cuenta/perfil-cuenta.component.ts index 0c3ade359b0a64975217cacfca436bdf8a5ec310..2bc92e37713be86b9a1133162f1e6a8dd5f4984c 100644 --- a/src/app/mi-cuenta/perfil-cuenta/perfil-cuenta.component.ts +++ b/src/app/mi-cuenta/perfil-cuenta/perfil-cuenta.component.ts @@ -7,6 +7,6 @@ import { Component, OnInit } from '@angular/core'; }) export class PerfilCuentaComponent implements OnInit { constructor() {} - + /* no posee lógica interna debido a que su única función es contener los componentes que conforman la vista de mi cuenta y la columna de navegación de esta */ ngOnInit(): void {} } diff --git a/src/app/mi-cuenta/restablecer-password/restablecer-password.component.ts b/src/app/mi-cuenta/restablecer-password/restablecer-password.component.ts index add8d6c152e21691caff53ac0703a48e4d406c5c..7b1ca1b840e9d302baed21050ecf69389ae12eca 100644 --- a/src/app/mi-cuenta/restablecer-password/restablecer-password.component.ts +++ b/src/app/mi-cuenta/restablecer-password/restablecer-password.component.ts @@ -39,8 +39,6 @@ export class RestablecerPasswordComponent implements OnInit { return; } this.authService.resetPassword(this.oobCode, this.password1).then((res) => { - console.log(res); - this.cambioCorrecto = true; }); } diff --git a/src/app/shared/clases/metodoPago.model.ts b/src/app/shared/clases/metodoPago.model.ts index b104ed1a3c8499b3b4f9259331858ce9b2ad6d80..d9fee40ae7c4d15b1be22fcc659c6748e2d1b50c 100644 --- a/src/app/shared/clases/metodoPago.model.ts +++ b/src/app/shared/clases/metodoPago.model.ts @@ -1,3 +1,3 @@ export interface MetodoPago { - /* To-Do en el caso de implementar la pasarela de pago */ + /* A definir cuando se incluyan los pagos */ } diff --git a/src/app/shared/servicios/auth-guard.service.ts b/src/app/shared/servicios/auth-guard.service.ts index d3ef992f072fff3f6d100a0f7c10be581f6244f9..cbfedd1c1bb9f1b93c10bc4fa65616ef0fe0fe13 100644 --- a/src/app/shared/servicios/auth-guard.service.ts +++ b/src/app/shared/servicios/auth-guard.service.ts @@ -14,7 +14,7 @@ import { AuthService } from './auth.service'; }) export class AuthGuardService implements CanActivate { constructor(private authService: AuthService, private router: Router) {} - + /* Resuelve si se puede acceder a las vistas de mi cuenta dependiendo de si hay un usuario autenticado o no */ canActivate( route: ActivatedRouteSnapshot, state: RouterStateSnapshot diff --git a/src/app/shared/servicios/auth.service.ts b/src/app/shared/servicios/auth.service.ts index 39e45aa973853bca292022f6f33e0e5000ec4813..8361347b8e9cc459a7bc22e558df8f9b9de4845e 100644 --- a/src/app/shared/servicios/auth.service.ts +++ b/src/app/shared/servicios/auth.service.ts @@ -17,16 +17,20 @@ import { Router } from '@angular/router'; @Injectable() export class AuthService { - credential!: UserCredential; - userBS = new BehaviorSubject<Usuario>(null); - userRegistroBS = new BehaviorSubject<Usuario>(null); - private password = ''; + credential!: UserCredential; /* la credencial del usuario que ha iniciado sesion en la aplicacion */ + userBS = new BehaviorSubject<Usuario>( + null + ); /* el usuario que ha iniciado sesion en la aplicacion */ + userRegistroBS = new BehaviorSubject<Usuario>( + null + ); /* el usuario que va a ser dado de alta en bse de datos tras terminar un registro */ constructor( private auth: Auth, private databaseService: DatabaseService, private router: Router ) {} - + /* metodo que permite comprobar si un usuario tiene sesion iniciada cuando se recarga + la página o se accede de nuevo, y que en caso de tener la sesion iniciada, recupera los datos del usuario desde base de datos */ public autoLogin() { const userLogged: boolean = JSON.parse(localStorage.getItem('userLogged')); if (userLogged) { @@ -38,9 +42,6 @@ export class AuthService { ); if (!userLogged) { - console.log('not userr'); - console.log(this.auth); - this.auth .updateCurrentUser(userCredential.user) .then(() => {}) @@ -49,7 +50,6 @@ export class AuthService { localStorage.removeItem('userCredential'); signOut(this.auth); this.credential = null; - console.log('error update user'); }); return; } @@ -74,16 +74,24 @@ export class AuthService { } }); } + /* metodo que permite cambiar el email de un usuario con sesion iniciada + */ public cambiarEmail(email: string) { return updateEmail(this.auth.currentUser, email); } + /* metodo que permite hacer una llamada a firebase para que envie un correo de recuperacion de contraseña a un usuario registrado que lo solicite. + Recibe como parametro el email que introduce el usuario */ forgotPassword(email: string) { return sendPasswordResetEmail(this.auth, email); } + /* metodo que permite cambiar la contraseña una vez ha sido solicitada la recuperacion de esta por un usario. + recibe como parametro el oobCode proporcionado por Firebase y la nueva contraseña del usuario */ resetPassword(oobCode: string, newPassword: string) { return confirmPasswordReset(this.auth, oobCode, newPassword); } - + /* metodo que permite iniciar sesion a un usario. REcibe como parametro las credenciales del usuario. + Si se logra iniciar sesion, se recuperan los datos del usuario de base de datos y se guardan en el servicio. + tambien se notifica a los componentes que necesiten al usuario cuando este está ya recuperado de abse de datos*/ public loginUserWithEmail( email: string, password: string @@ -101,7 +109,6 @@ export class AuthService { localStorage.setItem('userCredential', JSON.stringify(userAuth)); this.userBS.next(userDB); this.credential = userAuth; - this.password = ''; this.router.navigate(['/tienda/tienda']); }); @@ -110,6 +117,7 @@ export class AuthService { return from(loginPromise); } + /* metodo que permite cerrar la sesion de un usuario que la haya iniciado */ public logOut() { signOut(this.auth); this.credential = null; @@ -119,7 +127,7 @@ export class AuthService { this.router.navigate(['/auth']); window.location.reload(); } - + /* metodo que permite crear un usuario en el modulo auth de firebase mediante su email y contraseña, los cuales recibe por parametro */ public createUserWithEmail( email: string, password: string @@ -131,7 +139,7 @@ export class AuthService { ); return from(registerPromise); } - + /* metodo que permite actualizar y notificar de la actualizacion del usuario que va a ser registrado en la aplicacion */ public updateUserRegistro(user: Usuario): void { this.userRegistroBS.next(user); } diff --git a/src/app/shared/servicios/cesta-compra.service.ts b/src/app/shared/servicios/cesta-compra.service.ts index 21dd8988bd80be7d46178957ff0c009705472233..3e4eff6903e3cbc4fe2dce1b37a66457508b0868 100644 --- a/src/app/shared/servicios/cesta-compra.service.ts +++ b/src/app/shared/servicios/cesta-compra.service.ts @@ -11,19 +11,26 @@ import { DatabaseService } from './database.service'; providedIn: 'root', }) export class CestaCompraService { - private userSubscription: Subscription; - private user: Usuario; - public cestaBS = new BehaviorSubject<Cesta>(new Cesta()); - private cesta: Cesta = new Cesta(); - private pedido: Pedido = null; - public pedidoBS = new BehaviorSubject<Pedido>(null); - private diasTipicosParaUnEnvio = 4; - private fechaEntregaPrevista: Date = new Date(); - private gastosDeEnvío = 5.95; + private userSubscription: Subscription; /* subscripcion al usuario del AuthService */ + private user: Usuario; /* usuario local del servicio para ir modificandolo */ + public cestaBS = new BehaviorSubject<Cesta>( + new Cesta() + ); /* cesta a la que se pueden subscribir otros componentes para recibir sus cambios */ + private cesta: Cesta = new Cesta(); /* cesta local del servicio */ + private pedido: Pedido = + null; /* pedido que se va a crear en base de datos en caso de iniciarse el proceso de pedido */ + public pedidoBS = new BehaviorSubject<Pedido>( + null + ); /* pedido al que se pueden subscribir otros compononentes para recibir sus cambios */ + private diasTipicosParaUnEnvio = 4; /* dias que suele tardar un envio */ + private fechaEntregaPrevista: Date = + new Date(); /* fehca de entrega prevista, calculada al inicio del componente */ + private gastosDeEnvío = 5.95; /* gasto de envío de un pedido */ constructor( private databaseService: DatabaseService, private authService: AuthService ) { + /* al construir el servicio se crea la subscripcion al usuario del AuthService. Si se recibe usuario, se recuperan los productos de este usuario de base de datos */ this.userSubscription = this.authService.userBS.subscribe( (user: Usuario) => { if (!!user) { @@ -55,7 +62,7 @@ export class CestaCompraService { this.fechaEntregaPrevista.getDate() + this.diasTipicosParaUnEnvio ); } - + /* Metodo que permite recuperar la cesta almacenada en el almacenamiento local del navegador del usuario y guardarlo en la cesta del servicio */ recuperarCestaFromLocalStorage() { this.cesta = new Cesta(); let cesta: Cesta = JSON.parse(localStorage.getItem('cesta')); @@ -64,7 +71,9 @@ export class CestaCompraService { } this.cestaBS.next(this.cesta); } - + /* Metodo que permite añadir un producto a la cesta. recibe como parámetro el producto a añadir y las unidades a añadir de ese producto. +si el producto a añadir ha sido añadido previamente solo aumenta las unidades de ese producto en la cesta. +Tambien actualiza la cesta de el usuario en base de datso si este ha iniciado sesion*/ addProducto(producto: Producto, unidades: number) { let index = this.cesta.productos.findIndex( (e) => e.producto.productoID === producto.productoID @@ -98,6 +107,8 @@ export class CestaCompraService { localStorage.setItem('cesta', JSON.stringify(this.cesta)); this.cestaBS.next(this.cesta); } + /* metodo que permite eliminar un producto de la cesta de la compra. recibe como parametro el indicador del producto a borrar. + modifica la cesta del usuario en base de datos si este ha iniciado sesion. */ deleteProducto(productoID: string) { let index = this.cesta.productos.findIndex( (p) => p.producto.productoID === productoID @@ -115,7 +126,8 @@ export class CestaCompraService { localStorage.setItem('cesta', JSON.stringify(this.cesta)); this.updateUserYCestaEnDatabase(); } - + /* metodo que permite modificar la cantidad de un producto que ha sido añadido a la cesta. + recibe como parametro un objeto compuesto por un producto y las nuevas unidades del producto en la cesta. */ modificarCantidadProducto(entrada: { producto: Producto; unidades: number }) { let index = this.cesta.productos.findIndex( (e) => e.producto.productoID === entrada.producto.productoID @@ -137,6 +149,7 @@ export class CestaCompraService { this.updateUserYCestaEnDatabase(); } + /* metodo que devuelve en formato de string local la fecha de entrega prevista de un pedido. */ getFechaEntregaPrevistaPedido(): string { const options: Intl.DateTimeFormatOptions = { weekday: 'long', @@ -146,11 +159,11 @@ export class CestaCompraService { }; return this.fechaEntregaPrevista.toLocaleDateString('es-ES', options); } - + /* metodo que devuelve el valor de los gastos de envio */ getGastosDeEnvio(): number { return this.gastosDeEnvío; } - + /* metodo que crea un pedido con los datos iniciales de este para poder ir completandolo */ crearPedidoInicial() { this.pedido = new Pedido(); this.cesta.productos.forEach((p) => { @@ -167,13 +180,16 @@ export class CestaCompraService { this.pedido.fechaPedido = new Date().getTime(); this.pedidoBS.next(this.pedido); } + /* metodo que devuelve el pedido de el servicio */ getPedido(): Pedido { return this.pedido; } + /* metodo que actualiza los datos del pedido del servicio, y comunica los cambios a otros componentes. */ actualizarPedido(pedido: Pedido) { this.pedido = pedido; this.pedidoBS.next(pedido); } + /* metodo que permite vaciar las cestas local y remota */ clearCestas() { this.cesta = new Cesta(); this.cestaBS.next(this.cesta); @@ -182,20 +198,17 @@ export class CestaCompraService { localStorage.setItem('cesta', JSON.stringify(this.cesta)); this.updateUserYCestaEnDatabase(); } + /* metodo que actualiza la cesta de un usuario en base de datos con la cesta local del servicio. */ updateUserYCestaEnDatabase() { if (!!this.authService.credential) { - console.log(this.authService.credential); this.databaseService .updateUserInDatabase(this.user, this.authService.credential.user.uid) .pipe(take(1)) .subscribe( (res) => { - console.log('updateCompleto'); this.authService.userBS.next(this.user); }, - (error) => { - console.log(error); - } + (error) => {} ); } } diff --git a/src/app/shared/servicios/database.service.ts b/src/app/shared/servicios/database.service.ts index eb5fed41f49075e341063f8fd8b20adf893f0584..37f3aa505c9d7304f8c92dff8ce66cc06d00fae0 100644 --- a/src/app/shared/servicios/database.service.ts +++ b/src/app/shared/servicios/database.service.ts @@ -15,7 +15,8 @@ export class DatabaseService { private router: Router, private storage: AngularFireStorage ) {} - + /* Método que permite crear un usuario en base de datos, recibe un objeto de tipo Usuario y el identificador de ese usuario en base de datos. + Devuelve una promesa que resuelve si se completa la operación */ createNewUserInDatabase(user: Usuario, uid: string) { return new Promise<any>((resolve, reject) => { this.angularFirestore.collection('users').doc(uid).set({ @@ -30,6 +31,8 @@ export class DatabaseService { }); }); } + /* Método que permite actualizar los datos de un usuario en base de datos, recibe un objeto de tipo Usuario y el identificador de ese usuario a modificar en base de datos. + Devuelve una promesa que resuelve si se completa la operación */ updateUserInDatabase(user: Usuario, uid: string) { const updatePromise = this.angularFirestore .collection('users') @@ -46,16 +49,18 @@ export class DatabaseService { }); return from(updatePromise); } - + /* metodo que devuelve una referencia de una imagen accesible desde un navegador. +Recibe como parametro la ruta que ocupa en la jerarquía del módulo Storage la imagen en cuestion. +Devuelve el observable de la llamada al módulo storage*/ getDownloadURLFromStorage(imagePath: string) { const ref = this.storage.ref(imagePath); return ref.getDownloadURL(); } - + /* Método permite recuperar un usuario de base de datos */ getUserFromDatabase(uid: string): Observable<any> { return this.angularFirestore.collection('users').doc(uid).valueChanges(); } - + /* permite crear una consulta en base de datos. recibe parametrizados los datos de la consulta */ createConsultaInDatabase( nombre: string, apellidos: string, @@ -73,12 +78,14 @@ export class DatabaseService { motivoConsulta: motivoConsulta, }); } + /* metodo que recupera un productos de la base de datos. REcibe como parametro el identificador del producto a recuperar */ getProductoFromDatabase(productoID: string): Observable<any> { return this.angularFirestore .collection('productos') .doc(productoID) .valueChanges(); } + /* metodo que actualiza un producto en basee de datos. Recibe el producto a actualizar como parametro */ updateProductoInDatabase(producto: Producto): Promise<any> { return new Promise<any>((resolve, reject) => this.angularFirestore @@ -98,34 +105,37 @@ export class DatabaseService { stockEnAlmacen: producto.stockEnAlmacen, }) .then( - (response) => { - console.log(response); - }, + (response) => {}, (error) => { reject(error); } ) ); } + /* metodo que recupera todos los productos de base de datos. */ getAllProductosFromDatabase() { return this.angularFirestore.collection('productos').snapshotChanges(); } + /* metodo que recupera todos los productos destacados de base de datos */ getProductosDestacadosFromDatabase(): Observable<any> { return this.angularFirestore .collection('productos', (ref) => ref.where('destacado', '==', true)) .valueChanges(); } + /* Metodo que recupera las categorias presentes en base de datos */ getCategoriasNamesFromDatabase(): Observable<any> { return this.angularFirestore .collection('categorias') .doc('base') .valueChanges(); } + /* metodo que recupera los productos de una categoria. Recibe como parametro el nombre de la categoria de los productos a recuperar */ getProductosDeCategoriaFromDatabase(categoria: string): Observable<any> { return this.angularFirestore .collection('productos', (ref) => ref.where('categoria', '==', categoria)) .valueChanges(); } + /* Metodo que crea un pedido en base de datos. Recibe como parámetro el pedido que hay que crear y el identificador unico del usuario al que debe ser asociado el pedido. */ createPedidoInDatabase(pedido: Pedido, uid: string) { return new Promise<any>((resolve, reject) => this.angularFirestore @@ -149,12 +159,10 @@ export class DatabaseService { this.getProductoFromDatabase(par.productoID) .pipe(take(1)) .subscribe((producto: Producto) => { - console.log(producto); - let productoAct = producto; productoAct.stockEnAlmacen -= par.unidades; this.updateProductoInDatabase(productoAct).then((res) => - console.log(res) + console.log('') ); }); }); @@ -165,18 +173,20 @@ export class DatabaseService { ) ); } + /* Metodo que permite recuperar de base de datos los pedidos de un usuario. Recibe como parámetro el identificador unico del usario del que se desean recuperar los pedidos. */ getPedidosDeUsuarioFromDatabase(uid: string): Observable<any> { return this.angularFirestore .collection('pedidos', (ref) => ref.where('uid', '==', uid)) .snapshotChanges(); } + /* metodo que permite recuperar un pedido de un usuario de base de datos. recibe como parámetro el identificador único del pedido a recuperar */ getPedidoFromDatabase(numeroPedido: string) { return this.angularFirestore .collection('pedidos') .doc(numeroPedido) .valueChanges(); } - + /* Metodo que permite cancelar un pedido en base de datos. Recibe como parametro el pedido a cancelar y el identificador unico del pedido. */ cancelarPedidoInDatabase(pedido: Pedido, numeroPedido: string) { return this.angularFirestore .collection('pedidos') diff --git a/src/app/shared/servicios/pedido-guard.service.ts b/src/app/shared/servicios/pedido-guard.service.ts index 8e9a4bd7540bee5fc8aad338f1e72fb09f9811e8..d4e4c3c3afaef0b0d4f3ecca69dcaa103af5c401 100644 --- a/src/app/shared/servicios/pedido-guard.service.ts +++ b/src/app/shared/servicios/pedido-guard.service.ts @@ -17,7 +17,7 @@ export class PedidoGuardService implements CanActivate { private cestaService: CestaCompraService, private router: Router ) {} - + /* Metodo que resuelve si se puede acceder a laa vista de pago */ canActivate( route: ActivatedRouteSnapshot, state: RouterStateSnapshot @@ -27,12 +27,15 @@ export class PedidoGuardService implements CanActivate { | Observable<boolean | UrlTree> | Promise<boolean | UrlTree> { return this.cestaService.pedidoBS.pipe( + /* cuando hay un pedido devolvemos true para poder acceder a la vista de pago */ map((pedido) => { const hayPedido = !!pedido; if (hayPedido) { return true; } - return this.router.createUrlTree(['/cesta']); + return this.router.createUrlTree([ + '/cesta', + ]); /* si no hay pedido se devuelve una ruta que nos redirige a la cesta de la compra */ }) ); } diff --git a/src/app/sobre-nosotros/sobre-nosotros.component.ts b/src/app/sobre-nosotros/sobre-nosotros.component.ts index 42e4abda4becf44b6602103d9a63e045431112e3..b6871fca4362b5c8027a0e2fd07719cf79551743 100644 --- a/src/app/sobre-nosotros/sobre-nosotros.component.ts +++ b/src/app/sobre-nosotros/sobre-nosotros.component.ts @@ -3,13 +3,10 @@ import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-sobre-nosotros', templateUrl: './sobre-nosotros.component.html', - styleUrls: ['./sobre-nosotros.component.css'] + styleUrls: ['./sobre-nosotros.component.css'], }) export class SobreNosotrosComponent implements OnInit { - - constructor() { } - - ngOnInit(): void { - } - + constructor() {} + /* No posee lógica ya que su unica funcion es la de contener la vista sobre nosotros */ + ngOnInit(): void {} } diff --git a/src/app/tienda/card-producto/card-producto.component.ts b/src/app/tienda/card-producto/card-producto.component.ts index 6307d6eaedda56af586171d4f48cd94416b598af..a54da116f767c7ee5262e326877b890dcba83d72 100644 --- a/src/app/tienda/card-producto/card-producto.component.ts +++ b/src/app/tienda/card-producto/card-producto.component.ts @@ -10,20 +10,25 @@ import { DatabaseService } from 'src/app/shared/servicios/database.service'; providers: [DatabaseService], }) export class CardProductoComponent implements OnInit { - @Input('producto') producto: Producto; - imagen: Observable<string | null>; - added = false; + @Input('producto') + producto: Producto; /* producto que se recibe como parametro y que sera mostrado en la card */ + imagen: Observable< + string | null + >; /* la imagen que se va a mostrar en la card, la cual es un observable porque su recepcion es asincrona */ + added = + false; /* booleano que controla la muestra de un pequeño icono indicativo de que el produco ha sido añadido a la cesta */ constructor( private databaseService: DatabaseService, private cestaService: CestaCompraService ) {} - + /* se encarga de recuperar la imagen del producto de base de datos mediante una llamada al database service */ ngOnInit(): void { this.imagen = this.databaseService.getDownloadURLFromStorage( this.producto.imagenIconoPath ); } + /* funcion que se llama al hacer click en el boton añadir a la cesta y que mediante una llamada al cestaCompraService añade una unidad del producto mostrado a la cesta */ addCesta(): void { this.cestaService.addProducto(this.producto, 1); this.added = true; diff --git a/src/app/tienda/carousel-productos/carousel-productos.component.ts b/src/app/tienda/carousel-productos/carousel-productos.component.ts index 647b05b3acfe94d1fb8ab29455d6e6294cc6970e..a4ac8f8e836a917693a6c7d44292a8d1bd506eda 100644 --- a/src/app/tienda/carousel-productos/carousel-productos.component.ts +++ b/src/app/tienda/carousel-productos/carousel-productos.component.ts @@ -28,8 +28,9 @@ export class CarouselProductosComponent implements OnInit { numVisible: 1, numScroll: 1, }, - ]; - @Input('productos') productos: Producto[]; + ]; /* Opciones responsivas del carousel */ + @Input('productos') + productos: Producto[]; /* productos a mostrar en el carousel */ constructor() {} diff --git a/src/app/tienda/categorias/categorias.component.ts b/src/app/tienda/categorias/categorias.component.ts index 8dfa1d23daa5fc97d3af731e6c4abaeacf85edd5..514555732b1b8f88b0048070058c8c9286c66f8c 100644 --- a/src/app/tienda/categorias/categorias.component.ts +++ b/src/app/tienda/categorias/categorias.component.ts @@ -10,16 +10,16 @@ import { DatabaseService } from 'src/app/shared/servicios/database.service'; providers: [DatabaseService], }) export class CategoriasComponent implements OnInit { - @Input('mostrarBotonVolver') mostrarBotonVolver: Boolean; - categoriasAMostrar: string[0]; - paramsSubcription: Subscription; - tituloCategorias: string; + @Input('mostrarBotonVolver') + mostrarBotonVolver: Boolean; /* Booleano que controla el visionado o no del boton volver a la tienda */ + categoriasAMostrar: string[0]; /* array que contiene las categorias que van a ser mostradas en el componente */ + paramsSubcription: Subscription; /* Subscripcion a los parametros de la ruta para saber que categorias debemos mostrar */ + tituloCategorias: string; /* el titulo a mostrar en las categorias, que puede ser categorias principales, o todas las categorias */ constructor( private route: ActivatedRoute, - private databaseService: DatabaseService, - private router: Router + private databaseService: DatabaseService ) {} - + /* Se encarga de recuperar de la ruta el componente en el que se ha incrustado este componente para saber lo que debe mostrar */ ngOnInit(): void { switch (this.route.snapshot.url.toString()) { case 'tienda': diff --git a/src/app/tienda/grid-productos/grid-productos.component.ts b/src/app/tienda/grid-productos/grid-productos.component.ts index f53d50885dab1b8d0afd51e9da6d606b2490458d..0fc3576aa28e9fc88b9cf9dfe02c2189b146c48b 100644 --- a/src/app/tienda/grid-productos/grid-productos.component.ts +++ b/src/app/tienda/grid-productos/grid-productos.component.ts @@ -11,19 +11,22 @@ import { DatabaseService } from 'src/app/shared/servicios/database.service'; providers: [DatabaseService], }) export class GridProductosComponent implements OnInit, OnDestroy { - nombreCategoriaProductos: string; - paramsSubscription: Subscription; - mostrarBotonVolver = false; - @Input('productos') productos: Producto[]; + nombreCategoriaProductos: string; /* El nombre de la categoría de la que se muestran los productos, o todos los productos en caso de mostar todos */ + paramsSubscription: Subscription; /* La subscripcion a los paramteros para saber donde esta incrustado el componente y saber qué mostrar */ + mostrarBotonVolver = + false; /* booleano que controla el mostrar o no el botón volver a la tienda */ + @Input('productos') + productos: Producto[]; /* lo productos que recibe el componente para ser mostrados */ constructor( private route: ActivatedRoute, private databaseService: DatabaseService ) {} + /* Destruye la subscripcion a los parametros de la ruta */ ngOnDestroy(): void { this.paramsSubscription.unsubscribe(); } - + /* Se encarga de recuperar los productos de una categoria si no estamos en la pagina principal de la tienda, dado que en esa vista se pasan como parametro los productos */ ngOnInit(): void { this.paramsSubscription = this.route.params.subscribe((params) => { this.databaseService diff --git a/src/app/tienda/producto/producto.component.ts b/src/app/tienda/producto/producto.component.ts index 8c56e88d32548bf2fb8db4f83647ee1e4f64414d..e6294dc643e79aea376432c961394799b5544c85 100644 --- a/src/app/tienda/producto/producto.component.ts +++ b/src/app/tienda/producto/producto.component.ts @@ -12,19 +12,25 @@ import { DatabaseService } from 'src/app/shared/servicios/database.service'; providers: [DatabaseService], }) export class ProductoComponent implements OnInit, OnDestroy { - producto: Producto; - images = []; - cantidadAIncluirEnCesta = 1; - private paramsSubscription; - showNavigationArrows = true; - showNavigationIndicators = true; + producto: Producto; /* El producto que se va a mostrar */ + images = []; /* Las imagenes asociadas al producto */ + cantidadAIncluirEnCesta = 1; /* La cantidad de producto que va a ser adicionada a la cesta cuando el usuario lo haga */ + private paramsSubscription; /* La subscripcion a los parámetros de la ruta para saber que prodcuto mostrar */ + showNavigationArrows = + true; /* booleano que se emplea para saber si hay que mostrar las flechas en el carousel de imagenes */ + showNavigationIndicators = + true; /* booleano que se emplea para saber si hay me mostrar los indicadores de imagen en el carousel de imagenes */ + added = + false; /* Booleano que controla el mostrar o no un icono en el boton de añadir a la cesta para dar retroalimentacion al usuario */ - added = false; constructor( private route: ActivatedRoute, private databaseService: DatabaseService, private cestaService: CestaCompraService ) {} + + /* Recupera de los parametros el identificador del pedido que hay que mostrar y recupera ese pedido de base de datos para mostrarlo. + Tambien carga las imagenes del producto para mostrarlas en el carousel */ ngOnInit(): void { this.paramsSubscription = this.route.params.subscribe((params: Params) => { this.databaseService @@ -47,6 +53,9 @@ export class ProductoComponent implements OnInit, OnDestroy { getImage(imagePath: string) { return this.databaseService.getDownloadURLFromStorage(imagePath); } + + /* Metodo que se llama al hacer click en el boton "añadir a la cesta", el cual hace una llamada al CEstaCompraService para introducir en la cesta el producto. + También modifica el atributo added para mostar un pequeño icono al usuario indicando que la accion se ha completado*/ addCesta(): void { this.cestaService.addProducto(this.producto, this.cantidadAIncluirEnCesta); this.added = true; @@ -54,6 +63,8 @@ export class ProductoComponent implements OnInit, OnDestroy { this.added = !this.added; }, 1500); } + + /* destruye la subscripcion a los parametros de la ruta */ ngOnDestroy(): void { this.paramsSubscription.unsubscribe(); } diff --git a/src/app/tienda/tienda-tienda/tienda-tienda.component.ts b/src/app/tienda/tienda-tienda/tienda-tienda.component.ts index 1e93c038ef17ca5c4a9897c842f9967d0c23fad7..f16f4c634f6d55f781de13af5faf5149ae5a0114 100644 --- a/src/app/tienda/tienda-tienda/tienda-tienda.component.ts +++ b/src/app/tienda/tienda-tienda/tienda-tienda.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { Subscription } from 'rxjs'; +import { Subscription, take } from 'rxjs'; import { Producto } from 'src/app/shared/clases/producto'; import { DatabaseService } from 'src/app/shared/servicios/database.service'; @Component({ @@ -9,13 +9,14 @@ import { DatabaseService } from 'src/app/shared/servicios/database.service'; providers: [DatabaseService], }) export class TiendaTiendaComponent implements OnInit { - productos: Producto[]; - productosSubscription: Subscription; + productos: Producto[]; /* Los productos que van a ser mostrados */ + productosSubscription: Subscription; /* Subscripcion a los productos en base de datos*/ constructor(private databaseService: DatabaseService) {} - + /* Recupera todos los productos de base de datos para mostrarlos en la pagina principal de la tienda */ ngOnInit(): void { this.productosSubscription = this.databaseService .getAllProductosFromDatabase() + .pipe(take(1)) .subscribe((productosRes) => { this.productos = productosRes.map((p) => { return { ...(p.payload.doc.data() as Producto) };