"use client"; import type { ReactNode } from "react"; import { useCallback } from "react"; import { Menu } from "@mantine/core"; import { IconBrandDocker, IconHome, IconLogin, IconLogout, IconSettings, IconTool } from "@tabler/icons-react"; import type { RouterOutputs } from "@homarr/api"; import { signOut, useSession } from "@homarr/auth/client"; import { useModalAction } from "@homarr/modals"; import { useScopedI18n } from "@homarr/translation/client"; import { Link } from "@homarr/ui"; import { useAuthContext } from "~/app/[locale]/_client-providers/session"; import { CurrentColorSchemeCombobox } from "./color-scheme/current-color-scheme-combobox"; import { CurrentLanguageCombobox } from "./language/current-language-combobox"; import { DockerQuickAccessModal } from "./layout/header/docker-quick-access-modal"; import { AvailableUpdatesMenuItem } from "./layout/header/update"; interface UserAvatarMenuProps { children: ReactNode; availableUpdates?: RouterOutputs["updateChecker"]["getAvailableUpdates"]; isDockerEnabled?: boolean; opened: boolean; onOpenChange: (opened: boolean) => void; } export const UserAvatarMenu = ({ children, availableUpdates, isDockerEnabled, opened, onOpenChange, }: UserAvatarMenuProps) => { const t = useScopedI18n("common.userAvatar.menu"); const session = useSession(); const { logoutUrl } = useAuthContext(); const { openModal: openDockerModal } = useModalAction(DockerQuickAccessModal); const handleSignout = useCallback(async () => { const redirectUrl = logoutUrl ?? "/auth/login"; await signOut({ redirect: false, }); window.location.assign(redirectUrl); }, [logoutUrl]); return ( // We use keepMounted so we can add event listeners to prevent navigating away without saving the board }> {t("homeBoard")} {Boolean(session.data) && ( <> } > {t("preferences")} }> {t("management")} {isDockerEnabled && ( } onClick={() => openDockerModal()}> {t("docker")} )} )} {session.status === "authenticated" ? ( } color="red"> {t("logout")} ) : ( }> {t("login")} )} {children} ); };