import { useState, type FormEvent } from 'react' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { X } from 'lucide-react' import { createAdminUser, listAdminTeams } from '@/api/admin' import { ApiError, errorDetail } from '@/api/client' import { Select } from '@/components/ui/Select' import { useToast } from '@/components/ui/ToastProvider' /** Верхний предел выборки команд для селекта — без отдельной пагинации в этом контексте (как в AdminUsersTab). */ const TEAMS_LIMIT = 200 interface AdminUserCreateDialogProps { onClose: () => void } /** * Диалог «Добавить пользователя» в админке (вкладка «Пользователи») — * по образцу `AdminUserProfileDialog`. ФИО, email, * команда (справочник команд) и пароль; создание сразу с подтверждённой * почтой (`email_verified = true` выставляет backend). Роль остаётся * дефолтной («Пользователь») — сменить её можно потом из таблицы. */ export function AdminUserCreateDialog({ onClose }: AdminUserCreateDialogProps) { const toast = useToast() const queryClient = useQueryClient() const [name, setName] = useState('') const [email, setEmail] = useState('') const [password, setPassword] = useState('') const [teamId, setTeamId] = useState('') const [emailError, setEmailError] = useState(null) const { data: teamsData } = useQuery({ queryKey: ['admin', 'teams', 'all'], queryFn: () => listAdminTeams({ limit: TEAMS_LIMIT, offset: 0 }), }) const teams = teamsData?.items ?? [] const mutation = useMutation({ mutationFn: () => createAdminUser({ name_user: name.trim(), email: email.trim(), password, team_id: teamId === '' ? null : teamId }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin', 'users'] }) toast.show('Пользователь создан', 'success') onClose() }, onError: (err: unknown) => { if (err instanceof ApiError && err.status === 409) { setEmailError('Email уже зарегистрирован') } else if (err instanceof ApiError && err.status === 404 && errorDetail(err) === 'team_not_found') { toast.show('Выбранная команда не найдена — обновите список команд', 'error') } else { toast.show('Не удалось создать пользователя', 'error') } }, }) function handleSubmit(event: FormEvent) { event.preventDefault() setEmailError(null) mutation.mutate() } const canSubmit = name.trim().length > 0 && email.trim().length > 0 && password.length >= 8 return (
e.stopPropagation()}>

Добавить пользователя

setName(e.target.value)} maxLength={255} />
{ setEmail(e.target.value) setEmailError(null) }} /> {emailError && (

{emailError}

)}
setPassword(e.target.value)} />

Пользователь сможет сменить пароль после входа, в своём профиле

) }