/// import React, { useCallback, useMemo, useRef } from 'react' import cs from 'classnames' import { throttle } from 'lodash' import { SearchInput, FileTree, SpecificTreeNode, TreeFile, FileBase, TreeFolder, VirtualizedTreeRef } from '@cypress/design-system' import { useFuzzySort } from './useFuzzySort' import styles from './SpecList.module.scss' export interface SpecListProps { className?: string specs: Cypress.Cypress['spec'][] selectedFile?: string searchRef: React.MutableRefObject onFileClick: (path: string) => void } const fuzzyTransform = (node: T, indexes: number[]) => ({ ...node, indexes, }) export const SpecList: React.FC = ({ searchRef, className, specs, selectedFile, onFileClick }) => { const fileTreeRef = useRef() const files = useMemo(() => specs.map((spec) => ({ path: spec.relative })), [specs]) const { setSearch, matches } = useFuzzySort({ search: '', transformResult: fuzzyTransform, items: files, options: { key: 'path' }, }) // eslint-disable-next-line react-hooks/exhaustive-deps const onInput = useMemo(() => throttle(setSearch, 100), []) const onFilePress = useCallback((file: SpecificTreeNode>) => onFileClick(file.node.id), [onFileClick]) const onFolderKeyDown = useCallback((folder: SpecificTreeNode>, event: React.KeyboardEvent) => { if (folder.isFirst && event.key === 'ArrowUp') { event.preventDefault() searchRef.current.focus() } }, [searchRef]) const onEnter = useCallback(() => fileTreeRef.current.focus(), []) const onVerticalArrowKey = useCallback((arrow: 'up' | 'down') => { if (arrow === 'down') { onEnter() } }, [onEnter]) return ( ) }