import { forwardRef, useEffect, useImperativeHandle, useState } from "react"; import type { Resource } from "~/core/messages"; import { cn } from "~/lib/utils"; export interface ResourceMentionsProps { items: Array; command: (item: { id: string; label: string }) => void; } export const ResourceMentions = forwardRef< { onKeyDown: (args: { event: KeyboardEvent }) => boolean }, ResourceMentionsProps >((props, ref) => { const [selectedIndex, setSelectedIndex] = useState(0); const selectItem = (index: number) => { const item = props.items[index]; if (item) { props.command({ id: item.uri, label: item.title }); } }; const upHandler = () => { setSelectedIndex( (selectedIndex + props.items.length - 1) % props.items.length, ); }; const downHandler = () => { setSelectedIndex((selectedIndex + 1) % props.items.length); }; const enterHandler = () => { selectItem(selectedIndex); }; useEffect(() => setSelectedIndex(0), [props.items]); useImperativeHandle(ref, () => ({ onKeyDown: ({ event }) => { if (event.key === "ArrowUp") { upHandler(); return true; } if (event.key === "ArrowDown") { downHandler(); return true; } if (event.key === "Enter") { enterHandler(); return true; } return false; }, })); return (
{props.items.length ? ( props.items.map((item, index) => ( )) ) : (
No result
)}
); });