mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-12 23:56:36 +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);
|
||||
|
||||
/**
|
||||
* prevent it from setting hovering once when the sidebar is closed
|
||||
*/
|
||||
preventHovering$ = new LiveData<boolean>(false);
|
||||
|
||||
/**
|
||||
* small screen mode, will disable hover effect
|
||||
*/
|
||||
@@ -63,6 +68,10 @@ export class AppSidebar extends Entity {
|
||||
this.hovering$.next(hoverFloating);
|
||||
};
|
||||
|
||||
setPreventHovering = (preventHovering: boolean) => {
|
||||
this.preventHovering$.next(preventHovering);
|
||||
};
|
||||
|
||||
setResizing = (resizing: boolean) => {
|
||||
this.resizing$.next(resizing);
|
||||
};
|
||||
|
||||
+17
-2
@@ -16,15 +16,30 @@ export const SidebarSwitch = ({
|
||||
}) => {
|
||||
const appSidebarService = useService(AppSidebarService).sidebar;
|
||||
const open = useLiveData(appSidebarService.open$);
|
||||
const preventHovering = useLiveData(appSidebarService.preventHovering$);
|
||||
const timeoutRef = useRef<NodeJS.Timeout | null>(null);
|
||||
const switchRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
const handleMouseEnter = useCallback(() => {
|
||||
if (open || preventHovering) {
|
||||
return;
|
||||
}
|
||||
appSidebarService.setHovering(true);
|
||||
}, [appSidebarService]);
|
||||
}, [appSidebarService, open, preventHovering]);
|
||||
|
||||
const handleClickSwitch = useCallback(() => {
|
||||
if (timeoutRef.current) {
|
||||
clearTimeout(timeoutRef.current);
|
||||
}
|
||||
if (open) {
|
||||
timeoutRef.current = setTimeout(() => {
|
||||
appSidebarService.setPreventHovering(false);
|
||||
}, 500);
|
||||
}
|
||||
|
||||
appSidebarService.setPreventHovering(true);
|
||||
appSidebarService.toggleSidebar();
|
||||
}, [appSidebarService]);
|
||||
}, [appSidebarService, open]);
|
||||
|
||||
const t = useI18n();
|
||||
const tooltipContent = open
|
||||
|
||||
@@ -93,9 +93,6 @@ test('Collapse Sidebar', async ({ page }) => {
|
||||
.locator('[data-testid=app-sidebar-arrow-button-collapse][data-show=true]')
|
||||
.click();
|
||||
const sliderBarArea = page.getByTestId('app-sidebar');
|
||||
await sliderBarArea.hover();
|
||||
await page.mouse.move(600, 500);
|
||||
await page.waitForTimeout(5000);
|
||||
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]')
|
||||
.click();
|
||||
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 page
|
||||
|
||||
@@ -10,9 +10,6 @@ test('Collapse Sidebar', async ({ page }) => {
|
||||
.locator('[data-testid=app-sidebar-arrow-button-collapse][data-show=true]')
|
||||
.click();
|
||||
const sliderBarArea = page.getByTestId('app-sidebar');
|
||||
await sliderBarArea.hover();
|
||||
await page.mouse.move(300, 300);
|
||||
await page.waitForTimeout(5000);
|
||||
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]')
|
||||
.click();
|
||||
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 page
|
||||
|
||||
Reference in New Issue
Block a user