diff --git a/frontend/src/container/OrganizationSettings/InviteTeamMembers/index.tsx b/frontend/src/container/OrganizationSettings/InviteTeamMembers/index.tsx
index d059c2683c..e520fbbd72 100644
--- a/frontend/src/container/OrganizationSettings/InviteTeamMembers/index.tsx
+++ b/frontend/src/container/OrganizationSettings/InviteTeamMembers/index.tsx
@@ -1,54 +1,24 @@
import { PlusOutlined } from '@ant-design/icons';
-import { Button, Form, Input, Select, Space, Typography } from 'antd';
-import { Dispatch, SetStateAction, useCallback, useEffect } from 'react';
+import {
+ Button,
+ Form,
+ FormInstance,
+ Input,
+ Select,
+ Space,
+ Typography,
+} from 'antd';
import { useTranslation } from 'react-i18next';
+import { requireErrorMessage } from 'utils/form/requireErrorMessage';
-import { InviteTeamMembersProps } from '../PendingInvitesContainer/index';
-import { SelectDrawer, TitleWrapper } from './styles';
+import { InviteMemberFormValues } from '../PendingInvitesContainer/index';
+import { SelectDrawer, SpaceContainer, TitleWrapper } from './styles';
const { Option } = Select;
-function InviteTeamMembers({ allMembers, setAllMembers }: Props): JSX.Element {
+function InviteTeamMembers({ form, onFinish }: Props): JSX.Element {
const { t } = useTranslation('organizationsettings');
- useEffect(
- () => (): void => {
- setAllMembers([
- {
- email: '',
- name: '',
- role: 'VIEWER',
- },
- ]);
- },
- [setAllMembers],
- );
-
- const onAddHandler = (): void => {
- setAllMembers((state) => [
- ...state,
- {
- email: '',
- name: '',
- role: 'VIEWER',
- },
- ]);
- };
-
- const onChangeHandler = useCallback(
- (value: string, index: number, type: string): void => {
- setAllMembers((prev) => [
- ...prev.slice(0, index),
- {
- ...prev[index],
- [type]: value,
- },
- ...prev.slice(index, prev.length - 1),
- ]);
- },
- [setAllMembers],
- );
-
return (
<>
@@ -56,52 +26,50 @@ function InviteTeamMembers({ allMembers, setAllMembers }: Props): JSX.Element {
{t('name_optional')}
{t('role')}
-
+ {(fields, { add }): JSX.Element => (
+
+ {fields.map(({ key, name }) => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ))}
+
+ } type="default">
+ {t('add_another_team_member')}
+
+
+
+ )}
+
>
);
}
interface Props {
- allMembers: InviteTeamMembersProps[];
- setAllMembers: Dispatch>;
+ form: FormInstance;
+ onFinish: (values: InviteMemberFormValues) => Promise;
}
export default InviteTeamMembers;
diff --git a/frontend/src/container/OrganizationSettings/InviteTeamMembers/styles.ts b/frontend/src/container/OrganizationSettings/InviteTeamMembers/styles.ts
index 1426130972..d74d447d8e 100644
--- a/frontend/src/container/OrganizationSettings/InviteTeamMembers/styles.ts
+++ b/frontend/src/container/OrganizationSettings/InviteTeamMembers/styles.ts
@@ -1,4 +1,4 @@
-import { Select } from 'antd';
+import { Select, Space } from 'antd';
import styled from 'styled-components';
export const SelectDrawer = styled(Select)`
@@ -13,3 +13,9 @@ export const TitleWrapper = styled.div`
min-width: 11rem;
}
`;
+
+export const SpaceContainer = styled(Space)`
+ & .ant-form-item {
+ margin-bottom: 0px;
+ }
+`;
diff --git a/frontend/src/container/OrganizationSettings/PendingInvitesContainer/index.tsx b/frontend/src/container/OrganizationSettings/PendingInvitesContainer/index.tsx
index ecb374fcd0..e5d6eb06ac 100644
--- a/frontend/src/container/OrganizationSettings/PendingInvitesContainer/index.tsx
+++ b/frontend/src/container/OrganizationSettings/PendingInvitesContainer/index.tsx
@@ -1,5 +1,5 @@
import { PlusOutlined } from '@ant-design/icons';
-import { Button, Modal, Space, Typography } from 'antd';
+import { Button, Form, Modal, Space, Typography } from 'antd';
import { ColumnsType } from 'antd/lib/table';
import deleteInvite from 'api/user/deleteInvite';
import getPendingInvites from 'api/user/getPendingInvites';
@@ -27,6 +27,7 @@ function PendingInvitesContainer(): JSX.Element {
isInviteTeamMemberModalOpen,
setIsInviteTeamMemberModalOpen,
] = useState(false);
+ const [form] = Form.useForm();
const [isInvitingMembers, setIsInvitingMembers] = useState(false);
const { t } = useTranslation(['organizationsettings', 'common']);
const [state, setText] = useCopyToClipboard();
@@ -58,14 +59,6 @@ function PendingInvitesContainer(): JSX.Element {
setIsInviteTeamMemberModalOpen(value);
};
- const [allMembers, setAllMembers] = useState([
- {
- email: '',
- name: '',
- role: 'VIEWER',
- },
- ]);
-
const [dataSource, setDataSource] = useState([]);
const { hash } = useLocation();
@@ -192,45 +185,48 @@ function PendingInvitesContainer(): JSX.Element {
},
];
- const onInviteClickHandler = async (): Promise => {
- try {
- setIsInvitingMembers(true);
- allMembers.forEach(
- async (members): Promise => {
- const { error, statusCode } = await sendInvite({
- email: members.email,
- name: members.name,
- role: members.role,
- });
-
- if (statusCode !== 200) {
- notifications.error({
- message:
- error ||
- t('something_went_wrong', {
- ns: 'common',
- }),
+ const onInviteClickHandler = useCallback(
+ async (values: InviteMemberFormValues): Promise => {
+ try {
+ setIsInvitingMembers(true);
+ values.members.forEach(
+ async (member): Promise => {
+ const { error, statusCode } = await sendInvite({
+ email: member.email,
+ name: member.name,
+ role: member.role,
});
- }
- },
- );
- setTimeout(async () => {
- const { data, status } = await getPendingInvitesResponse.refetch();
- if (status === 'success' && data.payload) {
- setDataSource(getParsedInviteData(data?.payload || []));
- }
- setIsInvitingMembers(false);
- toggleModal(false);
- }, 2000);
- } catch (error) {
- notifications.error({
- message: t('something_went_wrong', {
- ns: 'common',
- }),
- });
- }
- };
+ if (statusCode !== 200) {
+ notifications.error({
+ message:
+ error ||
+ t('something_went_wrong', {
+ ns: 'common',
+ }),
+ });
+ }
+ },
+ );
+
+ setTimeout(async () => {
+ const { data, status } = await getPendingInvitesResponse.refetch();
+ if (status === 'success' && data.payload) {
+ setDataSource(getParsedInviteData(data?.payload || []));
+ }
+ setIsInvitingMembers(false);
+ toggleModal(false);
+ }, 2000);
+ } catch (error) {
+ notifications.error({
+ message: t('something_went_wrong', {
+ ns: 'common',
+ }),
+ });
+ }
+ },
+ [getParsedInviteData, getPendingInvitesResponse, notifications, t],
+ );
return (
@@ -248,7 +244,7 @@ function PendingInvitesContainer(): JSX.Element {
,