From 05fdda811bff5e9e03c25e80ba91a2ba88f209b4 Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Fri, 16 Jan 2026 14:05:20 +0100 Subject: [PATCH] Avoid billing redirect for endcustomer packages --- resources/js/admin/mobile/DashboardPage.tsx | 3 +- .../mobile/__tests__/DashboardPage.test.tsx | 40 ++++++++++++++++--- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/resources/js/admin/mobile/DashboardPage.tsx b/resources/js/admin/mobile/DashboardPage.tsx index eaab3e5..42d1bdc 100644 --- a/resources/js/admin/mobile/DashboardPage.tsx +++ b/resources/js/admin/mobile/DashboardPage.tsx @@ -169,6 +169,7 @@ export default function MobileDashboardPage() { const activePackage = packagesOverview?.activePackage ?? packagesOverview?.packages?.find((pkg) => pkg.active) ?? null; const remainingEvents = activePackage?.remaining_events ?? null; + const isResellerPackage = activePackage?.package_type === 'reseller'; const summarySeenPackageId = summarySeenOverride ?? onboardingStatus?.steps?.summary_seen_package_id ?? null; const hasSummaryPackage = @@ -178,7 +179,7 @@ export default function MobileDashboardPage() { !packagesLoading && !packagesError && !effectiveHasEvents && - (activePackage === null || (remainingEvents !== null && remainingEvents <= 0)); + (activePackage === null || (isResellerPackage && remainingEvents !== null && remainingEvents <= 0)); React.useEffect(() => { if (packagesLoading || !shouldRedirectToBilling) { diff --git a/resources/js/admin/mobile/__tests__/DashboardPage.test.tsx b/resources/js/admin/mobile/__tests__/DashboardPage.test.tsx index 8c40941..3c16a0d 100644 --- a/resources/js/admin/mobile/__tests__/DashboardPage.test.tsx +++ b/resources/js/admin/mobile/__tests__/DashboardPage.test.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { describe, expect, it, vi } from 'vitest'; +import { afterEach, describe, expect, it, vi } from 'vitest'; import { render, screen } from '@testing-library/react'; const fixtures = vi.hoisted(() => ({ @@ -41,6 +41,13 @@ const authState = { status: 'authenticated', user: { role: 'tenant_admin' }, }; +const eventContext = { + events: [fixtures.event], + activeEvent: fixtures.event, + hasEvents: true, + hasMultipleEvents: false, + isLoading: false, +}; vi.mock('react-router-dom', () => ({ useNavigate: () => navigateMock, @@ -98,11 +105,7 @@ vi.mock('@tanstack/react-query', () => ({ vi.mock('../../context/EventContext', () => ({ useEventContext: () => ({ - events: [fixtures.event], - activeEvent: fixtures.event, - hasEvents: true, - hasMultipleEvents: false, - isLoading: false, + ...eventContext, selectEvent: vi.fn(), }), })); @@ -231,6 +234,31 @@ vi.mock('../eventDate', () => ({ import MobileDashboardPage from '../DashboardPage'; describe('MobileDashboardPage', () => { + afterEach(() => { + eventContext.events = [fixtures.event]; + eventContext.activeEvent = fixtures.event; + eventContext.hasEvents = true; + eventContext.hasMultipleEvents = false; + + fixtures.activePackage.package_type = 'standard'; + fixtures.activePackage.remaining_events = 3; + navigateMock.mockClear(); + }); + + it('does not redirect endcustomer packages without remaining event quota', () => { + eventContext.events = []; + eventContext.activeEvent = null as unknown as typeof fixtures.event; + eventContext.hasEvents = false; + eventContext.hasMultipleEvents = false; + + fixtures.activePackage.package_type = 'endcustomer'; + fixtures.activePackage.remaining_events = 0; + + render(); + + expect(navigateMock).not.toHaveBeenCalledWith('/event-admin/mobile/billing#packages', { replace: true }); + }); + it('shows package usage progress when a limit is available', () => { render();