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:
@@ -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}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user