All checks were successful
Build and Push Docker Image / build (push) Successful in 9m59s
Replace router.push() with window.location.href for both start and end impersonation to ensure the updated JWT cookie is sent with the new request. Client-side routing can race with cookie propagation, causing the server to see the old session and redirect back to admin. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
51 lines
1.6 KiB
TypeScript
51 lines
1.6 KiB
TypeScript
'use client'
|
|
|
|
import { useSession } from 'next-auth/react'
|
|
import { useRouter } from 'next/navigation'
|
|
import { trpc } from '@/lib/trpc/client'
|
|
import { Button } from '@/components/ui/button'
|
|
import { ArrowLeft, Loader2 } from 'lucide-react'
|
|
import { toast } from 'sonner'
|
|
|
|
export function ImpersonationBanner() {
|
|
const { data: session, update } = useSession()
|
|
const router = useRouter()
|
|
const endImpersonation = trpc.user.endImpersonation.useMutation()
|
|
|
|
if (!session?.user?.impersonating) return null
|
|
|
|
const handleReturn = async () => {
|
|
try {
|
|
await endImpersonation.mutateAsync()
|
|
await update({ endImpersonation: true })
|
|
// Full page navigation to ensure updated JWT cookie is sent
|
|
window.location.href = '/admin/members'
|
|
} catch (error) {
|
|
toast.error(error instanceof Error ? error.message : 'Failed to end impersonation')
|
|
}
|
|
}
|
|
|
|
return (
|
|
<div className="fixed top-0 left-0 right-0 z-50 flex items-center justify-center gap-3 bg-red-600 px-4 py-1.5 text-sm text-white shadow-md">
|
|
<span>
|
|
Impersonating <strong>{session.user.name || session.user.email}</strong>{' '}
|
|
({session.user.role.replace('_', ' ')})
|
|
</span>
|
|
<Button
|
|
size="sm"
|
|
variant="secondary"
|
|
className="h-6 px-3 text-xs"
|
|
onClick={handleReturn}
|
|
disabled={endImpersonation.isPending}
|
|
>
|
|
{endImpersonation.isPending ? (
|
|
<Loader2 className="mr-1 h-3 w-3 animate-spin" />
|
|
) : (
|
|
<ArrowLeft className="mr-1 h-3 w-3" />
|
|
)}
|
|
Return to Admin
|
|
</Button>
|
|
</div>
|
|
)
|
|
}
|