feat(register): integrate modal and toast services for success and error handling

This commit is contained in:
2026-07-03 09:05:56 -03:00
parent 3697c4b97c
commit 625e2fea6c
3 changed files with 73 additions and 6 deletions

View File

@@ -3,6 +3,8 @@ import { provideRouter, Router } from '@angular/router';
import { of, throwError } from 'rxjs';
import { AuthService } from '../../../../core/services/auth/auth.service';
import { ModalService } from '../../../../core/services/modal.service';
import { ToastService } from '../../../../core/services/toast.service';
import { RegisterPageComponent } from './register-page.component';
describe('RegisterPageComponent', () => {
@@ -23,10 +25,21 @@ describe('RegisterPageComponent', () => {
})
)
};
const modalService = {
openSimple: vi.fn().mockReturnValue(of(undefined))
};
const toastService = {
danger: vi.fn()
};
await TestBed.configureTestingModule({
imports: [RegisterPageComponent],
providers: [provideRouter([]), { provide: AuthService, useValue: authService }]
providers: [
provideRouter([]),
{ provide: AuthService, useValue: authService },
{ provide: ModalService, useValue: modalService },
{ provide: ToastService, useValue: toastService }
]
}).compileComponents();
const fixture = TestBed.createComponent(RegisterPageComponent);
@@ -49,6 +62,10 @@ describe('RegisterPageComponent', () => {
password: 'secret123',
password_confirmation: 'secret123'
});
expect(modalService.openSimple).toHaveBeenCalledWith({
content: 'Tu cuenta fue creada correctamente',
buttonLabel: 'Cerrar'
});
expect(navigateSpy).toHaveBeenCalledWith(['/login']);
});
@@ -56,10 +73,21 @@ describe('RegisterPageComponent', () => {
const authService = {
register: vi.fn()
};
const modalService = {
openSimple: vi.fn()
};
const toastService = {
danger: vi.fn()
};
await TestBed.configureTestingModule({
imports: [RegisterPageComponent],
providers: [provideRouter([]), { provide: AuthService, useValue: authService }]
providers: [
provideRouter([]),
{ provide: AuthService, useValue: authService },
{ provide: ModalService, useValue: modalService },
{ provide: ToastService, useValue: toastService }
]
}).compileComponents();
const fixture = TestBed.createComponent(RegisterPageComponent);
@@ -81,10 +109,21 @@ describe('RegisterPageComponent', () => {
const authService = {
register: vi.fn()
};
const modalService = {
openSimple: vi.fn()
};
const toastService = {
danger: vi.fn()
};
await TestBed.configureTestingModule({
imports: [RegisterPageComponent],
providers: [provideRouter([]), { provide: AuthService, useValue: authService }]
providers: [
provideRouter([]),
{ provide: AuthService, useValue: authService },
{ provide: ModalService, useValue: modalService },
{ provide: ToastService, useValue: toastService }
]
}).compileComponents();
const fixture = TestBed.createComponent(RegisterPageComponent);
@@ -116,10 +155,21 @@ describe('RegisterPageComponent', () => {
}))
)
};
const modalService = {
openSimple: vi.fn()
};
const toastService = {
danger: vi.fn()
};
await TestBed.configureTestingModule({
imports: [RegisterPageComponent],
providers: [provideRouter([]), { provide: AuthService, useValue: authService }]
providers: [
provideRouter([]),
{ provide: AuthService, useValue: authService },
{ provide: ModalService, useValue: modalService },
{ provide: ToastService, useValue: toastService }
]
}).compileComponents();
const fixture = TestBed.createComponent(RegisterPageComponent);
@@ -134,5 +184,6 @@ describe('RegisterPageComponent', () => {
component.onSubmit();
expect(component.serverError()).toBe('El email ya esta en uso.');
expect(toastService.danger).toHaveBeenCalledWith('El email ya esta en uso.');
});
});

View File

@@ -10,6 +10,8 @@ import {
import { Router } from '@angular/router';
import { AuthService } from '../../../../core/services/auth/auth.service';
import { ModalService } from '../../../../core/services/modal.service';
import { ToastService } from '../../../../core/services/toast.service';
import { ButtonComponent } from '../../../../shared/components/button/button.component';
import { InputComponent } from '../../../../shared/components/input/input.component';
@@ -40,6 +42,8 @@ export class RegisterPageComponent {
private readonly formBuilder = inject(FormBuilder);
private readonly router = inject(Router);
private readonly authService = inject(AuthService);
private readonly modalService = inject(ModalService);
private readonly toastService = inject(ToastService);
private readonly submittedState = signal(false);
private readonly serverErrorState = signal<string | null>(null);
@@ -78,11 +82,18 @@ export class RegisterPageComponent {
this.authService.register(this.form.getRawValue()).subscribe({
next: () => {
this.isSubmittingState.set(false);
void this.router.navigate(['/login']);
this.modalService.openSimple({
content: 'Tu cuenta fue creada correctamente',
buttonLabel: 'Cerrar'
}).subscribe(() => {
void this.router.navigate(['/login']);
});
},
error: (error: unknown) => {
this.isSubmittingState.set(false);
this.serverErrorState.set(this.resolveErrorMessage(error));
const errorMessage = this.resolveErrorMessage(error);
this.serverErrorState.set(errorMessage);
this.toastService.danger(errorMessage);
}
});
}

View File

@@ -37,6 +37,7 @@
}
.modal-shell__content {
min-height: 180px;
max-height: calc(100dvh - 2rem);
border-radius: 1.25rem;
background:
@@ -72,6 +73,10 @@
}
.modal-shell__body {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
padding: 0 1.25rem 1.25rem;
color: #303030;
}