fix: prevent duplicate filters, support Direct referrer, pass filters to Campaigns

- Deduplicate filters so clicking the same item twice doesn't stack identical pills
- Normalize "Direct" referrer to empty string so direct traffic filtering works
- Pass active filters through to Campaigns component so it respects dashboard filters
This commit is contained in:
Usman Baig
2026-03-06 22:40:57 +01:00
parent ec96fa8a0d
commit 0809c37067
4 changed files with 36 additions and 8 deletions

View File

@@ -17,6 +17,7 @@ import UtmBuilder from '@/components/tools/UtmBuilder'
interface CampaignsProps {
siteId: string
dateRange: { start: string, end: string }
filters?: string
}
const LIMIT = 7
@@ -41,7 +42,7 @@ function campaignRowKey(item: CampaignStat): string {
return `${item.source}|${item.medium}|${item.campaign}`
}
export default function Campaigns({ siteId, dateRange }: CampaignsProps) {
export default function Campaigns({ siteId, dateRange, filters }: CampaignsProps) {
const [data, setData] = useState<CampaignStat[]>([])
const [isLoading, setIsLoading] = useState(true)
const [isModalOpen, setIsModalOpen] = useState(false)
@@ -56,7 +57,7 @@ export default function Campaigns({ siteId, dateRange }: CampaignsProps) {
const fetchData = async () => {
setIsLoading(true)
try {
const result = await getCampaigns(siteId, dateRange.start, dateRange.end, 10)
const result = await getCampaigns(siteId, dateRange.start, dateRange.end, 10, filters)
setData(result)
} catch (e) {
logger.error(e)
@@ -65,14 +66,14 @@ export default function Campaigns({ siteId, dateRange }: CampaignsProps) {
}
}
fetchData()
}, [siteId, dateRange])
}, [siteId, dateRange, filters])
useEffect(() => {
if (isModalOpen) {
const fetchFullData = async () => {
setIsLoadingFull(true)
try {
const result = await getCampaigns(siteId, dateRange.start, dateRange.end, 100)
const result = await getCampaigns(siteId, dateRange.start, dateRange.end, 100, filters)
setFullData(result)
} catch (e) {
logger.error(e)
@@ -84,7 +85,7 @@ export default function Campaigns({ siteId, dateRange }: CampaignsProps) {
} else {
setFullData([])
}
}, [isModalOpen, siteId, dateRange])
}, [isModalOpen, siteId, dateRange, filters])
const sortedData = useMemo(
() => sortCampaigns(data, sortKey, sortDir),