diff --git a/src/components/frontend/blocks/AppSidebar.tsx b/src/components/frontend/blocks/AppSidebar.tsx index 70f4d75..d89b528 100644 --- a/src/components/frontend/blocks/AppSidebar.tsx +++ b/src/components/frontend/blocks/AppSidebar.tsx @@ -274,15 +274,9 @@ export function AppSidebar({
@@ -327,6 +321,7 @@ export function AppSidebar({ avatar: "", }} showCallsign={showCallsign} + canImpersonate={canImpersonate} /> diff --git a/src/components/frontend/blocks/NavUser.tsx b/src/components/frontend/blocks/NavUser.tsx index 0971298..ca8bd65 100644 --- a/src/components/frontend/blocks/NavUser.tsx +++ b/src/components/frontend/blocks/NavUser.tsx @@ -1,6 +1,6 @@ "use client"; -import { BadgeCheck, Bird, Bomb, ChevronsUpDown, FileTextIcon, LogOut } from "lucide-react"; +import { BadgeCheck, Bird, Bomb, ChevronsUpDown, FileTextIcon, LogOut, Users2 } from "lucide-react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useState } from "react"; @@ -21,10 +21,14 @@ import { SidebarMenuItem, useSidebar, } from "@/components/ui/sidebar"; +import type { User } from "@/payload-types"; +import { ImpersonationModal } from "@/components/frontend/impersonation/ImpersonationModal"; +import { getImpersonationUsers } from "@/app/(frontend)/impersonate/actions"; export function NavUser({ user, showCallsign = false, + canImpersonate = false, }: { user: { displayName: string; @@ -32,10 +36,14 @@ export function NavUser({ avatar: string; }; showCallsign?: boolean; + canImpersonate?: boolean; }) { const { isMobile } = useSidebar(); const router = useRouter(); const [loggingOut, setLoggingOut] = useState(false); + const [showImpersonationModal, setShowImpersonationModal] = useState(false); + const [impersonationUsers, setImpersonationUsers] = useState([]); + const [loadingImpersonationUsers, setLoadingImpersonationUsers] = useState(false); const primaryLine = showCallsign ? user.username : user.displayName; const secondaryLine = showCallsign ? user.displayName : user.username; @@ -53,6 +61,24 @@ export function NavUser({ router.refresh(); }; + const handleOpenImpersonationModal = async () => { + setLoadingImpersonationUsers(true); + try { + const users = await getImpersonationUsers(); + setImpersonationUsers(users); + } catch (error) { + console.error("Failed to load impersonation users:", error); + } finally { + setLoadingImpersonationUsers(false); + } + setShowImpersonationModal(true); + }; + + const handleImpersonationStarted = async () => { + router.push("/"); + router.refresh(); + }; + return ( @@ -122,10 +148,12 @@ export function NavUser({ Account - {/* */} - {/* */} - {/* Notifications */} - {/* */} + {canImpersonate && ( + + + Impersonate + + )} handleLogout()}> @@ -135,6 +163,12 @@ export function NavUser({ + ); }