mirror of
https://github.com/makeplane/plane
synced 2024-06-14 14:31:34 +00:00
fix: update operaton for member invitations in workspace
This commit is contained in:
parent
7e5320b5d1
commit
77eef2c899
@ -40,7 +40,7 @@ export const WorkspaceMembersListItem: FC<Props> = observer((props) => {
|
|||||||
const { workspaceSlug } = router.query;
|
const { workspaceSlug } = router.query;
|
||||||
// store
|
// store
|
||||||
const {
|
const {
|
||||||
workspaceMember: { removeMember, updateMember, deleteWorkspaceInvitation },
|
workspaceMember: { removeMember, updateMember, updateMemberInvitation, deleteWorkspaceInvitation },
|
||||||
user: { currentWorkspaceMemberInfo, currentWorkspaceRole, currentUser, currentUserSettings, leaveWorkspace },
|
user: { currentWorkspaceMemberInfo, currentWorkspaceRole, currentUser, currentUserSettings, leaveWorkspace },
|
||||||
} = useMobxStore();
|
} = useMobxStore();
|
||||||
// states
|
// states
|
||||||
@ -126,6 +126,10 @@ export const WorkspaceMembersListItem: FC<Props> = observer((props) => {
|
|||||||
|
|
||||||
if (!currentWorkspaceMemberInfo) return null;
|
if (!currentWorkspaceMemberInfo) return null;
|
||||||
|
|
||||||
|
console.log("---");
|
||||||
|
console.log("member", member?.status, member);
|
||||||
|
console.log("---");
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<ConfirmWorkspaceMemberRemove
|
<ConfirmWorkspaceMemberRemove
|
||||||
@ -206,15 +210,26 @@ export const WorkspaceMembersListItem: FC<Props> = observer((props) => {
|
|||||||
onChange={(value: TUserWorkspaceRole | undefined) => {
|
onChange={(value: TUserWorkspaceRole | undefined) => {
|
||||||
if (!workspaceSlug || !value) return;
|
if (!workspaceSlug || !value) return;
|
||||||
|
|
||||||
updateMember(workspaceSlug.toString(), member.id, {
|
if (!member?.status)
|
||||||
role: value,
|
updateMemberInvitation(workspaceSlug.toString(), member.id, {
|
||||||
}).catch(() => {
|
role: value,
|
||||||
setToastAlert({
|
}).catch(() => {
|
||||||
type: "error",
|
setToastAlert({
|
||||||
title: "Error!",
|
type: "error",
|
||||||
message: "An error occurred while updating member role. Please try again.",
|
title: "Error!",
|
||||||
|
message: "An error occurred while updating member role. Please try again.",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
else
|
||||||
|
updateMember(workspaceSlug.toString(), member.id, {
|
||||||
|
role: value,
|
||||||
|
}).catch(() => {
|
||||||
|
setToastAlert({
|
||||||
|
type: "error",
|
||||||
|
title: "Error!",
|
||||||
|
message: "An error occurred while updating member role. Please try again.",
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
}}
|
}}
|
||||||
disabled={!hasRoleChangeAccess}
|
disabled={!hasRoleChangeAccess}
|
||||||
placement="bottom-end"
|
placement="bottom-end"
|
||||||
|
@ -166,6 +166,18 @@ export class WorkspaceService extends APIService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async updateWorkspaceInvitation(
|
||||||
|
workspaceSlug: string,
|
||||||
|
invitationId: string,
|
||||||
|
data: Partial<IWorkspaceMember>
|
||||||
|
): Promise<any> {
|
||||||
|
return this.patch(`/api/workspaces/${workspaceSlug}/invitations/${invitationId}/`, data)
|
||||||
|
.then((response) => response?.data)
|
||||||
|
.catch((error) => {
|
||||||
|
throw error?.response?.data;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
async deleteWorkspaceInvitations(workspaceSlug: string, invitationId: string): Promise<any> {
|
async deleteWorkspaceInvitations(workspaceSlug: string, invitationId: string): Promise<any> {
|
||||||
return this.delete(`/api/workspaces/${workspaceSlug}/invitations/${invitationId}/`)
|
return this.delete(`/api/workspaces/${workspaceSlug}/invitations/${invitationId}/`)
|
||||||
.then((response) => response?.data)
|
.then((response) => response?.data)
|
||||||
|
@ -19,6 +19,11 @@ export interface IWorkspaceMemberStore {
|
|||||||
updateMember: (workspaceSlug: string, memberId: string, data: Partial<IWorkspaceMember>) => Promise<void>;
|
updateMember: (workspaceSlug: string, memberId: string, data: Partial<IWorkspaceMember>) => Promise<void>;
|
||||||
removeMember: (workspaceSlug: string, memberId: string) => Promise<void>;
|
removeMember: (workspaceSlug: string, memberId: string) => Promise<void>;
|
||||||
inviteMembersToWorkspace: (workspaceSlug: string, data: IWorkspaceBulkInviteFormData) => Promise<any>;
|
inviteMembersToWorkspace: (workspaceSlug: string, data: IWorkspaceBulkInviteFormData) => Promise<any>;
|
||||||
|
updateMemberInvitation: (
|
||||||
|
workspaceSlug: string,
|
||||||
|
memberId: string,
|
||||||
|
data: Partial<IWorkspaceMemberInvitation>
|
||||||
|
) => Promise<void>;
|
||||||
deleteWorkspaceInvitation: (workspaceSlug: string, memberId: string) => Promise<void>;
|
deleteWorkspaceInvitation: (workspaceSlug: string, memberId: string) => Promise<void>;
|
||||||
// computed
|
// computed
|
||||||
workspaceMembers: IWorkspaceMember[] | null;
|
workspaceMembers: IWorkspaceMember[] | null;
|
||||||
@ -53,6 +58,7 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
|
|||||||
updateMember: action,
|
updateMember: action,
|
||||||
removeMember: action,
|
removeMember: action,
|
||||||
inviteMembersToWorkspace: action,
|
inviteMembersToWorkspace: action,
|
||||||
|
updateMemberInvitation: action,
|
||||||
deleteWorkspaceInvitation: action,
|
deleteWorkspaceInvitation: action,
|
||||||
// computed
|
// computed
|
||||||
workspaceMembers: computed,
|
workspaceMembers: computed,
|
||||||
@ -183,6 +189,55 @@ export class WorkspaceMemberStore implements IWorkspaceMemberStore {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* update workspace member invitation using workspace slug and member id and data
|
||||||
|
* @param workspaceSlug
|
||||||
|
* @param memberId
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
updateMemberInvitation = async (
|
||||||
|
workspaceSlug: string,
|
||||||
|
memberId: string,
|
||||||
|
data: Partial<IWorkspaceMemberInvitation>
|
||||||
|
) => {
|
||||||
|
const originalMemberInvitations = [...this.memberInvitations?.[workspaceSlug]]; // in case of error, we will revert back to original members
|
||||||
|
|
||||||
|
const memberInvitations = [...this.memberInvitations?.[workspaceSlug]];
|
||||||
|
|
||||||
|
const index = memberInvitations.findIndex((m) => m.id === memberId);
|
||||||
|
memberInvitations[index] = { ...memberInvitations[index], ...data };
|
||||||
|
|
||||||
|
// optimistic update
|
||||||
|
runInAction(() => {
|
||||||
|
this.loader = true;
|
||||||
|
this.error = null;
|
||||||
|
this.memberInvitations = {
|
||||||
|
...this.memberInvitations,
|
||||||
|
[workspaceSlug]: memberInvitations,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
await this.workspaceService.updateWorkspaceInvitation(workspaceSlug, memberId, data);
|
||||||
|
|
||||||
|
runInAction(() => {
|
||||||
|
this.loader = false;
|
||||||
|
this.error = null;
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
runInAction(() => {
|
||||||
|
this.loader = false;
|
||||||
|
this.error = error;
|
||||||
|
this.memberInvitations = {
|
||||||
|
...this.memberInvitations,
|
||||||
|
[workspaceSlug]: originalMemberInvitations,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* delete the workspace invitation
|
* delete the workspace invitation
|
||||||
* @param workspaceSlug
|
* @param workspaceSlug
|
||||||
|
Loading…
Reference in New Issue
Block a user