search.tsx 1004 B

1234567891011121314151617181920212223242526272829303132
  1. import React, { useContext, useEffect, useState } from 'react';
  2. import { Keys } from '../../../hooks/vim';
  3. import { searched } from './actions';
  4. import { CmusUIDispatchContext } from './reducer';
  5. export const Search: React.FC = () => {
  6. const dispatchUI = useContext(CmusUIDispatchContext);
  7. const [term, setTerm] = useState<string>('');
  8. useEffect(() => {
  9. dispatchUI(searched(term));
  10. }, [dispatchUI, term]);
  11. useEffect(() => {
  12. const listener = (event: KeyboardEvent): void => {
  13. if (event.key === Keys.enter || event.key === Keys.esc) {
  14. dispatchUI(searched(null));
  15. } else if (event.key === 'Backspace') {
  16. setTerm((last) => last.substring(0, last.length - 1));
  17. } else if (/^\w$/.test(event.key)) {
  18. setTerm((last) => `${last}${event.key}`);
  19. }
  20. };
  21. window.addEventListener('keydown', listener);
  22. return (): void => {
  23. window.removeEventListener('keydown', listener);
  24. };
  25. }, [dispatchUI]);
  26. return <div>/{term}</div>;
  27. };