Files
AFFiNE-Mirror/libs/components/editor-plugins/src/menu/group-menu/Menu.tsx
T
2022-09-26 15:25:48 +08:00

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',
},
}));