import FollowingBadge from '@/components/FollowingBadge' import { ScrollArea } from '@/components/ui/scroll-area' import { Pubkey } from '@/domain' import { cn } from '@/lib/utils' import { SuggestionKeyDownProps } from '@tiptap/suggestion' import { forwardRef, useEffect, useImperativeHandle, useState } from 'react' import Nip05 from '../../../Nip05' import { SimpleUserAvatar } from '../../../UserAvatar' import { SimpleUsername } from '../../../Username' export interface MentionListProps { items: string[] command: (payload: { id: string; label?: string }) => void } export interface MentionListHandle { onKeyDown: (args: SuggestionKeyDownProps) => boolean } const MentionList = forwardRef((props, ref) => { const [selectedIndex, setSelectedIndex] = useState(0) const selectItem = (index: number) => { const item = props.items[index] if (item) { props.command({ id: item, label: Pubkey.tryFromString(item)?.formatNpub(12) ?? item.slice(0, 12) }) } } 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(props.items.length ? 0 : -1) }, [props.items]) useImperativeHandle(ref, () => ({ onKeyDown: ({ event }: SuggestionKeyDownProps) => { if (event.key === 'ArrowUp') { upHandler() return true } if (event.key === 'ArrowDown') { downHandler() return true } if (event.key === 'Enter' && selectedIndex >= 0) { enterHandler() return true } return false } })) if (!props.items?.length) { return null } return ( e.stopPropagation()} onTouchMove={(e) => e.stopPropagation()} > {props.items.map((item, index) => ( ))} ) }) MentionList.displayName = 'MentionList' export default MentionList