"use client"; import React, { useState } from "react"; import { useDispatch, useSelector } from "react-redux"; import { AppDispatch } from "@/app/redux/store"; import "./AddUser.scss"; import { addUser } from "@/app/redux/auth/authSlice"; import { IEditUserForm } from "../User.interfaces"; import { COUNTRY_CODES } from "../constants"; import { formatPhoneDisplay, validatePhone } from "../utils"; import Spinner from "../../../components/Spinner/Spinner"; import { RootState } from "@/app/redux/store"; import toast from "react-hot-toast"; import Modal from "@/app/components/Modal/Modal"; import { selectAppMetadata } from "@/app/redux/metadata/selectors"; interface AddUserProps { open: boolean; onClose: () => void; } const AddUser: React.FC = ({ open, onClose }) => { const dispatch = useDispatch(); const { status, error: authError } = useSelector( (state: RootState) => state.auth ); const [form, setForm] = useState({ username: "", firstName: "", lastName: "", email: "", phone: "", role: "", merchants: [], groups: [], jobTitle: "", }); const [phoneError, setPhoneError] = useState(""); const [countryCode, setCountryCode] = useState("+1"); const data = useSelector(selectAppMetadata); const { merchants = [], groups = [], job_titles = [] } = data || {}; const loading = status === "loading"; 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) { return; } if ( !form.firstName || !form.lastName || !form.email || form.merchants.length === 0 || form.groups.length === 0 || !form.jobTitle ) { return; } // Format phone number with country code before submission const formattedForm = { ...form, phone: form.phone ? formatPhoneDisplay(form.phone, countryCode) : "", }; try { const resultAction = await dispatch(addUser(formattedForm)); const result = addUser.fulfilled.match(resultAction); if (result && resultAction.payload.success) { toast.success(resultAction.payload.message); // router.refresh(); onClose(); } } catch (err) { // Error is handled by Redux state console.error("Failed to add user:", err); } }; return (
{form.merchants.length > 0 && (
{form.merchants.map((merchant, index) => ( {merchant} ))}
)}
{form.groups.length > 0 && (
{form.groups.map((group, index) => ( {group} ))}
)}
{authError && ( {authError} )} {phoneError}
); }; export default AddUser;