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
This commit is contained in:
Bianca Widstam
2024-10-01 08:58:19 +00:00
parent 5faeaa3d34
commit 2e26506b39
3 changed files with 37 additions and 2 deletions

View File

@@ -16,6 +16,7 @@ import type { LanguageSwitcherContentProps } from "@/types/components/languageSw
export default function LanguageSwitcherContent({ export default function LanguageSwitcherContent({
urls, urls,
onLanguageSwitch,
}: LanguageSwitcherContentProps) { }: LanguageSwitcherContentProps) {
const intl = useIntl() const intl = useIntl()
const currentLanguage = useLang() const currentLanguage = useLang()
@@ -39,6 +40,7 @@ export default function LanguageSwitcherContent({
<Link <Link
className={`${styles.link} ${isActive ? styles.active : ""}`} className={`${styles.link} ${isActive ? styles.active : ""}`}
href={url} href={url}
onClick={onLanguageSwitch}
> >
{languages[key]} {languages[key]}
{isActive ? <CheckIcon color="burgundy" /> : null} {isActive ? <CheckIcon color="burgundy" /> : null}

View File

@@ -1,5 +1,6 @@
"use client" "use client"
import { useEffect, useRef } from "react"
import { useIntl } from "react-intl" import { useIntl } from "react-intl"
import { languages } from "@/constants/languages" import { languages } from "@/constants/languages"
@@ -28,6 +29,7 @@ export default function LanguageSwitcher({
const intl = useIntl() const intl = useIntl()
const currentLanguage = useLang() const currentLanguage = useLang()
const toggleDropdown = useDropdownStore((state) => state.toggleDropdown) const toggleDropdown = useDropdownStore((state) => state.toggleDropdown)
const languageSwitcherRef = useRef<HTMLDivElement>(null)
const isFooterLanguageSwitcherOpen = useDropdownStore( const isFooterLanguageSwitcherOpen = useDropdownStore(
(state) => state.isFooterLanguageSwitcherOpen (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 }) const classNames = languageSwitcherVariants({ color, position })
return ( return (
<div className={classNames}> <div className={classNames} ref={languageSwitcherRef}>
<button <button
type="button" type="button"
className={styles.button} className={styles.button}
@@ -99,7 +128,10 @@ export default function LanguageSwitcher({
> >
{isLanguageSwitcherOpen ? ( {isLanguageSwitcherOpen ? (
<LanguageSwitcherContainer type={type}> <LanguageSwitcherContainer type={type}>
<LanguageSwitcherContent urls={urls} /> <LanguageSwitcherContent
urls={urls}
onLanguageSwitch={() => toggleDropdown(dropdownType)}
/>
</LanguageSwitcherContainer> </LanguageSwitcherContainer>
) : null} ) : null}
</div> </div>

View File

@@ -17,6 +17,7 @@ export interface LanguageSwitcherProps {
export interface LanguageSwitcherContentProps { export interface LanguageSwitcherContentProps {
urls: LanguageSwitcherData urls: LanguageSwitcherData
onLanguageSwitch: () => void
} }
export interface LanguageSwitcherContainerProps { export interface LanguageSwitcherContainerProps {