From 991e1a263a6717466a29ce4f52939628aafa1649 Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Mon, 28 Jul 2025 12:25:44 +0530 Subject: [PATCH] implement feature permission checks for expense status actions --- src/components/Expenses/ViewExpense.jsx | 92 ++++++++++++++++--------- src/hooks/useExpense.js | 19 +++++ src/pages/Expense/ExpensePage.jsx | 8 ++- 3 files changed, 87 insertions(+), 32 deletions(-) diff --git a/src/components/Expenses/ViewExpense.jsx b/src/components/Expenses/ViewExpense.jsx index a9f7ae0f..9c3b24a2 100644 --- a/src/components/Expenses/ViewExpense.jsx +++ b/src/components/Expenses/ViewExpense.jsx @@ -1,5 +1,5 @@ -import React, { useState } from "react"; -import { useActionOnExpense, useExpense } from "../../hooks/useExpense"; +import React, { useState, useMemo } from "react"; +import { useActionOnExpense, useExpense, useHasAnyPermission } from "../../hooks/useExpense"; import { formatUTCToLocalTime } from "../../utils/dateUtils"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; @@ -7,9 +7,14 @@ import { ActionSchema } from "./ExpenseSchema"; import { useExpenseContext } from "../../pages/Expense/ExpensePage"; import { getColorNameFromHex } from "../../utils/appUtils"; import { ExpenseDetailsSkeleton } from "./ExpenseSkeleton"; +import { useHasUserPermission } from "../../hooks/useHasUserPermission"; +import { REVIEW_EXPENSE } from "../../utils/constants"; +import { useProfile } from "../../hooks/useProfile"; +import { useSelector } from "react-redux"; const ViewExpense = ({ ExpenseId }) => { const { data, isLoading, isError, error } = useExpense(ExpenseId); + const IsReview = useHasUserPermission(REVIEW_EXPENSE); const [imageLoaded, setImageLoaded] = useState({}); const { setDocumentView } = useExpenseContext(); const { @@ -25,6 +30,27 @@ const ViewExpense = ({ ExpenseId }) => { selectedStatus: "", }, }); + +const userPermissions = useSelector( + (state) => state?.globalVariables?.loginUser?.featurePermissions || [] +); + + +const nextStatusWithPermission = useMemo(() => { + if (!Array.isArray(data?.nextStatus)) return []; + + return data.nextStatus.filter((status) => { + const permissionIds = Array.isArray(status?.permissionIds) + ? status.permissionIds + : []; + + if (permissionIds.length === 0) return true; + + return permissionIds.some((id) => userPermissions.includes(id)); + }); +}, [data, userPermissions]); + + const { mutate: MakeAction } = useActionOnExpense(() => reset()); @@ -226,37 +252,41 @@ const ViewExpense = ({ ExpenseId }) => {
- {Array.isArray(data.nextStatus) && data.nextStatus.length > 0 && ( -
- -