From ce305eab58fa9e8fde659258c6898c7a0d2bc1bd Mon Sep 17 00:00:00 2001 From: dmitriylaukhin Date: Sat, 25 Apr 2026 12:52:13 +0500 Subject: [PATCH] Add admin impersonation button to users table Co-Authored-By: Claude Sonnet 4.6 --- src/components/admin/users-table.tsx | 63 ++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 13 deletions(-) diff --git a/src/components/admin/users-table.tsx b/src/components/admin/users-table.tsx index 48fd2b3..01ff35c 100644 --- a/src/components/admin/users-table.tsx +++ b/src/components/admin/users-table.tsx @@ -1,8 +1,10 @@ "use client"; import { useState } from "react"; +import { useRouter } from "next/navigation"; import Link from "next/link"; import { Badge } from "@/components/ui/badge"; +import { authClient } from "@/lib/auth-client"; type Enrollment = { courseId: string; @@ -90,6 +92,38 @@ function UserPopup({ user }: { user: UserRow }) { ); } +function ImpersonateButton({ userId }: { userId: string }) { + const router = useRouter(); + const [loading, setLoading] = useState(false); + + async function handleImpersonate() { + setLoading(true); + try { + await authClient.admin.impersonateUser({ userId }); + router.push("/dashboard"); + router.refresh(); + } finally { + setLoading(false); + } + } + + return ( + + ); +} + export function UsersTable({ users }: { users: UserRow[] }) { const [hoveredId, setHoveredId] = useState(null); @@ -134,21 +168,24 @@ export function UsersTable({ users }: { users: UserRow[] }) { {new Date(user.createdAt).toLocaleDateString("ru-RU")} - {/* Hover popup trigger */} + {/* Actions */} -
setHoveredId(user.id)} - onMouseLeave={() => setHoveredId(null)} - > - - {hoveredId === user.id && } + + {hoveredId === user.id && } +