'use client' import { useState } from 'react' import { Modal, Button, Checkbox, Input, Select } from '@ciphera-net/ui' import * as XLSX from 'xlsx' import type { DailyStat } from './Chart' interface ExportModalProps { isOpen: boolean onClose: () => void data: DailyStat[] } type ExportFormat = 'csv' | 'json' | 'xlsx' export default function ExportModal({ isOpen, onClose, data }: ExportModalProps) { const [format, setFormat] = useState('csv') const [filename, setFilename] = useState(`pulse_export_${new Date().toISOString().split('T')[0]}`) const [includeHeader, setIncludeHeader] = useState(true) const [selectedFields, setSelectedFields] = useState>({ date: true, pageviews: true, visitors: true, bounce_rate: true, avg_duration: true, }) const handleFieldChange = (field: keyof DailyStat, checked: boolean) => { setSelectedFields((prev) => ({ ...prev, [field]: checked })) } const handleExport = () => { // Filter fields const fields = (Object.keys(selectedFields) as Array).filter((k) => selectedFields[k]) // Prepare data const exportData = data.map((item) => { const filteredItem: Partial = {} fields.forEach((field) => { (filteredItem as any)[field] = item[field] }) return filteredItem }) let content = '' let mimeType = '' let extension = '' if (format === 'csv') { const header = fields.join(',') const rows = exportData.map((row) => fields.map((field) => { const val = row[field] if (field === 'date' && typeof val === 'string') { return new Date(val).toISOString() } return val }).join(',') ) content = (includeHeader ? header + '\n' : '') + rows.join('\n') mimeType = 'text/csv;charset=utf-8;' extension = 'csv' } else if (format === 'xlsx') { const ws = XLSX.utils.json_to_sheet(exportData) const wb = XLSX.utils.book_new() XLSX.utils.book_append_sheet(wb, ws, "Data") const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'array' }) const blob = new Blob([wbout], { type: 'application/octet-stream' }) const url = URL.createObjectURL(blob) const link = document.createElement('a') link.setAttribute('href', url) link.setAttribute('download', `${filename || 'export'}.${extension || 'xlsx'}`) document.body.appendChild(link) link.click() document.body.removeChild(link) onClose() return } else { content = JSON.stringify(exportData, null, 2) mimeType = 'application/json;charset=utf-8;' extension = 'json' } const blob = new Blob([content], { type: mimeType }) const url = URL.createObjectURL(blob) const link = document.createElement('a') link.setAttribute('href', url) link.setAttribute('download', `${filename || 'export'}.${extension}`) document.body.appendChild(link) link.click() document.body.removeChild(link) onClose() } return (
{/* Filename & Format */}
setFilename(e.target.value)} placeholder="filename" />