import { KeyboardEvent, useState } from 'react'; import { Input, Modal, ModalBody, ModalContent, ModalFooter, ModalOverlay } from '@chakra-ui/react'; import { useDebouncedCallback } from '@mantine/hooks'; import { SupportedEvent } from 'ontime-types'; import { useEventSelection } from '../../rundown/useEventSelection'; import useFinder from './useFinder'; import style from './Finder.module.scss'; interface FinderProps { isOpen: boolean; onClose: () => void; } export default function Finder(props: FinderProps) { const { isOpen, onClose } = props; const { find, results, error } = useFinder(); const [selected, setSelected] = useState(0); const setSelectedEvents = useEventSelection((state) => state.setSelectedEvents); const debouncedFind = useDebouncedCallback(find, 100); const navigate = (event: KeyboardEvent) => { // all operations need results if (results.length === 0) { return; } if (event.key === 'ArrowDown') { setSelected((prev) => (prev + 1) % results.length); } if (event.key === 'ArrowUp') { setSelected((prev) => (prev - 1 + results.length) % results.length); } if (event.key === 'Enter') { submit(); } }; const submit = () => { const selectedEvent = results[selected]; setSelectedEvents({ id: selectedEvent.id, index: selectedEvent.index, selectMode: 'click' }); onClose(); }; const handleMouseMoveEvent = (event: React.MouseEvent) => { const target = event.target as HTMLElement; const li = target.closest('li'); if (li) { const index = Number(li.dataset.index); if (!isNaN(index)) { setSelected(index); } } }; return (
    {error &&
  • {error}
  • } {results.length === 0 &&
  • No results
  • } {results.length > 0 && results.map((entry, index) => { const isSelected = selected === index; const displayIndex = entry.type === SupportedEvent.Event ? entry.eventIndex : '-'; const displayCue = entry.type === SupportedEvent.Event ? entry.cue : ''; const colour = entry.type === SupportedEvent.Event ? entry.colour : ''; return (
  • {displayIndex}
    {displayCue}
    {entry.title}
    {isSelected && Go ⏎}
  • ); })}
Use the keywords cue, index or title to filter search
); }