"use client"; import { useMemo, useState } from "react"; import { Check, ChevronsUpDown } from "lucide-react"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from "@/components/ui/command"; import type { ImpersonationUser } from "@/lib/impersonation"; import { cn } from "@/lib/utils"; interface ImpersonationModalProps { users: ImpersonationUser[]; open: boolean; onOpenChange: (open: boolean) => void; onStart?: () => void; } export function ImpersonationModal({ users, open, onOpenChange, onStart }: ImpersonationModalProps) { const [userId, setUserId] = useState(""); const [pickerOpen, setPickerOpen] = useState(false); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); const selectedUser = useMemo( () => users.find((user) => String(user.id) === userId) ?? null, [users, userId], ); async function startImpersonation() { if (!userId) return; setBusy(true); setError(null); try { const response = await fetch("/api/impersonation/start", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ userId }), }); const body = await response.json().catch(() => null); if (!response.ok) throw new Error(body?.error ?? "Unable to start impersonation."); onOpenChange(false); onStart?.(); } catch (e) { setError(e instanceof Error ? e.message : "Unable to start impersonation."); } finally { setBusy(false); } } return ( Impersonate a user All requests will use the selected user's identity and permissions until you return to your account.
No users found. {users.map((user) => ( { setUserId(String(user.id)); setPickerOpen(false); }} > {user.displayName || user.username || `User ${user.id}`} {user.username ? ` (${user.username})` : ""} ))}
{error &&

{error}

}
); }