feat(core): prevent the floating sidebar from showing immediately after the sidebar is closed (#8531)

close PD-1763

https://github.com/user-attachments/assets/a8346098-5f87-4297-bdb6-885f5486ce78
This commit is contained in:
JimmFly
2024-10-21 05:26:02 +00:00
parent 90ef12eaca
commit d1783b6f8c
4 changed files with 26 additions and 14 deletions

View File

@@ -36,6 +36,11 @@ export class AppSidebar extends Entity {
*/ */
hovering$ = new LiveData<boolean>(false); hovering$ = new LiveData<boolean>(false);
/**
* prevent it from setting hovering once when the sidebar is closed
*/
preventHovering$ = new LiveData<boolean>(false);
/** /**
* small screen mode, will disable hover effect * small screen mode, will disable hover effect
*/ */
@@ -63,6 +68,10 @@ export class AppSidebar extends Entity {
this.hovering$.next(hoverFloating); this.hovering$.next(hoverFloating);
}; };
setPreventHovering = (preventHovering: boolean) => {
this.preventHovering$.next(preventHovering);
};
setResizing = (resizing: boolean) => { setResizing = (resizing: boolean) => {
this.resizing$.next(resizing); this.resizing$.next(resizing);
}; };

View File

@@ -16,15 +16,30 @@ export const SidebarSwitch = ({
}) => { }) => {
const appSidebarService = useService(AppSidebarService).sidebar; const appSidebarService = useService(AppSidebarService).sidebar;
const open = useLiveData(appSidebarService.open$); const open = useLiveData(appSidebarService.open$);
const preventHovering = useLiveData(appSidebarService.preventHovering$);
const timeoutRef = useRef<NodeJS.Timeout | null>(null);
const switchRef = useRef<HTMLDivElement>(null); const switchRef = useRef<HTMLDivElement>(null);
const handleMouseEnter = useCallback(() => { const handleMouseEnter = useCallback(() => {
if (open || preventHovering) {
return;
}
appSidebarService.setHovering(true); appSidebarService.setHovering(true);
}, [appSidebarService]); }, [appSidebarService, open, preventHovering]);
const handleClickSwitch = useCallback(() => { const handleClickSwitch = useCallback(() => {
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}
if (open) {
timeoutRef.current = setTimeout(() => {
appSidebarService.setPreventHovering(false);
}, 500);
}
appSidebarService.setPreventHovering(true);
appSidebarService.toggleSidebar(); appSidebarService.toggleSidebar();
}, [appSidebarService]); }, [appSidebarService, open]);
const t = useI18n(); const t = useI18n();
const tooltipContent = open const tooltipContent = open

View File

@@ -93,9 +93,6 @@ test('Collapse Sidebar', async ({ page }) => {
.locator('[data-testid=app-sidebar-arrow-button-collapse][data-show=true]') .locator('[data-testid=app-sidebar-arrow-button-collapse][data-show=true]')
.click(); .click();
const sliderBarArea = page.getByTestId('app-sidebar'); const sliderBarArea = page.getByTestId('app-sidebar');
await sliderBarArea.hover();
await page.mouse.move(600, 500);
await page.waitForTimeout(5000);
await expect(sliderBarArea).not.toBeInViewport(); await expect(sliderBarArea).not.toBeInViewport();
}); });
@@ -104,9 +101,6 @@ test('Expand Sidebar', async ({ page }) => {
.locator('[data-testid=app-sidebar-arrow-button-collapse][data-show=true]') .locator('[data-testid=app-sidebar-arrow-button-collapse][data-show=true]')
.click(); .click();
const sliderBarArea = page.getByTestId('app-sidebar'); const sliderBarArea = page.getByTestId('app-sidebar');
await sliderBarArea.hover();
await page.mouse.move(600, 500);
await page.waitForTimeout(5000);
await expect(sliderBarArea).not.toBeInViewport(); await expect(sliderBarArea).not.toBeInViewport();
await page await page

View File

@@ -10,9 +10,6 @@ test('Collapse Sidebar', async ({ page }) => {
.locator('[data-testid=app-sidebar-arrow-button-collapse][data-show=true]') .locator('[data-testid=app-sidebar-arrow-button-collapse][data-show=true]')
.click(); .click();
const sliderBarArea = page.getByTestId('app-sidebar'); const sliderBarArea = page.getByTestId('app-sidebar');
await sliderBarArea.hover();
await page.mouse.move(300, 300);
await page.waitForTimeout(5000);
await expect(sliderBarArea).not.toBeInViewport(); await expect(sliderBarArea).not.toBeInViewport();
}); });
@@ -23,9 +20,6 @@ test('Expand Sidebar', async ({ page }) => {
.locator('[data-testid=app-sidebar-arrow-button-collapse][data-show=true]') .locator('[data-testid=app-sidebar-arrow-button-collapse][data-show=true]')
.click(); .click();
const sliderBarArea = page.getByTestId('sliderBar-inner'); const sliderBarArea = page.getByTestId('sliderBar-inner');
await sliderBarArea.hover();
await page.mouse.move(300, 300);
await page.waitForTimeout(5000);
await expect(sliderBarArea).not.toBeInViewport(); await expect(sliderBarArea).not.toBeInViewport();
await page await page