"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 type { RouterOutputs } from "@homarr/api"; import { signOut, useSession } from "@homarr/auth/client"; import { createModal, useModalAction } from "@homarr/modals"; import { useScopedI18n } from "@homarr/translation/client"; import { useAuthContext } from "~/app/[locale]/_client-providers/session"; import { CurrentLanguageCombobox } from "./language/current-language-combobox"; import { AvailableUpdatesMenuItem } from "./layout/header/update"; interface UserAvatarMenuProps { children: ReactNode; availableUpdatesPromise?: Promise; } export const UserAvatarMenu = ({ children, availableUpdatesPromise }: 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 ( // We use keepMounted so we can add event listeners to prevent navigating away without saving the board }> {colorSchemeText} }> {t("homeBoard")} {Boolean(session.data) && ( <> } > {t("preferences")} }> {t("management")} )} {session.status === "authenticated" ? ( } color="red"> {t("logout")} ) : ( }> {t("login")} )} {children} ); }; 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 (
{t("loggedOut")}
); }).withOptions({ centered: true, withCloseButton: false, transitionProps: { transition: "pop", }, size: 200, closeOnClickOutside: false, closeOnEscape: false, });