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 { toast } from 'sonner'; import { Loader2, UserPlus } from 'lucide-react'; const CreateMemberDialog = ({ open, onOpenChange, onSuccess }) => { const [formData, setFormData] = useState({ email: '', password: '', first_name: '', last_name: '', phone: '', address: '', city: '', state: '', zipcode: '', date_of_birth: '', member_since: '', role: 'member' }); const [loading, setLoading] = useState(false); const [errors, setErrors] = useState({}); 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 { // Format dates for backend const payload = { ...formData }; if (payload.date_of_birth === '') { delete payload.date_of_birth; } if (payload.member_since === '') { delete payload.member_since; } await api.post('/admin/users/create', payload); toast.success('Member created successfully'); // Reset form setFormData({ email: '', password: '', first_name: '', last_name: '', phone: '', address: '', city: '', state: '', zipcode: '', date_of_birth: '', member_since: '', role: 'member' }); onOpenChange(false); if (onSuccess) onSuccess(); } catch (error) { const errorMessage = error.response?.data?.detail || 'Failed to create member'; toast.error(errorMessage); } finally { setLoading(false); } }; return ( Create Member Create a new member account with direct login access. Member will be created immediately.
{/* Email & Password Row */}
handleChange('email', e.target.value)} className="rounded-xl border-2 border-[var(--neutral-800)] focus:border-brand-purple " placeholder="member@example.com" /> {errors.email && (

{errors.email}

)}
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}

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

{errors.first_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}

)}
{/* Address */}
handleChange('address', e.target.value)} className="rounded-xl border-2 border-[var(--neutral-800)] focus:border-brand-purple " placeholder="123 Main St" />
{/* City, State, Zipcode Row */}
handleChange('city', e.target.value)} className="rounded-xl border-2 border-[var(--neutral-800)] focus:border-brand-purple " placeholder="San Francisco" />
handleChange('state', e.target.value)} className="rounded-xl border-2 border-[var(--neutral-800)] focus:border-brand-purple " placeholder="CA" maxLength={2} />
handleChange('zipcode', e.target.value)} className="rounded-xl border-2 border-[var(--neutral-800)] focus:border-brand-purple " placeholder="94102" />
{/* Dates Row */}
handleChange('date_of_birth', e.target.value)} className="rounded-xl border-2 border-[var(--neutral-800)] focus:border-brand-purple " />
handleChange('member_since', e.target.value)} className="rounded-xl border-2 border-[var(--neutral-800)] focus:border-brand-purple " />
); }; export default CreateMemberDialog;