From 23c8e973f2eddc57a8243febcf462d32fc12258b Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sat, 27 Dec 2025 09:51:58 +0330 Subject: [PATCH] permission sidebar --- src/helpers/permissions.ts | 59 +++++++ src/hooks/usePermissions.ts | 50 ++++++ src/pages/roles/enum/Enum.ts | 29 ++++ src/shared/SideBar.tsx | 292 +++++++++++++++++++---------------- 4 files changed, 299 insertions(+), 131 deletions(-) create mode 100644 src/helpers/permissions.ts create mode 100644 src/hooks/usePermissions.ts create mode 100644 src/pages/roles/enum/Enum.ts diff --git a/src/helpers/permissions.ts b/src/helpers/permissions.ts new file mode 100644 index 0000000..be8fcd2 --- /dev/null +++ b/src/helpers/permissions.ts @@ -0,0 +1,59 @@ +import type { PermissionType } from '@/pages/roles/types/Types'; + +/** + * Checks if user has a specific permission + * @param permissions - Array of user permissions + * @param permissionName - Name of the permission to check + * @returns boolean indicating if user has the permission + */ +export const hasPermission = ( + permissions: PermissionType[] | undefined, + permissionName: string +): boolean => { + if (!permissions || permissions.length === 0) { + return false; + } + + return permissions.some( + (permission) => permission.name === permissionName + ); +}; + +/** + * Checks if user has any of the specified permissions + * @param permissions - Array of user permissions + * @param permissionNames - Array of permission names to check + * @returns boolean indicating if user has at least one of the permissions + */ +export const hasAnyPermission = ( + permissions: PermissionType[] | undefined, + permissionNames: string[] +): boolean => { + if (!permissions || permissions.length === 0 || permissionNames.length === 0) { + return false; + } + + return permissionNames.some((permissionName) => + hasPermission(permissions, permissionName) + ); +}; + +/** + * Checks if user has all of the specified permissions + * @param permissions - Array of user permissions + * @param permissionNames - Array of permission names to check + * @returns boolean indicating if user has all of the permissions + */ +export const hasAllPermissions = ( + permissions: PermissionType[] | undefined, + permissionNames: string[] +): boolean => { + if (!permissions || permissions.length === 0 || permissionNames.length === 0) { + return false; + } + + return permissionNames.every((permissionName) => + hasPermission(permissions, permissionName) + ); +}; + diff --git a/src/hooks/usePermissions.ts b/src/hooks/usePermissions.ts new file mode 100644 index 0000000..bd13ab6 --- /dev/null +++ b/src/hooks/usePermissions.ts @@ -0,0 +1,50 @@ +import { useMemo } from "react"; +import { useGetPermissions } from "@/pages/roles/hooks/useRolesData"; +import { + hasPermission, + hasAnyPermission, + hasAllPermissions, +} from "@/helpers/permissions"; + +/** + * Custom hook for managing user permissions + * @returns Object with permissions data and helper functions + */ +export const usePermissions = () => { + const { data: permissionsResponse, isLoading, error } = useGetPermissions(); + + const permissions = useMemo(() => { + return permissionsResponse?.data || []; + }, [permissionsResponse]); + + /** + * Checks if user has a specific permission + */ + const checkPermission = (permissionName: string): boolean => { + return hasPermission(permissions, permissionName); + }; + + /** + * Checks if user has any of the specified permissions + */ + const checkAnyPermission = (permissionNames: string[]): boolean => { + return hasAnyPermission(permissions, permissionNames); + }; + + /** + * Checks if user has all of the specified permissions + */ + const checkAllPermissions = (permissionNames: string[]): boolean => { + return hasAllPermissions(permissions, permissionNames); + }; + + return { + permissions, + isLoading, + error, + checkPermission, + checkAnyPermission, + checkAllPermissions, + hasPermission: checkPermission, + }; +}; diff --git a/src/pages/roles/enum/Enum.ts b/src/pages/roles/enum/Enum.ts new file mode 100644 index 0000000..d9f0073 --- /dev/null +++ b/src/pages/roles/enum/Enum.ts @@ -0,0 +1,29 @@ +export const enum PermissionEnum { + MANAGE_PAGER = "manage_pager", + // Food Management + MANAGE_FOODS = "manage_foods", + MANAGE_CATEGORIES = "manage_categories", + + // Order Management + MANAGE_ORDERS = "manage_orders", + + // User & Admin Management + MANAGE_ADMINS = "manage_admins", + MANAGE_USERS = "manage_users", + + // Reports & Finances + VIEW_REPORTS = "view_reports", + + UPDATE_RESTAURANT = "update_restaurant", + + // Role Management + MANAGE_ROLES = "manage_roles", + MANAGE_REVIEWS = "manage_reviews", + MANAGE_COUPONS = "manage_coupons", + MANAGE_PAYMENTS = "manage_payments", + MANAGE_DELIVERY = "manage_delivery", + MANAGE_SETTINGS = "manage_settings", + MANAGE_SCHEDULES = "manage_schedules", + MANAGE_REPORTS = "manage_reports", + MANAGE_CONTACTS = "manage_contacts", +} diff --git a/src/shared/SideBar.tsx b/src/shared/SideBar.tsx index f3e6efe..85c5210 100644 --- a/src/shared/SideBar.tsx +++ b/src/shared/SideBar.tsx @@ -13,11 +13,15 @@ import OrdersSubMenu from './components/OrdersSubMenu' import CustomersSubMenu from './components/CustomersSubMenu' import DiscountSubMenu from './components/DiscountSubMenu' import { SideBarItemHasSubMenu } from '../config/SideBarSubMenu' +import { usePermissions } from '@/hooks/usePermissions' +import { PermissionEnum } from '@/pages/roles/enum/Enum' + const SideBar: FC = () => { const { t } = useTranslation('global') const { openSidebar, setOpenSidebar, hasSubMenu, setSubMenuName, setSubtMenu, subMenuName } = useSharedStore() const location = useLocation() + const { checkPermission } = usePermissions() const isActive = (name: string) => { return location.pathname.includes(name) @@ -77,113 +81,138 @@ const SideBar: FC = () => { activeName='' /> - } - title={t('sidebar.orders')} - isActive={isActive('orders')} - link={Pages.orders.list} - name='orders' - activeName='orders' - /> + {checkPermission(PermissionEnum.MANAGE_ORDERS) && ( + } + title={t('sidebar.orders')} + isActive={isActive('orders')} + link={Pages.orders.list} + name='orders' + activeName='orders' + /> + )} - } - title={t('sidebar.foods')} - isActive={isActive('foods')} - link={Pages.foods.list} - activeName='foods' - /> + {checkPermission(PermissionEnum.MANAGE_FOODS) && ( + } + title={t('sidebar.foods')} + isActive={isActive('foods')} + link={Pages.foods.list} + activeName='foods' + /> + )} - } - title={t('sidebar.schedule')} - isActive={isActive('schedule')} - link={Pages.schedule.list} - name='schedule' - activeName='schedule' - /> + {checkPermission(PermissionEnum.MANAGE_SCHEDULES) && ( + } + title={t('sidebar.schedule')} + isActive={isActive('schedule')} + link={Pages.schedule.list} + name='schedule' + activeName='schedule' + /> + )} - } - title={t('sidebar.payment_methods')} - isActive={isActive('payment_methods')} - link={Pages.payment_methods.list} - name='payment_methods' - activeName='payment_methods' - /> + {checkPermission(PermissionEnum.MANAGE_PAYMENTS) && ( + } + title={t('sidebar.payment_methods')} + isActive={isActive('payment_methods')} + link={Pages.payment_methods.list} + name='payment_methods' + activeName='payment_methods' + /> + )} + {checkPermission(PermissionEnum.MANAGE_USERS) && ( + } + title={t('sidebar.customers')} + isActive={isActive('customers')} + link={Pages.customers.list} + name='customers' + activeName='customers' + /> + )} - } - title={t('sidebar.customers')} - isActive={isActive('customers')} - link={Pages.customers.list} - name='customers' - activeName='customers' - /> + {checkPermission(PermissionEnum.MANAGE_REVIEWS) && ( + } + title={t('sidebar.reviews')} + isActive={isActive('reviews')} + link={Pages.reviews.list} + name='reviews' + activeName='reviews' + /> + )} - } - title={t('sidebar.reviews')} - isActive={isActive('reviews')} - link={Pages.reviews.list} - name='reviews' - activeName='reviews' - /> + {checkPermission(PermissionEnum.MANAGE_PAGER) && ( + } + title={t('sidebar.pagers')} + isActive={isActive('pagers')} + link={Pages.pagers.list} + name='pagers' + activeName='pagers' + /> + )} - } - title={t('sidebar.pagers')} - isActive={isActive('pagers')} - link={Pages.pagers.list} - name='pagers' - activeName='pagers' - /> + {checkPermission(PermissionEnum.MANAGE_ADMINS) && ( + } + title={t('sidebar.admins')} + isActive={isActive('admins')} + link={Pages.admins.list} + name='admins' + activeName='admins' + /> + )} - } - title={t('sidebar.admins')} - isActive={isActive('admins')} - link={Pages.admins.list} - name='admins' - activeName='admins' - /> + {checkPermission(PermissionEnum.MANAGE_DELIVERY) && ( + } + title={t('sidebar.shipment_methods')} + isActive={isActive('shipment_methods')} + link={Pages.shipment_methods.list} + name='shipment_methods' + activeName='shipment_methods' + /> + )} - } - title={t('sidebar.shipment_methods')} - isActive={isActive('shipment_methods')} - link={Pages.shipment_methods.list} - name='shipment_methods' - activeName='shipment_methods' - /> + {checkPermission(PermissionEnum.MANAGE_COUPONS) && ( + } + title={t('sidebar.discount')} + isActive={isActive('discounts')} + link={Pages.coupons.list} + name='discounts' + activeName='discounts' + /> + )} - } - title={t('sidebar.discount')} - isActive={isActive('discounts')} - link={Pages.coupons.list} - name='discounts' - activeName='discounts' - /> + {checkPermission(PermissionEnum.MANAGE_ROLES) && ( + } + title={t('sidebar.roles')} + isActive={isActive('roles')} + link={Pages.roles.list} + name='roles' + activeName='roles' + /> + )} - } - title={t('sidebar.roles')} - isActive={isActive('roles')} - link={Pages.roles.list} - name='roles' - activeName='roles' - /> - - } - title={t('sidebar.notifications')} - isActive={isActive('notifications')} - link={Pages.notifications.list} - name='notifications' - activeName='notifications' - /> + { + checkPermission(PermissionEnum.MANAGE_SETTINGS) && ( + } + title={t('sidebar.notifications')} + isActive={isActive('notifications')} + link={Pages.notifications.list} + name='notifications' + activeName='notifications' + /> + ) + }
{
- } - title={t('sidebar.announcements')} - isActive={isActive('announcements')} - link={Pages.announcements.list} - activeName='announcements' - /> - } - title={t('sidebar.statistics')} - isActive={isActive('statistics')} - link={Pages.statistics.list} - activeName='statistics' - /> - } - title={t('sidebar.comments')} - isActive={isActive('comments')} - link={Pages.comments.list} - activeName='comments' - /> + {checkPermission(PermissionEnum.VIEW_REPORTS) && ( + } + title={t('sidebar.statistics')} + isActive={isActive('statistics')} + link={Pages.statistics.list} + activeName='statistics' + /> + )} + {checkPermission(PermissionEnum.MANAGE_CONTACTS) && ( + } + title={t('sidebar.comments')} + isActive={isActive('comments')} + link={Pages.comments.list} + activeName='comments' + /> + )} - } - title={t('sidebar.reports')} - isActive={isActive('reports')} - link={Pages.reports.list} - activeName='reports' - /> + {checkPermission(PermissionEnum.MANAGE_REPORTS) && ( + } + title={t('sidebar.reports')} + isActive={isActive('reports')} + link={Pages.reports.list} + activeName='reports' + /> + )}
- } - title={t('sidebar.setting')} - isActive={isActive('setting')} - link={Pages.setting} - activeName='settings' - /> + {checkPermission(PermissionEnum.MANAGE_SETTINGS) && ( + } + title={t('sidebar.setting')} + isActive={isActive('setting')} + link={Pages.setting} + activeName='settings' + /> + )}