Skip to content

Commit

Permalink
fix: Fix split panel height calculations when screen viewport is resi…
Browse files Browse the repository at this point in the history
…zed (#479)
  • Loading branch information
taheramr authored Nov 15, 2022
1 parent 72548f0 commit 080546b
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 6 deletions.
11 changes: 11 additions & 0 deletions src/app-layout/__integ__/app-layout-split-panel.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,18 @@ test(
await expect(page.getPanelPosition()).resolves.toEqual('side');
})
);
test(
'switches to bottom position when screen resizes to mobile',
setupTest(async page => {
await page.openPanel();
await page.switchPosition('side');
await expect(page.getPanelPosition()).resolves.toEqual('side');

await page.setWindowSize(viewports.mobile);
await expect(page.getPanelPosition()).resolves.toEqual('bottom');
await expect(page.getContentMarginBottom()).resolves.toEqual('160px');
})
);
test(
'switches to bottom position when screen is too narrow and restores back on resize',
setupTest(async page => {
Expand Down
15 changes: 9 additions & 6 deletions src/app-layout/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -162,11 +162,15 @@ const OldAppLayout = React.forwardRef(
footerSelector,
disableBodyScroll
);
const [isSplitpanelForcedPosition, setIsSplitpanelForcedPosition] = useState(false);

const [notificationsHeight, notificationsRef] = useContainerQuery(rect => rect.height);
const [splitPanelHeaderHeight, splitPanelHeaderMeasureRef] = useContainerQuery(
rect => (splitPanel ? rect.height : 0),
[splitPanel]
// eslint-disable-next-line react-hooks/exhaustive-deps
[splitPanel, isSplitpanelForcedPosition]
);

const splitPanelHeaderRefObject = useRef(null);
const splitPanelHeaderRef = useMergeRefs(splitPanelHeaderMeasureRef, splitPanelHeaderRefObject);
const anyPanelOpen = navigationVisible || toolsVisible;
Expand All @@ -188,7 +192,7 @@ const OldAppLayout = React.forwardRef(
const [splitPanelHeight, splitPanelRef] = useContainerQuery(
rect => (splitPanel ? rect.height : 0),
// eslint-disable-next-line react-hooks/exhaustive-deps
[splitPanel, splitPanelPosition]
[splitPanel, splitPanelPosition, isSplitpanelForcedPosition]
);

const closedDrawerWidth = 40;
Expand Down Expand Up @@ -273,8 +277,7 @@ const OldAppLayout = React.forwardRef(
}
});

const [isForcedPosition, setIsForcedPosition] = useState(false);
const finalSplitPanePosition = isForcedPosition ? 'bottom' : splitPanelPosition;
const finalSplitPanePosition = isSplitpanelForcedPosition ? 'bottom' : splitPanelPosition;

const splitPaneAvailableOnTheSide = Boolean(splitPanel) && finalSplitPanePosition === 'side';
const splitPanelOpenOnTheSide = splitPaneAvailableOnTheSide && splitPanelOpen;
Expand All @@ -293,7 +296,7 @@ const OldAppLayout = React.forwardRef(

useEffect(() => {
const contentWidth = contentWidthWithSplitPanel - splitPanelSize;
setIsForcedPosition(isMobile || (defaults.minContentWidth || 0) > contentWidth);
setIsSplitpanelForcedPosition(isMobile || (defaults.minContentWidth || 0) > contentWidth);
// This is a workaround to avoid a forced position due to splitPanelSize, which is
// user controlled variable.
// eslint-disable-next-line react-hooks/exhaustive-deps
Expand Down Expand Up @@ -329,7 +332,7 @@ const OldAppLayout = React.forwardRef(
isOpen: splitPanelOpen,
isMobile,
isRefresh: false,
isForcedPosition,
isForcedPosition: isSplitpanelForcedPosition,
lastInteraction: splitPanelLastInteraction,
splitPanelRef,
splitPanelHeaderRef,
Expand Down

0 comments on commit 080546b

Please sign in to comment.