mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-12 07:36:42 +08:00
98 lines
2.3 KiB
TypeScript
98 lines
2.3 KiB
TypeScript
import { AsyncBlock, Virgo } from '@toeverything/components/editor-core';
|
|
import { DeleteCashBinIcon } from '@toeverything/components/icons';
|
|
import { Popover, styled } from '@toeverything/components/ui';
|
|
import { Point } from '@toeverything/utils';
|
|
import { PropsWithChildren } from 'react';
|
|
import { ICON_WIDTH } from './DragItem';
|
|
|
|
type MenuProps = {
|
|
visible: boolean;
|
|
setVisible: (visible: boolean) => void;
|
|
setGroupBlock: (groupBlock: AsyncBlock | null) => void;
|
|
position: Point;
|
|
editor: Virgo;
|
|
groupBlock: AsyncBlock;
|
|
menuRef: React.RefObject<HTMLUListElement>;
|
|
};
|
|
|
|
export const Menu = ({
|
|
children,
|
|
position,
|
|
groupBlock,
|
|
setVisible,
|
|
visible,
|
|
setGroupBlock,
|
|
menuRef,
|
|
}: PropsWithChildren<MenuProps>) => {
|
|
const handlerDeleteGroup = () => {
|
|
groupBlock.remove();
|
|
setVisible(false);
|
|
setGroupBlock(null);
|
|
};
|
|
|
|
const Content = () => {
|
|
return (
|
|
<MenuUl ref={menuRef}>
|
|
<MenuItem onClick={handlerDeleteGroup}>
|
|
<IconContainer>
|
|
<DeleteCashBinIcon />
|
|
</IconContainer>
|
|
Delete
|
|
</MenuItem>
|
|
</MenuUl>
|
|
);
|
|
};
|
|
|
|
return (
|
|
<Popover
|
|
content={<Content />}
|
|
placement={'bottom-start'}
|
|
visible={visible}
|
|
anchorStyle={{
|
|
position: 'absolute',
|
|
top: position.y,
|
|
left: position.x - ICON_WIDTH,
|
|
height: ICON_WIDTH,
|
|
}}
|
|
>
|
|
{children}
|
|
</Popover>
|
|
);
|
|
};
|
|
|
|
const MenuUl = styled('ul')(({ theme }) => ({
|
|
background: '#FFF',
|
|
color: '#4C6275',
|
|
fontWeight: '400',
|
|
}));
|
|
|
|
const MenuItem = styled('li')(({ theme }) => ({
|
|
fontWeight: '400',
|
|
width: '268px',
|
|
height: '32px',
|
|
lineHeight: '32px',
|
|
display: 'flex',
|
|
fontSize: '14px',
|
|
borderRadius: '5px',
|
|
cursor: 'pointer',
|
|
'&:hover': {
|
|
backgroundColor: '#F5F7F8',
|
|
},
|
|
}));
|
|
|
|
const IconContainer = styled('div')(({ theme }) => ({
|
|
display: 'flex',
|
|
height: '32px',
|
|
margin: '0 8px',
|
|
flexDirection: 'column',
|
|
justifyContent: 'center',
|
|
lineHeight: '32px',
|
|
fontSize: '20px',
|
|
'&, & > svg': {
|
|
width: '20px',
|
|
},
|
|
'& > svg': {
|
|
height: '20px',
|
|
},
|
|
}));
|