mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-25 18:26:05 +08:00
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:
@@ -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);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user