74 lines
1.7 KiB
TypeScript
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`);
|
|
}
|