Merge pull request #2625 from MartinFournier/fix/terminal-unmount

Cancel debounced events on terminal unmount
This commit is contained in:
hydroflame 2022-01-14 15:20:33 -05:00 committed by GitHub
commit 62ac7f7d17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -95,20 +95,42 @@ export function TerminalRoot({ terminal, router, player }: IProps): React.ReactE
setKey((key) => key + 1); setKey((key) => key + 1);
} }
useEffect(() => TerminalEvents.subscribe(_.debounce(async () => rerender(), 25, { maxWait: 50 })), []); useEffect(() => {
useEffect(() => TerminalClearEvents.subscribe(_.debounce(async () => clear(), 25, { maxWait: 50 })), []); const debounced = _.debounce(async () => rerender(), 25, { maxWait: 50 });
const unsubscribe = TerminalEvents.subscribe(debounced);
return () => {
debounced.cancel();
unsubscribe();
}
}, []);
function doScroll(): void { useEffect(() => {
const debounced = _.debounce(async () => clear(), 25, { maxWait: 50 });
const unsubscribe = TerminalClearEvents.subscribe(debounced);
return () => {
debounced.cancel();
unsubscribe();
}
}, []);
function doScroll(): number | undefined {
const hook = scrollHook.current; const hook = scrollHook.current;
if (hook !== null) { if (hook !== null) {
setTimeout(() => hook.scrollIntoView(true), 50); return window.setTimeout(() => hook.scrollIntoView(true), 50);
} }
} }
doScroll(); doScroll();
useEffect(() => { useEffect(() => {
setTimeout(doScroll, 50); let scrollId: number;
const id = setTimeout(() => {
scrollId = doScroll() ?? 0;
}, 50);
return () => {
clearTimeout(id);
clearTimeout(scrollId);
}
}, []); }, []);
function lineClass(s: string): string { function lineClass(s: string): string {