Skip to content

Commit 1b6991c

Browse files
committed
remove keyboard callbacks on unmount
1 parent 6bf5fdd commit 1b6991c

3 files changed

Lines changed: 34 additions & 7 deletions

File tree

src/components/viewer3d/viewer3d-first-person.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ class Viewer3DFirstPerson extends React.Component<Viewer3DFirstPersonProps> {
109109
sceneOnTop.add(controls.getObject());
110110

111111
this.keyDownEvent = (event: KeyboardEvent) => {
112+
event.preventDefault();
112113
const moveResult = firstPersonOnKeyDown(
113114
event,
114115
moveForward,

src/plugins/keyboard.ts

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ import {
1919
import { State } from '../models';
2020

2121
export default function keyboard() {
22-
return (store: Store, stateExtractor: (store: any) => State) => {
23-
window.addEventListener('keydown', (event) => {
22+
return (store: Store, stateExtractor: (state: any) => State) => {
23+
function window_keydown_event_handler(event: KeyboardEvent) {
2424
const state = stateExtractor(store.getState());
2525
const mode = state.mode;
2626

@@ -59,6 +59,12 @@ export default function keyboard() {
5959
break;
6060
}
6161
case KEYBOARD_BUTTON_CODE.C: {
62+
if (
63+
event.getModifierState('Control') ||
64+
event.getModifierState('Meta')
65+
) {
66+
break;
67+
}
6268
const selectedLayer = state.scene.selectedLayer;
6369
if (selectedLayer === undefined) break;
6470
const selected = state.scene.layers[selectedLayer].selected;
@@ -91,17 +97,26 @@ export default function keyboard() {
9197
break;
9298
}
9399
case KEYBOARD_BUTTON_CODE.V: {
100+
if (
101+
event.getModifierState('Control') ||
102+
event.getModifierState('Meta')
103+
) {
104+
break;
105+
}
94106
store.dispatch(pasteProperties());
95107
break;
96108
}
97109
case KEYBOARD_BUTTON_CODE.CTRL: {
98-
store.dispatch(setAlterateState(true));
110+
if (!state.alterate) {
111+
store.dispatch(setAlterateState(true));
112+
}
99113
break;
100114
}
101115
}
102-
});
116+
}
117+
window.addEventListener('keydown', window_keydown_event_handler);
103118

104-
window.addEventListener('keyup', (event) => {
119+
function window_keyup_event_handler(event: KeyboardEvent) {
105120
const state = stateExtractor(store.getState());
106121
const mode = state.mode;
107122

@@ -121,6 +136,12 @@ export default function keyboard() {
121136
break;
122137
}
123138
}
124-
});
139+
}
140+
window.addEventListener('keyup', window_keyup_event_handler);
141+
142+
return () => {
143+
window.removeEventListener('keydown', window_keydown_event_handler);
144+
window.removeEventListener('keyup', window_keyup_event_handler);
145+
};
125146
};
126147
}

src/react-planner.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,13 @@ function ReactPlanner(props: InternalReactPlannerProps) {
9999
useEffect(() => {
100100
const store = context.store;
101101
const { projectActions, catalog, stateExtractor, plugins } = props;
102-
plugins.forEach((plugin) => plugin(store, stateExtractor));
102+
const pluginUnmounts = plugins
103+
.map((plugin) => plugin(store, stateExtractor))
104+
.filter((unmount) => !!unmount);
103105
projectActions.initCatalog(catalog);
106+
return () => {
107+
pluginUnmounts.forEach((unmount) => unmount());
108+
};
104109
}, []);
105110

106111
useEffect(() => {

0 commit comments

Comments
 (0)