import { DefaultTooltip, KeenIcon, useDataGrid } from '@/components'; import { useTransactionContext } from '../hooks/useTransactionContext'; import { Button } from '@/components/ui/button'; import { useCallback, useState, useEffect } from 'react'; import { toast } from 'sonner'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { apiConfig } from '@/config/api.config'; import { useCallApi } from '@/hooks'; import { getAuth } from '@/auth'; const ListToolbar = () => { const { table, reload } = useDataGrid(); const [trxDate, settrxDate] = useState({ from: '', to: '' }); const [searchValue, setSearchValue] = useState(''); // default: empty string const [typeSearchValue, setSearchTypeValue] = useState(''); // default: empty string const [typeValue, setTypeValue] = useState( (table.getState().columnFilters.find(f => f.id === 'kind')?.value as string) ?? '' ); const { GetData } = useCallApi(); const API_URL = apiConfig.transaction; const formatDate = (date: Date): string => { return date.toISOString().split('T')[0]; }; useEffect(() => { const today = new Date(); settrxDate({ from: formatDate(today), to: formatDate(today), }); }, []); useEffect(() => { const timer = setTimeout(() => { table.setColumnFilters((prev) => [ ...prev.filter((f) => f.id !== 'kind'), { id: 'kind', value: typeValue }, ]); table.setPageIndex(0); }, 200); return () => clearTimeout(timer); }, [typeValue, table]); useEffect(() => { const timer = setTimeout(() => { table.setColumnFilters((prev) => [ ...prev.filter((f) => f.id !== 'searchtype'), { id: 'searchtype', value: typeSearchValue }, ]); table.setPageIndex(0); }, 200); return () => clearTimeout(timer); }, [typeSearchValue, table]); useEffect(() => { const timer = setTimeout(() => { table.getColumn('code')?.setFilterValue(searchValue); table.setPageIndex(0); }, 200); return () => clearTimeout(timer); }, [searchValue, table]); const handleFilterData = useCallback(() => { try { table.getColumn('transaction_date')?.setFilterValue(trxDate); } catch (error) { toast.error('Error applying filter'); console.error('Error applying filter:', error); } }, [trxDate, table]); useEffect(() => { if (trxDate.from && trxDate.to) { handleFilterData(); } }, [trxDate]); const exporDataToExcel = async ( typeSearchValue: string, searchValue: string, trxDate: any, typeValue: string ) => { try { const formattedFilter: any = { "Transactions.transaction_date": { from: `${trxDate.from} 00:00:00`, to: `${trxDate.to} 23:59:59` } }; if (typeSearchValue === 'msisdn') { formattedFilter['origin_customer.msisdn'] = searchValue; } else if (typeSearchValue === 'fullname') { formattedFilter['origin_customer.fullname'] = searchValue; } else if (typeSearchValue === 'trxid') { formattedFilter['Transactions.code'] = searchValue; } if (typeValue) { formattedFilter["Transactions.kind"] = typeValue; } const filterParam = encodeURIComponent(JSON.stringify(formattedFilter)); const response = await fetch(`${API_URL}/transaction/export?filter=${filterParam}`, { method: 'GET', headers: { Authorization: `Bearer ${getAuth()?.access_token}`, // ganti dengan token kamu } }); if (!response.ok) { throw new Error('Failed to fetch file'); } const blob = await response.blob(); const contentDisposition = response.headers.get('content-disposition'); const filenameMatch = contentDisposition?.match(/filename="?(.+)"?/); const filename = filenameMatch ? filenameMatch[1] : 'transaction_history.xlsx'; return { blob, filename }; } catch (error) { console.error('Error exporting data:', error); return null; } }; return (
); }; export default ListToolbar;