{"record":{"id":"4f28a577bee4d661","repo":"makeplane/plane","slug":"member-not-found-4f28a5","errorCode":null,"errorMessage":"Member not found","messagePattern":"Member not found","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"apps/web/core/store/member/workspace/workspace-member.store.ts","lineNumber":259,"sourceCode":"            id: member.id,\n            member: member.member.id,\n            role: member.role,\n            is_active: member.is_active,\n          });\n        });\n      });\n      return response;\n    });\n\n  /**\n   * @description update the role of a workspace member\n   * @param workspaceSlug\n   * @param userId\n   * @param data\n   */\n  updateMember = async (workspaceSlug: string, userId: string, data: { role: EUserPermissions }) => {\n    const memberDetails = this.getWorkspaceMemberDetails(userId);\n    if (!memberDetails) throw new Error(\"Member not found\");\n    // original data to revert back in case of error\n    const originalProjectMemberData = { ...this.workspaceMemberMap?.[workspaceSlug]?.[userId] };\n    try {\n      runInAction(() => {\n        set(this.workspaceMemberMap, [workspaceSlug, userId, \"role\"], data.role);\n      });\n      await this.workspaceService.updateWorkspaceMember(workspaceSlug, memberDetails.id, data);\n    } catch (error) {\n      // revert back to original members in case of error\n      runInAction(() => {\n        set(this.workspaceMemberMap, [workspaceSlug, userId], originalProjectMemberData);\n      });\n      throw error;\n    }\n  };\n\n  /**\n   * @description remove a member from workspace","sourceCodeStart":241,"sourceCodeEnd":277,"githubUrl":"https://github.com/makeplane/plane/blob/1c8a60f858d8472aa56e29994ec1c7926da2c6ce/apps/web/core/store/member/workspace/workspace-member.store.ts#L241-L277","documentation":"Workspace-level analogue of [6]: updateMember in the workspace member store throws when getWorkspaceMemberDetails(userId) is falsy. The check protects the optimistic role update and the subsequent updateWorkspaceMember REST call which needs memberDetails.id.","triggerScenarios":"Changing a workspace member's role before workspaceMemberMap[workspaceSlug][userId] is loaded; the userId is not a workspace member; the member record exists but lacks the fields getWorkspaceMemberDetails expects.","commonSituations":"Workspace settings page opened via deep link before the members list resolves; member removed concurrently in another tab; cross-workspace confusion (userId valid in workspace A but action fired against workspace B).","solutions":["Fetch workspace members for the slug before enabling the role dropdown.","Confirm the userId is part of workspaceMemberMap[workspaceSlug]; re-fetch if not.","Verify the workspaceSlug in scope matches the member's actual workspace.","Guard the action at the call site and show a loading/disabled state instead of throwing."],"exampleFix":"// before\nconst memberDetails = this.getWorkspaceMemberDetails(userId);\nif (!memberDetails) throw new Error(\"Member not found\");\n// after\nconst memberDetails = this.getWorkspaceMemberDetails(userId);\nif (!memberDetails) { await this.fetchWorkspaceMembers(workspaceSlug); return; }","handlingStrategy":"validation","validationCode":"const member = workspaceMemberStore.getWorkspaceMemberDetails(userId);\nif (!member) {\n  await workspaceMemberStore.fetchWorkspaceMembers(workspaceSlug);\n  return;\n}","typeGuard":"const hasWorkspaceMember = (m: unknown): m is { id: string } =>\n  typeof m === 'object' && m !== null && typeof (m as any).id === 'string';","tryCatchPattern":"try { await updateMember(workspaceSlug, userId, { role }); }\ncatch (e) { showRoleUpdateError(); }","preventionTips":["Fetch workspace members before enabling role changes.","Verify the userId belongs to the active workspaceSlug.","Surface a UI error instead of letting the throw propagate."],"tags":["members","web","workspace","roles","store-lookup","precondition"],"backgroundTag":null,"analyzedSha":"1c8a60f858d8472aa56e29994ec1c7926da2c6ce","analyzedAt":"2026-08-12T14:44:31.636Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}