import { useState, useEffect } from 'react'; import { Dialog, DialogTitle, DialogContent, DialogActions, Button, Grid, TextField, MenuItem, Alert, CircularProgress, IconButton, useMediaQuery } from '@mui/material'; import { useTheme } from '@mui/material/styles'; import CloseIcon from '@mui/icons-material/Close'; import { createUser, updateUser } from '@/utils/apiClient'; const ROLES = ['admin', 'rep', 'manager']; const EMPTY = { name: '', email: '', phone: '', role: 'rep', pin: '', password: '' }; const withValue = (opts, v) => (v && !opts.includes(v) ? [v, ...opts] : opts); export default function UserFormDialog({ open, mode, initial, onClose, onSaved }) { const isEdit = mode === 'edit'; const theme = useTheme(); const fullScreen = useMediaQuery(theme.breakpoints.down('sm')); const [form, setForm] = useState(EMPTY); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); useEffect(() => { if (open) { setForm({ ...EMPTY, ...(initial || {}) }); setError(null); } }, [open, initial]); const set = (k) => (e) => setForm((f) => ({ ...f, [k]: e.target.value })); const handleSave = async () => { if (!form.name.trim()) { setError('Name is required.'); return; } if (!form.email.trim()) { setError('Email is required.'); return; } if (!isEdit && !form.password.trim()) { setError('Password is required.'); return; } setSaving(true); setError(null); const payload = { first_name: form.name.trim(), email: form.email.trim(), phone: form.phone, role: form.role, ...(form.password ? { password: form.password } : {}), ...(form.pin ? { pin: String(form.pin) } : {}), }; try { if (isEdit) { await updateUser(initial.id, payload); } else { await createUser(payload); } onSaved(); } catch (e) { setError(e.message || 'Failed to save user'); } finally { setSaving(false); } }; return ( {isEdit ? 'Edit Team User' : 'Add Team User'} {error && {error}} {withValue(ROLES, form.role).map((o) => {o})} ); }