From 56ba55a4ca9d2c159d9d20f963b966360c0c5800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Mon, 31 Mar 2025 21:55:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E7=A6=BBContextMenu=E7=9A=84=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E4=BD=93=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ContextMenu.tsx | 83 ++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 28 deletions(-) diff --git a/src/components/ContextMenu.tsx b/src/components/ContextMenu.tsx index 16d68c7..198db8c 100644 --- a/src/components/ContextMenu.tsx +++ b/src/components/ContextMenu.tsx @@ -1,7 +1,16 @@ import { SwatchEntry } from 'color-module'; import { useAtomValue, useSetAtom } from 'jotai'; import { capitalize, size } from 'lodash-es'; -import { FC, MouseEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { + FC, + MouseEvent, + RefObject, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; import { MaterialDesign2SchemeSource } from '../material-2-scheme'; import { MaterialDesign3DynamicSchemeSource, @@ -225,6 +234,45 @@ const Material3SchemeMenu: FC = ({ color, afterClick }) => ); }; +interface ContextMenuBodyProps { + color: string; + afterClick?: () => void; + x?: number; + y?: number; + ref?: RefObject; +} + +export const ContextMenuBody: FC = ({ color, afterClick, x, y, ref }) => { + const activeScheme = useActiveScheme(); + + const schemeMenu = useMemo(() => { + const sharedProps: ContextMenuItemProps = { + color, + afterClick, + }; + switch (activeScheme?.type) { + case 'q_scheme': + return ; + case 'swatch_scheme': + return ; + case 'material_2': + return ; + case 'material_3': + case 'material_3_dynamic': + return ; + default: + return null; + } + }, [activeScheme, color, afterClick]); + + return ( +
+ + {schemeMenu} +
+ ); +}; + interface ContextMenuProps { color: string; } @@ -236,7 +284,6 @@ const ContextMenu: FC = ({ color }) => { const containerRef = useRef(null); const triggerRef = useRef(null); const menuRef = useRef(null); - const activeScheme = useActiveScheme(); const handleOpenMenu = () => { if (isOpen) { @@ -278,26 +325,6 @@ const ContextMenu: FC = ({ color }) => { [handleCloseMenu, isOpen], ); - const schemeMenu = useMemo(() => { - const sharedProps: ContextMenuItemProps = { - color, - afterClick: handleCloseMenu, - }; - switch (activeScheme?.type) { - case 'q_scheme': - return ; - case 'swatch_scheme': - return ; - case 'material_2': - return ; - case 'material_3': - case 'material_3_dynamic': - return ; - default: - return null; - } - }, [activeScheme]); - useEffect(() => { if (isOpen && menuRef.current && containerRef.current && triggerRef.current) { const menuElemenet = menuRef.current; @@ -348,13 +375,13 @@ const ContextMenu: FC = ({ color }) => { ref={triggerRef} /> {isOpen && ( -
- - {schemeMenu} -
+ /> )} );