fix: stabilize terminal layout resizing

This commit is contained in:
Bohdan Triapitsyn
2026-05-22 01:53:32 +03:00
parent 2d85cc86be
commit a22433ed71
2 changed files with 3 additions and 27 deletions
@@ -121,10 +121,10 @@ export const BottomTerminalDock: React.FC<BottomTerminalDockProps> = ({ isOpen,
'flex overflow-hidden border-t border-border bg-sidebar',
shouldApplyFullscreenLayout ? 'absolute inset-x-0 bottom-0 z-40' : 'relative',
isResizing ? 'transition-none' : 'transition-[height] duration-300 ease-in-out',
!isOpen && 'border-t-0'
(!isOpen || shouldApplyFullscreenLayout) && 'border-t-0'
)}
style={shouldApplyFullscreenLayout ? {
top: 'var(--oc-header-height, 48px)',
top: 0,
} : {
height: `${appliedHeight}px`,
minHeight: `${appliedHeight}px`,
@@ -162,7 +162,6 @@ export const TerminalView: React.FC = () => {
const [isReconnectPending, setIsReconnectPending] = React.useState(false);
const [activeModifier, setActiveModifier] = React.useState<Modifier | null>(null);
const [isRestarting, setIsRestarting] = React.useState(false);
const [viewportLayoutVersion, setViewportLayoutVersion] = React.useState(0);
const streamCleanupRef = React.useRef<(() => void) | null>(null);
const activeTerminalIdRef = React.useRef<string | null>(null);
@@ -835,29 +834,6 @@ export const TerminalView: React.FC = () => {
return `${directoryPart}::${tabPart}::${terminalPart}`;
}, [effectiveDirectory, activeTabId, terminalSessionId]);
const viewportSessionKey = React.useMemo(() => {
return `${terminalViewportKey}::layout-${viewportLayoutVersion}`;
}, [terminalViewportKey, viewportLayoutVersion]);
React.useEffect(() => {
if (useTouchTerminalInput || !isBottomTerminalOpen || !isTerminalVisible) {
return;
}
if (typeof window === 'undefined') {
setViewportLayoutVersion((value) => value + 1);
return;
}
const timeoutId = window.setTimeout(() => {
setViewportLayoutVersion((value) => value + 1);
}, 140);
return () => {
window.clearTimeout(timeoutId);
};
}, [bottomTerminalHeight, isBottomTerminalExpanded, isBottomTerminalOpen, isTerminalVisible, useTouchTerminalInput]);
React.useEffect(() => {
if (!isTerminalVisible || useTouchTerminalInput) {
return;
@@ -1139,7 +1115,7 @@ export const TerminalView: React.FC = () => {
ref={(controller) => {
terminalControllerRef.current = controller;
}}
sessionKey={viewportSessionKey}
sessionKey={terminalViewportKey}
chunks={bufferChunks}
onInput={handleViewportInput}
onResize={handleViewportResize}