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
36 lines
1006 B
import {Dispatch, SetStateAction, useEffect, useMemo, useState} from "react";
|
|
|
|
export function useKey(keys: string | string[], func: () => void, deps: any[] = []) {
|
|
useEffect(() => {
|
|
const f = (ev: KeyboardEvent) => {
|
|
const fixedKey = Array.isArray(keys) ? keys : [keys];
|
|
|
|
if (fixedKey.includes(ev.key)) {
|
|
func();
|
|
}
|
|
};
|
|
|
|
window.addEventListener("keydown", f);
|
|
|
|
return () => {
|
|
window.removeEventListener("keydown", f);
|
|
};
|
|
}, [keys, func, ...deps]);
|
|
}
|
|
|
|
export function usePlusMinus(length: number): [number, Dispatch<SetStateAction<number>>] {
|
|
const [current, setCurrent] = useState(0);
|
|
|
|
useKey("-", () => setCurrent(prev => prev <= 0 ? length - 1 : prev - 1), [length]);
|
|
useKey("+", () => setCurrent(prev => prev >= length - 1 ? 0 : prev + 1), [length]);
|
|
|
|
useEffect(() => {
|
|
if (current < 0) {
|
|
setCurrent(0);
|
|
} else if (current > length - 1) {
|
|
setCurrent(length - 1);
|
|
}
|
|
}, [length]);
|
|
|
|
return [current, setCurrent];
|
|
}
|