mediahub-fe/utils/export-media-tracking.ts

74 lines
1.7 KiB
TypeScript

import * as XLSX from "xlsx";
import { getMediaTrackingResult } from "@/service/media-tracking/media-tracking";
import { saveAs } from "file-saver";
type ExportParams = {
mediaTrackingId: number;
};
export async function exportMediaTrackingToExcel({
mediaTrackingId,
}: ExportParams) {
let page = 0;
let totalPages = 1;
const allData: any[] = [];
while (page < totalPages) {
const res = await getMediaTrackingResult({
id: mediaTrackingId,
page,
});
const data = res?.data?.data;
if (!data) break;
totalPages = data.totalPages;
allData.push(...data.content);
page++;
}
if (allData.length === 0) {
throw new Error("Tidak ada data untuk di-export");
}
function extractDomain(url?: string): string {
if (!url) return "-";
try {
return new URL(url).hostname;
} catch {
return "-";
}
}
const rows = allData.map((item, index) => ({
No: index + 1,
"Media Online": extractDomain(item.link),
"Judul Berita": item.title ?? "-",
"Link Berita": item.link ?? "-",
Validasi: item.validationStatus ?? "-",
View: item.viewCount ?? 0,
Share: item.shareCount ?? 0,
Komentar: item.commentCount ?? 0,
Tanggal: item.createdAt
? new Date(item.createdAt).toLocaleString("id-ID")
: "-",
}));
const worksheet = XLSX.utils.json_to_sheet(rows);
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, "Media Tracking");
const excelBuffer = XLSX.write(workbook, {
bookType: "xlsx",
type: "array",
});
const blob = new Blob([excelBuffer], {
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
});
saveAs(blob, `media-tracking-${mediaTrackingId}.xlsx`);
}