diff --git a/src/components/pages/expense/ExpensesTable.tsx b/src/components/pages/expense/ExpensesTable.tsx index c7a0d0f3..52b3e773 100644 --- a/src/components/pages/expense/ExpensesTable.tsx +++ b/src/components/pages/expense/ExpensesTable.tsx @@ -41,7 +41,7 @@ import Dropdown from '@/components/dropdown/Dropdown'; import { Expense } from '@/types/api/expense'; import { ExpenseApi } from '@/services/api/expense'; import { cn, formatCurrency, formatDate } from '@/lib/helper'; -import { isResponseSuccess } from '@/lib/api-helper'; +import { getErrorMessage, isResponseSuccess } from '@/lib/api-helper'; import { useTableFilter } from '@/services/hooks/useTableFilter'; import { BaseApiResponse } from '@/types/api/api-general'; @@ -84,43 +84,6 @@ type ApprovalStatusValue = const isApprovalDateRequired = (status?: ApprovalStatusValue) => status === 'REALISASI' || status === 'SELESAI'; -const getExportErrorMessage = async ( - error: unknown, - fallbackMessage: string -) => { - if (axios.isAxiosError(error)) { - const responseData = error.response?.data; - - if (responseData instanceof Blob) { - try { - const parsed = JSON.parse(await responseData.text()) as { - message?: string; - }; - return parsed.message || fallbackMessage; - } catch { - return fallbackMessage; - } - } - - if ( - responseData && - typeof responseData === 'object' && - 'message' in responseData && - typeof responseData.message === 'string' - ) { - return responseData.message; - } - - return error.message || fallbackMessage; - } - - if (error instanceof Error) { - return error.message; - } - - return fallbackMessage; -}; - const RowOptionsMenu = ({ popoverPosition = 'bottom', props, @@ -314,6 +277,8 @@ const ExpensesTable = () => { const [isDeleteLoading, setIsDeleteLoading] = useState(false); const [isApproveLoading, setIsApproveLoading] = useState(false); const [isRejectLoading, setIsRejectLoading] = useState(false); + const [isLoadingExportingToExcel, setIsLoadingExportingToExcel] = + useState(false); const [isExportProgressLoading, setIsExportProgressLoading] = useState(false); const [, setApprovalNotes] = useState(''); const [bulkApprovalStatus, setBulkApprovalStatus] = @@ -603,7 +568,7 @@ const ExpensesTable = () => { toast.success('Ekspor berhasil'); } catch (error) { toast.error( - await getExportErrorMessage(error, 'Gagal mengekspor input progress') + await getErrorMessage(error, 'Gagal mengekspor input progress') ); } finally { setIsExportProgressLoading(false); @@ -818,6 +783,20 @@ const ExpensesTable = () => { resetFilter(); }; + const exportToExcel = useCallback(async () => { + setIsLoadingExportingToExcel(true); + + try { + await ExpenseApi.exportToExcel(getTableFilterQueryString()); + } catch (error) { + toast.error( + await getErrorMessage(error, 'Gagal mengekspor data pengeluaran') + ); + } finally { + setIsLoadingExportingToExcel(false); + } + }, [getTableFilterQueryString]); + // track sorting useEffect(() => { const isNameSorted = sorting.find((sortItem) => sortItem.id === 'name'); @@ -1031,6 +1010,17 @@ const ExpensesTable = () => { } > + +