import { AutoComplete, Button, Drawer, Flex, Form, message, Modal, Select, Spin, Typography } from '@/shared/antd-imports'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import { toggleInviteMemberDrawer, triggerTeamMembersRefresh, } from '../../../features/settings/member/memberSlice'; import { useTranslation } from 'react-i18next'; import { useState, useEffect, useCallback } from 'react'; import { jobTitlesApiService } from '@/api/settings/job-titles/job-titles.api.service'; import { IJobTitle } from '@/types/job.types'; import { teamMembersApiService } from '@/api/team-members/teamMembers.api.service'; import { ITeamMemberCreateRequest } from '@/types/teamMembers/team-member-create-request'; import { LinkOutlined } from '@ant-design/icons'; interface FormValues { email: string[]; jobTitle: string; access: 'member' | 'admin'; } const InviteTeamMembers = () => { const [searching, setSearching] = useState(false); const [jobTitles, setJobTitles] = useState([]); const [emails, setEmails] = useState([]); const [selectedJobTitle, setSelectedJobTitle] = useState(null); const [loading, setLoading] = useState(false); const [form] = Form.useForm(); const { t } = useTranslation('settings/team-members'); const isDrawerOpen = useAppSelector(state => state.memberReducer.isInviteMemberDrawerOpen); const dispatch = useAppDispatch(); const handleSearch = useCallback( async (value: string) => { try { setSearching(true); const res = await jobTitlesApiService.getJobTitles(1, 10, null, null, value || null); if (res.done) { setJobTitles(res.body.data || []); } } catch (error) { message.error(t('Failed to fetch job titles')); } finally { setSearching(false); } }, [t] ); useEffect(() => { if (isDrawerOpen) { handleSearch(''); } }, [isDrawerOpen, handleSearch]); const handleFormSubmit = async (values: FormValues) => { try { setLoading(true); const body: ITeamMemberCreateRequest = { job_title: selectedJobTitle, emails: emails, is_admin: values.access === 'admin', }; const res = await teamMembersApiService.createTeamMember(body); if (res.done) { form.resetFields(); setEmails([]); setSelectedJobTitle(null); dispatch(triggerTeamMembersRefresh()); // Trigger refresh in TeamMembersSettings dispatch(toggleInviteMemberDrawer()); } } catch (error) { message.error(t('createMemberErrorMessage')); } finally { setLoading(false); } }; const handleClose = () => { form.resetFields(); dispatch(toggleInviteMemberDrawer()); }; const handleEmailChange = (value: string[]) => { setEmails(value); }; return ( {t('addMemberDrawerTitle')} } open={isDrawerOpen} onCancel={handleClose} destroyOnClose afterOpenChange={visible => visible && handleSearch('')} width={400} loading={loading} footer={ {/* */} } >
{ if (!value?.length) return Promise.reject(t('memberEmailRequiredError')); return Promise.resolve(); }, }, ]} >
); }; export default InviteTeamMembers;