You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

36 lines
1006 B

2 years ago
  1. import {Dispatch, SetStateAction, useEffect, useMemo, useState} from "react";
  2. export function useKey(keys: string | string[], func: () => void, deps: any[] = []) {
  3. useEffect(() => {
  4. const f = (ev: KeyboardEvent) => {
  5. const fixedKey = Array.isArray(keys) ? keys : [keys];
  6. if (fixedKey.includes(ev.key)) {
  7. func();
  8. }
  9. };
  10. window.addEventListener("keydown", f);
  11. return () => {
  12. window.removeEventListener("keydown", f);
  13. };
  14. }, [keys, func, ...deps]);
  15. }
  16. export function usePlusMinus(length: number): [number, Dispatch<SetStateAction<number>>] {
  17. const [current, setCurrent] = useState(0);
  18. useKey("-", () => setCurrent(prev => prev <= 0 ? length - 1 : prev - 1), [length]);
  19. useKey("+", () => setCurrent(prev => prev >= length - 1 ? 0 : prev + 1), [length]);
  20. useEffect(() => {
  21. if (current < 0) {
  22. setCurrent(0);
  23. } else if (current > length - 1) {
  24. setCurrent(length - 1);
  25. }
  26. }, [length]);
  27. return [current, setCurrent];
  28. }