'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 (
) } async function createStuffAction( state: { previousState: { fullName?: string; email?: string; password?: string; } error: Record