import React, { forwardRef, useEffect, useImperativeHandle, useState, } from 'react' import { useTranslation } from 'next-i18next' import { useRouter } from 'next/router' import { SuggestionProps } from '@tiptap/suggestion' import classNames from 'classnames' import styles from './index.module.scss' type Props = Pick export type MentionRef = { onKeyDown: (props: { event: KeyboardEvent }) => boolean } export type MentionSuggestion = { granblue_id: string name: { [key: string]: string en: string ja: string } type: string element: number } interface MentionProps extends SuggestionProps { items: MentionSuggestion[] } export const MentionList = forwardRef( ({ items, ...props }: Props, forwardedRef) => { const router = useRouter() const locale = router.locale || 'en' const { t } = useTranslation('common') const [selectedIndex, setSelectedIndex] = useState(0) const selectItem = (index: number) => { const item = items[index] if (item) { props.command({ id: item }) } } const upHandler = () => { setSelectedIndex((selectedIndex + items.length - 1) % items.length) } const downHandler = () => { setSelectedIndex((selectedIndex + 1) % items.length) } const enterHandler = () => { selectItem(selectedIndex) } useEffect(() => setSelectedIndex(0), [items]) useImperativeHandle(forwardedRef, () => ({ 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 (
{items.length ? ( items.map((item, index) => ( )) ) : (
{t('search.errors.no_results_generic')}
)}
) } ) MentionList.displayName = 'MentionList'