"use client"; import { ChevronDown, Globe, LogOut, User, Key, Home, Menu, } from "lucide-react"; import { Button } from "@/shared/common/ui/button"; import { Avatar, AvatarFallback } from "@/shared/common/ui/avatar"; import { useAuthUser } from "@/shared/hooks/useAuthUser"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/shared/common/ui/dropdown-menu"; import { useTranslation } from "react-i18next"; import { NavLink, useNavigate, useLocation } from "react-router-dom"; import { useRef, useEffect, useState } from "react"; import { FiBell } from "react-icons/fi"; import { useUser } from "@/shared/context/UserContext"; import { UI_LANGUAGE_OPTIONS, getUiLanguageLabel, resolveUiLanguage, } from "@/shared/i18n/uiLanguages"; import { useNotifications } from "@/shared/hooks/useNotification"; import NotificationList from "@/record-management/components/NotificationList"; import { resolveModuleConfig, useTenantConfig, } from "@/layout/components/TenantConfig"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/shared/common/ui/tooltip"; export const TopBar = () => { const { t, i18n } = useTranslation(); const navigate = useNavigate(); const { pathname } = useLocation(); const { logout } = useAuthUser(); const userDetails = useUser(); const { config: tenantConfig } = useTenantConfig(); const moduleConfig = resolveModuleConfig(tenantConfig); const isAdminModuleVisible = userDetails?.roles?.some( (role: { key: string }) => role.key === "unit_admin" || role.key === "organization_admin" || role.key === "super_admin", ); const visibleModuleCount = [ moduleConfig.recordManagement, moduleConfig.performance, moduleConfig.objective, moduleConfig.dms, moduleConfig.siteManagement && isAdminModuleVisible, ].filter(Boolean).length; const shouldShowHomePageLink = visibleModuleCount > 1; const fullName = userDetails?.name?.en || t("user"); const splittedName = fullName.trim().split(" "); const initials = splittedName.length === 1 ? splittedName[0][0] : `${splittedName[0][0]}${splittedName[1][0]}`; const changeLanguage = (lng: string) => { i18n.changeLanguage(lng); }; const currentLanguage = resolveUiLanguage(i18n.language); const handleLogout = () => { logout(); }; const userRoles = userDetails?.roles?.map((role: any) => role.key) || []; const isSuperAdmin = userRoles.includes("super_admin"); const isOrgAdmin = userRoles.includes("unit_admin") || userRoles.includes("organization_admin"); const modulesList = [ { id: "homepage", label: t("nav.homePage", "Home Page"), path: "/homepage", }, ...(moduleConfig.recordManagement ? [ { id: "recordManagement", label: t("nav.Record Management", "Record Management"), path: "/record-management/dashboard", }, ] : []), ...(moduleConfig.performance ? [ { id: "performanceManagement", label: t("nav.PerformanceManagement", "Performance Management"), path: "/performance-management/plan-years", }, ] : []), ...(moduleConfig.objective ? [ { id: "objectiveManagement", label: t("nav.objectiveManagement", "Objective Management"), path: "/objective-management/plan-years", }, ] : []), ...(moduleConfig.dms ? [ { id: "documentManagement", label: t("nav.DocumentManagement", "Document Management"), path: "/dms/dashboard", }, ] : []), ...(isOrgAdmin && moduleConfig.siteManagement ? [ { id: "orgAdmin", label: t("nav.admin", "Admin"), path: "/user-management/user_management-dashboard", }, ] : []), ...(isSuperAdmin ? [ { id: "superAdmin", label: t("OrganizationAdmin", "Super Admin"), path: "/user-management/dashboard", }, ] : []), ]; const [openNotifications, setOpenNotifications] = useState(false); const dropdownRef = useRef(null); const { unseenCount, refresh } = useNotifications({ take: 1, skip: 0, orderBy: "createdAt:DESC", }); // Close notification panel on outside click useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( dropdownRef.current && !dropdownRef.current.contains(event.target as Node) ) { setOpenNotifications(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); return ( <>
{t("nav.moduleNavigationHint")} {modulesList .filter((item) => { const currentPath = pathname; if (item.id === "homepage") { return !currentPath.startsWith("/homepage"); } if (item.id === "recordManagement") { return !currentPath.startsWith("/record-management"); } if (item.id === "performanceManagement") { return !currentPath.startsWith("/performance-management"); } if (item.id === "objectiveManagement") { return !currentPath.startsWith("/objective-management"); } if (item.id === "documentManagement") { return !currentPath.startsWith("/dms"); } if (item.id === "complaints") { return !currentPath.startsWith("/complaints"); } if (item.id === "orgAdmin" || item.id === "superAdmin") { return !currentPath.startsWith("/user-management"); } return true; }) .map((item) => ( navigate(item.path)} className="cursor-pointer hover:bg-primary-50 dark:hover:bg-primary-900/30 hover:text-primary-700 dark:hover:text-primary-400 py-2.5" > {item.label} ))}
{/* Notification bell */}
{openNotifications && (
)}
changeLanguage("en")} className="cursor-pointer hover:bg-primary-50 dark:hover:bg-primary-900/30 hover:text-primary-700 dark:hover:text-primary-400"> English changeLanguage("am")} className="cursor-pointer hover:bg-primary-50 dark:hover:bg-primary-900/30 hover:text-primary-700 dark:hover:text-primary-400"> አማርኛ
{initials.toUpperCase()}
{userDetails?.name?.en}
@{userDetails?.username}
navigate("/profile")} className="cursor-pointer hover:bg-primary-50 dark:hover:bg-primary-900/30 hover:text-primary-700 dark:hover:text-primary-400 py-2.5"> {t("header.viewProfile")} navigate("/dashboard/profile")} className="cursor-pointer hover:bg-primary-50 dark:hover:bg-primary-900/30 hover:text-primary-700 dark:hover:text-primary-400 py-2.5"> {t("header.changePassword")} {t("header.signOut")}
); };