feat(cart): integrate confirmation modals for item removal in cart component

This commit is contained in:
2026-07-02 12:04:29 -03:00
parent 446d1b8970
commit bf5fd83f98
6 changed files with 253 additions and 61 deletions

View File

@@ -14,6 +14,7 @@ import {
it,
vi
} from 'vitest';
import { firstValueFrom } from 'rxjs';
import { ConfirmDeleteModalComponent } from '../../shared/components/confirm-delete-modal/confirm-delete-modal.component';
import { ConfirmModalComponent } from '../../shared/components/confirm-modal/confirm-modal.component';
@@ -134,7 +135,7 @@ describe('ModalService', () => {
});
it('opens the standard confirm modal with default labels', () => {
const ref = service.openConfirm({
const result$ = service.openConfirm({
title: 'Confirmar compra',
content: 'Esto confirmara la compra actual.'
});
@@ -142,7 +143,7 @@ describe('ModalService', () => {
const activeModal = service.activeModal();
expect(activeModal?.component).toBe(ConfirmModalComponent);
expect(activeModal?.ref).toBe(ref);
expect(result$).toBeDefined();
expect(activeModal?.config).toEqual({
title: 'Confirmar compra',
data: {
@@ -157,6 +158,32 @@ describe('ModalService', () => {
});
});
it('maps the confirm modal close result to true', async () => {
const result$ = service.openConfirm({
title: 'Confirmar compra',
content: 'Esto confirmara la compra actual.'
});
const activeModal = service.activeModal();
const resultPromise = firstValueFrom(result$);
activeModal?.ref.close(true);
await expect(resultPromise).resolves.toBe(true);
});
it('maps dismissing a confirm modal to false', async () => {
const result$ = service.openConfirmDelete({
title: 'Eliminar producto',
content: 'Se eliminara el producto.'
});
const activeModal = service.activeModal();
const resultPromise = firstValueFrom(result$);
activeModal?.ref.dismiss('escape');
await expect(resultPromise).resolves.toBe(false);
});
it('opens the delete confirm modal preserving modal overrides', () => {
service.openConfirmDelete({
title: 'Eliminar producto',

View File

@@ -1,5 +1,5 @@
import { InjectionToken, Injectable, Type, signal } from '@angular/core';
import { Observable, Subject } from 'rxjs';
import { Observable, Subject, map } from 'rxjs';
import { ConfirmDeleteModalComponent } from '../../shared/components/confirm-delete-modal/confirm-delete-modal.component';
import { ConfirmModalComponent } from '../../shared/components/confirm-modal/confirm-modal.component';
@@ -135,11 +135,23 @@ export class ModalService {
return ref;
}
openConfirm(config: ConfirmModalConfig): ModalRef<boolean> {
openConfirm(config: ConfirmModalConfig): Observable<boolean> {
return this.openConfirmRef(config).afterClosed$.pipe(
map((result) => result === true)
);
}
openConfirmDelete(config: ConfirmModalConfig): Observable<boolean> {
return this.openConfirmDeleteRef(config).afterClosed$.pipe(
map((result) => result === true)
);
}
openConfirmRef(config: ConfirmModalConfig): ModalRef<boolean> {
return this.open(ConfirmModalComponent, this.buildConfirmModalConfig(config));
}
openConfirmDelete(config: ConfirmModalConfig): ModalRef<boolean> {
openConfirmDeleteRef(config: ConfirmModalConfig): ModalRef<boolean> {
return this.open(
ConfirmDeleteModalComponent,
this.buildConfirmModalConfig(config)