diff --git a/apps/web/src/app/admin/components/UserAdmin/UserAdminAccountInfo.tsx b/apps/web/src/app/admin/components/UserAdmin/UserAdminAccountInfo.tsx index 80c5d38fb4..9810f47f49 100644 --- a/apps/web/src/app/admin/components/UserAdmin/UserAdminAccountInfo.tsx +++ b/apps/web/src/app/admin/components/UserAdmin/UserAdminAccountInfo.tsx @@ -12,6 +12,10 @@ import { Button } from '@/components/ui/button'; import Link from 'next/link'; import { SquareArrowOutUpRight, Webhook } from 'lucide-react'; import { createHash } from 'crypto'; +import { useMutation } from '@tanstack/react-query'; +import { useTRPC } from '@/lib/trpc/utils'; +import { toast } from 'sonner'; +import { useState } from 'react'; function getGravatarUrl(email: string, size: number = 80): string { const hash = createHash('md5').update(email.toLowerCase().trim()).digest('hex'); @@ -25,6 +29,24 @@ export function UserAdminAccountInfo(user: UserAdminAccountInfoProps) { const stripeUrl = `https://dashboard.stripe.com/${process.env.NODE_ENV === 'development' ? 'test/' : ''}customers/${user.stripe_customer_id}`; const hibpUrl = `https://haveibeenpwned.com/account/${encodeURIComponent(user.google_user_email)}`; + const trpc = useTRPC(); + const [isOpenAIDeactivated, setIsOpenAIDeactivated] = useState(user.is_openai_deactivated); + const toggleOpenAIDeactivated = useMutation( + trpc.admin.users.setOpenAIDeactivated.mutationOptions({ + onSuccess: (_, variables) => { + setIsOpenAIDeactivated(variables.is_openai_deactivated); + toast.success( + variables.is_openai_deactivated + ? 'OpenAI deactivated: balanced will route to Kimi K2.5' + : 'OpenAI re-enabled: balanced will route to Codex' + ); + }, + onError: error => { + toast.error(error.message || 'Failed to update OpenAI deactivation status'); + }, + }) + ); + return ( {!user.is_sso_protected_domain && } +