import React, { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import type { SetupStepProps } from '../SetupWizard'; interface TeamMember { id: string; name: string; email: string; role: string; } export const TeamSetupStep: React.FC = ({ onUpdate, onComplete, canContinue }) => { const { t } = useTranslation(); // Local state for team members (will be sent to backend when API is available) const [teamMembers, setTeamMembers] = useState([]); const [isAdding, setIsAdding] = useState(false); const [formData, setFormData] = useState({ name: '', email: '', role: 'baker', }); const [errors, setErrors] = useState>({}); // Notify parent - Team step is always optional, so always canContinue useEffect(() => { onUpdate?.({ itemsCount: teamMembers.length, canContinue: true, // Always true since this step is optional }); }, [teamMembers.length, onUpdate]); // Validation const validateForm = (): boolean => { const newErrors: Record = {}; if (!formData.name.trim()) { newErrors.name = t('setup_wizard:team.errors.name_required', 'Name is required'); } if (!formData.email.trim()) { newErrors.email = t('setup_wizard:team.errors.email_required', 'Email is required'); } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email)) { newErrors.email = t('setup_wizard:team.errors.email_invalid', 'Invalid email format'); } // Check for duplicate email if (teamMembers.some((member) => member.email.toLowerCase() === formData.email.toLowerCase())) { newErrors.email = t('setup_wizard:team.errors.email_duplicate', 'This email is already added'); } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; // Form handlers const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) return; // Add team member to local state const newMember: TeamMember = { id: Date.now().toString(), name: formData.name, email: formData.email, role: formData.role, }; setTeamMembers([...teamMembers, newMember]); // Reset form resetForm(); }; const resetForm = () => { setFormData({ name: '', email: '', role: 'baker', }); setErrors({}); setIsAdding(false); }; const handleRemove = (memberId: string) => { setTeamMembers(teamMembers.filter((member) => member.id !== memberId)); }; const roleOptions = [ { value: 'admin', label: t('team:role.admin', 'Admin'), icon: '👑', description: t('team:role.admin_desc', 'Full access') }, { value: 'manager', label: t('team:role.manager', 'Manager'), icon: '📊', description: t('team:role.manager_desc', 'Can manage operations') }, { value: 'baker', label: t('team:role.baker', 'Baker'), icon: '👨‍🍳', description: t('team:role.baker_desc', 'Production staff') }, { value: 'cashier', label: t('team:role.cashier', 'Cashier'), icon: '💰', description: t('team:role.cashier_desc', 'Sales and POS') }, ]; return (
{/* Why This Matters */}

{t('setup_wizard:why_this_matters', 'Why This Matters')}

{t('setup_wizard:team.why', 'Adding team members allows you to assign tasks, track who does what, and give everyone the tools they need to work efficiently.')}

{/* Optional badge */}
{t('setup_wizard:optional', 'Optional')} {t('setup_wizard:team.optional_note', 'You can add team members now or invite them later from settings')}
{/* Info note about future invitations */} {teamMembers.length > 0 && (
{t('setup_wizard:team.invitation_note', 'Team members will receive invitation emails once you complete the setup wizard.')}
)} {/* Progress indicator */}
{t('setup_wizard:team.added_count', { count: teamMembers.length, defaultValue: '{{count}} team member added' })}
{/* Team members list */} {teamMembers.length > 0 && (

{t('setup_wizard:team.your_team', 'Your Team Members')}

{teamMembers.map((member) => (
{roleOptions.find(opt => opt.value === member.role)?.icon || '👤'}
{member.name}
{roleOptions.find(opt => opt.value === member.role)?.label || member.role}

{member.email}

))}
)} {/* Add form */} {isAdding ? (

{t('setup_wizard:team.add_member', 'Add Team Member')}

{/* Name */}
setFormData({ ...formData, name: e.target.value })} className={`w-full px-3 py-2 bg-[var(--bg-primary)] border ${errors.name ? 'border-[var(--color-error)]' : 'border-[var(--border-secondary)]'} rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] text-[var(--text-primary)]`} placeholder={t('setup_wizard:team.placeholders.name', 'e.g., María García')} /> {errors.name &&

{errors.name}

}
{/* Email */}
setFormData({ ...formData, email: e.target.value })} className={`w-full px-3 py-2 bg-[var(--bg-primary)] border ${errors.email ? 'border-[var(--color-error)]' : 'border-[var(--border-secondary)]'} rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] text-[var(--text-primary)]`} placeholder={t('setup_wizard:team.placeholders.email', 'e.g., maria@panaderia.com')} /> {errors.email &&

{errors.email}

}
{/* Role */}
{roleOptions.map((option) => ( ))}
) : ( )} {/* Skip message */} {teamMembers.length === 0 && !isAdding && (

{t('setup_wizard:team.skip_message', 'Working alone for now? No problem!')}

{t('setup_wizard:team.skip_hint', 'You can always invite team members later from Settings → Team')}

)} {/* Continue button - only shown when used in onboarding context */} {onComplete && (
)}
); };