import React, { useMemo, useState, useEffect, useRef } from 'react' import { useDrag } from '../../hooks' import { debounce } from '../../utils' import { FolderTitleProps } from '../Folder' import { Chevron } from '../UI' import { StyledFilterInput, StyledTitleWithFilter, TitleContainer, Icon, FilterWrapper } from './StyledFilter' type FilterProps = { setFilter: (value: string) => void; toggle: (flag?: boolean) => void } const FilterInput = React.forwardRef(({ setFilter, toggle }, ref) => { const [value, set] = useState('') const debouncedOnChange = useMemo(() => debounce(setFilter, 250), [setFilter]) const clear = () => { setFilter('') set('') } const _onChange = (e: React.ChangeEvent) => { const v = e.currentTarget.value toggle(true) set(v) } useEffect(() => { debouncedOnChange(value) }, [value, debouncedOnChange]) return ( <> e.stopPropagation()} onChange={_onChange} /> clear()} style={{ visibility: value ? 'visible' : 'hidden' }}> ) }) export type TitleWithFilterProps = FilterProps & FolderTitleProps & { onDrag: (point: { x?: number; y?: number }) => void onDragStart: (point: { x?: number; y?: number }) => void onDragEnd: (point: { x?: number; y?: number }) => void title: React.ReactNode drag: boolean filterEnabled: boolean from?: { x?: number; y?: number } } export function TitleWithFilter({ setFilter, onDrag, onDragStart, onDragEnd, toggle, toggled, title, drag, filterEnabled, from, }: TitleWithFilterProps) { const [filterShown, setShowFilter] = useState(false) const inputRef = useRef(null) useEffect(() => { if (filterShown) inputRef.current?.focus() else inputRef.current?.blur() }, [filterShown]) const bind = useDrag( ({ offset: [x, y], first, last }) => { onDrag({ x, y }) if (first) { onDragStart({ x, y }) } if (last) { onDragEnd({ x, y }) } }, { filterTaps: true, from: ({ offset: [x, y] }) => [from?.x || x, from?.y || y], } ) useEffect(() => { const handleShortcut = (event: KeyboardEvent) => { if (event.key === 'L' && event.shiftKey && event.metaKey) { setShowFilter((f) => !f) } } window.addEventListener('keydown', handleShortcut) return () => window.removeEventListener('keydown', handleShortcut) }, []) return ( <> toggle()}> {title === undefined && drag ? ( ) : ( title )} {filterEnabled && ( setShowFilter((f) => !f)}> )} ) }