"use client"; import { useState, useEffect, useRef } from "react"; import PropTypes from "prop-types"; import { LOCALE_COOKIE, normalizeLocale } from "@/i18n/config"; import { useTheme } from "@/shared/hooks/useTheme"; import ChangelogModal from "./ChangelogModal"; import NineRemotePromoModal from "./NineRemotePromoModal"; import LanguageSwitcher from "./LanguageSwitcher"; const LOCALE_INFO = { "en": { name: "English", flag: "🇺🇸" }, "vi": { name: "Tiếng Việt", flag: "🇻🇳" }, "zh-CN": { name: "简体中文", flag: "🇨🇳" }, "zh-TW": { name: "繁體中文", flag: "🇹🇼" }, "ja": { name: "日本語", flag: "🇯🇵" }, "pt-BR": { name: "Português (BR)", flag: "🇧🇷" }, "pt-PT": { name: "Português (PT)", flag: "🇵🇹" }, "ko": { name: "한국어", flag: "🇰🇷" }, "es": { name: "Español", flag: "🇪🇸" }, "de": { name: "Deutsch", flag: "🇩🇪" }, "fr": { name: "Français", flag: "🇫🇷" }, "he": { name: "עברית", flag: "🇮🇱" }, "ar": { name: "العربية", flag: "🇸🇦" }, "ru": { name: "Русский", flag: "🇷🇺" }, "pl": { name: "Polski", flag: "🇵🇱" }, "cs": { name: "Čeština", flag: "🇨🇿" }, "nl": { name: "Nederlands", flag: "🇳🇱" }, "tr": { name: "Türkçe", flag: "🇹🇷" }, "uk": { name: "Українська", flag: "🇺🇦" }, "tl": { name: "Tagalog", flag: "🇵🇭" }, "id": { name: "Indonesia", flag: "🇮🇩" }, "th": { name: "ไทย", flag: "🇹🇭" }, "hi": { name: "हिन्दी", flag: "🇮🇳" }, "bn": { name: "বাংলা", flag: "🇧🇩" }, "ur": { name: "اردو", flag: "🇵🇰" }, "ro": { name: "Română", flag: "🇷🇴" }, "sv": { name: "Svenska", flag: "🇸🇪" }, "it": { name: "Italiano", flag: "🇮🇹" }, "el": { name: "Ελληνικά", flag: "🇬🇷" }, "hu": { name: "Magyar", flag: "🇭🇺" }, "fi": { name: "Suomi", flag: "🇫🇮" }, "da": { name: "Dansk", flag: "🇩🇰" }, "no": { name: "Norsk", flag: "🇳🇴" }, }; function getLocaleFromCookie() { if (typeof document === "undefined") return "en"; const cookie = document.cookie .split(";") .find((c) => c.trim().startsWith(`${LOCALE_COOKIE}=`)); const value = cookie ? decodeURIComponent(cookie.split("=")[1]) : "en"; return normalizeLocale(value); } function MenuItem({ icon, label, onClick, trailing, danger }) { return ( ); } MenuItem.propTypes = { icon: PropTypes.string.isRequired, label: PropTypes.string.isRequired, onClick: PropTypes.func.isRequired, trailing: PropTypes.node, danger: PropTypes.bool, }; export default function HeaderMenu({ onLogout }) { const [isOpen, setIsOpen] = useState(false); const [changelogOpen, setChangelogOpen] = useState(false); const [remoteOpen, setRemoteOpen] = useState(false); const [langOpen, setLangOpen] = useState(false); const [locale, setLocale] = useState("en"); const { toggleTheme, isDark } = useTheme(); const menuRef = useRef(null); useEffect(() => { setLocale(getLocaleFromCookie()); }, [langOpen]); useEffect(() => { const handleClickOutside = (e) => { if (menuRef.current && !menuRef.current.contains(e.target)) { setIsOpen(false); } }; if (isOpen) { document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); } }, [isOpen]); const close = () => setIsOpen(false); return ( <>
{isOpen && (
{ close(); setChangelogOpen(true); }} /> { close(); setLangOpen(true); }} /> { toggleTheme(); close(); }} /> { close(); setRemoteOpen(true); }} /> { close(); onLogout(); }} />
)}
setChangelogOpen(false)} /> setRemoteOpen(false)} /> setLangOpen(false)} /> ); } HeaderMenu.propTypes = { onLogout: PropTypes.func.isRequired, };