feat: download campaign report

This commit is contained in:
Abhishek Kumar 2026-03-11 17:57:04 +05:30
parent ff92c6ae5c
commit 4d807266a7
12 changed files with 429 additions and 28 deletions

View file

@ -1,11 +1,12 @@
"use client";
import { ArrowLeft, Check, Clock, Pause, Pencil, Play, RefreshCw, X } from 'lucide-react';
import { ArrowLeft, Check, Clock, Download, Pause, Pencil, Play, RefreshCw, X } from 'lucide-react';
import { useParams, useRouter, useSearchParams } from 'next/navigation';
import { useCallback, useEffect, useState } from 'react';
import { toast } from 'sonner';
import {
downloadCampaignReportApiV1CampaignCampaignIdReportGet,
getCampaignApiV1CampaignCampaignIdGet,
getCampaignSourceDownloadUrlApiV1CampaignCampaignIdSourceDownloadUrlGet,
pauseCampaignApiV1CampaignCampaignIdPausePost,
@ -111,6 +112,40 @@ export default function CampaignDetailPage() {
}
};
// Handle download report
const handleDownloadReport = async () => {
if (!user) return;
try {
const accessToken = await getAccessToken();
const response = await downloadCampaignReportApiV1CampaignCampaignIdReportGet({
path: {
campaign_id: campaignId,
},
headers: {
'Authorization': `Bearer ${accessToken}`,
},
parseAs: 'blob',
});
if (response.data) {
const blob = response.data as Blob;
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `campaign_${campaignId}_report.csv`;
document.body.appendChild(a);
a.click();
a.remove();
window.URL.revokeObjectURL(url);
} else {
toast.error('Failed to download report');
}
} catch (error) {
console.error('Failed to download report:', error);
toast.error('Failed to download report');
}
};
// Handle start campaign
const handleStart = async () => {
if (!user) return;
@ -328,7 +363,13 @@ export default function CampaignDetailPage() {
</span>
</div>
</div>
{renderActionButton()}
<div className="flex items-center gap-2">
<Button variant="outline" onClick={handleDownloadReport}>
<Download className="h-4 w-4 mr-2" />
Download Report
</Button>
{renderActionButton()}
</div>
</div>
</div>