mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2026-05-02 12:07:02 +00:00
remove unused useMemo
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import { useEffect, useMemo, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
|
|
||||||
import AddIcon from '@mui/icons-material/Add';
|
import AddIcon from '@mui/icons-material/Add';
|
||||||
import CancelIcon from '@mui/icons-material/Cancel';
|
import CancelIcon from '@mui/icons-material/Cancel';
|
||||||
@@ -68,15 +68,10 @@ const CustomEntitiesDialog = ({
|
|||||||
const { LL } = useI18nContext();
|
const { LL } = useI18nContext();
|
||||||
const [editItem, setEditItem] = useState<EntityItem>(selectedItem);
|
const [editItem, setEditItem] = useState<EntityItem>(selectedItem);
|
||||||
const [fieldErrors, setFieldErrors] = useState<ValidateFieldsError>();
|
const [fieldErrors, setFieldErrors] = useState<ValidateFieldsError>();
|
||||||
// Stable handler reference so the memoized ValidatedTextField can skip re-renders
|
const updateFormValue = updateValue(
|
||||||
const updateFormValue = useMemo(
|
|
||||||
() =>
|
|
||||||
updateValue(
|
|
||||||
setEditItem as unknown as React.Dispatch<
|
setEditItem as unknown as React.Dispatch<
|
||||||
React.SetStateAction<Record<string, unknown>>
|
React.SetStateAction<Record<string, unknown>>
|
||||||
>
|
>
|
||||||
),
|
|
||||||
[]
|
|
||||||
);
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useEffect, useMemo, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
|
|
||||||
import CancelIcon from '@mui/icons-material/Cancel';
|
import CancelIcon from '@mui/icons-material/Cancel';
|
||||||
import WarningIcon from '@mui/icons-material/Warning';
|
import WarningIcon from '@mui/icons-material/Warning';
|
||||||
@@ -52,8 +52,7 @@ const DevicesDialog = ({
|
|||||||
const [editItem, setEditItem] = useState<DeviceValue>(selectedItem);
|
const [editItem, setEditItem] = useState<DeviceValue>(selectedItem);
|
||||||
const [fieldErrors, setFieldErrors] = useState<ValidateFieldsError>();
|
const [fieldErrors, setFieldErrors] = useState<ValidateFieldsError>();
|
||||||
|
|
||||||
// Stable handler reference so the memoized ValidatedTextField can skip re-renders
|
const updateFormValue = updateValue(setEditItem);
|
||||||
const updateFormValue = useMemo(() => updateValue(setEditItem), [setEditItem]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (open) {
|
if (open) {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useEffect, useMemo, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
|
|
||||||
import AddIcon from '@mui/icons-material/Add';
|
import AddIcon from '@mui/icons-material/Add';
|
||||||
import CancelIcon from '@mui/icons-material/Cancel';
|
import CancelIcon from '@mui/icons-material/Cancel';
|
||||||
@@ -90,15 +90,10 @@ const SchedulerDialog = ({
|
|||||||
const [fieldErrors, setFieldErrors] = useState<ValidateFieldsError>();
|
const [fieldErrors, setFieldErrors] = useState<ValidateFieldsError>();
|
||||||
const [scheduleType, setScheduleType] = useState<ScheduleFlag>();
|
const [scheduleType, setScheduleType] = useState<ScheduleFlag>();
|
||||||
|
|
||||||
// Stable handler reference so the memoized ValidatedTextField can skip re-renders
|
const updateFormValue = updateValue(
|
||||||
const updateFormValue = useMemo(
|
|
||||||
() =>
|
|
||||||
updateValue(
|
|
||||||
setEditItem as unknown as React.Dispatch<
|
setEditItem as unknown as React.Dispatch<
|
||||||
React.SetStateAction<Record<string, unknown>>
|
React.SetStateAction<Record<string, unknown>>
|
||||||
>
|
>
|
||||||
),
|
|
||||||
[]
|
|
||||||
);
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useEffect, useMemo, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
|
|
||||||
import CancelIcon from '@mui/icons-material/Cancel';
|
import CancelIcon from '@mui/icons-material/Cancel';
|
||||||
import DoneIcon from '@mui/icons-material/Done';
|
import DoneIcon from '@mui/icons-material/Done';
|
||||||
@@ -53,18 +53,13 @@ const SensorsAnalogDialog = ({
|
|||||||
const [fieldErrors, setFieldErrors] = useState<ValidateFieldsError>();
|
const [fieldErrors, setFieldErrors] = useState<ValidateFieldsError>();
|
||||||
const [editItem, setEditItem] = useState<AnalogSensor>(selectedItem);
|
const [editItem, setEditItem] = useState<AnalogSensor>(selectedItem);
|
||||||
|
|
||||||
// Stable handler reference so the memoized ValidatedTextField can skip re-renders
|
const updateFormValue = updateValue((updater) =>
|
||||||
const updateFormValue = useMemo(
|
|
||||||
() =>
|
|
||||||
updateValue((updater) =>
|
|
||||||
setEditItem(
|
setEditItem(
|
||||||
(prev) =>
|
(prev) =>
|
||||||
updater(
|
updater(
|
||||||
prev as unknown as Record<string, unknown>
|
prev as unknown as Record<string, unknown>
|
||||||
) as unknown as AnalogSensor
|
) as unknown as AnalogSensor
|
||||||
)
|
)
|
||||||
),
|
|
||||||
[setEditItem]
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const isCounterOrRate =
|
const isCounterOrRate =
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useEffect, useMemo, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
|
|
||||||
import CancelIcon from '@mui/icons-material/Cancel';
|
import CancelIcon from '@mui/icons-material/Cancel';
|
||||||
import DoneIcon from '@mui/icons-material/Done';
|
import DoneIcon from '@mui/icons-material/Done';
|
||||||
@@ -50,17 +50,12 @@ const SensorsTemperatureDialog = ({
|
|||||||
const [fieldErrors, setFieldErrors] = useState<ValidateFieldsError>();
|
const [fieldErrors, setFieldErrors] = useState<ValidateFieldsError>();
|
||||||
const [editItem, setEditItem] = useState<TemperatureSensor>(selectedItem);
|
const [editItem, setEditItem] = useState<TemperatureSensor>(selectedItem);
|
||||||
|
|
||||||
// Stable handler reference so the memoized ValidatedTextField can skip re-renders
|
const updateFormValue = updateValue(
|
||||||
const updateFormValue = useMemo(
|
|
||||||
() =>
|
|
||||||
updateValue(
|
|
||||||
setEditItem as unknown as (
|
setEditItem as unknown as (
|
||||||
updater: (
|
updater: (
|
||||||
prevState: Readonly<Record<string, unknown>>
|
prevState: Readonly<Record<string, unknown>>
|
||||||
) => Record<string, unknown>
|
) => Record<string, unknown>
|
||||||
) => void
|
) => void
|
||||||
),
|
|
||||||
[setEditItem]
|
|
||||||
);
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@@ -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 { useBlocker } from 'react-router';
|
||||||
|
|
||||||
import CancelIcon from '@mui/icons-material/Cancel';
|
import CancelIcon from '@mui/icons-material/Cancel';
|
||||||
@@ -55,9 +55,7 @@ const ManageUsers = () => {
|
|||||||
const blocker = useBlocker(changed !== 0);
|
const blocker = useBlocker(changed !== 0);
|
||||||
const { LL } = useI18nContext();
|
const { LL } = useI18nContext();
|
||||||
|
|
||||||
const table_theme = useMemo(
|
const table_theme = useTheme({
|
||||||
() =>
|
|
||||||
useTheme({
|
|
||||||
Table: `
|
Table: `
|
||||||
--data-table-library_grid-template-columns: repeat(1, minmax(0, 1fr)) minmax(120px, max-content) 120px;
|
--data-table-library_grid-template-columns: repeat(1, minmax(0, 1fr)) minmax(120px, max-content) 120px;
|
||||||
`,
|
`,
|
||||||
@@ -95,9 +93,7 @@ const ManageUsers = () => {
|
|||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
}),
|
});
|
||||||
[]
|
|
||||||
);
|
|
||||||
|
|
||||||
const noAdminConfigured = () => !data?.users.find((u) => u.admin);
|
const noAdminConfigured = () => !data?.users.find((u) => u.admin);
|
||||||
|
|
||||||
@@ -122,11 +118,11 @@ const ManageUsers = () => {
|
|||||||
setUser({ ...toEdit });
|
setUser({ ...toEdit });
|
||||||
};
|
};
|
||||||
|
|
||||||
const cancelEditingUser = useCallback(() => {
|
const cancelEditingUser = () => {
|
||||||
setUser(undefined);
|
setUser(undefined);
|
||||||
}, []);
|
};
|
||||||
|
|
||||||
const doneEditingUser = useCallback(() => {
|
const doneEditingUser = () => {
|
||||||
if (user && data) {
|
if (user && data) {
|
||||||
const users = [
|
const users = [
|
||||||
...data.users.filter(
|
...data.users.filter(
|
||||||
@@ -138,7 +134,7 @@ const ManageUsers = () => {
|
|||||||
setUser(undefined);
|
setUser(undefined);
|
||||||
setChanged(changed + 1);
|
setChanged(changed + 1);
|
||||||
}
|
}
|
||||||
}, [user, data, updateDataValue, changed]);
|
};
|
||||||
|
|
||||||
const closeGenerateToken = useCallback(() => {
|
const closeGenerateToken = useCallback(() => {
|
||||||
setGeneratingToken(undefined);
|
setGeneratingToken(undefined);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useCallback, useMemo, useState } from 'react';
|
import { useCallback, useState } from 'react';
|
||||||
import { useBlocker } from 'react-router';
|
import { useBlocker } from 'react-router';
|
||||||
import { toast } from 'react-toastify';
|
import { toast } from 'react-toastify';
|
||||||
|
|
||||||
@@ -54,37 +54,33 @@ export const useRest = <D>({ read, update }: RestRequestOptions<D>) => {
|
|||||||
}
|
}
|
||||||
}, [readData]);
|
}, [readData]);
|
||||||
|
|
||||||
const saveData = useCallback(async () => {
|
const saveData = async () => {
|
||||||
if (!data) return;
|
if (!data) return;
|
||||||
|
|
||||||
// Reset states before saving
|
|
||||||
setRestartNeeded(false);
|
setRestartNeeded(false);
|
||||||
setErrorMessage(undefined);
|
setErrorMessage(undefined);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await writeData(data as D);
|
await writeData(data as D);
|
||||||
// Only update origData on successful save (dirtyFlags cleared by onSuccess handler)
|
|
||||||
setOrigData(data as D);
|
setOrigData(data as D);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const message = error instanceof Error ? error.message : String(error);
|
const message = error instanceof Error ? error.message : String(error);
|
||||||
|
|
||||||
if (message === REBOOT_ERROR_MESSAGE) {
|
if (message === REBOOT_ERROR_MESSAGE) {
|
||||||
setRestartNeeded(true);
|
setRestartNeeded(true);
|
||||||
return; // Early return - save succeeded but needs reboot
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore original data on validation error
|
|
||||||
if (origData) {
|
if (origData) {
|
||||||
updateData({ data: origData });
|
updateData({ data: origData });
|
||||||
}
|
}
|
||||||
toast.error(message);
|
toast.error(message);
|
||||||
setErrorMessage(message);
|
setErrorMessage(message);
|
||||||
setDirtyFlags([]); // Clear flags so user can retry
|
setDirtyFlags([]);
|
||||||
}
|
}
|
||||||
}, [data, writeData, origData, updateData]);
|
};
|
||||||
|
|
||||||
return useMemo(
|
return {
|
||||||
() => ({
|
|
||||||
loadData,
|
loadData,
|
||||||
saveData,
|
saveData,
|
||||||
saving: !!saving,
|
saving: !!saving,
|
||||||
@@ -97,18 +93,5 @@ export const useRest = <D>({ read, update }: RestRequestOptions<D>) => {
|
|||||||
blocker,
|
blocker,
|
||||||
errorMessage,
|
errorMessage,
|
||||||
restartNeeded
|
restartNeeded
|
||||||
}),
|
};
|
||||||
[
|
|
||||||
loadData,
|
|
||||||
saveData,
|
|
||||||
saving,
|
|
||||||
updateDataValue,
|
|
||||||
data,
|
|
||||||
origData,
|
|
||||||
dirtyFlags,
|
|
||||||
blocker,
|
|
||||||
errorMessage,
|
|
||||||
restartNeeded
|
|
||||||
]
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user