Files
calendar/packages/lib/hooks/useKeyPress.ts
T
sean-brydonandGitHub c68ff54e77 Feat/full custom select (#6865)
* Inital Setup - refactors/optimise

* Escape clears focus

* A11y and optimisations

* A11y enter fix

* Sort out flatternt list indexing

* Fix spacing - fix single selected state

* Solves group highlights breaking things

* Fix selecting while filtering list

* Remove styles and rename story

* Hide labels while searching for now

* Remove group item

* move onclick hook to hooks

* Fix typo

* Use check icon on single select

* scroll into view when keyboard navigating

* add comment explaining dropdown close

* Remove tenery and make disabled easier to read

* Typo

* remove log

* Remove destructing of classNames props

* Refactor callbacks + hooks

* Style updates with ciaran

* Final style changes

* center icon

* Add darkmode
2023-02-13 15:14:23 +01:00

47 lines
1.5 KiB
TypeScript

import { useState, useEffect, RefObject, useRef } from "react";
export function useKeyPress(
targetKey: string,
ref?: RefObject<HTMLInputElement>,
handler?: () => void
): boolean {
// State for keeping track of whether key is pressed
const [keyPressed, setKeyPressed] = useState(false);
const placeHolderRef = ref?.current;
// If pressed key is our target key then set to true
function downHandler({ key }: { key: string }) {
if (key === targetKey) {
setKeyPressed(true);
handler && handler();
}
}
// If released key is our target key then set to false
const upHandler = ({ key }: { key: string }) => {
if (key === targetKey) {
setKeyPressed(false);
}
};
// Add event listeners
useEffect(() => {
if (ref && placeHolderRef) {
placeHolderRef.addEventListener("keydown", downHandler);
placeHolderRef.addEventListener("keyup", upHandler);
return () => {
placeHolderRef?.removeEventListener("keydown", downHandler);
placeHolderRef?.removeEventListener("keyup", upHandler);
};
} else {
window.addEventListener("keydown", downHandler);
window.addEventListener("keyup", upHandler);
// Remove event listeners on cleanup
return () => {
window.removeEventListener("keydown", downHandler);
window.removeEventListener("keyup", upHandler);
};
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []); // Empty array ensures that effect is only run on mount and unmount
return keyPressed;
}