59 lines
1.5 KiB
TypeScript
59 lines
1.5 KiB
TypeScript
import { useState, MouseEvent, ReactNode } from "react";
|
|
import Info from "@icons/Info";
|
|
|
|
import { Paper, Popover, SxProps, Typography } from "@mui/material";
|
|
|
|
export const InfoPopover = ({
|
|
blink = false,
|
|
sx,
|
|
children = "подсказка"
|
|
}: {
|
|
blink?: boolean,
|
|
sx?: SxProps,
|
|
children?: ReactNode
|
|
}) => {
|
|
const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);
|
|
|
|
const handleClick = (event: MouseEvent<HTMLButtonElement>) => {
|
|
setAnchorEl(event.currentTarget);
|
|
};
|
|
|
|
const handleClose = () => {
|
|
setAnchorEl(null);
|
|
};
|
|
|
|
const open = Boolean(anchorEl);
|
|
const id = open ? "simple-popover" : undefined;
|
|
|
|
return (
|
|
<>
|
|
<Info
|
|
className={blink ? "blink" : ""}
|
|
onClick={handleClick}
|
|
sx={{p:0, height: "20px", ...sx}}
|
|
/>
|
|
<Popover
|
|
id={id}
|
|
open={open}
|
|
anchorEl={anchorEl}
|
|
onClose={handleClose}
|
|
anchorOrigin={{
|
|
vertical: "bottom",
|
|
horizontal: "left",
|
|
}}
|
|
>
|
|
<Paper
|
|
sx={{
|
|
p: "20px",
|
|
display: "flex",
|
|
justifyContent: "center",
|
|
alignItems: "center",
|
|
flexDirection: "column",
|
|
}}
|
|
>
|
|
{children}
|
|
</Paper>
|
|
</Popover>
|
|
</>
|
|
);
|
|
}; |