Pull out shared hook

This commit is contained in:
Ayaz Hafiz 2023-08-02 14:44:06 -05:00
parent 43e2f2f091
commit f3c0b54fe9
No known key found for this signature in database
GPG key ID: 0E2A37416A25EF58
4 changed files with 53 additions and 99 deletions

View file

@ -0,0 +1,42 @@
import { useEffect, useState } from "react";
import type { TypedEmitter } from "tiny-typed-emitter";
type Events<Name extends string, T> = {
[K in Name]: (value: T) => void;
};
interface UseFocusOutlineEventProps<Name extends string, T> {
value: T;
ee: TypedEmitter<Events<Name, T>>;
event: Name;
defaultIsOutlined?: boolean;
}
export function useFocusOutlineEvent<Name extends string, T>({
value,
ee,
event,
defaultIsOutlined = false,
}: UseFocusOutlineEventProps<Name, T>) {
const [isOutlined, setIsOutlined] = useState(defaultIsOutlined);
useEffect(() => {
ee.on(event, (focusValue: T) => {
if (focusValue !== value) return;
setIsOutlined(true);
});
}, [ee, event, value]);
useEffect(() => {
if (!isOutlined) return;
const timer = setTimeout(() => {
setIsOutlined(false);
}, 500);
return () => {
clearTimeout(timer);
};
}, [isOutlined]);
return isOutlined;
}