import React, { useState } from 'react'; import api from '../utils/api'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from './ui/dialog'; import { Button } from './ui/button'; import { Input } from './ui/input'; import { Label } from './ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './ui/select'; import { toast } from 'sonner'; import { Loader2, UserPlus } from 'lucide-react'; const CreateStaffDialog = ({ open, onOpenChange, onSuccess }) => { const [formData, setFormData] = useState({ email: '', password: '', first_name: '', last_name: '', phone: '', member_since: '', role: 'admin' }); const [loading, setLoading] = useState(false); const [errors, setErrors] = useState({}); const getTodayDate = () => new Date().toISOString().slice(0, 10); const handleChange = (field, value) => { setFormData(prev => ({ ...prev, [field]: value })); // Clear error when user starts typing if (errors[field]) { setErrors(prev => ({ ...prev, [field]: null })); } }; const validate = () => { const newErrors = {}; if (!formData.email) { newErrors.email = 'Email is required'; } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email)) { newErrors.email = 'Invalid email format'; } if (!formData.password || formData.password.length < 8) { newErrors.password = 'Password must be at least 8 characters'; } if (!formData.first_name) { newErrors.first_name = 'First name is required'; } if (!formData.last_name) { newErrors.last_name = 'Last name is required'; } if (!formData.phone) { newErrors.phone = 'Phone is required'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async (e) => { e.preventDefault(); if (!validate()) { return; } setLoading(true); try { const payload = { ...formData }; if (!payload.member_since) { payload.member_since = getTodayDate(); } await api.post('/admin/users/create', payload); toast.success('Staff member created successfully'); // Reset form setFormData({ email: '', password: '', first_name: '', last_name: '', phone: '', member_since: '', role: 'admin' }); onOpenChange(false); if (onSuccess) onSuccess(); } catch (error) { const errorMessage = error.response?.data?.detail || 'Failed to create staff member'; toast.error(errorMessage); } finally { setLoading(false); } }; return ( Create Staff Member Create a new staff account with direct login access. User will be created immediately.
{/* Email */}
handleChange('email', e.target.value)} className="rounded-xl border-2 border-[var(--neutral-800)] focus:border-brand-purple " placeholder="staff@example.com" /> {errors.email && (

{errors.email}

)}
{/* Password */}
handleChange('password', e.target.value)} className="rounded-xl border-2 border-[var(--neutral-800)] focus:border-brand-purple " placeholder="Minimum 8 characters" /> {errors.password && (

{errors.password}

)}
{/* First Name */}
handleChange('first_name', e.target.value)} className="rounded-xl border-2 border-[var(--neutral-800)] focus:border-brand-purple " placeholder="Jane" /> {errors.first_name && (

{errors.first_name}

)}
{/* Last Name */}
handleChange('last_name', e.target.value)} className="rounded-xl border-2 border-[var(--neutral-800)] focus:border-brand-purple " placeholder="Doe" /> {errors.last_name && (

{errors.last_name}

)}
{/* Phone */}
handleChange('phone', e.target.value)} className="rounded-xl border-2 border-[var(--neutral-800)] focus:border-brand-purple " placeholder="(555) 123-4567" /> {errors.phone && (

{errors.phone}

)}
{/* Member Since */}
handleChange('member_since', e.target.value)} className="rounded-xl border-2 border-[var(--neutral-800)] focus:border-brand-purple " />
{/* Role */}
); }; export default CreateStaffDialog;