mirror of
https://github.com/muerwre/vault-frontend.git
synced 2025-04-25 12:56:41 +07:00
refactored hooks directory
This commit is contained in:
parent
efa3ba902d
commit
f76a5a4798
106 changed files with 122 additions and 144 deletions
33
src/hooks/dom/useClickOutsideFocus.ts
Normal file
33
src/hooks/dom/useClickOutsideFocus.ts
Normal file
|
@ -0,0 +1,33 @@
|
|||
/**
|
||||
* Handles blur by detecting clicks outside refs.
|
||||
*/
|
||||
import { useCallback, useEffect, useRef, useState } from 'react';
|
||||
import { useCloseOnEscape } from '~/hooks';
|
||||
|
||||
export const useClickOutsideFocus = () => {
|
||||
const ref = useRef<HTMLElement>();
|
||||
const [isActive, setIsActive] = useState(false);
|
||||
|
||||
const activate = useCallback(() => setIsActive(true), [setIsActive]);
|
||||
const deactivate = useCallback(() => setIsActive(false), [setIsActive]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!isActive || !ref.current) {
|
||||
return;
|
||||
}
|
||||
|
||||
const deactivator = (event: MouseEvent) => {
|
||||
if (!ref.current?.contains(event.target as Node)) {
|
||||
deactivate();
|
||||
}
|
||||
};
|
||||
|
||||
document.addEventListener('mouseup', deactivator);
|
||||
|
||||
return () => document.removeEventListener('mouseup', deactivator);
|
||||
}, [deactivate, isActive]);
|
||||
|
||||
useCloseOnEscape(deactivate);
|
||||
|
||||
return { ref, isActive, activate, deactivate };
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue