import React, { useEffect, useRef } from 'react'; import { Form, Input, Button, List, Alert, message, InputRef } from '@/shared/antd-imports'; import { CloseCircleOutlined, MailOutlined, PlusOutlined } from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; import { Typography } from '@/shared/antd-imports'; import { setTeamMembers, setTasks } from '@/features/account-setup/account-setup.slice'; import { useDispatch, useSelector } from 'react-redux'; import { RootState } from '@/app/store'; import { validateEmail } from '@/utils/validateEmail'; import { sanitizeInput } from '@/utils/sanitizeInput'; import { Rule } from 'antd/es/form'; const { Title } = Typography; interface Email { id: number; value: string; } interface MembersStepProps { isDarkMode: boolean; styles: any; } const MembersStep: React.FC = ({ isDarkMode, styles }) => { const { t } = useTranslation('account-setup'); const { teamMembers, organizationName } = useSelector( (state: RootState) => state.accountSetupReducer ); const inputRefs = useRef<(InputRef | null)[]>([]); const dispatch = useDispatch(); const [form] = Form.useForm(); const addEmail = () => { if (teamMembers.length == 5) return; const newId = teamMembers.length > 0 ? Math.max(...teamMembers.map(t => t.id)) + 1 : 0; dispatch(setTeamMembers([...teamMembers, { id: newId, value: '' }])); setTimeout(() => { inputRefs.current[newId]?.focus(); }, 0); }; const removeEmail = (id: number) => { if (teamMembers.length > 1) { dispatch(setTeamMembers(teamMembers.filter(teamMember => teamMember.id !== id))); } }; const updateEmail = (id: number, value: string) => { const sanitizedValue = sanitizeInput(value); dispatch( setTeamMembers( teamMembers.map(teamMember => teamMember.id === id ? { ...teamMember, value: sanitizedValue } : teamMember ) ) ); }; const handleKeyPress = (e: React.KeyboardEvent) => { const input = e.currentTarget as HTMLInputElement; if (!input.value.trim()) return; e.preventDefault(); addEmail(); }; // Function to set ref that doesn't return anything (void) const setInputRef = (index: number) => (el: InputRef | null) => { inputRefs.current[index] = el; }; useEffect(() => { setTimeout(() => { inputRefs.current[teamMembers.length - 1]?.focus(); // Set initial form values const initialValues: Record = {}; teamMembers.forEach(teamMember => { initialValues[`email-${teamMember.id}`] = teamMember.value; }); form.setFieldsValue(initialValues); }, 200); }, []); const formRules = { email: [ { validator: async (_: any, value: string) => { if (!value) return; if (!validateEmail(value)) { throw new Error(t('invalidEmail')); } }, }, ], }; return (
{t('step3Title')} "<mark>{organizationName}</mark>". {t('step3InputLabel')}  {t('maxMembers')} } > (
updateEmail(teamMember.id, e.target.value)} onPressEnter={handleKeyPress} ref={setInputRef(index)} status={teamMember.value && !validateEmail(teamMember.value) ? 'error' : ''} id={`member-${index}`} />
)} />
); }; export default MembersStep;