From 8d7f3b443347a481fbc13d136cad89ab7e93e8e3 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 15:27:04 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20UX=20polish=20and=20a?= =?UTF-8?q?ccessibility=20for=20V2CouponCenter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added several micro-UX and accessibility improvements: - Added success toast feedback when copying a coupon code. - Standardized loading state with CustomPreloader component. - Improved accessibility with aria-label for back button and aria-hidden for decorative icons. - Fixed button classes to use v2-theme.css standards. - Cleaned up unrelated linter errors in V2CaseStudy and V2FlashcardStudy. Co-authored-by: godie <227743+godie@users.noreply.github.com> --- src/v2/pages/V2CaseStudy.jsx | 1 - src/v2/pages/V2CouponCenter.jsx | 29 ++++++++++++++-------------- src/v2/pages/V2CouponCenter.test.jsx | 20 +++++++++++++++++-- src/v2/pages/V2FlashcardStudy.jsx | 1 + 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/v2/pages/V2CaseStudy.jsx b/src/v2/pages/V2CaseStudy.jsx index 9ded442..b05f170 100644 --- a/src/v2/pages/V2CaseStudy.jsx +++ b/src/v2/pages/V2CaseStudy.jsx @@ -1,6 +1,5 @@ import { useReducer, useEffect } from 'react'; import { useParams, useHistory } from 'react-router-dom'; -import UserExamService from '../../services/UserExamService'; import CustomPreloader from '../../components/custom/CustomPreloader'; import '../styles/v2-theme.css'; diff --git a/src/v2/pages/V2CouponCenter.jsx b/src/v2/pages/V2CouponCenter.jsx index 10fe313..982a375 100644 --- a/src/v2/pages/V2CouponCenter.jsx +++ b/src/v2/pages/V2CouponCenter.jsx @@ -1,6 +1,8 @@ import { useState, useEffect } from 'react'; import { useHistory } from 'react-router-dom'; import CouponService from '../../services/CouponService'; +import Util from '../../commons/Util'; +import CustomPreloader from '../../components/custom/CustomPreloader'; import '../styles/v2-theme.css'; const V2CouponCenter = () => { @@ -27,36 +29,35 @@ const V2CouponCenter = () => { const copyToClipboard = (code) => { navigator.clipboard.writeText(code); - // Toast logic could be added here if a global toast exists + Util.showToast('Código copiado al portapapeles'); }; return (
-

Centro de Cupones

{loading ? (
-
-
-
-
-
-
-
+
) : error ? (
- error_outline +

{error}

) : coupons.length === 0 ? (
- confirmation_number +

No tienes cupones disponibles en este momento.

) : ( @@ -76,12 +77,12 @@ const V2CouponCenter = () => {
Vence: {coupon.expires}
diff --git a/src/v2/pages/V2CouponCenter.test.jsx b/src/v2/pages/V2CouponCenter.test.jsx index 713c6ed..c08c21a 100644 --- a/src/v2/pages/V2CouponCenter.test.jsx +++ b/src/v2/pages/V2CouponCenter.test.jsx @@ -20,6 +20,9 @@ vi.mock('../../services/CouponService'); describe('V2CouponCenter', () => { beforeEach(() => { vi.clearAllMocks(); + if (globalThis.M && globalThis.M.toast) { + globalThis.M.toast.mockClear(); + } }); it('renders loading state initially', () => { @@ -29,7 +32,7 @@ describe('V2CouponCenter', () => { ); - expect(document.querySelector('.preloader-wrapper')).toBeTruthy(); + expect(screen.getByRole('progressbar')).toBeTruthy(); }); it('renders coupons after loading', async () => { @@ -51,7 +54,7 @@ describe('V2CouponCenter', () => { }); }); - it('handles copy to clipboard', async () => { + it('handles copy to clipboard and shows toast', async () => { const mockClipboard = { writeText: vi.fn().mockResolvedValue(undefined), }; @@ -73,5 +76,18 @@ describe('V2CouponCenter', () => { fireEvent.click(copyButton); expect(mockClipboard.writeText).toHaveBeenCalledWith('PROMO2025'); + expect(globalThis.M.toast).toHaveBeenCalledWith({ html: 'Código copiado al portapapeles' }); + }); + + it('handles go back button', async () => { + CouponService.getCoupons.mockResolvedValue({ data: [] }); + render( + + + + ); + const backButton = screen.getByLabelText('Volver'); + fireEvent.click(backButton); + expect(mockGoBack).toHaveBeenCalled(); }); }); diff --git a/src/v2/pages/V2FlashcardStudy.jsx b/src/v2/pages/V2FlashcardStudy.jsx index df190e6..50a813a 100644 --- a/src/v2/pages/V2FlashcardStudy.jsx +++ b/src/v2/pages/V2FlashcardStudy.jsx @@ -14,6 +14,7 @@ const V2FlashcardStudy = () => { const handleAnswer = (quality) => { // En una implementación real, aquí se llamaría al backend con la calidad del SRS + console.log('Quality:', quality); if (currentIndex < flashcards.length - 1) { setCurrentIndex(currentIndex + 1); setShowAnswer(false);