'use client'; import { useState } from 'react'; import { useRouter } from 'next/navigation'; import { zodResolver } from '@hookform/resolvers/zod'; import { useQuery } from '@tanstack/react-query'; import { useForm } from 'react-hook-form'; import { useSupabase } from '@kit/supabase/hooks/use-supabase'; import { AlertDialog, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from '@kit/ui/alert-dialog'; import { Button } from '@kit/ui/button'; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from '@kit/ui/form'; import { Input } from '@kit/ui/input'; import { LoadingOverlay } from '@kit/ui/loading-overlay'; import { impersonateUserAction } from '../lib/server/admin-server-actions'; import { ImpersonateUserSchema } from '../lib/server/schema/admin-actions.schema'; export function AdminImpersonateUserDialog( props: React.PropsWithChildren<{ userId: string; }>, ) { const form = useForm({ resolver: zodResolver(ImpersonateUserSchema), defaultValues: { userId: props.userId, confirmation: '', }, }); const [tokens, setTokens] = useState<{ accessToken: string; refreshToken: string; }>(); if (tokens) { return ( <> Setting up your session... ); } return ( {props.children} Impersonate User Are you sure you want to impersonate this user? You will be logged in as this user. To stop impersonating, log out.
{ const tokens = await impersonateUserAction(data); setTokens(tokens); })} > ( Type CONFIRM to confirm Are you sure you want to impersonate this user? )} /> Cancel
); } function ImpersonateUserAuthSetter({ tokens, }: React.PropsWithChildren<{ tokens: { accessToken: string; refreshToken: string; }; }>) { useSetSession(tokens); return Setting up your session...; } function useSetSession(tokens: { accessToken: string; refreshToken: string }) { const supabase = useSupabase(); const router = useRouter(); return useQuery({ queryKey: ['impersonate-user', tokens.accessToken, tokens.refreshToken], queryFn: async () => { await supabase.auth.setSession({ refresh_token: tokens.refreshToken, access_token: tokens.accessToken, }); router.push('/home'); }, }); }