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
| import { types } from "mobx-state-tree";
| import { User } from "./Users";
| import { StringOrNumberID } from "./types";
| import { FF_DISABLE_GLOBAL_USER_FETCHING, isFF } from "../utils/feature-flags";
|
| // Create a union type that can handle both user references and direct user objects
| const UserOrReference = types.union({
| dispatcher: (snapshot) => {
| // If it's a full user object (has firstName, email, etc.), use User model
| if (snapshot && typeof snapshot === "object" && (snapshot.firstName || snapshot.email || snapshot.username)) {
| return User;
| }
| // Otherwise, it's a reference to a user ID
| return types.reference(User);
| },
| cases: {
| [User.name]: User,
| reference: types.reference(User),
| },
| });
|
| export const Assignee = types
| .model("Assignee", {
| id: StringOrNumberID,
| user: types.late(() => UserOrReference),
| review: types.maybeNull(types.enumeration(["accepted", "rejected", "fixed"])),
| reviewed: types.maybeNull(types.boolean),
| annotated: types.maybeNull(types.boolean),
| })
| .views((self) => ({
| get firstName() {
| return self.user.firstName;
| },
| get lastName() {
| return self.user.lastName;
| },
| get username() {
| return self.user.username;
| },
| get email() {
| return self.user.email;
| },
| get lastActivity() {
| return self.user.lastActivity;
| },
| get avatar() {
| return self.user.avatar;
| },
| get initials() {
| return self.user.initials;
| },
| get fullName() {
| return self.user.fullName;
| },
| }))
| .preProcessSnapshot((sn) => {
| let result = sn;
|
| if (typeof sn === "number") {
| result = {
| id: sn,
| user: sn,
| annotated: true,
| review: null,
| reviewed: false,
| };
| } else {
| const { user_id, annotated, review, reviewed, ...user } = sn;
|
| // When global user fetching is disabled, always create user objects, otherwise use references via user id
| // If we only have user_id and no other user properties, just use the user_id as reference
| const hasUserProperties = Object.keys(user).length > 0;
| result = {
| id: user_id,
| user: isFF(FF_DISABLE_GLOBAL_USER_FETCHING) && hasUserProperties ? { id: user_id, ...user } : user_id, // Use user_id as reference
| annotated,
| review,
| reviewed,
| };
| }
|
| return result;
| });
|
|