"use client"; import React, { useState } from "react"; import { useRouter } from "next/navigation"; import "./AddUser.scss"; import { addUser } from "@/services/roles.services"; import { IEditUserForm } from "../User.interfaces"; import { COUNTRY_CODES } from "../constants"; import { formatPhoneDisplay, validatePhone } from "../utils"; interface AddUserFormProps { onSuccess?: () => void; } const AddUserForm: React.FC = ({ onSuccess }) => { const router = useRouter(); const [form, setForm] = useState({ username: "", firstName: "", lastName: "", email: "", phone: "", role: "", merchants: [], groups: [], jobTitle: "", }); const [error, setError] = useState(""); const [loading, setLoading] = useState(false); const [phoneError, setPhoneError] = useState(""); const [countryCode, setCountryCode] = useState("+1"); const handleChange = ( e: React.ChangeEvent ) => { const { name, value } = e.target; if (name === "countryCode") { setCountryCode(value); return; } // Handle array fields (merchants and groups) if (name === "merchants" || name === "groups") { if (value === "") { // If empty selection, set empty array setForm(prev => ({ ...prev, [name]: [] })); } else { // Add the selected value to the array if not already present setForm(prev => { const currentArray = prev[name as keyof IEditUserForm] as string[]; if (!currentArray.includes(value)) { return { ...prev, [name]: [...currentArray, value] }; } return prev; }); } } else { // Handle single value fields setForm(prev => ({ ...prev, [name]: value })); } }; const handleCountryCodeChange = (e: React.ChangeEvent) => { const newCountryCode = e.target.value; setCountryCode(newCountryCode); // Re-validate phone if it exists if (form.phone) { const phoneError = validatePhone(form.phone, newCountryCode); setPhoneError(phoneError); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); // Validate phone number if provided if (form.phone && phoneError) { setError("Please fix phone number errors before submitting."); return; } if ( !form.firstName || !form.lastName || !form.email || form.merchants.length === 0 || form.groups.length === 0 || !form.jobTitle ) { setError("Please fill in all required fields."); return; } try { setLoading(true); setError(""); // Format phone number with country code before submission const formattedForm = { ...form, phone: form.phone ? formatPhoneDisplay(form.phone, countryCode) : "", }; await addUser(formattedForm); if (onSuccess) onSuccess(); router.refresh(); // <- refreshes the page (SSR re-runs) // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (err: any) { setError(err.message || "Something went wrong."); } finally { setLoading(false); } }; return (
{form.merchants.length > 0 && (
{form.merchants.map((merchant, index) => ( {merchant} ))}
)}
{form.groups.length > 0 && (
{form.groups.map((group, index) => ( {group} ))}
)}
{error && {error}} {phoneError}
); }; export default AddUserForm;