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();