forked from hoppscotch/hoppscotch
/
userManagement.ts
121 lines (102 loc) 路 3.14 KB
/
userManagement.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import { useToast } from '~/composables/toast';
import { getI18n } from '~/modules/i18n';
import { UserDeletionResult } from './backend/graphql';
import { ADMIN_CANNOT_BE_DELETED, USER_IS_OWNER } from './errors';
type IndividualActionInput = {
type: 'individual';
metadata: null;
};
type BulkActionInput = {
type: 'bulk';
metadata: {
areMultipleUsersSelected: boolean;
deletedIDs: string[];
};
};
type IndividualActionResult = {
data: null;
};
type BulkActionResult = {
data: { timeoutID: NodeJS.Timeout | null };
};
type HandleUserDeletion = {
(
deletedUsersList: UserDeletionResult[],
action: IndividualActionInput | BulkActionInput
): IndividualActionResult | BulkActionResult;
};
const t = getI18n();
const toast = useToast();
export const handleUserDeletion: HandleUserDeletion = (
deletedUsersList,
action
) => {
let timeoutID: NodeJS.Timeout | null = null;
const uniqueErrorMessages = new Set(
deletedUsersList.map(({ errorMessage }) => errorMessage).filter(Boolean)
) as Set<string>;
const { type, metadata } = action;
// Show the success toast based on the action type if there are no errors
if (uniqueErrorMessages.size === 0) {
if (type === 'bulk') {
toast.success(
metadata.areMultipleUsersSelected
? t('state.delete_user_success')
: t('state.delete_users_success')
);
return { type, data: { timeoutID } };
}
toast.success(t('state.delete_user_success'));
return { type, data: null };
}
const errMsgMap = {
[ADMIN_CANNOT_BE_DELETED]:
type === 'bulk'
? t('state.remove_admin_for_deletion')
: t('state.remove_admin_to_delete_user'),
[USER_IS_OWNER]:
type === 'bulk'
? t('state.remove_owner_for_deletion')
: t('state.remove_owner_to_delete_user'),
};
const errMsgMapKeys = Object.keys(errMsgMap);
if (type === 'bulk') {
const { areMultipleUsersSelected, deletedIDs } = metadata;
// Show toast messages with the count of users deleted only if multiple users are selected
if (areMultipleUsersSelected) {
toast.success(
t('state.delete_some_users_success', { count: deletedIDs.length })
);
toast.error(
t('state.delete_some_users_failure', {
count: deletedUsersList.length - deletedIDs.length,
})
);
}
}
uniqueErrorMessages.forEach((errorMessage) => {
if (errMsgMapKeys.includes(errorMessage)) {
if (type === 'bulk') {
timeoutID = setTimeout(
() => {
toast.error(errMsgMap[errorMessage as keyof typeof errMsgMap]);
},
metadata.areMultipleUsersSelected ? 2000 : 0
);
return;
}
toast.error(errMsgMap[errorMessage as keyof typeof errMsgMap]);
}
});
// Fallback for the case where the error message is not in the compiled list
if (
Array.from(uniqueErrorMessages).some(
(key) => !((key as string) in errMsgMap)
)
) {
type === 'bulk' && metadata.areMultipleUsersSelected
? t('state.delete_users_failure')
: t('state.delete_user_failure');
}
return { data: type === 'bulk' ? { timeoutID } : null };
};