From 2e26506b3994c7d51225999b032c472ef729404e Mon Sep 17 00:00:00 2001 From: Bianca Widstam Date: Tue, 1 Oct 2024 08:58:19 +0000 Subject: [PATCH] Merged in feat/SW-517-language-switcher-dismiss (pull request #626) Feat/SW-517 language switcher dismiss * feat(SW-517): Close language switcher when clicking outside * feat(SW-517): Close language switcher on selection * feat(SW-517): Fix mobile header Approved-by: Niclas Edenvin Approved-by: Linus Flood --- .../LanguageSwitcherContent/index.tsx | 2 ++ components/LanguageSwitcher/index.tsx | 36 +++++++++++++++++-- .../languageSwitcher/languageSwitcher.ts | 1 + 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/components/LanguageSwitcher/LanguageSwitcherContent/index.tsx b/components/LanguageSwitcher/LanguageSwitcherContent/index.tsx index 3533ecb93..19cc69961 100644 --- a/components/LanguageSwitcher/LanguageSwitcherContent/index.tsx +++ b/components/LanguageSwitcher/LanguageSwitcherContent/index.tsx @@ -16,6 +16,7 @@ import type { LanguageSwitcherContentProps } from "@/types/components/languageSw export default function LanguageSwitcherContent({ urls, + onLanguageSwitch, }: LanguageSwitcherContentProps) { const intl = useIntl() const currentLanguage = useLang() @@ -39,6 +40,7 @@ export default function LanguageSwitcherContent({ {languages[key]} {isActive ? : null} diff --git a/components/LanguageSwitcher/index.tsx b/components/LanguageSwitcher/index.tsx index 3d0543051..b5cb2f25e 100644 --- a/components/LanguageSwitcher/index.tsx +++ b/components/LanguageSwitcher/index.tsx @@ -1,5 +1,6 @@ "use client" +import { useEffect, useRef } from "react" import { useIntl } from "react-intl" import { languages } from "@/constants/languages" @@ -28,6 +29,7 @@ export default function LanguageSwitcher({ const intl = useIntl() const currentLanguage = useLang() const toggleDropdown = useDropdownStore((state) => state.toggleDropdown) + const languageSwitcherRef = useRef(null) const isFooterLanguageSwitcherOpen = useDropdownStore( (state) => state.isFooterLanguageSwitcherOpen ) @@ -70,10 +72,37 @@ export default function LanguageSwitcher({ }) } + useEffect(() => { + function handleClickOutside(evt: Event) { + const target = evt.target as HTMLElement + if ( + languageSwitcherRef.current && + target && + !languageSwitcherRef.current.contains(target) && + isLanguageSwitcherOpen && + !isHeaderLanguageSwitcherMobileOpen + ) { + toggleDropdown(dropdownType) + } + } + + if (languageSwitcherRef.current) { + document.addEventListener("click", handleClickOutside) + } + return () => { + document.removeEventListener("click", handleClickOutside) + } + }, [ + dropdownType, + toggleDropdown, + isLanguageSwitcherOpen, + isHeaderLanguageSwitcherMobileOpen, + ]) + const classNames = languageSwitcherVariants({ color, position }) return ( -
+
diff --git a/types/components/languageSwitcher/languageSwitcher.ts b/types/components/languageSwitcher/languageSwitcher.ts index 312d28712..5201728cb 100644 --- a/types/components/languageSwitcher/languageSwitcher.ts +++ b/types/components/languageSwitcher/languageSwitcher.ts @@ -17,6 +17,7 @@ export interface LanguageSwitcherProps { export interface LanguageSwitcherContentProps { urls: LanguageSwitcherData + onLanguageSwitch: () => void } export interface LanguageSwitcherContainerProps {