## Context This PR introduces the new Create and Edit role components, behind the PERMISSIONS_ENABLED_V2 feature flag.
106 lines
2.9 KiB
TypeScript
106 lines
2.9 KiB
TypeScript
import { settingsDraftRoleFamilyState } from '@/settings/roles/states/settingsDraftRoleFamilyState';
|
|
import { settingsPersistedRoleFamilyState } from '@/settings/roles/states/settingsPersistedRoleFamilyState';
|
|
import { useRecoilState, useSetRecoilState } from 'recoil';
|
|
import {
|
|
useUpdateWorkspaceMemberRoleMutation,
|
|
WorkspaceMember,
|
|
} from '~/generated/graphql';
|
|
|
|
type AddWorkspaceMemberToRoleAndUpdateStateParams = {
|
|
workspaceMemberId: string;
|
|
};
|
|
|
|
type UpdateWorkspaceMemberRoleDraftStateParams = {
|
|
workspaceMember: WorkspaceMember;
|
|
};
|
|
|
|
type AddWorkspaceMembersToRoleParams = {
|
|
roleId: string;
|
|
workspaceMemberIds: string[];
|
|
};
|
|
|
|
export const useUpdateWorkspaceMemberRole = (roleId: string) => {
|
|
const setSettingsPersistedRole = useSetRecoilState(
|
|
settingsPersistedRoleFamilyState(roleId),
|
|
);
|
|
const [settingsDraftRole, setSettingsDraftRole] = useRecoilState(
|
|
settingsDraftRoleFamilyState(roleId),
|
|
);
|
|
|
|
const [updateWorkspaceMemberRoleMutation] =
|
|
useUpdateWorkspaceMemberRoleMutation();
|
|
|
|
const updateWorkspaceMemberRoleDraftState = ({
|
|
workspaceMember,
|
|
}: UpdateWorkspaceMemberRoleDraftStateParams) => {
|
|
setSettingsDraftRole({
|
|
...settingsDraftRole,
|
|
workspaceMembers: [
|
|
...settingsDraftRole.workspaceMembers,
|
|
{
|
|
id: workspaceMember.id,
|
|
name: workspaceMember.name,
|
|
colorScheme: workspaceMember.colorScheme,
|
|
userEmail: workspaceMember.userEmail,
|
|
},
|
|
],
|
|
});
|
|
};
|
|
|
|
const addWorkspaceMemberToRoleAndUpdateState = async ({
|
|
workspaceMemberId,
|
|
}: AddWorkspaceMemberToRoleAndUpdateStateParams) => {
|
|
const { data } = await updateWorkspaceMemberRoleMutation({
|
|
variables: {
|
|
workspaceMemberId,
|
|
roleId,
|
|
},
|
|
});
|
|
|
|
if (data?.updateWorkspaceMemberRole !== undefined) {
|
|
const updatedWorkspaceMember = data.updateWorkspaceMemberRole;
|
|
const updatedWorkspaceMembers = [
|
|
...settingsDraftRole.workspaceMembers,
|
|
{
|
|
id: updatedWorkspaceMember.id,
|
|
name: updatedWorkspaceMember.name,
|
|
colorScheme: updatedWorkspaceMember.colorScheme,
|
|
userEmail: updatedWorkspaceMember.userEmail,
|
|
},
|
|
];
|
|
|
|
const updatedRole = {
|
|
...settingsDraftRole,
|
|
workspaceMembers: updatedWorkspaceMembers,
|
|
};
|
|
|
|
setSettingsPersistedRole(updatedRole);
|
|
setSettingsDraftRole(updatedRole);
|
|
}
|
|
|
|
return data?.updateWorkspaceMemberRole;
|
|
};
|
|
|
|
const addWorkspaceMembersToRole = async ({
|
|
roleId,
|
|
workspaceMemberIds,
|
|
}: AddWorkspaceMembersToRoleParams) => {
|
|
await Promise.all(
|
|
workspaceMemberIds.map((workspaceMemberId) =>
|
|
updateWorkspaceMemberRoleMutation({
|
|
variables: {
|
|
roleId,
|
|
workspaceMemberId,
|
|
},
|
|
}),
|
|
),
|
|
);
|
|
};
|
|
|
|
return {
|
|
addWorkspaceMemberToRoleAndUpdateState,
|
|
updateWorkspaceMemberRoleDraftState,
|
|
addWorkspaceMembersToRole,
|
|
};
|
|
};
|