From 53facb9f2cf4d61ddaa472b28ecdc293f09f4461 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sat, 26 Apr 2025 15:39:45 +0200 Subject: [PATCH] Detect click outside of the component (manage no language selection) --- src/components/Language/LanguageSelector.tsx | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/components/Language/LanguageSelector.tsx b/src/components/Language/LanguageSelector.tsx index 6241347..751c0a9 100644 --- a/src/components/Language/LanguageSelector.tsx +++ b/src/components/Language/LanguageSelector.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { supportedLanguages } from '../../../i18n'; import { Tooltip, useTheme } from '@mui/material'; @@ -7,6 +7,7 @@ const LanguageSelector = () => { const { i18n, t } = useTranslation(['core']); const [showSelect, setShowSelect] = useState(false); const theme = useTheme(); + const selectorRef = useRef(null); const handleChange = (e) => { const newLang = e.target.value; @@ -18,8 +19,23 @@ const LanguageSelector = () => { const { name, flag } = supportedLanguages[currentLang] || supportedLanguages['en']; + // Detect clicks outside the component + useEffect(() => { + const handleClickOutside = (event) => { + if (selectorRef.current && !selectorRef.current.contains(event.target)) { + setShowSelect(false); + } + }; + + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, []); + return (
{ }} value={currentLang} onChange={handleChange} - onBlur={() => setShowSelect(false)} + autoFocus > {Object.entries(supportedLanguages).map(([code, { name }]) => (