diff --git a/components/language-switcher.tsx b/components/language-switcher.tsx index d4e7d37..2984c07 100644 --- a/components/language-switcher.tsx +++ b/components/language-switcher.tsx @@ -1,23 +1,110 @@ "use client"; +import { useEffect, useRef, useState } from "react"; import { useTranslation } from "./language-provider"; import { cn } from "../lib/utils"; export function LanguageSwitcher() { const { locale, setLocale, locales, dir } = useTranslation(); + const [open, setOpen] = useState(false); + const wrapperRef = useRef(null); + + const currentLocale = locales.find((item) => item.value === locale); + + useEffect(() => { + function onPointerDown(event: MouseEvent) { + if (!wrapperRef.current?.contains(event.target as Node)) { + setOpen(false); + } + } + + function onEscape(event: KeyboardEvent) { + if (event.key === "Escape") { + setOpen(false); + } + } + + document.addEventListener("mousedown", onPointerDown); + document.addEventListener("keydown", onEscape); + + return () => { + document.removeEventListener("mousedown", onPointerDown); + document.removeEventListener("keydown", onEscape); + }; + }, []); + + function onSelect(nextLocale: (typeof locales)[number]["value"]) { + setLocale(nextLocale); + setOpen(false); + } + return ( -
- + {currentLocale?.label ?? locale} + + + + {open && ( + + )}
); }