Skip to content

Commit ff481d0

Browse files
committed
feat: delete policies on project member remove
1 parent 5773040 commit ff481d0

File tree

2 files changed

+81
-5
lines changed

2 files changed

+81
-5
lines changed

sdks/js/packages/core/react/components/organization/project/members/remove.tsx

Lines changed: 70 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,59 @@
1-
import { Dialog, Image, Separator } from '@raystack/apsara/*';
1+
import { Dialog, Image, Separator, toast } from '@raystack/apsara';
22
import styles from '../../organization.module.css';
3-
import { Flex, Text } from '@raystack/apsara/v1';
3+
import { Button, Flex, Text } from '@raystack/apsara/v1';
44
import cross from '~/react/assets/cross.svg';
55
import { useNavigate, useParams } from '@tanstack/react-router';
6+
import { useFrontier } from '~/react/contexts/FrontierContext';
7+
import { useState } from 'react';
8+
import { V1Beta1Policy } from '~/api-client';
69

710
export const RemoveProjectMember = () => {
11+
const [isLoading, setIsLoading] = useState(false);
12+
13+
const { client } = useFrontier();
814
const navigate = useNavigate({
915
from: '/projects/$projectId/$membertype/$memberId/remove'
1016
});
1117

12-
const { projectId } = useParams({
18+
const { projectId, memberId } = useParams({
1319
from: '/projects/$projectId/$membertype/$memberId/remove'
1420
});
21+
22+
async function onConfirm() {
23+
setIsLoading(true);
24+
try {
25+
const {
26+
// @ts-ignore
27+
data: { policies = [] }
28+
} = await client?.frontierServiceListPolicies({
29+
project_id: projectId,
30+
user_id: memberId
31+
});
32+
33+
const deletePromises = policies.map((p: V1Beta1Policy) =>
34+
client?.frontierServiceDeletePolicy(p.id as string)
35+
);
36+
37+
await Promise.all(deletePromises);
38+
navigate({
39+
to: '/projects/$projectId',
40+
params: { projectId },
41+
state: { refetch: true }
42+
});
43+
toast.success('Member removed');
44+
} catch (err: any) {
45+
toast.error('Something went wrong', {
46+
description: err.message
47+
});
48+
} finally {
49+
setIsLoading(false);
50+
}
51+
}
52+
1553
return (
1654
<Dialog open={true}>
1755
<Dialog.Content
18-
style={{ padding: 0, maxWidth: '600px', width: '100%', zIndex: '60' }}
56+
style={{ padding: 0, maxWidth: '400px', width: '100%', zIndex: '60' }}
1957
overlayClassname={styles.overlay}
2058
>
2159
<Flex justify="between" style={{ padding: '16px 24px' }}>
@@ -37,6 +75,34 @@ export const RemoveProjectMember = () => {
3775
/>
3876
</Flex>
3977
<Separator />
78+
<Flex direction="column" gap="medium" style={{ padding: '24px' }}>
79+
<Text size={4}>
80+
Are you sure you want to remove this member from the project?
81+
</Text>
82+
</Flex>
83+
<Separator />
84+
<Flex justify="end" style={{ padding: 'var(--pd-16)' }} gap="medium">
85+
<Button
86+
size="normal"
87+
variant="secondary"
88+
onClick={() => navigate({ to: '/members' })}
89+
data-test-id="frontier-sdk-remove-project-member-cancel-btn"
90+
disabled={isLoading}
91+
>
92+
Cancel
93+
</Button>
94+
<Button
95+
size="normal"
96+
variant="danger"
97+
onClick={onConfirm}
98+
data-test-id="frontier-sdk-remove-project-member-confirm-btn"
99+
disabled={isLoading}
100+
loading={isLoading}
101+
loaderText="Removing"
102+
>
103+
Remove
104+
</Button>
105+
</Flex>
40106
</Dialog.Content>
41107
</Dialog>
42108
);

sdks/js/packages/core/react/components/organization/project/project.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Flex, Image, Text } from '@raystack/apsara';
33
import { Tabs } from '@raystack/apsara';
44
import {
55
Outlet,
6+
useLocation,
67
useNavigate,
78
useParams,
89
useRouterState
@@ -36,6 +37,9 @@ export const ProjectPage = () => {
3637
let navigate = useNavigate({ from: '/projects/$projectId' });
3738
const routeState = useRouterState();
3839

40+
const location = useLocation();
41+
const refetch = location?.state?.refetch;
42+
3943
const isDeleteRoute = useMemo(() => {
4044
return routeState.matches.some(
4145
route => route.routeId === '/projects/$projectId/delete'
@@ -130,7 +134,13 @@ export const ProjectPage = () => {
130134
getProjectMembers();
131135
getProjectTeams();
132136
getProjectRoles();
133-
}, [getProjectDetails, getProjectMembers, getProjectTeams, getProjectRoles]);
137+
}, [
138+
getProjectDetails,
139+
getProjectMembers,
140+
getProjectTeams,
141+
getProjectRoles,
142+
refetch
143+
]);
134144

135145
const isLoading =
136146
isProjectLoading ||

0 commit comments

Comments
 (0)