From 5239b9f99108e5fca22b711bdd68270f7d6857ef Mon Sep 17 00:00:00 2001 From: Labhansh Agrawal Date: Tue, 25 Jul 2023 08:50:08 +0530 Subject: [PATCH] move Hyper container to function component --- lib/containers/hyper.tsx | 170 +++++++++++++++++++-------------------- 1 file changed, 83 insertions(+), 87 deletions(-) diff --git a/lib/containers/hyper.tsx b/lib/containers/hyper.tsx index ea6c15c0c962..5fd406187ea3 100644 --- a/lib/containers/hyper.tsx +++ b/lib/containers/hyper.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, {forwardRef, useEffect, useRef} from 'react'; import type {MousetrapInstance} from 'mousetrap'; import Mousetrap from 'mousetrap'; @@ -15,131 +15,127 @@ import type Terms from '../components/terms'; const isMac = /Mac/.test(navigator.userAgent); -class Hyper extends React.PureComponent { - mousetrap!: MousetrapInstance; - terms!: Terms; - constructor(props: HyperProps) { - super(props); - } - - componentDidUpdate(prev: HyperProps) { - const {lastConfigUpdate} = this.props; - if (lastConfigUpdate && lastConfigUpdate !== prev.lastConfigUpdate) { - void this.attachKeyListeners(); - } - if (prev.activeSession !== this.props.activeSession) { - this.handleFocusActive(this.props.activeSession); - } - } +const Hyper = forwardRef((props, ref) => { + const mousetrap = useRef(null); + const terms = useRef(null); + + useEffect(() => { + void attachKeyListeners(); + }, [props.lastConfigUpdate]); + useEffect(() => { + handleFocusActive(props.activeSession); + }, [props.activeSession]); - handleFocusActive = (uid?: string | null) => { - const term = uid && this.terms.getTermByUid(uid); + const handleFocusActive = (uid?: string | null) => { + const term = uid && terms.current?.getTermByUid(uid); if (term) { term.focus(); } }; - handleSelectAll = () => { - const term = this.terms.getActiveTerm(); + const handleSelectAll = () => { + const term = terms.current?.getActiveTerm(); if (term) { term.selectAll(); } }; - async attachKeyListeners() { - if (!this.mousetrap) { + const attachKeyListeners = async () => { + if (!mousetrap.current) { // eslint-disable-next-line @typescript-eslint/no-unsafe-call - this.mousetrap = new (Mousetrap as any)(window, true); - this.mousetrap.stopCallback = () => { + mousetrap.current = new (Mousetrap as any)(window, true); + mousetrap.current!.stopCallback = () => { // All events should be intercepted even if focus is in an input/textarea return false; }; } else { - this.mousetrap.reset(); + mousetrap.current.reset(); } const keys = await getRegisteredKeys(); Object.keys(keys).forEach((commandKeys) => { - this.mousetrap.bind( + mousetrap.current?.bind( commandKeys, (e) => { const command = keys[commandKeys]; - // We should tell to xterm that it should ignore this event. + // We should tell xterm to ignore this event. (e as any).catched = true; - this.props.execCommand(command, getCommandHandler(command), e); + props.execCommand(command, getCommandHandler(command), e); shouldPreventDefault(command) && e.preventDefault(); }, 'keydown' ); }); - } + }; - componentDidMount() { - void this.attachKeyListeners(); - window.rpc.on('term selectAll', this.handleSelectAll); - } + useEffect(() => { + void attachKeyListeners(); + window.rpc.on('term selectAll', handleSelectAll); + }, []); - onTermsRef = (terms: Terms) => { - this.terms = terms; + const onTermsRef = (_terms: Terms) => { + terms.current = _terms; window.focusActiveTerm = (uid?: string) => { if (uid) { - this.handleFocusActive(uid); + handleFocusActive(uid); } else { - this.terms.getActiveTerm().focus(); + terms.current?.getActiveTerm()?.focus(); } }; }; - componentWillUnmount() { - this.mousetrap?.reset(); - } - - render() { - const {isMac: isMac_, customCSS, uiFontFamily, borderColor, maximized, fullScreen} = this.props; - const borderWidth = isMac_ ? '' : `${maximized ? '0' : '1'}px`; - stylis.set({prefix: false}); - return ( -
-
- - - {this.props.customInnerChildren} -
- - - - {this.props.customChildren} - - - - {/* - Add custom CSS to Hyper. - We add a scope to the customCSS so that it can get around the weighting applied by styled-jsx - */} - + + {/* + Add custom CSS to Hyper. + We add a scope to the customCSS so that it can get around the weighting applied by styled-jsx + */} +