Skip to content

Commit 9d75390

Browse files
authored
Merge pull request #329 from avinxshKD/fix/event-listener-cleanup
fix: cleanup event listeners on unmount (#301)
2 parents 1dc7d84 + 36e3273 commit 9d75390

4 files changed

Lines changed: 48 additions & 24 deletions

File tree

src/GraphArea.jsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,12 @@ function Graph({
5656
}, [active, instance, graphID, dispatcher]);
5757

5858
useEffect(() => {
59-
if (ref.current) {
60-
setContainerDim(ref.current);
61-
window.addEventListener('resize', () => setContainerDim(ref.current));
62-
setInstance(initialiseNewGraph());
63-
}
59+
if (!ref.current) return;
60+
setContainerDim(ref.current);
61+
const handleResize = () => setContainerDim(ref.current);
62+
window.addEventListener('resize', handleResize);
63+
setInstance(initialiseNewGraph());
64+
return () => window.removeEventListener('resize', handleResize);
6465
}, [ref]);
6566

6667
// Update theme when darkMode changes

src/component/File-drag-drop.jsx

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,42 +6,58 @@ import { readFile } from '../toolbarActions/toolbarFunctions';
66

77
const app = ({ superState, dispatcher }) => {
88
const fileRef = React.useRef();
9+
const superStateRef = React.useRef(superState);
10+
const dispatcherRef = React.useRef(dispatcher);
11+
12+
useEffect(() => {
13+
superStateRef.current = superState;
14+
dispatcherRef.current = dispatcher;
15+
});
916

1017
useEffect(() => {
1118
dispatcher({ type: T.SET_FILE_REF, payload: fileRef });
1219
const p = document.getElementsByTagName('body')[0];
1320
const c = document.getElementsByClassName('drag-drop-area')[0];
1421
let cc = 0;
15-
p.addEventListener('dragenter', (e) => {
22+
23+
const onDragEnter = (e) => {
1624
e.preventDefault();
1725
cc += 1;
1826
if (cc === 1) c.classList.remove('hidden');
19-
});
20-
p.addEventListener('dragleave', (e) => {
27+
};
28+
const onDragLeave = (e) => {
2129
e.preventDefault();
2230
cc -= 1;
2331
if (cc === 0) c.classList.add('hidden');
24-
});
25-
26-
p.addEventListener('dragover', (e) => {
32+
};
33+
const onDragOver = (e) => { e.preventDefault(); };
34+
const onDragReset = (e) => {
2735
e.preventDefault();
28-
});
29-
['dragend', 'dragexit', 'drop'].forEach((dragEvent) => {
30-
p.addEventListener(dragEvent, (e) => {
31-
e.preventDefault();
32-
cc = 0;
33-
c.classList.add('hidden');
34-
});
35-
});
36-
37-
p.addEventListener('drop', (e) => {
36+
cc = 0;
37+
c.classList.add('hidden');
38+
};
39+
const onDrop = (e) => {
3840
e.preventDefault();
3941
fileRef.current.value = null;
4042
if (e.dataTransfer.files.length === 1
4143
&& e.dataTransfer.files[0].name.split('.').slice(-1)[0] === 'graphml') {
42-
readFile(superState, dispatcher, e.dataTransfer.files[0]);
44+
readFile(superStateRef.current, dispatcherRef.current, e.dataTransfer.files[0]);
4345
}
44-
});
46+
};
47+
48+
p.addEventListener('dragenter', onDragEnter);
49+
p.addEventListener('dragleave', onDragLeave);
50+
p.addEventListener('dragover', onDragOver);
51+
['dragend', 'dragexit', 'drop'].forEach((dragEvent) => p.addEventListener(dragEvent, onDragReset));
52+
p.addEventListener('drop', onDrop);
53+
54+
return () => {
55+
p.removeEventListener('dragenter', onDragEnter);
56+
p.removeEventListener('dragleave', onDragLeave);
57+
p.removeEventListener('dragover', onDragOver);
58+
['dragend', 'dragexit', 'drop'].forEach((dragEvent) => p.removeEventListener(dragEvent, onDragReset));
59+
p.removeEventListener('drop', onDrop);
60+
};
4561
}, []);
4662
return (
4763
<div className="drag-drop-area hidden">

src/component/Header.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,14 @@ const setHotKeys = (actions) => {
3131
event.preventDefault();
3232
map[handler.shortcut].click();
3333
});
34+
return keys;
3435
};
3536

3637
const Header = ({ superState, dispatcher }) => {
3738
const actions = toolbarList(superState, dispatcher);
3839
React.useEffect(() => {
39-
setHotKeys(actions, superState, dispatcher);
40+
const keys = setHotKeys(actions);
41+
return () => { if (keys) hotkeys.unbind(keys); };
4042
}, []);
4143

4244
return (

src/component/TabBar.jsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ const TabBar = ({ superState, dispatcher }) => {
6363
const el = document.querySelector('.tab.tab-graph.selected > .tab-act.close');
6464
if (el) el.click();
6565
});
66+
return () => {
67+
hotkeys.unbind('ctrl+shift+m,command+shift+m');
68+
hotkeys.unbind('ctrl+shift+e,command+shift+e');
69+
hotkeys.unbind('ctrl+shift+l,command+shift+l');
70+
};
6671
}, []);
6772

6873
return (

0 commit comments

Comments
 (0)