diff --git a/components/compare-form.tsx b/components/compare-form.tsx index 56c4d5a..fe89b40 100644 --- a/components/compare-form.tsx +++ b/components/compare-form.tsx @@ -39,7 +39,7 @@ export function CompareForm({ }, []); const canSubmit = Boolean(username1.trim() && username2.trim() && !loading); - const isEmpty = !username1.trim() && !username2.trim(); + const isEmpty = (!username1.trim() && !username2.trim()) && !data; const handleSwap = () => { setUsername1(username2); 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 && ( + + )}
); }