diff --git a/sdks/js/packages/core/react/components/organization/members/MemberRemoveConfirm.tsx b/sdks/js/packages/core/react/components/organization/members/MemberRemoveConfirm.tsx new file mode 100644 index 000000000..be3b7b2c7 --- /dev/null +++ b/sdks/js/packages/core/react/components/organization/members/MemberRemoveConfirm.tsx @@ -0,0 +1,64 @@ +import { + Flex, + Text, + Dialog, + Button, + Separator, + Image + } from '@raystack/apsara'; + import cross from '~/react/assets/cross.svg'; + +const MemberRemoveConfirm = ({ isOpen, setIsOpen, deleteMember, isLoading }: { + isOpen: boolean; + setIsOpen: (isOpen: boolean) => void; + deleteMember: () => void; + isLoading: boolean; +}) => { + return ( + + + + + Remove member? + + cross isLoading ? null : setIsOpen(false)} + style={{ cursor: isLoading ? 'not-allowed' : 'pointer' }} + data-test-id="close-remove-member-dialog" + /> + + + + + Are you sure you want to remove this member from the organization? + + + + + + + + + + ) +} + +export default MemberRemoveConfirm \ No newline at end of file diff --git a/sdks/js/packages/core/react/components/organization/members/member.columns.tsx b/sdks/js/packages/core/react/components/organization/members/member.columns.tsx index b1c92c6a4..aa3bccd43 100644 --- a/sdks/js/packages/core/react/components/organization/members/member.columns.tsx +++ b/sdks/js/packages/core/react/components/organization/members/member.columns.tsx @@ -1,3 +1,4 @@ +import { useState } from 'react'; import { DotsHorizontalIcon, TrashIcon, @@ -9,7 +10,7 @@ import { DropdownMenu, Flex, Label, - Text + Text, } from '@raystack/apsara'; import { useNavigate } from '@tanstack/react-router'; import { toast } from 'sonner'; @@ -22,6 +23,7 @@ import { } from '~/src'; import { Role } from '~/src/types'; import { differenceWith, getInitials, isEqualById } from '~/utils'; +import MemberRemoveConfirm from './MemberRemoveConfirm'; import styles from '../organization.module.css'; export const getColumns = ( @@ -135,8 +137,11 @@ const MembersActions = ({ }) => { const { client } = useFrontier(); const navigate = useNavigate({ from: '/members' }); + const [isConfirmOpen, setIsConfirmOpen] = useState(false); + const [isLoading, setIsLoading] = useState(false); async function deleteMember() { + setIsLoading(true); try { // @ts-ignore if (member?.invited) { @@ -157,6 +162,9 @@ const MembersActions = ({ toast.error('Something went wrong', { description: error.message }); + } finally { + setIsConfirmOpen(false); + setIsLoading(false); } } async function updateRole(role: V1Beta1Role) { @@ -191,37 +199,45 @@ const MembersActions = ({ } return canUpdateGroup ? ( - - - - - - - {excludedRoles.map((role: V1Beta1Role) => ( - + <> + + + + + + + {excludedRoles.map((role: V1Beta1Role) => ( + +
updateRole(role)} + className={styles.dropdownActionItem} + data-test-id={`update-role-${role?.name}-dropdown-item`} + > + + Make {role.title} +
+
+ ))} + +
updateRole(role)} + onClick={() => setIsConfirmOpen(true)} className={styles.dropdownActionItem} - data-test-id={`update-role-${role?.name}-dropdown-item`} + data-test-id="remove-member-dropdown-item" > - - Make {role.title} + + Remove
- ))} - - -
- - Remove -
-
-
-
-
+
+
+
+ + ) : null; };