@@ -21,8 +21,7 @@ import {
2121} from "~/components/primitives/Table" ;
2222import { useUser } from "~/hooks/useUser" ;
2323import { adminGetUsers , redirectWithImpersonation } from "~/models/admin.server" ;
24- import { commitImpersonationSession , setImpersonationId } from "~/services/impersonation.server" ;
25- import { requireUserId } from "~/services/session.server" ;
24+ import { requireUser , requireUserId } from "~/services/session.server" ;
2625import { createSearchParams } from "~/utils/searchParams" ;
2726
2827export const SearchParams = z . object ( {
@@ -32,7 +31,29 @@ export const SearchParams = z.object({
3231
3332export type SearchParams = z . infer < typeof SearchParams > ;
3433
34+ const FormSchema = z . object ( { id : z . string ( ) } ) ;
35+
36+ async function handleImpersonationRequest (
37+ request : Request ,
38+ userId : string
39+ ) : Promise < Response > {
40+ const user = await requireUser ( request ) ;
41+ if ( ! user . admin ) {
42+ return redirect ( "/" ) ;
43+ }
44+ return redirectWithImpersonation ( request , userId , "/" ) ;
45+ }
46+
3547export const loader = async ( { request, params } : LoaderFunctionArgs ) => {
48+ // Check if this is an impersonation request via query parameter (e.g., from Plain customer cards)
49+ const url = new URL ( request . url ) ;
50+ const impersonateUserId = url . searchParams . get ( "impersonate" ) ;
51+
52+ if ( impersonateUserId ) {
53+ return handleImpersonationRequest ( request , impersonateUserId ) ;
54+ }
55+
56+ // Normal loader logic for admin dashboard
3657 const userId = await requireUserId ( request ) ;
3758
3859 const searchParams = createSearchParams ( request . url , SearchParams ) ;
@@ -44,8 +65,6 @@ export const loader = async ({ request, params }: LoaderFunctionArgs) => {
4465 return typedjson ( result ) ;
4566} ;
4667
47- const FormSchema = z . object ( { id : z . string ( ) } ) ;
48-
4968export async function action ( { request } : ActionFunctionArgs ) {
5069 if ( request . method . toLowerCase ( ) !== "post" ) {
5170 return new Response ( "Method not allowed" , { status : 405 } ) ;
@@ -54,7 +73,7 @@ export async function action({ request }: ActionFunctionArgs) {
5473 const payload = Object . fromEntries ( await request . formData ( ) ) ;
5574 const { id } = FormSchema . parse ( payload ) ;
5675
57- return redirectWithImpersonation ( request , id , "/" ) ;
76+ return handleImpersonationRequest ( request , id ) ;
5877}
5978
6079export default function AdminDashboardRoute ( ) {
0 commit comments