import React, { useCallback, useMemo, useState, useRef, PropsWithChildren } from 'react'; import cn from 'classnames'; import ClickAwayListener from '@mui/material/ClickAwayListener'; import Popper, { PopperProps } from '@mui/material/Popper'; import { Card } from '../card/card'; import { PopperCustomClasses } from './popper_card_styles'; import { SpeechBubbleArrow } from '../assets/icons/speech_bubble_arrow_component'; import merge from 'lodash/merge'; import { PopperPlacementType } from '@mui/material'; import uniqBy from 'lodash/uniqBy'; interface Props { className?: string; anchorElement: any; open?: boolean; onClose?: () => void; popperProps?: Omit; structured?: boolean; onClickAway?: () => void; dismissArrow?: boolean; classes?: PopperCustomClasses; customClasses?: PopperCustomClasses; containerProps?: any; } export const PopperCard: React.FC> = ({ className, anchorElement, open, onClose, popperProps, structured, onClickAway, dismissArrow = false, customClasses: oldCustomClasses = {}, classes: receivedClasses = {}, containerProps = {}, children, }) => { const mergedClasses = useMemo(() => merge({}, oldCustomClasses, receivedClasses), [ JSON.stringify(oldCustomClasses), JSON.stringify(receivedClasses), ]); const classes = mergedClasses; const [arrowReference, setArrowReference] = useState(null); let modifiers = useMemo( () => uniqBy( [ ...((popperProps && popperProps.modifiers) || []), { name: 'flip', enabled: true, }, { name: 'preventOverflow', enabled: true, options: { padding: 8, }, }, { name: 'offset', options: { offset: [0, 16], // décaler le popper de 10px vers le bas }, }, { name: 'arrow', enabled: true, options: { element: arrowReference, }, }, ], 'name' ), [popperProps?.modifiers, arrowReference] ); return ( {({ placement }) => ( {children} )} ); }; interface PopperContentProps { className?: string; dismissArrow?: boolean; setArrowReference: (...parameters: any[]) => void; onClickAway?: (...parameters: any[]) => void; structured?: boolean; classes: any; placement: PopperPlacementType; } const Content: React.FC> = ({ className, dismissArrow, setArrowReference, placement, onClickAway, structured, classes, children, }) => { const handleClickAway = useCallback( (...parameters: any[]) => { if (typeof onClickAway === 'function') { onClickAway(...parameters); } }, [onClickAway] ); const content = (
{!dismissArrow && (
)} {children}
); if (onClickAway) { return {content}; } return content; };