"use client"; import { Primitive } from "../../../utils/Primitive"; import { type ComponentRef, type ComponentPropsWithoutRef, type ReactNode, forwardRef, useCallback, } from "react"; import { composeEventHandlers } from "@radix-ui/primitive"; import { useTriggerPopoverScopeContext } from "./TriggerPopover"; import type { Unstable_TriggerItem } from "@assistant-ui/core"; export namespace ComposerPrimitiveTriggerPopoverItems { export type Element = ComponentRef; export type Props = Omit< ComponentPropsWithoutRef, "children" > & { children: (items: readonly Unstable_TriggerItem[]) => ReactNode; }; } /** * Renders the list of items within a category or search results via a render function. * Only renders when a category is active or search mode is on. */ export const ComposerPrimitiveTriggerPopoverItems = forwardRef< ComposerPrimitiveTriggerPopoverItems.Element, ComposerPrimitiveTriggerPopoverItems.Props >(({ children, "aria-label": ariaLabel, ...props }, forwardedRef) => { const { items, activeCategoryId, isSearchMode, open } = useTriggerPopoverScopeContext(); if (!open || (!activeCategoryId && !isSearchMode)) return null; return ( {children(items)} ); }); ComposerPrimitiveTriggerPopoverItems.displayName = "ComposerPrimitive.TriggerPopoverItems"; export namespace ComposerPrimitiveTriggerPopoverItem { export type Element = ComponentRef; export type Props = ComponentPropsWithoutRef & { item: Unstable_TriggerItem; index?: number | undefined; }; } /** * A button that selects a trigger item. * Automatically receives `data-highlighted` when keyboard-navigated. */ export const ComposerPrimitiveTriggerPopoverItem = forwardRef< ComposerPrimitiveTriggerPopoverItem.Element, ComposerPrimitiveTriggerPopoverItem.Props >( ( { item, index: indexProp, onClick, onMouseMove, ...props }, forwardedRef, ) => { const { selectItem, highlightIndex, items, highlightedIndex, activeCategoryId, isSearchMode, popoverId, } = useTriggerPopoverScopeContext(); const handleClick = useCallback(() => { selectItem(item); }, [selectItem, item]); const itemIndex = indexProp ?? items.findIndex((i) => i.id === item.id); const isHighlighted = (isSearchMode || activeCategoryId !== null) && itemIndex === highlightedIndex; const handleMouseMove = useCallback(() => { highlightIndex(itemIndex); }, [highlightIndex, itemIndex]); return ( ); }, ); ComposerPrimitiveTriggerPopoverItem.displayName = "ComposerPrimitive.TriggerPopoverItem";