Skip to content

Commit 07cf097

Browse files
authored
refactor: Optimize React hook dependencies by using getState() for immutable Zustand store actions (fixes #299); Remove unused setters from logFileStore. (#334)
1 parent a8b6520 commit 07cf097

File tree

7 files changed

+48
-47
lines changed

7 files changed

+48
-47
lines changed

src/components/CentralContainer/Sidebar/SidebarTabs/index.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import {Ref} from "react";
1+
import {
2+
Ref,
3+
useCallback,
4+
} from "react";
25

36
import {
47
TabList,
@@ -48,8 +51,8 @@ interface SidebarTabsProps {
4851
*/
4952
const SidebarTabs = ({ref}: SidebarTabsProps) => {
5053
const activeTabName = useUiStore((state) => state.activeTabName);
51-
const setActiveTabName = useUiStore((state) => state.setActiveTabName);
52-
const handleTabButtonClick = (tabName: TAB_NAME) => {
54+
55+
const handleTabButtonClick = useCallback((tabName: TAB_NAME) => {
5356
switch (tabName) {
5457
case TAB_NAME.DOCUMENTATION:
5558
openInNewTab(DOCUMENTATION_URL);
@@ -58,11 +61,11 @@ const SidebarTabs = ({ref}: SidebarTabsProps) => {
5861
const newTabName = (activeTabName === tabName) ?
5962
TAB_NAME.NONE :
6063
tabName;
61-
64+
const {setActiveTabName} = useUiStore.getState();
6265
setActiveTabName(newTabName);
6366
}
6467
}
65-
};
68+
}, [activeTabName]);
6669

6770
return (
6871
<Tabs

src/components/CentralContainer/Sidebar/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,14 @@ const setPanelWidth = (newValue: number) => {
4646
*/
4747
const Sidebar = () => {
4848
const activeTabName = useUiStore((state) => state.activeTabName);
49-
const setActiveTabName = useUiStore((state) => state.setActiveTabName);
5049
const tabListRef = useRef<HTMLDivElement>(null);
5150

5251
const handleResizeHandleRelease = useCallback(() => {
5352
if (getPanelWidth() === tabListRef.current?.clientWidth) {
53+
const {setActiveTabName} = useUiStore.getState();
5454
setActiveTabName(TAB_NAME.NONE);
5555
}
56-
}, [setActiveTabName]);
56+
}, []);
5757

5858
const handleResize = useCallback((resizeHandlePosition: number) => {
5959
if (null === tabListRef.current) {

src/components/DropFileContainer/index.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import React, {useState} from "react";
1+
import React, {
2+
useCallback,
3+
useState,
4+
} from "react";
25

36
import useLogFileStore from "../../stores/logFileStore";
47
import useUiStore from "../../stores/uiStore";
@@ -21,12 +24,11 @@ interface DropFileContextProviderProps {
2124
* @return
2225
*/
2326
const DropFileContainer = ({children}: DropFileContextProviderProps) => {
24-
const loadFile = useLogFileStore((state) => state.loadFile);
2527
const uiState = useUiStore((state) => state.uiState);
2628
const [isFileHovering, setIsFileHovering] = useState(false);
2729
const disabled = isDisabled(uiState, UI_ELEMENT.DRAG_AND_DROP);
2830

29-
const handleDrag = (ev: React.DragEvent<HTMLDivElement>) => {
31+
const handleDrag = useCallback((ev: React.DragEvent<HTMLDivElement>) => {
3032
ev.preventDefault();
3133
ev.stopPropagation();
3234

@@ -47,9 +49,9 @@ const DropFileContainer = ({children}: DropFileContextProviderProps) => {
4749

4850
setIsFileHovering(false);
4951
}
50-
};
52+
}, []);
5153

52-
const handleDrop = (ev: React.DragEvent<HTMLDivElement>) => {
54+
const handleDrop = useCallback((ev: React.DragEvent<HTMLDivElement>) => {
5355
ev.preventDefault();
5456
ev.stopPropagation();
5557

@@ -64,8 +66,9 @@ const DropFileContainer = ({children}: DropFileContextProviderProps) => {
6466

6567
return;
6668
}
69+
const {loadFile} = useLogFileStore.getState();
6770
loadFile(file, {code: CURSOR_CODE.LAST_EVENT, args: null});
68-
};
71+
}, [disabled]);
6972

7073
return (
7174
<div

src/components/MenuBar/ExportLogsButton.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import {useCallback} from "react";
2+
13
import {
24
CircularProgress,
35
Typography,
@@ -23,9 +25,13 @@ import MenuBarIconButton from "./MenuBarIconButton";
2325
*/
2426
const ExportLogsButton = () => {
2527
const exportProgress = useLogExportStore((state) => state.exportProgress);
26-
const exportLogs = useLogExportStore((state) => state.exportLogs);
2728
const uiState = useUiStore((state) => state.uiState);
2829

30+
const handleExportButtonClick = useCallback(() => {
31+
const {exportLogs} = useLogExportStore.getState();
32+
exportLogs();
33+
}, []);
34+
2935
return (
3036
<MenuBarIconButton
3137
className={ignorePointerIfFastLoading(uiState)}
@@ -37,7 +43,7 @@ const ExportLogsButton = () => {
3743
) ||
3844
isDisabled(uiState, UI_ELEMENT.EXPORT_LOGS_BUTTON)
3945
}
40-
onClick={exportLogs}
46+
onClick={handleExportButtonClick}
4147
>
4248
{null === exportProgress ?
4349
<DownloadIcon/> :

src/components/MenuBar/index.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import {useCallback} from "react";
2+
13
import {
24
Box,
35
Divider,
@@ -28,14 +30,14 @@ import "./index.css";
2830
*/
2931
const MenuBar = () => {
3032
const fileName = useLogFileStore((state) => state.fileName);
31-
const loadFile = useLogFileStore((state) => state.loadFile);
3233
const uiState = useUiStore((state) => state.uiState);
3334

34-
const handleOpenFile = () => {
35+
const handleOpenFile = useCallback(() => {
3536
openFile((file) => {
37+
const {loadFile} = useLogFileStore.getState();
3638
loadFile(file, {code: CURSOR_CODE.LAST_EVENT, args: null});
3739
});
38-
};
40+
}, []);
3941

4042
return (
4143
<>

src/components/PopUps/PopUpMessageBox.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, {
2+
useCallback,
23
useEffect,
34
useRef,
45
useState,
@@ -39,14 +40,13 @@ interface PopUpMessageProps {
3940
const PopUpMessageBox = ({message}: PopUpMessageProps) => {
4041
const {id, level, primaryAction, message: messageStr, title, timeoutMillis} = message;
4142

42-
const handlePopUpMessageClose = useNotificationStore((state) => state.handlePopUpMessageClose);
43-
4443
const [percentRemaining, setPercentRemaining] = useState<number>(100);
4544
const intervalCountRef = useRef<number>(0);
4645

47-
const handleCloseButtonClick = () => {
46+
const handleCloseButtonClick = useCallback(() => {
47+
const {handlePopUpMessageClose} = useNotificationStore.getState();
4848
handlePopUpMessageClose(id);
49-
};
49+
}, [id]);
5050

5151
const handlePrimaryActionClick = (ev: React.MouseEvent<HTMLButtonElement>) => {
5252
primaryAction?.onClick?.(ev);
@@ -66,6 +66,7 @@ const PopUpMessageBox = ({message}: PopUpMessageProps) => {
6666
intervalCountRef.current++;
6767
const newPercentRemaining = 100 - (100 * (intervalCountRef.current / totalIntervals));
6868
if (0 >= newPercentRemaining) {
69+
const {handlePopUpMessageClose} = useNotificationStore.getState();
6970
handlePopUpMessageClose(id);
7071
}
7172
setPercentRemaining(newPercentRemaining);
@@ -76,7 +77,6 @@ const PopUpMessageBox = ({message}: PopUpMessageProps) => {
7677
};
7778
}, [
7879
timeoutMillis,
79-
handlePopUpMessageClose,
8080
id,
8181
]);
8282

src/stores/logFileStore.ts

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
/* eslint max-lines-per-function: ["error", 70] */
21
import * as Comlink from "comlink";
32
import {create} from "zustand";
43

@@ -42,11 +41,6 @@ interface LogFileValues {
4241
}
4342

4443
interface LogFileActions {
45-
setFileName: (newFileName: string) => void;
46-
setMetadata: (newMetadata: Nullable<Metadata>) => void;
47-
setNumEvents: (newNumEvents: number) => void;
48-
setOnDiskFileSizeInBytes: (newOnDiskFileSizeInBytes: number) => void;
49-
5044
loadFile: (fileSrc: FileSrcType, cursor: CursorType) => void;
5145
}
5246

@@ -103,17 +97,22 @@ const handleQueryResults = (progress: number, results: QueryResults) => {
10397
mergeQueryResults(results);
10498
};
10599

106-
// eslint-disable-next-line max-lines-per-function
107-
const useLogFileStore = create<LogFileState>((set, get) => ({
100+
101+
const useLogFileStore = create<LogFileState>((set) => ({
108102
...LOG_FILE_STORE_DEFAULT,
109103
loadFile: (fileSrc: FileSrcType, cursor: CursorType) => {
110104
const {setUiState} = useUiStore.getState();
111105
setUiState(UI_STATE.FILE_LOADING);
112106

113-
const {setFileName, setMetadata, setOnDiskFileSizeInBytes} = get();
114-
setFileName("Loading...");
115-
setMetadata(LOG_FILE_STORE_DEFAULT.metadata);
116-
setOnDiskFileSizeInBytes(LOG_FILE_STORE_DEFAULT.onDiskFileSizeInBytes);
107+
set({
108+
fileName: "Loading...",
109+
fileSrc: fileSrc,
110+
metadata: LOG_FILE_STORE_DEFAULT.metadata,
111+
onDiskFileSizeInBytes: LOG_FILE_STORE_DEFAULT.onDiskFileSizeInBytes,
112+
});
113+
if ("string" !== typeof fileSrc) {
114+
updateWindowUrlSearchParams({[SEARCH_PARAM_NAMES.FILE_PATH]: null});
115+
}
117116

118117
const {setExportProgress} = useLogExportStore.getState();
119118
setExportProgress(LOG_EXPORT_STORE_DEFAULT.exportProgress);
@@ -166,18 +165,6 @@ const useLogFileStore = create<LogFileState>((set, get) => ({
166165
setUiState(UI_STATE.UNOPENED);
167166
});
168167
},
169-
setFileName: (newFileName) => {
170-
set({fileName: newFileName});
171-
},
172-
setMetadata: (newMetadata) => {
173-
set({metadata: newMetadata});
174-
},
175-
setNumEvents: (newNumEvents) => {
176-
set({numEvents: newNumEvents});
177-
},
178-
setOnDiskFileSizeInBytes: (newSize) => {
179-
set({onDiskFileSizeInBytes: newSize});
180-
},
181168
}));
182169

183170
export default useLogFileStore;

0 commit comments

Comments
 (0)