1
1
mirror of https://github.com/theoludwig/theoludwig.git synced 2024-12-08 00:44:30 +01:00
.profile/components/Header/Locales/index.tsx

101 lines
2.7 KiB
TypeScript
Raw Normal View History

"use client"
import { usePathname } from "next/navigation"
import { useCallback, useEffect, useState, useRef } from "react"
import classNames from "clsx"
import type { Locale as LocaleType, CookiesStore } from "@/utils/constants"
import { LOCALES } from "@/utils/constants"
2021-12-04 15:52:51 +01:00
import { Arrow } from "./Arrow"
import { LocaleFlag } from "./LocaleFlag"
export interface LocalesProps {
currentLocale: string
cookiesStore: CookiesStore
}
export const Locales = (props: LocalesProps): JSX.Element => {
const { currentLocale, cookiesStore } = props
const pathname = usePathname()
const [hiddenMenu, setHiddenMenu] = useState(true)
2022-05-03 10:05:11 +02:00
const languageClickRef = useRef<HTMLDivElement | null>(null)
2021-06-15 20:35:52 +02:00
const handleHiddenMenu = useCallback(() => {
2022-09-04 20:40:58 +02:00
setHiddenMenu((oldHiddenMenu) => {
return !oldHiddenMenu
})
2022-05-03 10:05:11 +02:00
}, [])
2021-06-15 20:35:52 +02:00
useEffect(() => {
2022-05-03 10:05:11 +02:00
const handleClickEvent = (event: MouseEvent): void => {
if (languageClickRef.current == null || event.target == null) {
return
}
if (!languageClickRef.current.contains(event.target as Node)) {
setHiddenMenu(true)
}
}
window.document.addEventListener("click", handleClickEvent)
2022-05-03 10:05:11 +02:00
return () => {
return window.removeEventListener("click", handleClickEvent)
}
2022-05-03 10:05:11 +02:00
}, [])
const handleLocale = async (locale: LocaleType): Promise<void> => {
const { setLocale } = await import("@/i18n/i18n.server")
setLocale(locale)
}
if (pathname.startsWith("/blog")) {
return <></>
}
return (
<div className="flex cursor-pointer flex-col items-center justify-center">
2021-08-13 15:48:29 +02:00
<div
2022-05-03 10:05:11 +02:00
ref={languageClickRef}
data-cy="locale-click"
className="mr-5 flex items-center"
2021-08-13 15:48:29 +02:00
onClick={handleHiddenMenu}
>
<LocaleFlag
locale={currentLocale}
cookiesStore={cookiesStore?.toString()}
/>
<Arrow />
</div>
2021-08-23 19:41:39 +02:00
<ul
data-cy="locales-list"
2021-08-23 19:41:39 +02:00
className={classNames(
"absolute top-14 z-10 mr-4 mt-3 flex w-32 list-none flex-col items-center justify-center rounded-lg bg-white p-0 shadow-lightFlag dark:bg-black dark:shadow-darkFlag",
{ hidden: hiddenMenu },
2021-08-23 19:41:39 +02:00
)}
>
{LOCALES.filter((locale) => {
return locale !== currentLocale
}).map((locale) => {
2021-08-23 19:41:39 +02:00
return (
<li
key={locale}
className="flex h-12 w-full items-center justify-center hover:bg-[#4f545c] hover:bg-opacity-20"
2022-09-04 20:40:58 +02:00
onClick={async () => {
return await handleLocale(locale)
2022-09-04 20:40:58 +02:00
}}
2021-08-23 19:41:39 +02:00
>
<LocaleFlag
locale={locale}
cookiesStore={cookiesStore?.toString()}
/>
2021-08-23 19:41:39 +02:00
</li>
)
})}
</ul>
</div>
)
}