import React, { createContext, useContext, useState, useEffect, useRef } from "react"; import { useForm, useFormContext } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { useSelector } from "react-redux"; import Breadcrumb from "../../components/common/Breadcrumb"; import GlobalModel from "../../components/common/GlobalModel"; import ExpenseList from "../../components/Expenses/ExpenseList"; import ViewExpense from "../../components/Expenses/ViewExpense"; import ManageExpense from "../../components/Expenses/ManageExpense"; import ExpenseFilterPanel from "../../components/Expenses/ExpenseFilterPanel"; import ExpenseFilterChips from "../../components/Expenses/ExpenseFilterChips"; import { useFab } from "../../Context/FabContext"; import { useHasUserPermission } from "../../hooks/useHasUserPermission"; import { CREATE_EXEPENSE, VIEW_ALL_EXPNESE, VIEW_SELF_EXPENSE, } from "../../utils/constants"; import { defaultFilter, SearchSchema } from "../../components/Expenses/ExpenseSchema"; import PreviewDocument from "../../components/Expenses/PreviewDocument"; // Context export const ExpenseContext = createContext(); export const useExpenseContext = () => { const context = useContext(ExpenseContext); if (!context) { throw new Error("useExpenseContext must be used within an ExpenseProvider"); } return context; }; const ExpensePage = () => { const selectedProjectId = useSelector( (store) => store.localVariables.projectId ); const [filters, setFilters] = useState(defaultFilter); const [groupBy, setGroupBy] = useState("transactionDate"); const [searchText, setSearchText] = useState(""); const filterPanelRef = useRef(); const [ManageExpenseModal, setManageExpenseModal] = useState({ IsOpen: null, expenseId: null, }); const [viewExpense, setViewExpense] = useState({ expenseId: null, view: false, }); const [ViewDocument, setDocumentView] = useState({ IsOpen: false, Image: null, }); const IsCreatedAble = useHasUserPermission(CREATE_EXEPENSE); const IsViewAll = useHasUserPermission(VIEW_ALL_EXPNESE); const IsViewSelf = useHasUserPermission(VIEW_SELF_EXPENSE); const { setOffcanvasContent, setShowTrigger } = useFab(); const [filterData, setFilterdata] = useState(defaultFilter); const removeFilterChip = (key, id) => { setFilters((prev) => { const updated = { ...prev }; if (Array.isArray(updated[key])) { updated[key] = updated[key].filter((v) => v !== id); filterPanelRef.current?.resetFieldValue(key, updated[key]); } else if (key === "dateRange") { updated.startDate = null; updated.endDate = null; filterPanelRef.current?.resetFieldValue("startDate", null); filterPanelRef.current?.resetFieldValue("endDate", null); } return updated; }); }; useEffect(() => { if (IsViewAll || IsViewSelf || IsCreatedAble) { setShowTrigger(true); setOffcanvasContent( "Expense Filters", ); } return () => { setShowTrigger(false); setOffcanvasContent("", null); }; }, [IsViewAll, IsViewSelf, IsCreatedAble]); const contextValue = { setViewExpense, setManageExpenseModal, setDocumentView, filterData, removeFilterChip }; return ( {IsViewAll || IsViewSelf || IsCreatedAble ? ( <> setSearchText(e.target.value)} /> {IsCreatedAble && ( setManageExpenseModal({ IsOpen: true, expenseId: null, }) } > Add New Expense )} > ) : ( Access Denied: You don't have permission to perform this action! )} {/* Modals */} {ManageExpenseModal.IsOpen && ( setManageExpenseModal({ IsOpen: null, expenseId: null }) } > setManageExpenseModal({ IsOpen: null, expenseId: null }) } /> )} {viewExpense.view && ( setViewExpense({ expenseId: null, view: false })} > )} {ViewDocument.IsOpen && ( setDocumentView({ IsOpen: false, Image: null })} > )} ); }; export default ExpensePage;
Access Denied: You don't have permission to perform this action!