import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown'; import { activeDropdownFocusIdState } from '@/ui/layout/dropdown/states/activeDropdownFocusIdState'; import { previousDropdownFocusIdState } from '@/ui/layout/dropdown/states/previousDropdownFocusIdState'; import { useRemoveFocusItemFromFocusStackById } from '@/ui/utilities/focus/hooks/useRemoveFocusItemFromFocusStackById'; import { useRecoilCallback } from 'recoil'; import { isDefined } from 'twenty-shared/utils'; export const useCloseAnyOpenDropdown = () => { const { closeDropdown } = useCloseDropdown(); const { removeFocusItemFromFocusStackById } = useRemoveFocusItemFromFocusStackById(); const closeAnyOpenDropdown = useRecoilCallback( ({ snapshot, set }) => () => { const previousDropdownFocusId = snapshot .getLoadable(previousDropdownFocusIdState) .getValue(); const activeDropdownFocusId = snapshot .getLoadable(activeDropdownFocusIdState) .getValue(); const thereIsNoDropdownOpen = !isDefined(activeDropdownFocusId) && !isDefined(previousDropdownFocusId); if (thereIsNoDropdownOpen) { return; } const thereIsOneNestedDropdownOpen = isDefined(previousDropdownFocusId); if (isDefined(activeDropdownFocusId)) { closeDropdown(activeDropdownFocusId); removeFocusItemFromFocusStackById({ focusId: activeDropdownFocusId, }); } if (thereIsOneNestedDropdownOpen) { closeDropdown(previousDropdownFocusId); removeFocusItemFromFocusStackById({ focusId: previousDropdownFocusId, }); } set(previousDropdownFocusIdState, null); set(activeDropdownFocusIdState, null); }, [closeDropdown, removeFocusItemFromFocusStackById], ); return { closeAnyOpenDropdown }; };