import { useState, type HTMLAttributes } from "react";
import { useAnchoredPopover } from "./anchoredPopoverHooks";
// The hover wiring of a media card's preview (./MediaPreview has the why).
/** How long the pointer must rest on a card: long enough that a sweep across a grid opens nothing. */
const MEDIA_PREVIEW_DELAY = 900;
export function useMediaPreview(enabled = true) {
const [open, setOpen] = useState(false);
const pop = useAnchoredPopover({
open: open && enabled,
onOpenChange: setOpen,
mode: "hover",
placement: "right-start",
offset: 8,
hoverDelay: { open: MEDIA_PREVIEW_DELAY, close: 0 },
pointerOnly: true,
});
return {
popover: pop,
/** The preview is up: the pointer has rested on the card (what a card may fetch for it waits on). */
open: open && enabled,
/** The card root's props: the anchor, the hover wiring, and a close on any press — merged with
* the root's own (its menu's right-click and long-press). */
rootProps: (own: HTMLAttributes & Record = {}) => ({
...(pop.getReferenceProps({
...own,
onPointerDown: (e: React.PointerEvent) => {
setOpen(false);
(own.onPointerDown as ((e: React.PointerEvent) => void) | undefined)?.(e);
},
onContextMenu: (e: React.MouseEvent) => {
setOpen(false);
(own.onContextMenu as ((e: React.MouseEvent) => void) | undefined)?.(e);
},
}) as HTMLAttributes & Record),
ref: pop.refs.setReference,
}),
};
}