'use client'; import { toast } from 'react-toastify'; import fileDownload from 'js-file-download'; import { infoMsg } from '@/utils/labels'; import { convertToCSV, convertToJSON } from '@/utils/utils'; import { Dropdown, DropdownButton, useDropdown } from '../dropdown'; import { IconCSV, IconDownload, IconJSON } from '../icons'; import { cn } from '../utils'; import { MiniButton } from './mini-button'; interface ExportDropdownProps { /** Disabled state */ disabled?: boolean; /** Data to export (can be readonly or mutable array of objects) */ data: readonly Readonly[]; /** Optional filename (without extension) */ filename?: string; /** Optional button className */ className?: string; } export function ExportDropdown({ disabled, data, filename = 'export', className }: ExportDropdownProps) { const { elementRef: ref, isOpen, toggle, handleBlur, hide } = useDropdown(); function handleExport(format: 'csv' | 'json') { if (!data || data.length === 0) { toast.error(infoMsg.noDataToExport); return; } try { if (format === 'csv') { const blob = convertToCSV(data); fileDownload(blob, `${filename}.csv`, 'text/csv;charset=utf-8;'); } else { const blob = convertToJSON(data); fileDownload(blob, `${filename}.json`, 'application/json;charset=utf-8;'); } } catch (error) { console.error(error); } hide(); } return (
} onClick={toggle} disabled={disabled} /> } text='CSV' onClick={() => handleExport('csv')} className='w-full justify-start' /> } text='JSON' onClick={() => handleExport('json')} className='w-full justify-start' />
); }