From 58cd380c649f05224aa6dfe5440fbbb8e4430ef9 Mon Sep 17 00:00:00 2001 From: Amirhossein Mahmoodi Date: Sun, 5 Jan 2025 14:22:50 +0330 Subject: [PATCH] better performance --- src/core/components/ActivityCodeLog.jsx | 34 +++++++++++++++---------- src/core/middlewares/withPermission.js | 12 +++++++-- src/lib/hooks/usePermissions.js | 2 +- src/lib/hooks/useSidebarBadge.js | 2 +- 4 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/core/components/ActivityCodeLog.jsx b/src/core/components/ActivityCodeLog.jsx index ef53b42..cf284e6 100644 --- a/src/core/components/ActivityCodeLog.jsx +++ b/src/core/components/ActivityCodeLog.jsx @@ -1,30 +1,36 @@ "use client"; + +import { useEffect, useState, memo } from "react"; import useRequest from "@/lib/hooks/useRequest"; -import { useEffect } from "react"; import { ACTIVITY_LOG } from "@/core/utils/routes"; -const ActivityCodeLog = ({ activity_code }) => { +const ActivityCodeLog = memo(({ activity_code }) => { const requestServer = useRequest({ notificationShow: false }); + const [hasLogged, setHasLogged] = useState(false); useEffect(() => { - if (!activity_code) return; + if (!activity_code || hasLogged) return; - const fetchSubItems = async () => { + const controller = new AbortController(); + + const fetchActivityLog = async () => { try { await requestServer(ACTIVITY_LOG, "post", { - data: { - activityCode: activity_code, - }, + data: { activityCode: activity_code }, + signal: controller.signal, }); - } catch (error) { - console.error(error); // Always helpful to log the error for debugging. - } + setHasLogged(true); + } catch (error) {} }; - fetchSubItems(); - }, [activity_code, requestServer]); + fetchActivityLog(); - return null; // Ensure the component still renders something. -}; + return () => { + controller.abort(); + }; + }, [activity_code, hasLogged, requestServer]); + + return null; +}); export default ActivityCodeLog; diff --git a/src/core/middlewares/withPermission.js b/src/core/middlewares/withPermission.js index c6e3661..0da81c9 100644 --- a/src/core/middlewares/withPermission.js +++ b/src/core/middlewares/withPermission.js @@ -2,16 +2,24 @@ import { Box, Typography } from "@mui/material"; import { usePermissions } from "@/lib/hooks/usePermissions"; +import { useEffect, useState } from "react"; function WithPermission({ children, permission_name }) { const { data, error, isLoading } = usePermissions(); + const [cachedData, setCachedData] = useState(null); - if (error || isLoading || !data || !permission_name) { + useEffect(() => { + if (data) { + setCachedData(data); + } + }, [data]); + + if (error || isLoading || !cachedData || !permission_name) { return null; } const hasPermission = - permission_name.includes("all") || permission_name.some((permission) => data.includes(permission)); + permission_name.includes("all") || permission_name.some((permission) => cachedData.includes(permission)); if (!hasPermission) { return ( diff --git a/src/lib/hooks/usePermissions.js b/src/lib/hooks/usePermissions.js index 004ff6d..3fb4921 100644 --- a/src/lib/hooks/usePermissions.js +++ b/src/lib/hooks/usePermissions.js @@ -14,5 +14,5 @@ export const usePermissions = () => { } }; - return useSWR(GET_PERMISSIONS_ROUTE, fetcher, { keepPreviousData: true }); + return useSWR(GET_PERMISSIONS_ROUTE, fetcher, { keepPreviousData: true, dedupingInterval: 30000 }); }; diff --git a/src/lib/hooks/useSidebarBadge.js b/src/lib/hooks/useSidebarBadge.js index 621ce55..2befed2 100644 --- a/src/lib/hooks/useSidebarBadge.js +++ b/src/lib/hooks/useSidebarBadge.js @@ -14,5 +14,5 @@ export const useSidebarBadge = () => { } }; - return useSWR(GET_SIDEBAR_BADGE_ROUTE, fetcher, { keepPreviousData: true }); + return useSWR(GET_SIDEBAR_BADGE_ROUTE, fetcher, { keepPreviousData: true, dedupingInterval: 30000 }); };