diff --git a/app/sites/[id]/funnels/[funnelId]/page.tsx b/app/sites/[id]/funnels/[funnelId]/page.tsx
index ac1b729..ddbec35 100644
--- a/app/sites/[id]/funnels/[funnelId]/page.tsx
+++ b/app/sites/[id]/funnels/[funnelId]/page.tsx
@@ -2,6 +2,7 @@
import { useCallback, useEffect, useMemo, useState } from 'react'
import { useParams, useRouter } from 'next/navigation'
+import { ApiError } from '@/lib/api/client'
import { getFunnel, getFunnelStats, deleteFunnel, type Funnel, type FunnelStats } from '@/lib/api/funnels'
import { toast, LoadingOverlay, Select, DatePicker, ChevronLeftIcon, ArrowRightIcon, TrashIcon, useTheme } from '@ciphera-net/ui'
import Link from 'next/link'
@@ -45,8 +46,10 @@ export default function FunnelReportPage() {
const [dateRange, setDateRange] = useState(getDateRange(30))
const [datePreset, setDatePreset] = useState<'7' | '30' | 'custom'>('30')
const [isDatePickerOpen, setIsDatePickerOpen] = useState(false)
+ const [loadError, setLoadError] = useState<'not_found' | 'error' | null>(null)
const loadData = useCallback(async () => {
+ setLoadError(null)
try {
setLoading(true)
const [funnelData, statsData] = await Promise.all([
@@ -56,7 +59,9 @@ export default function FunnelReportPage() {
setFunnel(funnelData)
setStats(statsData)
} catch (error) {
- toast.error('Failed to load funnel data')
+ const is404 = error instanceof ApiError && error.status === 404
+ setLoadError(is404 ? 'not_found' : 'error')
+ if (!is404) toast.error('Failed to load funnel data')
} finally {
setLoading(false)
}
@@ -88,6 +93,25 @@ export default function FunnelReportPage() {
return
Funnel not found
+Failed to load funnel data
+ +