Skip to content

Commit d00f86c

Browse files
committed
fix(core): handle modal overlay click event correctly (#8063)
1. overlay click + hide is brought back. this is because modal (ormobile menu)'s `onPointerDownOutside` is bound to document.body. Code in https://github.com/toeverything/AFFiNE/blob/e58af08f6325c7c2c6cbd3325e954fd7d2ab6859/packages/frontend/core/src/modules/explorer/views/tree/node.tsx#L353-L356 will stop the event from bubbling to the document element. 2. when Menu's set to modal=true, the parent is set to pointer-events: none as well. changed menu to modal false instead. ![image.png](https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/T2klNLEk0wxLh4NRDzhk/3e50281f-839d-4463-af00-dff2fce8202b.png)
1 parent ae3b13b commit d00f86c

File tree

4 files changed

+30
-6
lines changed

4 files changed

+30
-6
lines changed

packages/frontend/component/src/components/rename-modal/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export const RenameModal = ({
4141
return (
4242
<Menu
4343
rootOptions={{
44+
modal: true,
4445
open: open,
4546
onOpenChange: onOpenChange,
4647
}}

packages/frontend/component/src/ui/menu/desktop/root.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export const DesktopMenu = ({
1010
children,
1111
items,
1212
portalOptions,
13-
rootOptions: { onOpenChange, defaultOpen, ...rootOptions } = {},
13+
rootOptions: { onOpenChange, defaultOpen, modal, ...rootOptions } = {},
1414
contentOptions: {
1515
className = '',
1616
style: contentStyle = {},
@@ -30,9 +30,18 @@ export const DesktopMenu = ({
3030
<DropdownMenu.Root
3131
onOpenChange={handleOpenChange}
3232
defaultOpen={defaultOpen}
33+
modal={modal ?? false}
3334
{...rootOptions}
3435
>
35-
<DropdownMenu.Trigger asChild>{children}</DropdownMenu.Trigger>
36+
<DropdownMenu.Trigger
37+
asChild
38+
onClick={e => {
39+
e.stopPropagation();
40+
e.preventDefault();
41+
}}
42+
>
43+
{children}
44+
</DropdownMenu.Trigger>
3645

3746
<DropdownMenu.Portal {...portalOptions}>
3847
<DropdownMenu.Content

packages/frontend/component/src/ui/modal/modal.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import * as Dialog from '@radix-ui/react-dialog';
99
import * as VisuallyHidden from '@radix-ui/react-visually-hidden';
1010
import { assignInlineVars } from '@vanilla-extract/dynamic';
1111
import clsx from 'clsx';
12-
import type { CSSProperties } from 'react';
12+
import type { CSSProperties, MouseEvent } from 'react';
1313
import { forwardRef, useCallback, useEffect, useState } from 'react';
1414

1515
import { isMobile } from '../../utils/env';
@@ -139,6 +139,7 @@ export const ModalInner = forwardRef<HTMLDivElement, ModalProps>(
139139
overlayOptions: {
140140
className: overlayClassName,
141141
style: overlayStyle,
142+
onClick: onOverlayClick,
142143
...otherOverlayOptions
143144
} = {},
144145
closeButtonOptions,
@@ -189,6 +190,19 @@ export const ModalInner = forwardRef<HTMLDivElement, ModalProps>(
189190
[onEscapeKeyDown, persistent]
190191
);
191192

193+
const handleOverlayClick = useCallback(
194+
(e: MouseEvent<HTMLDivElement>) => {
195+
onOverlayClick?.(e);
196+
if (persistent) {
197+
e.preventDefault();
198+
} else {
199+
e.stopPropagation();
200+
onOpenChange?.(false);
201+
}
202+
},
203+
[onOpenChange, onOverlayClick, persistent]
204+
);
205+
192206
if (!container) {
193207
return;
194208
}
@@ -211,6 +225,7 @@ export const ModalInner = forwardRef<HTMLDivElement, ModalProps>(
211225
style={{
212226
...overlayStyle,
213227
}}
228+
onClick={handleOverlayClick}
214229
{...otherOverlayOptions}
215230
/>
216231
<div

tests/kit/utils/properties.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,9 @@ export const addCustomProperty = async (
126126
})
127127
.locator('.selected')
128128
).toBeVisible();
129-
await page.keyboard.press('Escape', {
130-
delay: 100,
131-
});
129+
await page.keyboard.press('Escape');
132130
}
131+
await page.waitForTimeout(500);
133132
};
134133

135134
export const expectPropertyOrdering = async (

0 commit comments

Comments
 (0)