import { Option, Query, Callback } from '@tutorbook/model'; import { Ripple } from '@rmwc/ripple'; import React from 'react'; import QueryForm from '@tutorbook/query-form'; import styles from './filter-form.module.scss'; interface SearchButtonProps { children: string; onClick: (event: React.FormEvent) => void; } function SearchButton({ onClick, children }: SearchButtonProps): JSX.Element { return ( ); } interface FilterFormProps { query: Query; onChange: Callback; } type FocusTarget = 'subjects' | 'availability' | 'langs' | 'orgs'; export default function FilterForm({ query, onChange, }: FilterFormProps): JSX.Element { const [active, setActive] = React.useState(false); const formRef: React.RefObject = React.createRef< HTMLDivElement >(); const str: (value: Option[]) => string = ( value: Option[] ) => { return value.map((option: Option) => option.label).join(', '); }; const [focused, setFocused] = React.useState(); React.useEffect(() => { if (!formRef.current) return () => {}; const element: HTMLElement = formRef.current; const removeClickListener = () => { /* eslint-disable-next-line @typescript-eslint/no-use-before-define */ document.removeEventListener('click', outsideClickListener); }; const outsideClickListener = (event: MouseEvent) => { if (!element.contains(event.target as Node) && active) { setActive(false); setFocused(undefined); removeClickListener(); } }; document.addEventListener('click', outsideClickListener); return removeClickListener; }); return ( <>
{ setFocused('subjects'); setActive(true); }} > {str(query.subjects) || 'Any subjects'} {query.aspect === 'tutoring' && ( <> { setFocused('availability'); setActive(true); }} > {query.availability.toString() || 'Any availability'} )} { setFocused('langs'); setActive(true); }} > {str(query.langs) || 'Any language'}
); }