import { Button } from "@prismicio/editor-ui"; import { Video } from "cloudinary-react"; import { clsx } from "clsx"; import { createContext, createElement, type FC, type ImgHTMLAttributes, type PropsWithChildren, useCallback, useContext, useState, type VideoHTMLAttributes, } from "react"; import { useDelayedAction } from "@/hooks/useDelayedAction"; import { CloseIcon } from "@/icons/CloseIcon"; import { BaseHoverCard, type BaseHoverCardProps } from "../BaseHoverCard"; import styles from "./HoverCard.module.css"; type HoverCardProps = PropsWithChildren<{ align?: BaseHoverCardProps["align"]; alignOffset?: BaseHoverCardProps["alignOffset"]; arrowSize?: BaseHoverCardProps["arrowSize"]; collisionPadding?: BaseHoverCardProps["collisionPadding"]; onClose?: () => void; open: BaseHoverCardProps["open"]; openDelay?: BaseHoverCardProps["openDelay"]; side?: BaseHoverCardProps["side"]; sideOffset?: BaseHoverCardProps["sideOffset"]; trigger: BaseHoverCardProps["trigger"]; }>; export const HoverCard: FC = ({ align, alignOffset, arrowSize, children, collisionPadding, onClose, open, openDelay = 5000, side, sideOffset, trigger, }) => { const [isOpen, setOpen] = useState(false); const handleClose = useCallback(() => { onClose && onClose(); setOpen(false); }, [onClose, setOpen]); const handleChange = (value: boolean) => { if (value === true && open === true) { setOpen(value); } }; const handleDefaultOpening = useCallback( () => setOpen((wasOpen) => wasOpen === false), [setOpen], ); useDelayedAction({ condition: open === true, action: handleDefaultOpening, delay: openDelay, }); return ( {children} ); }; type HoverCardWrapperProps = PropsWithChildren<{ handleClose: () => void; }>; const HoverCardWrapper = ({ handleClose, children }: HoverCardWrapperProps) => { return (
{children}
); }; type HoverCardContextValue = { handleClose: () => void; }; const HoverCardContext = createContext({ handleClose: () => void 0, }); function useHoverCardContextValue() { return useContext(HoverCardContext); } export const HoverCardTitle: FC = ({ children }) => { const { handleClose } = useHoverCardContextValue(); return (
{children}
); }; type HoverCardMediaProps = | ({ component: "video" } & VideoHTMLAttributes & { cloudName: string; publicId: string; }) | ({ component: "image" } & ImgHTMLAttributes); export const HoverCardMedia: FC = ({ component, ...otherProps }) => { const ReactComponent = component === "image" ? "img" : Video; return (
{createElement(ReactComponent, { ...otherProps, className: clsx(styles.media, otherProps.className), })}
); }; export const HoverCardDescription: FC = ({ children }) => { return
{children}
; }; export const HoverCardCloseButton: FC = ({ children }) => { const { handleClose } = useHoverCardContextValue(); return (
); };