simplify click outside

This commit is contained in:
Pavel Mineev
2022-02-07 22:47:00 -06:00
parent 38414c4628
commit c9b1fb4737
+14 -8
View File
@@ -14,6 +14,7 @@ function handleChangeIframeSize(element: HTMLElement) {
export function useDropdown(disableClosing?: boolean) {
const rootRef = useRef<HTMLDivElement>(null);
const clickInsideRef = useRef<boolean>(false);
const [showDropdown, setShowDropdown] = useState(false);
const toggleDropdownState = () => {
setShowDropdown((s) => !s);
@@ -36,24 +37,29 @@ export function useDropdown(disableClosing?: boolean) {
setShowDropdown(false);
}
function handleClickOutside(evt: MouseEvent) {
if (
disableClosing ||
dropdownElement?.contains(evt.target as HTMLDivElement) ||
(evt.target as Element).classList?.contains('telegram-auth')
// telegram button is gone from dropdown render by the time of this check
// without that condition click on telegram button considered as outside click
) {
function handleClickOutside() {
const isClickInside = clickInsideRef.current;
clickInsideRef.current = false;
if (disableClosing || isClickInside) {
return;
}
setShowDropdown(false);
}
function handleClickInside() {
clickInsideRef.current = true;
}
// check if click is inside dropdown on capture phase
dropdownElement.addEventListener('click', handleClickInside, { capture: true });
document.addEventListener('click', handleClickOutside);
window.addEventListener('message', handleMessageFromParent);
return () => {
dropdownElement.removeEventListener('click', handleClickInside);
document.removeEventListener('click', handleClickOutside);
window.removeEventListener('message', handleMessageFromParent);
};