'use client' import styles from '@/app/styles/module/login.module.scss' import { useActionState, useState, useRef, useEffect } from 'react'; import { createStuff } from '@/app/actions/stuffActions'; import { useTranslations } from 'next-intl'; import { IconEye } from '@/app/ui/icons/icons'; import { useQueryClient } from '@tanstack/react-query'; import { toast } from 'sonner'; import { z } from 'zod'; const createStuffSchema = z.object({ fullName: z.string() .min(2, 'full-name-too-short') .max(100, 'full-name-too-long') .trim(), email: z.string() .email('invalid-email') .toLowerCase() .trim(), password: z.string() .min(6, 'password-too-short') .max(50, 'password-too-long'), }) export default function CreateStaffForm({ onSuccess }: { onSuccess?: () => void }) { const [state, formAction, isPending] = useActionState( createStuffAction, undefined, ); const t = useTranslations('Login-register-form'); const tStaff = useTranslations('Staff'); const [showPassword, setShowPassword] = useState(false); function toggleShowPassword() { setShowPassword(!showPassword); } const queryClient = useQueryClient(); useEffect(() => { if (state?.success) { toast.success(tStaff('staff-created-successfully')); queryClient.invalidateQueries({ queryKey: ['stuffList'] }); if (onSuccess) { onSuccess(); } } if (state?.error?.server) { toast.error(t(state.error.server)); } }, [state, queryClient, onSuccess, t, tStaff]); return (
{/* Поле Email */}
{ e.target.value = e.target.value.toLowerCase(); }} /> {state?.error?.email && (

{t(state?.error?.email)}

)}
{/* Поле Password */}
{state?.error?.password && (

{t(state?.error?.password)}

)}
{/* Поле Full Name */}
{state?.error?.fullName && (

{t(state?.error?.fullName)}

)}
{/* Общая ошибка сервера */} {state?.error?.server && !state.success && (

{t(state?.error?.server)}

)} {/* Кнопка отправки */}
) } async function createStuffAction( state: { previousState: { fullName?: string; email?: string; password?: string; } error: Record success?: boolean; } | undefined, formData: FormData, ) { const fullName = formData.get('fullName') as string || ''; const email = formData.get('email') as string || ''; const password = formData.get('password') as string || ''; const validatedFields = createStuffSchema.safeParse({ fullName, email, password }); if (!validatedFields.success) { const errors: Record = {} JSON.parse(validatedFields.error.message).forEach((obj: { message: string, path: string[] }) => { const fieldName = obj.path[0]; if (errors[fieldName]) { errors[fieldName] = `${errors[fieldName]} ${obj.message}`; } else { errors[fieldName] = obj.message; } }); return { previousState: { fullName, email, password }, error: errors, success: false }; } try { const { fullName, email, password } = validatedFields.data; // Вызов API для создания сотрудника const result = await createStuff(fullName, email, password); if (result) { return { previousState: { fullName: '', email: '', password: '' }, error: {}, success: true }; } else { throw new Error('creation-failed'); } } catch (error) { const errors: Record = {} switch (error) { case 'email-already-exists': errors['email'] = 'email-already-exists'; break; case 'invalid-email': errors['email'] = 'invalid-email'; break; default: errors['server'] = 'request-ended-with-an-error'; break; } return { previousState: { fullName, email, password }, error: errors, success: false }; } }