"use client"; /** * Модалка создания сотрудника (#2556, эпик #2549) — `POST /api/v1/team/employees`. * * Пароль задаётся вручную менеджером/админом — email-рассылки нет (см. issue * DoD), поэтому после успешного создания показываем явное «передайте пароль * сотруднику» вместо тихого закрытия модалки. */ import { useState } from "react"; import type { FormEvent } from "react"; import { USERNAME_HINT, USERNAME_PATTERN, teamErrorMessage, useCreateEmployee, } from "@/lib/team-api"; interface CreateEmployeeFormProps { onClose: () => void; } export function CreateEmployeeForm({ onClose }: CreateEmployeeFormProps) { const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [showPassword, setShowPassword] = useState(false); const [displayName, setDisplayName] = useState(""); const [orgName, setOrgName] = useState(""); const [email, setEmail] = useState(""); const [monthlyLimit, setMonthlyLimit] = useState(""); const [usernameTouched, setUsernameTouched] = useState(false); const createMutation = useCreateEmployee(); const usernameValid = USERNAME_PATTERN.test(username); const usernameInvalid = usernameTouched && username.length > 0 && !usernameValid; function handleSubmit(e: FormEvent) { e.preventDefault(); setUsernameTouched(true); if (createMutation.isPending) return; if (!USERNAME_PATTERN.test(username)) return; if (password.length === 0) return; const parsedLimit = monthlyLimit.trim() === "" ? undefined : Number(monthlyLimit); createMutation.mutate({ username: username.trim(), password, display_name: displayName.trim() || undefined, org_name: orgName.trim() || undefined, email: email.trim() || undefined, monthly_limit: parsedLimit !== undefined && Number.isFinite(parsedLimit) && parsedLimit >= 1 ? Math.trunc(parsedLimit) : undefined, }); } if (createMutation.isSuccess) { return (
e.stopPropagation()} >

Сотрудник создан

Логин «{createMutation.data.username}» готов. Передайте пароль сотруднику — он не сохраняется в системе и не отправляется автоматически.

); } return (
e.stopPropagation()} onSubmit={handleSubmit} >

Новый сотрудник

Пароль задаётся вручную — передайте его сотруднику лично, рассылки нет.

{createMutation.isError ? (

{teamErrorMessage(createMutation.error)}

) : null}
setUsername(e.target.value)} onBlur={() => setUsernameTouched(true)} disabled={createMutation.isPending} aria-invalid={usernameInvalid} />

{USERNAME_HINT}

{usernameInvalid ? (

Логин не соответствует формату

) : null}
setPassword(e.target.value)} disabled={createMutation.isPending} />
setDisplayName(e.target.value)} disabled={createMutation.isPending} />
setOrgName(e.target.value)} disabled={createMutation.isPending} />
setEmail(e.target.value)} disabled={createMutation.isPending} />
setMonthlyLimit(e.target.value)} disabled={createMutation.isPending} />
); }