96 lines
2.8 KiB
TypeScript
96 lines
2.8 KiB
TypeScript
import { useState } from 'react';
|
|
import { Expense } from '@/types';
|
|
import { router } from '@inertiajs/react';
|
|
import expenseRoutes from '@/routes/expense';
|
|
import { toast } from 'sonner';
|
|
|
|
export function useExpenseIndex() {
|
|
const [isFormOpen, setIsFormOpen] = useState(false);
|
|
const [selectedExpense, setSelectedExpense] = useState<Expense | null>(null);
|
|
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
|
|
const [isBulkDeleteDialogOpen, setIsBulkDeleteDialogOpen] = useState(false);
|
|
const [expenseToDelete, setExpenseToDelete] = useState<Expense | null>(null);
|
|
const [rowsToDelete, setRowsToDelete] = useState<any[]>([]);
|
|
const [rowSelection, setRowSelection] = useState({});
|
|
const [selectedProof, setSelectedProof] = useState<string | null>(null);
|
|
|
|
const onAdd = () => {
|
|
setSelectedExpense(null);
|
|
setIsFormOpen(true);
|
|
};
|
|
|
|
const onEdit = (expense: Expense) => {
|
|
setSelectedExpense(expense);
|
|
setIsFormOpen(true);
|
|
};
|
|
|
|
const onDelete = (expense: Expense) => {
|
|
setExpenseToDelete(expense);
|
|
setIsDeleteDialogOpen(true);
|
|
};
|
|
|
|
const confirmDelete = () => {
|
|
if (expenseToDelete) {
|
|
router.delete(expenseRoutes.destroy(expenseToDelete.id).url, {
|
|
onSuccess: (response: any) => {
|
|
toast.success(response.props.flash.success);
|
|
setIsDeleteDialogOpen(false);
|
|
setExpenseToDelete(null);
|
|
setRowSelection({});
|
|
},
|
|
});
|
|
}
|
|
};
|
|
|
|
const confirmBulkDelete = () => {
|
|
router.post(expenseRoutes.bulkDestroy().url, {
|
|
ids: rowsToDelete.map((row: any) => row.id),
|
|
_method: 'DELETE'
|
|
}, {
|
|
onSuccess: (response: any) => {
|
|
toast.success(response.props.flash.success);
|
|
setIsBulkDeleteDialogOpen(false);
|
|
setRowsToDelete([]);
|
|
setRowSelection({});
|
|
},
|
|
});
|
|
};
|
|
|
|
const closeForm = () => {
|
|
setIsFormOpen(false);
|
|
setTimeout(() => setSelectedExpense(null), 200);
|
|
};
|
|
|
|
const onPreviewImage = (url: string) => {
|
|
setSelectedProof(url);
|
|
};
|
|
|
|
const closeImagePreview = () => {
|
|
setSelectedProof(null);
|
|
};
|
|
|
|
return {
|
|
isFormOpen,
|
|
selectedExpense,
|
|
isDeleteDialogOpen,
|
|
isBulkDeleteDialogOpen,
|
|
expenseToDelete,
|
|
rowsToDelete,
|
|
rowSelection,
|
|
selectedProof,
|
|
setRowSelection,
|
|
setRowsToDelete,
|
|
setIsDeleteDialogOpen,
|
|
setIsBulkDeleteDialogOpen,
|
|
setSelectedProof,
|
|
onAdd,
|
|
onEdit,
|
|
onDelete,
|
|
confirmDelete,
|
|
confirmBulkDelete,
|
|
closeForm,
|
|
onPreviewImage,
|
|
closeImagePreview,
|
|
};
|
|
}
|