From 3b765b308ef16977f8a0df386840cd20b2826c35 Mon Sep 17 00:00:00 2001 From: proddy Date: Tue, 28 Apr 2026 17:31:50 +0200 Subject: [PATCH] remove unused useMemo --- .../src/app/main/CustomEntitiesDialog.tsx | 15 ++--- interface/src/app/main/DevicesDialog.tsx | 5 +- interface/src/app/main/SchedulerDialog.tsx | 15 ++--- .../src/app/main/SensorsAnalogDialog.tsx | 21 +++---- .../src/app/main/SensorsTemperatureDialog.tsx | 19 +++---- .../src/app/settings/security/ManageUsers.tsx | 28 ++++------ interface/src/utils/useRest.ts | 55 +++++++------------ 7 files changed, 58 insertions(+), 100 deletions(-) diff --git a/interface/src/app/main/CustomEntitiesDialog.tsx b/interface/src/app/main/CustomEntitiesDialog.tsx index 3a2cf945f..8ede016b4 100644 --- a/interface/src/app/main/CustomEntitiesDialog.tsx +++ b/interface/src/app/main/CustomEntitiesDialog.tsx @@ -1,4 +1,4 @@ -import { useEffect, useMemo, useState } from 'react'; +import { useEffect, useState } from 'react'; import AddIcon from '@mui/icons-material/Add'; import CancelIcon from '@mui/icons-material/Cancel'; @@ -68,15 +68,10 @@ const CustomEntitiesDialog = ({ const { LL } = useI18nContext(); const [editItem, setEditItem] = useState(selectedItem); const [fieldErrors, setFieldErrors] = useState(); - // Stable handler reference so the memoized ValidatedTextField can skip re-renders - const updateFormValue = useMemo( - () => - updateValue( - setEditItem as unknown as React.Dispatch< - React.SetStateAction> - > - ), - [] + const updateFormValue = updateValue( + setEditItem as unknown as React.Dispatch< + React.SetStateAction> + > ); useEffect(() => { diff --git a/interface/src/app/main/DevicesDialog.tsx b/interface/src/app/main/DevicesDialog.tsx index 89a6fae13..706c2d608 100644 --- a/interface/src/app/main/DevicesDialog.tsx +++ b/interface/src/app/main/DevicesDialog.tsx @@ -1,4 +1,4 @@ -import { useEffect, useMemo, useState } from 'react'; +import { useEffect, useState } from 'react'; import CancelIcon from '@mui/icons-material/Cancel'; import WarningIcon from '@mui/icons-material/Warning'; @@ -52,8 +52,7 @@ const DevicesDialog = ({ const [editItem, setEditItem] = useState(selectedItem); const [fieldErrors, setFieldErrors] = useState(); - // Stable handler reference so the memoized ValidatedTextField can skip re-renders - const updateFormValue = useMemo(() => updateValue(setEditItem), [setEditItem]); + const updateFormValue = updateValue(setEditItem); useEffect(() => { if (open) { diff --git a/interface/src/app/main/SchedulerDialog.tsx b/interface/src/app/main/SchedulerDialog.tsx index ca3ff97dd..d68d9b727 100644 --- a/interface/src/app/main/SchedulerDialog.tsx +++ b/interface/src/app/main/SchedulerDialog.tsx @@ -1,4 +1,4 @@ -import { useEffect, useMemo, useState } from 'react'; +import { useEffect, useState } from 'react'; import AddIcon from '@mui/icons-material/Add'; import CancelIcon from '@mui/icons-material/Cancel'; @@ -90,15 +90,10 @@ const SchedulerDialog = ({ const [fieldErrors, setFieldErrors] = useState(); const [scheduleType, setScheduleType] = useState(); - // Stable handler reference so the memoized ValidatedTextField can skip re-renders - const updateFormValue = useMemo( - () => - updateValue( - setEditItem as unknown as React.Dispatch< - React.SetStateAction> - > - ), - [] + const updateFormValue = updateValue( + setEditItem as unknown as React.Dispatch< + React.SetStateAction> + > ); useEffect(() => { diff --git a/interface/src/app/main/SensorsAnalogDialog.tsx b/interface/src/app/main/SensorsAnalogDialog.tsx index 283a00803..483d337cc 100644 --- a/interface/src/app/main/SensorsAnalogDialog.tsx +++ b/interface/src/app/main/SensorsAnalogDialog.tsx @@ -1,4 +1,4 @@ -import { useEffect, useMemo, useState } from 'react'; +import { useEffect, useState } from 'react'; import CancelIcon from '@mui/icons-material/Cancel'; import DoneIcon from '@mui/icons-material/Done'; @@ -53,18 +53,13 @@ const SensorsAnalogDialog = ({ const [fieldErrors, setFieldErrors] = useState(); const [editItem, setEditItem] = useState(selectedItem); - // Stable handler reference so the memoized ValidatedTextField can skip re-renders - const updateFormValue = useMemo( - () => - updateValue((updater) => - setEditItem( - (prev) => - updater( - prev as unknown as Record - ) as unknown as AnalogSensor - ) - ), - [setEditItem] + const updateFormValue = updateValue((updater) => + setEditItem( + (prev) => + updater( + prev as unknown as Record + ) as unknown as AnalogSensor + ) ); const isCounterOrRate = diff --git a/interface/src/app/main/SensorsTemperatureDialog.tsx b/interface/src/app/main/SensorsTemperatureDialog.tsx index 21a422a77..714156a85 100644 --- a/interface/src/app/main/SensorsTemperatureDialog.tsx +++ b/interface/src/app/main/SensorsTemperatureDialog.tsx @@ -1,4 +1,4 @@ -import { useEffect, useMemo, useState } from 'react'; +import { useEffect, useState } from 'react'; import CancelIcon from '@mui/icons-material/Cancel'; import DoneIcon from '@mui/icons-material/Done'; @@ -50,17 +50,12 @@ const SensorsTemperatureDialog = ({ const [fieldErrors, setFieldErrors] = useState(); const [editItem, setEditItem] = useState(selectedItem); - // Stable handler reference so the memoized ValidatedTextField can skip re-renders - const updateFormValue = useMemo( - () => - updateValue( - setEditItem as unknown as ( - updater: ( - prevState: Readonly> - ) => Record - ) => void - ), - [setEditItem] + const updateFormValue = updateValue( + setEditItem as unknown as ( + updater: ( + prevState: Readonly> + ) => Record + ) => void ); useEffect(() => { diff --git a/interface/src/app/settings/security/ManageUsers.tsx b/interface/src/app/settings/security/ManageUsers.tsx index 9dec88ee9..5ae9de30a 100644 --- a/interface/src/app/settings/security/ManageUsers.tsx +++ b/interface/src/app/settings/security/ManageUsers.tsx @@ -1,4 +1,4 @@ -import { memo, useCallback, useContext, useMemo, useState } from 'react'; +import { memo, useCallback, useContext, useState } from 'react'; import { useBlocker } from 'react-router'; import CancelIcon from '@mui/icons-material/Cancel'; @@ -55,16 +55,14 @@ const ManageUsers = () => { const blocker = useBlocker(changed !== 0); const { LL } = useI18nContext(); - const table_theme = useMemo( - () => - useTheme({ - Table: ` + const table_theme = useTheme({ + Table: ` --data-table-library_grid-template-columns: repeat(1, minmax(0, 1fr)) minmax(120px, max-content) 120px; `, - BaseRow: ` + BaseRow: ` font-size: 14px; `, - HeaderRow: ` + HeaderRow: ` text-transform: uppercase; background-color: black; color: #90CAF9; @@ -74,7 +72,7 @@ const ManageUsers = () => { border-bottom: 1px solid #565656; } `, - Row: ` + Row: ` .td { padding: 8px; border-top: 1px solid #565656; @@ -87,7 +85,7 @@ const ManageUsers = () => { background-color: #1e1e1e; } `, - BaseCell: ` + BaseCell: ` &:nth-of-type(2) { text-align: center; } @@ -95,9 +93,7 @@ const ManageUsers = () => { text-align: right; } ` - }), - [] - ); + }); const noAdminConfigured = () => !data?.users.find((u) => u.admin); @@ -122,11 +118,11 @@ const ManageUsers = () => { setUser({ ...toEdit }); }; - const cancelEditingUser = useCallback(() => { + const cancelEditingUser = () => { setUser(undefined); - }, []); + }; - const doneEditingUser = useCallback(() => { + const doneEditingUser = () => { if (user && data) { const users = [ ...data.users.filter( @@ -138,7 +134,7 @@ const ManageUsers = () => { setUser(undefined); setChanged(changed + 1); } - }, [user, data, updateDataValue, changed]); + }; const closeGenerateToken = useCallback(() => { setGeneratingToken(undefined); diff --git a/interface/src/utils/useRest.ts b/interface/src/utils/useRest.ts index 0d57abff9..791c6e4e0 100644 --- a/interface/src/utils/useRest.ts +++ b/interface/src/utils/useRest.ts @@ -1,4 +1,4 @@ -import { useCallback, useMemo, useState } from 'react'; +import { useCallback, useState } from 'react'; import { useBlocker } from 'react-router'; import { toast } from 'react-toastify'; @@ -54,61 +54,44 @@ export const useRest = ({ read, update }: RestRequestOptions) => { } }, [readData]); - const saveData = useCallback(async () => { + const saveData = async () => { if (!data) return; - // Reset states before saving setRestartNeeded(false); setErrorMessage(undefined); try { await writeData(data as D); - // Only update origData on successful save (dirtyFlags cleared by onSuccess handler) setOrigData(data as D); } catch (error) { const message = error instanceof Error ? error.message : String(error); if (message === REBOOT_ERROR_MESSAGE) { setRestartNeeded(true); - return; // Early return - save succeeded but needs reboot + return; } - // Restore original data on validation error if (origData) { updateData({ data: origData }); } toast.error(message); setErrorMessage(message); - setDirtyFlags([]); // Clear flags so user can retry + setDirtyFlags([]); } - }, [data, writeData, origData, updateData]); + }; - return useMemo( - () => ({ - loadData, - saveData, - saving: !!saving, - updateDataValue, - data: data as D, - origData: origData as D, - dirtyFlags, - setDirtyFlags, - setOrigData, - blocker, - errorMessage, - restartNeeded - }), - [ - loadData, - saveData, - saving, - updateDataValue, - data, - origData, - dirtyFlags, - blocker, - errorMessage, - restartNeeded - ] - ); + return { + loadData, + saveData, + saving: !!saving, + updateDataValue, + data: data as D, + origData: origData as D, + dirtyFlags, + setDirtyFlags, + setOrigData, + blocker, + errorMessage, + restartNeeded + }; };