"use client"; import type { ReactNode } from "react"; import { useCallback, useEffect } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { Center, Menu, Stack, Text, useMantineColorScheme } from "@mantine/core"; import { useHotkeys, useTimeout } from "@mantine/hooks"; import { IconCheck, IconHome, IconLogin, IconLogout, IconMoon, IconSettings, IconSun, IconTool, } from "@tabler/icons-react"; import { signOut, useSession } from "@homarr/auth/client"; import { createModal, useModalAction } from "@homarr/modals"; import { useScopedI18n } from "@homarr/translation/client"; import "flag-icons/css/flag-icons.min.css"; import { useAuthContext } from "~/app/[locale]/_client-providers/session"; import { CurrentLanguageCombobox } from "./language/current-language-combobox"; interface UserAvatarMenuProps { children: ReactNode; } export const UserAvatarMenu = ({ children }: UserAvatarMenuProps) => { const t = useScopedI18n("common.userAvatar.menu"); const { colorScheme, toggleColorScheme } = useMantineColorScheme(); useHotkeys([["mod+J", toggleColorScheme]]); const ColorSchemeIcon = colorScheme === "dark" ? IconSun : IconMoon; const colorSchemeText = colorScheme === "dark" ? t("switchToLightMode") : t("switchToDarkMode"); const session = useSession(); const router = useRouter(); const { logoutUrl } = useAuthContext(); const { openModal } = useModalAction(LogoutModal); const handleSignout = useCallback(async () => { await signOut({ redirect: false, }); openModal({ onTimeout: () => { if (logoutUrl) { window.location.assign(logoutUrl); return; } router.refresh(); }, }); }, [logoutUrl, openModal, router]); return (
); }; const LogoutModal = createModal<{ onTimeout: () => void }>(({ actions, innerProps }) => { const t = useScopedI18n("common.userAvatar.menu"); const { start } = useTimeout(() => { actions.closeModal(); innerProps.onTimeout(); }, 1500); useEffect(() => { start(); }, [start]); return (