Skip to content

Commit c66521d

Browse files
Copilotsawka
andcommitted
Finalize preview context menu support
Co-authored-by: sawka <2722291+sawka@users.noreply.github.com>
1 parent af81250 commit c66521d

1 file changed

Lines changed: 17 additions & 6 deletions

File tree

frontend/preview/preview-contextmenu.tsx

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ type PreviewContextMenuItemProps = {
4343
};
4444

4545
let previewContextMenuListener: ((state: PreviewContextMenuState) => void) | null = null;
46+
const previewContextMenuItemIds = new WeakMap<ContextMenuItem, string>();
4647

4748
function makeVirtualElement(x: number, y: number): VirtualElement {
4849
return {
@@ -56,7 +57,7 @@ function makeVirtualElement(x: number, y: number): VirtualElement {
5657
right: x,
5758
bottom: y,
5859
left: x,
59-
toJSON: () => undefined,
60+
toJSON: () => ({}),
6061
} as DOMRect;
6162
},
6263
};
@@ -78,6 +79,16 @@ function activateItem(item: ContextMenuItem, closeMenu: () => void): void {
7879
item.click?.();
7980
}
8081

82+
function getPreviewContextMenuItemId(item: ContextMenuItem): string {
83+
const existingId = previewContextMenuItemIds.get(item);
84+
if (existingId != null) {
85+
return existingId;
86+
}
87+
const newId = crypto.randomUUID();
88+
previewContextMenuItemIds.set(item, newId);
89+
return newId;
90+
}
91+
8192
const PreviewContextMenuItem = memo(
8293
({ item, itemPath, depth, parentPath, openPath, setOpenPath, closeMenu }: PreviewContextMenuItemProps) => {
8394
const rowRef = useRef<HTMLDivElement>(null);
@@ -212,7 +223,7 @@ const PreviewContextMenuPanel = memo(
212223
>
213224
{visibleItems.map((item, index) => (
214225
<PreviewContextMenuItem
215-
key={`${depth}-${index}-${item.label ?? item.type ?? "item"}`}
226+
key={getPreviewContextMenuItemId(item)}
216227
item={item}
217228
itemPath={[...parentPath, index]}
218229
depth={depth}
@@ -231,16 +242,16 @@ PreviewContextMenuPanel.displayName = "PreviewContextMenuPanel";
231242

232243
export function showPreviewContextMenu(menu: ContextMenuItem[], e: React.MouseEvent): void {
233244
e.stopPropagation();
234-
e.preventDefault?.();
245+
e.preventDefault();
235246
previewContextMenuListener?.({
236247
items: menu,
237-
x: e.clientX ?? 0,
238-
y: e.clientY ?? 0,
248+
x: e.clientX,
249+
y: e.clientY,
239250
});
240251
}
241252

242253
export const PreviewContextMenu = memo(() => {
243-
const [menuState, setMenuState] = useState<PreviewContextMenuState>(null);
254+
const [menuState, setMenuState] = useState<PreviewContextMenuState | null>(null);
244255
const [openPath, setOpenPath] = useState<number[]>([]);
245256
const portalRef = useRef<HTMLDivElement>(null);
246257

0 commit comments

Comments
 (0)