分离ContextMenu的菜单体。
This commit is contained in:
parent
036b9fead6
commit
56ba55a4ca
|
@ -1,7 +1,16 @@
|
||||||
import { SwatchEntry } from 'color-module';
|
import { SwatchEntry } from 'color-module';
|
||||||
import { useAtomValue, useSetAtom } from 'jotai';
|
import { useAtomValue, useSetAtom } from 'jotai';
|
||||||
import { capitalize, size } from 'lodash-es';
|
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 { MaterialDesign2SchemeSource } from '../material-2-scheme';
|
||||||
import {
|
import {
|
||||||
MaterialDesign3DynamicSchemeSource,
|
MaterialDesign3DynamicSchemeSource,
|
||||||
|
@ -225,6 +234,45 @@ const Material3SchemeMenu: FC<ContextMenuItemProps> = ({ color, afterClick }) =>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
interface ContextMenuBodyProps {
|
||||||
|
color: string;
|
||||||
|
afterClick?: () => void;
|
||||||
|
x?: number;
|
||||||
|
y?: number;
|
||||||
|
ref?: RefObject<HTMLDivElement>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ContextMenuBody: FC<ContextMenuBodyProps> = ({ color, afterClick, x, y, ref }) => {
|
||||||
|
const activeScheme = useActiveScheme();
|
||||||
|
|
||||||
|
const schemeMenu = useMemo(() => {
|
||||||
|
const sharedProps: ContextMenuItemProps = {
|
||||||
|
color,
|
||||||
|
afterClick,
|
||||||
|
};
|
||||||
|
switch (activeScheme?.type) {
|
||||||
|
case 'q_scheme':
|
||||||
|
return <QSchemeMenu {...sharedProps} />;
|
||||||
|
case 'swatch_scheme':
|
||||||
|
return <SwatchSchemeMenu {...sharedProps} />;
|
||||||
|
case 'material_2':
|
||||||
|
return <Material2SchemeMenu {...sharedProps} />;
|
||||||
|
case 'material_3':
|
||||||
|
case 'material_3_dynamic':
|
||||||
|
return <Material3SchemeMenu {...sharedProps} />;
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}, [activeScheme, color, afterClick]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={styles.menu_body} ref={ref} style={{ top: y, left: x }}>
|
||||||
|
<SetPickerMenu color={color} afterClick={afterClick} />
|
||||||
|
{schemeMenu}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
interface ContextMenuProps {
|
interface ContextMenuProps {
|
||||||
color: string;
|
color: string;
|
||||||
}
|
}
|
||||||
|
@ -236,7 +284,6 @@ const ContextMenu: FC<ContextMenuProps> = ({ color }) => {
|
||||||
const containerRef = useRef<HTMLDivElement>(null);
|
const containerRef = useRef<HTMLDivElement>(null);
|
||||||
const triggerRef = useRef<HTMLButtonElement>(null);
|
const triggerRef = useRef<HTMLButtonElement>(null);
|
||||||
const menuRef = useRef<HTMLDivElement>(null);
|
const menuRef = useRef<HTMLDivElement>(null);
|
||||||
const activeScheme = useActiveScheme();
|
|
||||||
|
|
||||||
const handleOpenMenu = () => {
|
const handleOpenMenu = () => {
|
||||||
if (isOpen) {
|
if (isOpen) {
|
||||||
|
@ -278,26 +325,6 @@ const ContextMenu: FC<ContextMenuProps> = ({ color }) => {
|
||||||
[handleCloseMenu, isOpen],
|
[handleCloseMenu, isOpen],
|
||||||
);
|
);
|
||||||
|
|
||||||
const schemeMenu = useMemo(() => {
|
|
||||||
const sharedProps: ContextMenuItemProps = {
|
|
||||||
color,
|
|
||||||
afterClick: handleCloseMenu,
|
|
||||||
};
|
|
||||||
switch (activeScheme?.type) {
|
|
||||||
case 'q_scheme':
|
|
||||||
return <QSchemeMenu {...sharedProps} />;
|
|
||||||
case 'swatch_scheme':
|
|
||||||
return <SwatchSchemeMenu {...sharedProps} />;
|
|
||||||
case 'material_2':
|
|
||||||
return <Material2SchemeMenu {...sharedProps} />;
|
|
||||||
case 'material_3':
|
|
||||||
case 'material_3_dynamic':
|
|
||||||
return <Material3SchemeMenu {...sharedProps} />;
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}, [activeScheme]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isOpen && menuRef.current && containerRef.current && triggerRef.current) {
|
if (isOpen && menuRef.current && containerRef.current && triggerRef.current) {
|
||||||
const menuElemenet = menuRef.current;
|
const menuElemenet = menuRef.current;
|
||||||
|
@ -348,13 +375,13 @@ const ContextMenu: FC<ContextMenuProps> = ({ color }) => {
|
||||||
ref={triggerRef}
|
ref={triggerRef}
|
||||||
/>
|
/>
|
||||||
{isOpen && (
|
{isOpen && (
|
||||||
<div
|
<ContextMenuBody
|
||||||
className={styles.menu_body}
|
color={color}
|
||||||
|
afterClick={handleCloseMenu}
|
||||||
|
x={renderPosition.x}
|
||||||
|
y={renderPosition.y}
|
||||||
ref={menuRef}
|
ref={menuRef}
|
||||||
style={{ top: renderPosition.y, left: renderPosition.x }}>
|
/>
|
||||||
<SetPickerMenu color={color} afterClick={handleCloseMenu} />
|
|
||||||
{schemeMenu}
|
|
||||||
</div>
|
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user