import { useState } from 'react' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { useTranslation } from 'react-i18next' import { toast } from '@/shared/ui/toast-store' import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/shared/ui/dialog' import { Button } from '@/shared/ui/button' import { Input } from '@/shared/ui/input' import { Label } from '@/shared/ui/label' import { Badge } from '@/shared/ui/badge' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/shared/ui/select' import { listRoles } from '@/features/admin/roles/api' import { useAuthStore } from '@/features/auth/store' import type { UserSummaryDto } from '@/shared/api/types' import { blockUser, changeUserRole, deleteUser, forceRevokeConfig, getUserConfigs, resetUserPassword, unblockUser, } from './api' export function UserManageDialog({ user, open, onOpenChange }: { user: UserSummaryDto; open: boolean; onOpenChange: (open: boolean) => void }) { const { t } = useTranslation() const queryClient = useQueryClient() const [newPassword, setNewPassword] = useState('') const currentUserId = useAuthStore((state) => state.user?.id) const rolesQuery = useQuery({ queryKey: ['admin-roles'], queryFn: listRoles, enabled: open }) const configsQuery = useQuery({ queryKey: ['admin-user-configs', user.id], queryFn: () => getUserConfigs(user.id), enabled: open }) const invalidateUsers = () => queryClient.invalidateQueries({ queryKey: ['admin-users'] }) const blockMutation = useMutation({ mutationFn: () => (user.isBlocked ? unblockUser(user.id) : blockUser(user.id)), onSuccess: async () => { toast.success(user.isBlocked ? t('admin.users.unblocked') : t('admin.users.blocked')) await invalidateUsers() }, onError: () => toast.error(t('auth.genericError')), }) const roleMutation = useMutation({ mutationFn: (roleId: string) => changeUserRole(user.id, roleId), onSuccess: async () => { toast.success(t('admin.users.roleChanged')) await invalidateUsers() }, onError: () => toast.error(t('auth.genericError')), }) const resetPasswordMutation = useMutation({ mutationFn: () => resetUserPassword(user.id, newPassword), onSuccess: () => { toast.success(t('admin.users.passwordReset')) setNewPassword('') }, onError: () => toast.error(t('auth.genericError')), }) const revokeMutation = useMutation({ mutationFn: (configId: string) => forceRevokeConfig(configId), onSuccess: async () => { toast.success(t('configs.revoked')) await queryClient.invalidateQueries({ queryKey: ['admin-user-configs', user.id] }) }, onError: () => toast.error(t('auth.genericError')), }) const deleteMutation = useMutation({ mutationFn: () => deleteUser(user.id), onSuccess: async () => { toast.success(t('admin.users.deleted')) onOpenChange(false) await invalidateUsers() }, onError: () => toast.error(t('auth.genericError')), }) return ( {user.userName}
{user.isBlocked ? t('admin.users.status.blocked') : user.isActivated ? t('admin.users.status.active') : t('admin.users.status.pending')}
setNewPassword(e.target.value)} placeholder={t('auth.passwordHint')} />
{configsQuery.data?.length === 0 &&

{t('configs.empty')}

} {configsQuery.data?.map((config) => (
{config.label ?? config.location} · {config.protocol} · {t(`configs.status.${config.status}`)}
))}
{user.id !== currentUserId && ( )}
) }