@magmamath/students-features 0.2.4 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commonjs/features/feedback/model/comments.js +61 -10
- package/dist/commonjs/features/feedback/model/comments.js.map +1 -1
- package/dist/commonjs/features/feedback/model/model.js +36 -6
- package/dist/commonjs/features/feedback/model/model.js.map +1 -1
- package/dist/commonjs/features/feedback/types.js.map +1 -1
- package/dist/module/features/feedback/model/comments.js +61 -10
- package/dist/module/features/feedback/model/comments.js.map +1 -1
- package/dist/module/features/feedback/model/model.js +36 -6
- package/dist/module/features/feedback/model/model.js.map +1 -1
- package/dist/module/features/feedback/types.js.map +1 -1
- package/dist/typescript/commonjs/features/feedback/model/comments.d.ts +7 -3
- package/dist/typescript/commonjs/features/feedback/model/comments.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/feedback/model/model.d.ts +5 -4
- package/dist/typescript/commonjs/features/feedback/model/model.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/feedback/types.d.ts +4 -0
- package/dist/typescript/commonjs/features/feedback/types.d.ts.map +1 -1
- package/dist/typescript/module/features/feedback/model/comments.d.ts +7 -3
- package/dist/typescript/module/features/feedback/model/comments.d.ts.map +1 -1
- package/dist/typescript/module/features/feedback/model/model.d.ts +5 -4
- package/dist/typescript/module/features/feedback/model/model.d.ts.map +1 -1
- package/dist/typescript/module/features/feedback/types.d.ts +4 -0
- package/dist/typescript/module/features/feedback/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/features/feedback/model/comments.ts +55 -10
- package/src/features/feedback/model/model.ts +32 -9
- package/src/features/feedback/types.ts +6 -0
|
@@ -6,9 +6,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.TeacherComments = void 0;
|
|
7
7
|
var _effector = require("effector");
|
|
8
8
|
class TeacherComments {
|
|
9
|
+
setNoCommentsMessage = (0, _effector.createEvent)();
|
|
9
10
|
setAllCommentsRead = (0, _effector.createEvent)();
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
add = (0, _effector.createEvent)();
|
|
12
|
+
delete = (0, _effector.createEvent)();
|
|
12
13
|
setData = (0, _effector.createEvent)();
|
|
13
14
|
$data = (0, _effector.restore)(this.setData, null).on(this.setAllCommentsRead, (state, {
|
|
14
15
|
assignmentId,
|
|
@@ -24,7 +25,7 @@ class TeacherComments {
|
|
|
24
25
|
})),
|
|
25
26
|
unreadMessagesCount: 0
|
|
26
27
|
})
|
|
27
|
-
})).on(this.
|
|
28
|
+
})).on(this.add, (state, {
|
|
28
29
|
assignmentId,
|
|
29
30
|
problemId,
|
|
30
31
|
comment,
|
|
@@ -37,7 +38,7 @@ class TeacherComments {
|
|
|
37
38
|
comments: [...data.comments, comment],
|
|
38
39
|
unreadMessagesCount: isRead ? data.unreadMessagesCount : data.unreadMessagesCount + 1
|
|
39
40
|
})
|
|
40
|
-
})).on(this.
|
|
41
|
+
})).on(this.delete, (state, {
|
|
41
42
|
assignmentId,
|
|
42
43
|
problemId,
|
|
43
44
|
commentId
|
|
@@ -50,17 +51,64 @@ class TeacherComments {
|
|
|
50
51
|
_id
|
|
51
52
|
}) => _id === commentId);
|
|
52
53
|
if (!commentToDelete) return data;
|
|
54
|
+
const filteredComments = data.comments.filter(({
|
|
55
|
+
_id
|
|
56
|
+
}) => _id !== commentId);
|
|
57
|
+
if (!filteredComments.length) return undefined;
|
|
53
58
|
return {
|
|
54
|
-
comments:
|
|
55
|
-
_id
|
|
56
|
-
}) => _id !== commentId),
|
|
59
|
+
comments: filteredComments,
|
|
57
60
|
unreadMessagesCount: commentToDelete.isRead ? data.unreadMessagesCount : data.unreadMessagesCount - 1
|
|
58
61
|
};
|
|
59
62
|
}
|
|
63
|
+
})).on(this.setNoCommentsMessage, (state, noCommentsMessage) => this.update({
|
|
64
|
+
state,
|
|
65
|
+
assignmentId: noCommentsMessage.exerciseId,
|
|
66
|
+
problemId: noCommentsMessage.problemId,
|
|
67
|
+
fn: () => ({
|
|
68
|
+
comments: [noCommentsMessage],
|
|
69
|
+
unreadMessagesCount: 0
|
|
70
|
+
})
|
|
60
71
|
}));
|
|
61
|
-
constructor() {
|
|
72
|
+
constructor(api, $isOpen, EMPTY_COMMENT) {
|
|
62
73
|
(0, _effector.sample)({
|
|
63
|
-
clock: this.
|
|
74
|
+
clock: this.add,
|
|
75
|
+
source: {
|
|
76
|
+
isOpen: $isOpen
|
|
77
|
+
},
|
|
78
|
+
filter: ({
|
|
79
|
+
isOpen
|
|
80
|
+
}) => isOpen,
|
|
81
|
+
fn: (_, {
|
|
82
|
+
comment
|
|
83
|
+
}) => ({
|
|
84
|
+
ids: [comment._id]
|
|
85
|
+
}),
|
|
86
|
+
target: api.updateCommentStatusSeenFx
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// Adds message "No comments yet" after removing last comment and list is open
|
|
90
|
+
(0, _effector.sample)({
|
|
91
|
+
clock: this.delete,
|
|
92
|
+
source: {
|
|
93
|
+
isOpen: $isOpen,
|
|
94
|
+
state: this.$data
|
|
95
|
+
},
|
|
96
|
+
filter: ({
|
|
97
|
+
isOpen,
|
|
98
|
+
state
|
|
99
|
+
}, deletedMessage) => {
|
|
100
|
+
const hasNoMessages = !state?.get(deletedMessage.assignmentId)?.[deletedMessage.problemId]?.comments.length;
|
|
101
|
+
return isOpen && hasNoMessages;
|
|
102
|
+
},
|
|
103
|
+
fn: (_, {
|
|
104
|
+
assignmentId,
|
|
105
|
+
problemId
|
|
106
|
+
}) => ({
|
|
107
|
+
...EMPTY_COMMENT,
|
|
108
|
+
exerciseId: assignmentId,
|
|
109
|
+
problemId
|
|
110
|
+
}),
|
|
111
|
+
target: this.setNoCommentsMessage
|
|
64
112
|
});
|
|
65
113
|
}
|
|
66
114
|
update({
|
|
@@ -72,7 +120,10 @@ class TeacherComments {
|
|
|
72
120
|
if (!state) return state;
|
|
73
121
|
const updatedState = new Map(state);
|
|
74
122
|
const assignmentMap = updatedState.get(assignmentId) || {};
|
|
75
|
-
const currentData = assignmentMap[problemId]
|
|
123
|
+
const currentData = assignmentMap[problemId] || {
|
|
124
|
+
comments: [],
|
|
125
|
+
unreadMessagesCount: 0
|
|
126
|
+
};
|
|
76
127
|
const updatedData = fn(currentData);
|
|
77
128
|
if (updatedData === undefined) {
|
|
78
129
|
delete assignmentMap[problemId];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_effector","require","TeacherComments","
|
|
1
|
+
{"version":3,"names":["_effector","require","TeacherComments","setNoCommentsMessage","createEvent","setAllCommentsRead","add","delete","setData","$data","restore","on","state","assignmentId","problemId","update","fn","data","comments","map","comment","isRead","unreadMessagesCount","commentId","commentToDelete","find","_id","filteredComments","filter","length","undefined","noCommentsMessage","exerciseId","constructor","api","$isOpen","EMPTY_COMMENT","sample","clock","source","isOpen","_","ids","target","updateCommentStatusSeenFx","deletedMessage","hasNoMessages","get","updatedState","Map","assignmentMap","currentData","updatedData","Object","keys","set","exports"],"sourceRoot":"../../../../../src","sources":["features/feedback/model/comments.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,22 +9,52 @@ var _api = require("./api.js");
|
|
|
9
9
|
var _sockets = require("./sockets.js");
|
|
10
10
|
var _comments = require("./comments.js");
|
|
11
11
|
var _helpers = require("../helpers.js");
|
|
12
|
+
var _constants = require("../constants.js");
|
|
12
13
|
class TeacherFeedbackModel {
|
|
13
14
|
setIsOpen = (0, _effector.createEvent)();
|
|
14
15
|
$isOpen = (0, _effector.restore)(this.setIsOpen, false);
|
|
15
16
|
constructor({
|
|
16
17
|
api,
|
|
17
18
|
socket,
|
|
18
|
-
credits
|
|
19
|
+
credits,
|
|
20
|
+
defaults
|
|
19
21
|
}) {
|
|
20
22
|
this.api = new _api.TeacherFeedbackAPI(api);
|
|
21
23
|
this.sockets = new _sockets.TeacherFeedbackSockets(socket);
|
|
22
|
-
this.comments = new _comments.TeacherComments();
|
|
24
|
+
this.comments = new _comments.TeacherComments(this.api, this.$isOpen, defaults.EMPTY_COMMENT);
|
|
23
25
|
(0, _effector.sample)({
|
|
24
26
|
clock: credits.$problemId,
|
|
25
27
|
fn: () => false,
|
|
26
28
|
target: this.setIsOpen
|
|
27
29
|
});
|
|
30
|
+
|
|
31
|
+
// Deletes entity when closing list with no comments
|
|
32
|
+
(0, _effector.sample)({
|
|
33
|
+
clock: this.setIsOpen,
|
|
34
|
+
source: {
|
|
35
|
+
data: this.comments.$data,
|
|
36
|
+
assignmentId: credits.$assignmentId,
|
|
37
|
+
problemId: credits.$problemId
|
|
38
|
+
},
|
|
39
|
+
filter: ({
|
|
40
|
+
data,
|
|
41
|
+
assignmentId,
|
|
42
|
+
problemId
|
|
43
|
+
}, isOpen) => {
|
|
44
|
+
const comments = data?.get(assignmentId)?.[problemId].comments;
|
|
45
|
+
const isOnlyNoCommentsMessage = comments?.length === 1 && comments[0]._id === _constants.EMPTY_COMMENT_ID;
|
|
46
|
+
return !isOpen && isOnlyNoCommentsMessage;
|
|
47
|
+
},
|
|
48
|
+
fn: ({
|
|
49
|
+
assignmentId,
|
|
50
|
+
problemId
|
|
51
|
+
}, comment) => ({
|
|
52
|
+
assignmentId,
|
|
53
|
+
problemId,
|
|
54
|
+
commentId: _constants.EMPTY_COMMENT_ID
|
|
55
|
+
}),
|
|
56
|
+
target: this.comments.delete
|
|
57
|
+
});
|
|
28
58
|
(0, _effector.sample)({
|
|
29
59
|
clock: this.setIsOpen,
|
|
30
60
|
source: {
|
|
@@ -77,7 +107,7 @@ class TeacherFeedbackModel {
|
|
|
77
107
|
problemId: comment.problemId,
|
|
78
108
|
commentId: comment._id
|
|
79
109
|
}),
|
|
80
|
-
target: this.comments.
|
|
110
|
+
target: this.comments.delete
|
|
81
111
|
});
|
|
82
112
|
(0, _effector.sample)({
|
|
83
113
|
clock: this.sockets.commentAdded,
|
|
@@ -91,12 +121,12 @@ class TeacherFeedbackModel {
|
|
|
91
121
|
problemId,
|
|
92
122
|
isOpen
|
|
93
123
|
}, comment) => ({
|
|
94
|
-
assignmentId,
|
|
95
|
-
problemId,
|
|
96
124
|
comment,
|
|
125
|
+
assignmentId,
|
|
126
|
+
problemId: comment.problemId,
|
|
97
127
|
isRead: isOpen && comment.problemId === problemId
|
|
98
128
|
}),
|
|
99
|
-
target: this.comments.
|
|
129
|
+
target: this.comments.add
|
|
100
130
|
});
|
|
101
131
|
}
|
|
102
132
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_effector","require","_api","_sockets","_comments","_helpers","TeacherFeedbackModel","setIsOpen","createEvent","$isOpen","restore","constructor","api","socket","credits","TeacherFeedbackAPI","sockets","TeacherFeedbackSockets","comments","TeacherComments","sample","clock","$problemId","fn","target","source","data","$data","assignmentId","$assignmentId","problemId","filter","isOpen","findCommentsByCredits","hasUnreadComments","some","isRead","ids","map","
|
|
1
|
+
{"version":3,"names":["_effector","require","_api","_sockets","_comments","_helpers","_constants","TeacherFeedbackModel","setIsOpen","createEvent","$isOpen","restore","constructor","api","socket","credits","defaults","TeacherFeedbackAPI","sockets","TeacherFeedbackSockets","comments","TeacherComments","EMPTY_COMMENT","sample","clock","$problemId","fn","target","source","data","$data","assignmentId","$assignmentId","problemId","filter","isOpen","get","isOnlyNoCommentsMessage","length","_id","EMPTY_COMMENT_ID","comment","commentId","delete","findCommentsByCredits","hasUnreadComments","some","isRead","ids","map","updateCommentStatusSeenFx","pending","setAllCommentsRead","getCommentsFx","done","params","result","generateCommentsMap","id","setData","commentDeleted","commentAdded","add","exports"],"sourceRoot":"../../../../../src","sources":["features/feedback/model/model.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["FeedbackSocketEvents","exports"],"sourceRoot":"../../../../src","sources":["features/feedback/types.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"names":["FeedbackSocketEvents","exports"],"sourceRoot":"../../../../src","sources":["features/feedback/types.ts"],"mappings":";;;;;;IA4CYA,oBAAoB,GAAAC,OAAA,CAAAD,oBAAA,0BAApBA,oBAAoB;EAApBA,oBAAoB;EAApBA,oBAAoB;EAAA,OAApBA,oBAAoB;AAAA","ignoreList":[]}
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
import { createEvent, restore, sample } from 'effector';
|
|
4
4
|
export class TeacherComments {
|
|
5
|
+
setNoCommentsMessage = createEvent();
|
|
5
6
|
setAllCommentsRead = createEvent();
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
add = createEvent();
|
|
8
|
+
delete = createEvent();
|
|
8
9
|
setData = createEvent();
|
|
9
10
|
$data = restore(this.setData, null).on(this.setAllCommentsRead, (state, {
|
|
10
11
|
assignmentId,
|
|
@@ -20,7 +21,7 @@ export class TeacherComments {
|
|
|
20
21
|
})),
|
|
21
22
|
unreadMessagesCount: 0
|
|
22
23
|
})
|
|
23
|
-
})).on(this.
|
|
24
|
+
})).on(this.add, (state, {
|
|
24
25
|
assignmentId,
|
|
25
26
|
problemId,
|
|
26
27
|
comment,
|
|
@@ -33,7 +34,7 @@ export class TeacherComments {
|
|
|
33
34
|
comments: [...data.comments, comment],
|
|
34
35
|
unreadMessagesCount: isRead ? data.unreadMessagesCount : data.unreadMessagesCount + 1
|
|
35
36
|
})
|
|
36
|
-
})).on(this.
|
|
37
|
+
})).on(this.delete, (state, {
|
|
37
38
|
assignmentId,
|
|
38
39
|
problemId,
|
|
39
40
|
commentId
|
|
@@ -46,17 +47,64 @@ export class TeacherComments {
|
|
|
46
47
|
_id
|
|
47
48
|
}) => _id === commentId);
|
|
48
49
|
if (!commentToDelete) return data;
|
|
50
|
+
const filteredComments = data.comments.filter(({
|
|
51
|
+
_id
|
|
52
|
+
}) => _id !== commentId);
|
|
53
|
+
if (!filteredComments.length) return undefined;
|
|
49
54
|
return {
|
|
50
|
-
comments:
|
|
51
|
-
_id
|
|
52
|
-
}) => _id !== commentId),
|
|
55
|
+
comments: filteredComments,
|
|
53
56
|
unreadMessagesCount: commentToDelete.isRead ? data.unreadMessagesCount : data.unreadMessagesCount - 1
|
|
54
57
|
};
|
|
55
58
|
}
|
|
59
|
+
})).on(this.setNoCommentsMessage, (state, noCommentsMessage) => this.update({
|
|
60
|
+
state,
|
|
61
|
+
assignmentId: noCommentsMessage.exerciseId,
|
|
62
|
+
problemId: noCommentsMessage.problemId,
|
|
63
|
+
fn: () => ({
|
|
64
|
+
comments: [noCommentsMessage],
|
|
65
|
+
unreadMessagesCount: 0
|
|
66
|
+
})
|
|
56
67
|
}));
|
|
57
|
-
constructor() {
|
|
68
|
+
constructor(api, $isOpen, EMPTY_COMMENT) {
|
|
58
69
|
sample({
|
|
59
|
-
clock: this.
|
|
70
|
+
clock: this.add,
|
|
71
|
+
source: {
|
|
72
|
+
isOpen: $isOpen
|
|
73
|
+
},
|
|
74
|
+
filter: ({
|
|
75
|
+
isOpen
|
|
76
|
+
}) => isOpen,
|
|
77
|
+
fn: (_, {
|
|
78
|
+
comment
|
|
79
|
+
}) => ({
|
|
80
|
+
ids: [comment._id]
|
|
81
|
+
}),
|
|
82
|
+
target: api.updateCommentStatusSeenFx
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Adds message "No comments yet" after removing last comment and list is open
|
|
86
|
+
sample({
|
|
87
|
+
clock: this.delete,
|
|
88
|
+
source: {
|
|
89
|
+
isOpen: $isOpen,
|
|
90
|
+
state: this.$data
|
|
91
|
+
},
|
|
92
|
+
filter: ({
|
|
93
|
+
isOpen,
|
|
94
|
+
state
|
|
95
|
+
}, deletedMessage) => {
|
|
96
|
+
const hasNoMessages = !state?.get(deletedMessage.assignmentId)?.[deletedMessage.problemId]?.comments.length;
|
|
97
|
+
return isOpen && hasNoMessages;
|
|
98
|
+
},
|
|
99
|
+
fn: (_, {
|
|
100
|
+
assignmentId,
|
|
101
|
+
problemId
|
|
102
|
+
}) => ({
|
|
103
|
+
...EMPTY_COMMENT,
|
|
104
|
+
exerciseId: assignmentId,
|
|
105
|
+
problemId
|
|
106
|
+
}),
|
|
107
|
+
target: this.setNoCommentsMessage
|
|
60
108
|
});
|
|
61
109
|
}
|
|
62
110
|
update({
|
|
@@ -68,7 +116,10 @@ export class TeacherComments {
|
|
|
68
116
|
if (!state) return state;
|
|
69
117
|
const updatedState = new Map(state);
|
|
70
118
|
const assignmentMap = updatedState.get(assignmentId) || {};
|
|
71
|
-
const currentData = assignmentMap[problemId]
|
|
119
|
+
const currentData = assignmentMap[problemId] || {
|
|
120
|
+
comments: [],
|
|
121
|
+
unreadMessagesCount: 0
|
|
122
|
+
};
|
|
72
123
|
const updatedData = fn(currentData);
|
|
73
124
|
if (updatedData === undefined) {
|
|
74
125
|
delete assignmentMap[problemId];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createEvent","restore","sample","TeacherComments","setAllCommentsRead","
|
|
1
|
+
{"version":3,"names":["createEvent","restore","sample","TeacherComments","setNoCommentsMessage","setAllCommentsRead","add","delete","setData","$data","on","state","assignmentId","problemId","update","fn","data","comments","map","comment","isRead","unreadMessagesCount","commentId","commentToDelete","find","_id","filteredComments","filter","length","undefined","noCommentsMessage","exerciseId","constructor","api","$isOpen","EMPTY_COMMENT","clock","source","isOpen","_","ids","target","updateCommentStatusSeenFx","deletedMessage","hasNoMessages","get","updatedState","Map","assignmentMap","currentData","updatedData","Object","keys","set"],"sourceRoot":"../../../../../src","sources":["features/feedback/model/comments.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,OAAO,EAAEC,MAAM,QAAe,UAAU;AAY9D,OAAO,MAAMC,eAAe,CAAC;EACVC,oBAAoB,GAAGJ,WAAW,CAAiB,CAAC;EACrDK,kBAAkB,GAAGL,WAAW,CAAU,CAAC;EAC3CM,GAAG,GAAGN,WAAW,CAAyD,CAAC;EAC3EO,MAAM,GAAGP,WAAW,CAAkC,CAAC;EAEvDQ,OAAO,GAAGR,WAAW,CAAc,CAAC;EACpCS,KAAK,GAAGR,OAAO,CAAqB,IAAI,CAACO,OAAO,EAAE,IAAI,CAAC,CACpEE,EAAE,CAAC,IAAI,CAACL,kBAAkB,EAAE,CAACM,KAAK,EAAE;IAAEC,YAAY;IAAEC;EAAU,CAAC,KAC9D,IAAI,CAACC,MAAM,CAAC;IACVH,KAAK;IACLC,YAAY;IACZC,SAAS;IACTE,EAAE,EAAEC,IAAI,KAAK;MACXC,QAAQ,EAAED,IAAI,CAACC,QAAQ,CAACC,GAAG,CAACC,OAAO,KAAK;QAAE,GAAGA,OAAO;QAAEC,MAAM,EAAE;MAAK,CAAC,CAAC,CAAC;MACtEC,mBAAmB,EAAE;IACvB,CAAC;EACH,CAAC,CACH,CAAC,CACAX,EAAE,CAAC,IAAI,CAACJ,GAAG,EAAE,CAACK,KAAK,EAAE;IAAEC,YAAY;IAAEC,SAAS;IAAEM,OAAO;IAAEC;EAAO,CAAC,KAChE,IAAI,CAACN,MAAM,CAAC;IACVH,KAAK;IACLC,YAAY;IACZC,SAAS;IACTE,EAAE,EAAEC,IAAI,KAAK;MACXC,QAAQ,EAAE,CAAC,GAAGD,IAAI,CAACC,QAAQ,EAAEE,OAAO,CAAC;MACrCE,mBAAmB,EAAED,MAAM,GAAGJ,IAAI,CAACK,mBAAmB,GAAGL,IAAI,CAACK,mBAAmB,GAAG;IACtF,CAAC;EACH,CAAC,CACH,CAAC,CACAX,EAAE,CAAC,IAAI,CAACH,MAAM,EAAE,CAACI,KAAK,EAAE;IAAEC,YAAY;IAAEC,SAAS;IAAES;EAAU,CAAC,KAC7D,IAAI,CAACR,MAAM,CAAC;IACVH,KAAK;IACLC,YAAY;IACZC,SAAS;IACTE,EAAE,EAAEC,IAAI,IAAI;MACV,MAAMO,eAAe,GAAGP,IAAI,CAACC,QAAQ,CAACO,IAAI,CAAC,CAAC;QAAEC;MAAI,CAAC,KAAKA,GAAG,KAAKH,SAAS,CAAC;MAC1E,IAAI,CAACC,eAAe,EAAE,OAAOP,IAAI;MAEjC,MAAMU,gBAAgB,GAAGV,IAAI,CAACC,QAAQ,CAACU,MAAM,CAAC,CAAC;QAAEF;MAAI,CAAC,KAAKA,GAAG,KAAKH,SAAS,CAAC;MAC7E,IAAI,CAACI,gBAAgB,CAACE,MAAM,EAAE,OAAOC,SAAS;MAE9C,OAAO;QACLZ,QAAQ,EAAES,gBAAgB;QAC1BL,mBAAmB,EAAEE,eAAe,CAACH,MAAM,GACvCJ,IAAI,CAACK,mBAAmB,GACxBL,IAAI,CAACK,mBAAmB,GAAG;MACjC,CAAC;IACH;EACF,CAAC,CACH,CAAC,CACAX,EAAE,CAAC,IAAI,CAACN,oBAAoB,EAAE,CAACO,KAAK,EAAEmB,iBAAiB,KACtD,IAAI,CAAChB,MAAM,CAAC;IACVH,KAAK;IACLC,YAAY,EAAEkB,iBAAiB,CAACC,UAAU;IAC1ClB,SAAS,EAAEiB,iBAAiB,CAACjB,SAAS;IACtCE,EAAE,EAAEA,CAAA,MAAO;MACTE,QAAQ,EAAE,CAACa,iBAAiB,CAAC;MAC7BT,mBAAmB,EAAE;IACvB,CAAC;EACH,CAAC,CACH,CAAC;EAEHW,WAAWA,CACTC,GAAuB,EACvBC,OAAuB,EACvBC,aAAqE,EACrE;IACAjC,MAAM,CAAC;MACLkC,KAAK,EAAE,IAAI,CAAC9B,GAAG;MACf+B,MAAM,EAAE;QAAEC,MAAM,EAAEJ;MAAQ,CAAC;MAC3BP,MAAM,EAAEA,CAAC;QAAEW;MAAO,CAAC,KAAKA,MAAM;MAC9BvB,EAAE,EAAEA,CAACwB,CAAC,EAAE;QAAEpB;MAAQ,CAAC,MAAM;QACvBqB,GAAG,EAAE,CAACrB,OAAO,CAACM,GAAG;MACnB,CAAC,CAAC;MACFgB,MAAM,EAAER,GAAG,CAACS;IACd,CAAC,CAAC;;IAEF;IACAxC,MAAM,CAAC;MACLkC,KAAK,EAAE,IAAI,CAAC7B,MAAM;MAClB8B,MAAM,EAAE;QAAEC,MAAM,EAAEJ,OAAO;QAAEvB,KAAK,EAAE,IAAI,CAACF;MAAM,CAAC;MAC9CkB,MAAM,EAAEA,CAAC;QAAEW,MAAM;QAAE3B;MAAM,CAAC,EAAEgC,cAAc,KAAK;QAC7C,MAAMC,aAAa,GAAG,CAACjC,KAAK,EAAEkC,GAAG,CAACF,cAAc,CAAC/B,YAAY,CAAC,GAAG+B,cAAc,CAAC9B,SAAS,CAAC,EACtFI,QAAQ,CAACW,MAAM;QACnB,OAAOU,MAAM,IAAIM,aAAa;MAChC,CAAC;MACD7B,EAAE,EAAEA,CAACwB,CAAC,EAAE;QAAE3B,YAAY;QAAEC;MAAU,CAAC,MAAM;QACvC,GAAGsB,aAAa;QAChBJ,UAAU,EAAEnB,YAAY;QACxBC;MACF,CAAC,CAAC;MACF4B,MAAM,EAAE,IAAI,CAACrC;IACf,CAAC,CAAC;EACJ;EAEQU,MAAMA,CAAC;IAAEH,KAAK;IAAEC,YAAY;IAAEC,SAAS;IAAEE;EAAgB,CAAC,EAAE;IAClE,IAAI,CAACJ,KAAK,EAAE,OAAOA,KAAK;IAExB,MAAMmC,YAAY,GAAG,IAAIC,GAAG,CAACpC,KAAK,CAAC;IACnC,MAAMqC,aAAa,GAAGF,YAAY,CAACD,GAAG,CAACjC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAMqC,WAAW,GAAGD,aAAa,CAACnC,SAAS,CAAC,IAAI;MAAEI,QAAQ,EAAE,EAAE;MAAEI,mBAAmB,EAAE;IAAE,CAAC;IACxF,MAAM6B,WAAW,GAAGnC,EAAE,CAACkC,WAAW,CAAC;IAEnC,IAAIC,WAAW,KAAKrB,SAAS,EAAE;MAC7B,OAAOmB,aAAa,CAACnC,SAAS,CAAC;MAC/B,IAAIsC,MAAM,CAACC,IAAI,CAACJ,aAAa,CAAC,CAACpB,MAAM,KAAK,CAAC,EAAEkB,YAAY,CAACvC,MAAM,CAACK,YAAY,CAAC;MAC9E,OAAOkC,YAAY;IACrB;IAEAE,aAAa,CAACnC,SAAS,CAAC,GAAGqC,WAAW;IACtCJ,YAAY,CAACO,GAAG,CAACzC,YAAY,EAAEoC,aAAa,CAAC;IAC7C,OAAOF,YAAY;EACrB;AACF","ignoreList":[]}
|
|
@@ -5,22 +5,52 @@ import { TeacherFeedbackAPI } from "./api.js";
|
|
|
5
5
|
import { TeacherFeedbackSockets } from "./sockets.js";
|
|
6
6
|
import { TeacherComments } from "./comments.js";
|
|
7
7
|
import { findCommentsByCredits, generateCommentsMap } from "../helpers.js";
|
|
8
|
+
import { EMPTY_COMMENT_ID } from "../constants.js";
|
|
8
9
|
export class TeacherFeedbackModel {
|
|
9
10
|
setIsOpen = createEvent();
|
|
10
11
|
$isOpen = restore(this.setIsOpen, false);
|
|
11
12
|
constructor({
|
|
12
13
|
api,
|
|
13
14
|
socket,
|
|
14
|
-
credits
|
|
15
|
+
credits,
|
|
16
|
+
defaults
|
|
15
17
|
}) {
|
|
16
18
|
this.api = new TeacherFeedbackAPI(api);
|
|
17
19
|
this.sockets = new TeacherFeedbackSockets(socket);
|
|
18
|
-
this.comments = new TeacherComments();
|
|
20
|
+
this.comments = new TeacherComments(this.api, this.$isOpen, defaults.EMPTY_COMMENT);
|
|
19
21
|
sample({
|
|
20
22
|
clock: credits.$problemId,
|
|
21
23
|
fn: () => false,
|
|
22
24
|
target: this.setIsOpen
|
|
23
25
|
});
|
|
26
|
+
|
|
27
|
+
// Deletes entity when closing list with no comments
|
|
28
|
+
sample({
|
|
29
|
+
clock: this.setIsOpen,
|
|
30
|
+
source: {
|
|
31
|
+
data: this.comments.$data,
|
|
32
|
+
assignmentId: credits.$assignmentId,
|
|
33
|
+
problemId: credits.$problemId
|
|
34
|
+
},
|
|
35
|
+
filter: ({
|
|
36
|
+
data,
|
|
37
|
+
assignmentId,
|
|
38
|
+
problemId
|
|
39
|
+
}, isOpen) => {
|
|
40
|
+
const comments = data?.get(assignmentId)?.[problemId].comments;
|
|
41
|
+
const isOnlyNoCommentsMessage = comments?.length === 1 && comments[0]._id === EMPTY_COMMENT_ID;
|
|
42
|
+
return !isOpen && isOnlyNoCommentsMessage;
|
|
43
|
+
},
|
|
44
|
+
fn: ({
|
|
45
|
+
assignmentId,
|
|
46
|
+
problemId
|
|
47
|
+
}, comment) => ({
|
|
48
|
+
assignmentId,
|
|
49
|
+
problemId,
|
|
50
|
+
commentId: EMPTY_COMMENT_ID
|
|
51
|
+
}),
|
|
52
|
+
target: this.comments.delete
|
|
53
|
+
});
|
|
24
54
|
sample({
|
|
25
55
|
clock: this.setIsOpen,
|
|
26
56
|
source: {
|
|
@@ -73,7 +103,7 @@ export class TeacherFeedbackModel {
|
|
|
73
103
|
problemId: comment.problemId,
|
|
74
104
|
commentId: comment._id
|
|
75
105
|
}),
|
|
76
|
-
target: this.comments.
|
|
106
|
+
target: this.comments.delete
|
|
77
107
|
});
|
|
78
108
|
sample({
|
|
79
109
|
clock: this.sockets.commentAdded,
|
|
@@ -87,12 +117,12 @@ export class TeacherFeedbackModel {
|
|
|
87
117
|
problemId,
|
|
88
118
|
isOpen
|
|
89
119
|
}, comment) => ({
|
|
90
|
-
assignmentId,
|
|
91
|
-
problemId,
|
|
92
120
|
comment,
|
|
121
|
+
assignmentId,
|
|
122
|
+
problemId: comment.problemId,
|
|
93
123
|
isRead: isOpen && comment.problemId === problemId
|
|
94
124
|
}),
|
|
95
|
-
target: this.comments.
|
|
125
|
+
target: this.comments.add
|
|
96
126
|
});
|
|
97
127
|
}
|
|
98
128
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createEvent","restore","sample","TeacherFeedbackAPI","TeacherFeedbackSockets","TeacherComments","findCommentsByCredits","generateCommentsMap","TeacherFeedbackModel","setIsOpen","$isOpen","constructor","api","socket","credits","sockets","comments","clock","$problemId","fn","target","source","data","$data","assignmentId","$assignmentId","problemId","filter","isOpen","hasUnreadComments","some","isRead","ids","map","
|
|
1
|
+
{"version":3,"names":["createEvent","restore","sample","TeacherFeedbackAPI","TeacherFeedbackSockets","TeacherComments","findCommentsByCredits","generateCommentsMap","EMPTY_COMMENT_ID","TeacherFeedbackModel","setIsOpen","$isOpen","constructor","api","socket","credits","defaults","sockets","comments","EMPTY_COMMENT","clock","$problemId","fn","target","source","data","$data","assignmentId","$assignmentId","problemId","filter","isOpen","get","isOnlyNoCommentsMessage","length","_id","comment","commentId","delete","hasUnreadComments","some","isRead","ids","map","updateCommentStatusSeenFx","pending","setAllCommentsRead","getCommentsFx","done","params","result","id","setData","commentDeleted","commentAdded","add"],"sourceRoot":"../../../../../src","sources":["features/feedback/model/model.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["FeedbackSocketEvents"],"sourceRoot":"../../../../src","sources":["features/feedback/types.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"names":["FeedbackSocketEvents"],"sourceRoot":"../../../../src","sources":["features/feedback/types.ts"],"mappings":";;AA4CA,WAAYA,oBAAoB,0BAApBA,oBAAoB;EAApBA,oBAAoB;EAApBA,oBAAoB;EAAA,OAApBA,oBAAoB;AAAA","ignoreList":[]}
|
|
@@ -1,16 +1,20 @@
|
|
|
1
|
+
import { Store } from 'effector';
|
|
1
2
|
import { CommentsMap, Credits, TeacherComment } from '../types';
|
|
3
|
+
import { TeacherFeedbackAPI } from './api';
|
|
4
|
+
import { TeacherFeedbackModelProps } from './model';
|
|
2
5
|
export declare class TeacherComments {
|
|
6
|
+
private readonly setNoCommentsMessage;
|
|
3
7
|
readonly setAllCommentsRead: import("effector").EventCallable<Credits>;
|
|
4
|
-
readonly
|
|
8
|
+
readonly add: import("effector").EventCallable<Credits & {
|
|
5
9
|
comment: TeacherComment;
|
|
6
10
|
isRead: boolean;
|
|
7
11
|
}>;
|
|
8
|
-
readonly
|
|
12
|
+
readonly delete: import("effector").EventCallable<Credits & {
|
|
9
13
|
commentId: string;
|
|
10
14
|
}>;
|
|
11
15
|
readonly setData: import("effector").EventCallable<CommentsMap>;
|
|
12
16
|
readonly $data: import("effector").StoreWritable<CommentsMap | null>;
|
|
13
|
-
constructor();
|
|
17
|
+
constructor(api: TeacherFeedbackAPI, $isOpen: Store<boolean>, EMPTY_COMMENT: TeacherFeedbackModelProps['defaults']['EMPTY_COMMENT']);
|
|
14
18
|
private update;
|
|
15
19
|
}
|
|
16
20
|
//# sourceMappingURL=comments.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../../../../../src/features/feedback/model/comments.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../../../../../src/features/feedback/model/comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,OAAO,EAAqC,cAAc,EAAE,MAAM,UAAU,CAAA;AAClG,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AASnD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAgC;IACrE,SAAgB,kBAAkB,4CAAyB;IAC3D,SAAgB,GAAG;iBAAoC,cAAc;gBAAU,OAAO;OAAK;IAC3F,SAAgB,MAAM;mBAAsC,MAAM;OAAK;IAEvE,SAAgB,OAAO,gDAA6B;IACpD,SAAgB,KAAK,uDAsDlB;gBAGD,GAAG,EAAE,kBAAkB,EACvB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EACvB,aAAa,EAAE,yBAAyB,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC;IA8BvE,OAAO,CAAC,MAAM;CAkBf"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Store } from 'effector';
|
|
2
2
|
import { TeacherFeedbackAPI } from './api';
|
|
3
|
+
import { TeacherFeedbackSockets } from './sockets';
|
|
3
4
|
import { TeacherComments } from './comments';
|
|
4
|
-
import { GetCommentsPayload, GetCommentsResponse,
|
|
5
|
+
import { GetCommentsPayload, GetCommentsResponse, NoCommentsMessage, UpdateCommentStatusSeenPayload } from '../types';
|
|
5
6
|
export type TeacherFeedbackModelProps = {
|
|
6
7
|
api: {
|
|
7
8
|
getComments: (props: GetCommentsPayload) => Promise<GetCommentsResponse>;
|
|
@@ -13,15 +14,15 @@ export type TeacherFeedbackModelProps = {
|
|
|
13
14
|
$problemId: Store<string>;
|
|
14
15
|
};
|
|
15
16
|
defaults: {
|
|
16
|
-
EMPTY_COMMENT:
|
|
17
|
+
EMPTY_COMMENT: NoCommentsMessage;
|
|
17
18
|
};
|
|
18
19
|
};
|
|
19
20
|
export declare class TeacherFeedbackModel {
|
|
20
|
-
|
|
21
|
+
readonly sockets: TeacherFeedbackSockets;
|
|
21
22
|
readonly api: TeacherFeedbackAPI;
|
|
22
23
|
readonly comments: TeacherComments;
|
|
23
24
|
readonly setIsOpen: import("effector").EventCallable<boolean>;
|
|
24
25
|
readonly $isOpen: import("effector").StoreWritable<boolean>;
|
|
25
|
-
constructor({ api, socket, credits }: TeacherFeedbackModelProps);
|
|
26
|
+
constructor({ api, socket, credits, defaults }: TeacherFeedbackModelProps);
|
|
26
27
|
}
|
|
27
28
|
//# sourceMappingURL=model.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../../../src/features/feedback/model/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../../../src/features/feedback/model/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,8BAA8B,EAC/B,MAAM,UAAU,CAAA;AAGjB,MAAM,MAAM,yBAAyB,GAAG;IACtC,GAAG,EAAE;QACH,WAAW,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAA;QACxE,uBAAuB,EAAE,CAAC,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KAClF,CAAA;IACD,MAAM,EAAE,GAAG,CAAA;IACX,OAAO,EAAE;QACP,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;QAC5B,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;KAC1B,CAAA;IACD,QAAQ,EAAE;QAAE,aAAa,EAAE,iBAAiB,CAAA;KAAE,CAAA;CAC/C,CAAA;AAED,qBAAa,oBAAoB;IAC/B,SAAgB,OAAO,EAAE,sBAAsB,CAAA;IAC/C,SAAgB,GAAG,EAAE,kBAAkB,CAAA;IACvC,SAAgB,QAAQ,EAAE,eAAe,CAAA;IACzC,SAAgB,SAAS,4CAAyB;IAClD,SAAgB,OAAO,4CAAiC;gBAE5C,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,yBAAyB;CA2F1E"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { EMPTY_COMMENT_ID } from './constants';
|
|
1
2
|
export type GetCommentsPayload = {
|
|
2
3
|
id: string;
|
|
3
4
|
};
|
|
@@ -22,6 +23,9 @@ export type TeacherComment = {
|
|
|
22
23
|
updatedAt: Date;
|
|
23
24
|
__v: number;
|
|
24
25
|
};
|
|
26
|
+
export type NoCommentsMessage = Omit<TeacherComment, '_id' | 'problemId' | 'exerciseId'> & {
|
|
27
|
+
_id: typeof EMPTY_COMMENT_ID;
|
|
28
|
+
};
|
|
25
29
|
export type FeedbackEntity = {
|
|
26
30
|
comments: TeacherComment[];
|
|
27
31
|
unreadMessagesCount: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/features/feedback/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAA;CACX,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,cAAc,EAAE,CAAA;KAAE,CAAA;CACpD,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG;IAC3C,GAAG,EAAE,MAAM,EAAE,CAAA;CACd,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,mBAAmB,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE;IAAE,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAA;CAAE,CAAC,CAAA;AAE9E,MAAM,MAAM,OAAO,GAAG;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,oBAAY,oBAAoB;IAC9B,aAAa,2BAA2B;IACxC,eAAe,2BAA2B;CAC3C"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/features/feedback/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAA;CACX,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,cAAc,EAAE,CAAA;KAAE,CAAA;CACpD,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG;IAC3C,GAAG,EAAE,MAAM,EAAE,CAAA;CACd,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,WAAW,GAAG,YAAY,CAAC,GAAG;IACzF,GAAG,EAAE,OAAO,gBAAgB,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,mBAAmB,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE;IAAE,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAA;CAAE,CAAC,CAAA;AAE9E,MAAM,MAAM,OAAO,GAAG;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,oBAAY,oBAAoB;IAC9B,aAAa,2BAA2B;IACxC,eAAe,2BAA2B;CAC3C"}
|
|
@@ -1,16 +1,20 @@
|
|
|
1
|
+
import { Store } from 'effector';
|
|
1
2
|
import { CommentsMap, Credits, TeacherComment } from '../types';
|
|
3
|
+
import { TeacherFeedbackAPI } from './api';
|
|
4
|
+
import { TeacherFeedbackModelProps } from './model';
|
|
2
5
|
export declare class TeacherComments {
|
|
6
|
+
private readonly setNoCommentsMessage;
|
|
3
7
|
readonly setAllCommentsRead: import("effector").EventCallable<Credits>;
|
|
4
|
-
readonly
|
|
8
|
+
readonly add: import("effector").EventCallable<Credits & {
|
|
5
9
|
comment: TeacherComment;
|
|
6
10
|
isRead: boolean;
|
|
7
11
|
}>;
|
|
8
|
-
readonly
|
|
12
|
+
readonly delete: import("effector").EventCallable<Credits & {
|
|
9
13
|
commentId: string;
|
|
10
14
|
}>;
|
|
11
15
|
readonly setData: import("effector").EventCallable<CommentsMap>;
|
|
12
16
|
readonly $data: import("effector").StoreWritable<CommentsMap | null>;
|
|
13
|
-
constructor();
|
|
17
|
+
constructor(api: TeacherFeedbackAPI, $isOpen: Store<boolean>, EMPTY_COMMENT: TeacherFeedbackModelProps['defaults']['EMPTY_COMMENT']);
|
|
14
18
|
private update;
|
|
15
19
|
}
|
|
16
20
|
//# sourceMappingURL=comments.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../../../../../src/features/feedback/model/comments.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../../../../../src/features/feedback/model/comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,OAAO,EAAqC,cAAc,EAAE,MAAM,UAAU,CAAA;AAClG,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AASnD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAgC;IACrE,SAAgB,kBAAkB,4CAAyB;IAC3D,SAAgB,GAAG;iBAAoC,cAAc;gBAAU,OAAO;OAAK;IAC3F,SAAgB,MAAM;mBAAsC,MAAM;OAAK;IAEvE,SAAgB,OAAO,gDAA6B;IACpD,SAAgB,KAAK,uDAsDlB;gBAGD,GAAG,EAAE,kBAAkB,EACvB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EACvB,aAAa,EAAE,yBAAyB,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC;IA8BvE,OAAO,CAAC,MAAM;CAkBf"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Store } from 'effector';
|
|
2
2
|
import { TeacherFeedbackAPI } from './api';
|
|
3
|
+
import { TeacherFeedbackSockets } from './sockets';
|
|
3
4
|
import { TeacherComments } from './comments';
|
|
4
|
-
import { GetCommentsPayload, GetCommentsResponse,
|
|
5
|
+
import { GetCommentsPayload, GetCommentsResponse, NoCommentsMessage, UpdateCommentStatusSeenPayload } from '../types';
|
|
5
6
|
export type TeacherFeedbackModelProps = {
|
|
6
7
|
api: {
|
|
7
8
|
getComments: (props: GetCommentsPayload) => Promise<GetCommentsResponse>;
|
|
@@ -13,15 +14,15 @@ export type TeacherFeedbackModelProps = {
|
|
|
13
14
|
$problemId: Store<string>;
|
|
14
15
|
};
|
|
15
16
|
defaults: {
|
|
16
|
-
EMPTY_COMMENT:
|
|
17
|
+
EMPTY_COMMENT: NoCommentsMessage;
|
|
17
18
|
};
|
|
18
19
|
};
|
|
19
20
|
export declare class TeacherFeedbackModel {
|
|
20
|
-
|
|
21
|
+
readonly sockets: TeacherFeedbackSockets;
|
|
21
22
|
readonly api: TeacherFeedbackAPI;
|
|
22
23
|
readonly comments: TeacherComments;
|
|
23
24
|
readonly setIsOpen: import("effector").EventCallable<boolean>;
|
|
24
25
|
readonly $isOpen: import("effector").StoreWritable<boolean>;
|
|
25
|
-
constructor({ api, socket, credits }: TeacherFeedbackModelProps);
|
|
26
|
+
constructor({ api, socket, credits, defaults }: TeacherFeedbackModelProps);
|
|
26
27
|
}
|
|
27
28
|
//# sourceMappingURL=model.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../../../src/features/feedback/model/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../../../src/features/feedback/model/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,8BAA8B,EAC/B,MAAM,UAAU,CAAA;AAGjB,MAAM,MAAM,yBAAyB,GAAG;IACtC,GAAG,EAAE;QACH,WAAW,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAA;QACxE,uBAAuB,EAAE,CAAC,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KAClF,CAAA;IACD,MAAM,EAAE,GAAG,CAAA;IACX,OAAO,EAAE;QACP,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;QAC5B,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;KAC1B,CAAA;IACD,QAAQ,EAAE;QAAE,aAAa,EAAE,iBAAiB,CAAA;KAAE,CAAA;CAC/C,CAAA;AAED,qBAAa,oBAAoB;IAC/B,SAAgB,OAAO,EAAE,sBAAsB,CAAA;IAC/C,SAAgB,GAAG,EAAE,kBAAkB,CAAA;IACvC,SAAgB,QAAQ,EAAE,eAAe,CAAA;IACzC,SAAgB,SAAS,4CAAyB;IAClD,SAAgB,OAAO,4CAAiC;gBAE5C,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,yBAAyB;CA2F1E"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { EMPTY_COMMENT_ID } from './constants';
|
|
1
2
|
export type GetCommentsPayload = {
|
|
2
3
|
id: string;
|
|
3
4
|
};
|
|
@@ -22,6 +23,9 @@ export type TeacherComment = {
|
|
|
22
23
|
updatedAt: Date;
|
|
23
24
|
__v: number;
|
|
24
25
|
};
|
|
26
|
+
export type NoCommentsMessage = Omit<TeacherComment, '_id' | 'problemId' | 'exerciseId'> & {
|
|
27
|
+
_id: typeof EMPTY_COMMENT_ID;
|
|
28
|
+
};
|
|
25
29
|
export type FeedbackEntity = {
|
|
26
30
|
comments: TeacherComment[];
|
|
27
31
|
unreadMessagesCount: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/features/feedback/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAA;CACX,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,cAAc,EAAE,CAAA;KAAE,CAAA;CACpD,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG;IAC3C,GAAG,EAAE,MAAM,EAAE,CAAA;CACd,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,mBAAmB,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE;IAAE,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAA;CAAE,CAAC,CAAA;AAE9E,MAAM,MAAM,OAAO,GAAG;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,oBAAY,oBAAoB;IAC9B,aAAa,2BAA2B;IACxC,eAAe,2BAA2B;CAC3C"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/features/feedback/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAA;CACX,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,cAAc,EAAE,CAAA;KAAE,CAAA;CACpD,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG;IAC3C,GAAG,EAAE,MAAM,EAAE,CAAA;CACd,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,WAAW,GAAG,YAAY,CAAC,GAAG;IACzF,GAAG,EAAE,OAAO,gBAAgB,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,mBAAmB,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE;IAAE,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAA;CAAE,CAAC,CAAA;AAE9E,MAAM,MAAM,OAAO,GAAG;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,oBAAY,oBAAoB;IAC9B,aAAa,2BAA2B;IACxC,eAAe,2BAA2B;CAC3C"}
|
package/package.json
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { createEvent, restore, sample } from 'effector'
|
|
2
|
-
import { CommentsMap, Credits, FeedbackEntity, TeacherComment } from '../types'
|
|
1
|
+
import { createEvent, restore, sample, Store } from 'effector'
|
|
2
|
+
import { CommentsMap, Credits, FeedbackEntity, NoCommentsMessage, TeacherComment } from '../types'
|
|
3
|
+
import { TeacherFeedbackAPI } from './api'
|
|
4
|
+
import { TeacherFeedbackModelProps } from './model'
|
|
3
5
|
|
|
4
6
|
type UpdateProps = {
|
|
5
7
|
state: CommentsMap | null
|
|
@@ -9,9 +11,10 @@ type UpdateProps = {
|
|
|
9
11
|
}
|
|
10
12
|
|
|
11
13
|
export class TeacherComments {
|
|
14
|
+
private readonly setNoCommentsMessage = createEvent<TeacherComment>()
|
|
12
15
|
public readonly setAllCommentsRead = createEvent<Credits>()
|
|
13
|
-
public readonly
|
|
14
|
-
public readonly
|
|
16
|
+
public readonly add = createEvent<Credits & { comment: TeacherComment; isRead: boolean }>()
|
|
17
|
+
public readonly delete = createEvent<Credits & { commentId: string }>()
|
|
15
18
|
|
|
16
19
|
public readonly setData = createEvent<CommentsMap>()
|
|
17
20
|
public readonly $data = restore<CommentsMap | null>(this.setData, null)
|
|
@@ -26,7 +29,7 @@ export class TeacherComments {
|
|
|
26
29
|
}),
|
|
27
30
|
}),
|
|
28
31
|
)
|
|
29
|
-
.on(this.
|
|
32
|
+
.on(this.add, (state, { assignmentId, problemId, comment, isRead }) =>
|
|
30
33
|
this.update({
|
|
31
34
|
state,
|
|
32
35
|
assignmentId,
|
|
@@ -37,7 +40,7 @@ export class TeacherComments {
|
|
|
37
40
|
}),
|
|
38
41
|
}),
|
|
39
42
|
)
|
|
40
|
-
.on(this.
|
|
43
|
+
.on(this.delete, (state, { assignmentId, problemId, commentId }) =>
|
|
41
44
|
this.update({
|
|
42
45
|
state,
|
|
43
46
|
assignmentId,
|
|
@@ -45,8 +48,12 @@ export class TeacherComments {
|
|
|
45
48
|
fn: data => {
|
|
46
49
|
const commentToDelete = data.comments.find(({ _id }) => _id === commentId)
|
|
47
50
|
if (!commentToDelete) return data
|
|
51
|
+
|
|
52
|
+
const filteredComments = data.comments.filter(({ _id }) => _id !== commentId)
|
|
53
|
+
if (!filteredComments.length) return undefined
|
|
54
|
+
|
|
48
55
|
return {
|
|
49
|
-
comments:
|
|
56
|
+
comments: filteredComments,
|
|
50
57
|
unreadMessagesCount: commentToDelete.isRead
|
|
51
58
|
? data.unreadMessagesCount
|
|
52
59
|
: data.unreadMessagesCount - 1,
|
|
@@ -54,10 +61,48 @@ export class TeacherComments {
|
|
|
54
61
|
},
|
|
55
62
|
}),
|
|
56
63
|
)
|
|
64
|
+
.on(this.setNoCommentsMessage, (state, noCommentsMessage) =>
|
|
65
|
+
this.update({
|
|
66
|
+
state,
|
|
67
|
+
assignmentId: noCommentsMessage.exerciseId,
|
|
68
|
+
problemId: noCommentsMessage.problemId,
|
|
69
|
+
fn: () => ({
|
|
70
|
+
comments: [noCommentsMessage],
|
|
71
|
+
unreadMessagesCount: 0,
|
|
72
|
+
}),
|
|
73
|
+
}),
|
|
74
|
+
)
|
|
57
75
|
|
|
58
|
-
constructor(
|
|
76
|
+
constructor(
|
|
77
|
+
api: TeacherFeedbackAPI,
|
|
78
|
+
$isOpen: Store<boolean>,
|
|
79
|
+
EMPTY_COMMENT: TeacherFeedbackModelProps['defaults']['EMPTY_COMMENT'],
|
|
80
|
+
) {
|
|
59
81
|
sample({
|
|
60
|
-
clock: this.
|
|
82
|
+
clock: this.add,
|
|
83
|
+
source: { isOpen: $isOpen },
|
|
84
|
+
filter: ({ isOpen }) => isOpen,
|
|
85
|
+
fn: (_, { comment }) => ({
|
|
86
|
+
ids: [comment._id],
|
|
87
|
+
}),
|
|
88
|
+
target: api.updateCommentStatusSeenFx,
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
// Adds message "No comments yet" after removing last comment and list is open
|
|
92
|
+
sample({
|
|
93
|
+
clock: this.delete,
|
|
94
|
+
source: { isOpen: $isOpen, state: this.$data },
|
|
95
|
+
filter: ({ isOpen, state }, deletedMessage) => {
|
|
96
|
+
const hasNoMessages = !state?.get(deletedMessage.assignmentId)?.[deletedMessage.problemId]
|
|
97
|
+
?.comments.length
|
|
98
|
+
return isOpen && hasNoMessages
|
|
99
|
+
},
|
|
100
|
+
fn: (_, { assignmentId, problemId }) => ({
|
|
101
|
+
...EMPTY_COMMENT,
|
|
102
|
+
exerciseId: assignmentId,
|
|
103
|
+
problemId,
|
|
104
|
+
}),
|
|
105
|
+
target: this.setNoCommentsMessage,
|
|
61
106
|
})
|
|
62
107
|
}
|
|
63
108
|
|
|
@@ -66,7 +111,7 @@ export class TeacherComments {
|
|
|
66
111
|
|
|
67
112
|
const updatedState = new Map(state)
|
|
68
113
|
const assignmentMap = updatedState.get(assignmentId) || {}
|
|
69
|
-
const currentData = assignmentMap[problemId]
|
|
114
|
+
const currentData = assignmentMap[problemId] || { comments: [], unreadMessagesCount: 0 }
|
|
70
115
|
const updatedData = fn(currentData)
|
|
71
116
|
|
|
72
117
|
if (updatedData === undefined) {
|
|
@@ -6,9 +6,10 @@ import { findCommentsByCredits, generateCommentsMap } from '../helpers'
|
|
|
6
6
|
import {
|
|
7
7
|
GetCommentsPayload,
|
|
8
8
|
GetCommentsResponse,
|
|
9
|
-
|
|
9
|
+
NoCommentsMessage,
|
|
10
10
|
UpdateCommentStatusSeenPayload,
|
|
11
11
|
} from '../types'
|
|
12
|
+
import { EMPTY_COMMENT_ID } from '../constants'
|
|
12
13
|
|
|
13
14
|
export type TeacherFeedbackModelProps = {
|
|
14
15
|
api: {
|
|
@@ -20,20 +21,20 @@ export type TeacherFeedbackModelProps = {
|
|
|
20
21
|
$assignmentId: Store<string>
|
|
21
22
|
$problemId: Store<string>
|
|
22
23
|
}
|
|
23
|
-
defaults: { EMPTY_COMMENT:
|
|
24
|
+
defaults: { EMPTY_COMMENT: NoCommentsMessage }
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
export class TeacherFeedbackModel {
|
|
27
|
-
|
|
28
|
+
public readonly sockets: TeacherFeedbackSockets
|
|
28
29
|
public readonly api: TeacherFeedbackAPI
|
|
29
30
|
public readonly comments: TeacherComments
|
|
30
31
|
public readonly setIsOpen = createEvent<boolean>()
|
|
31
32
|
public readonly $isOpen = restore(this.setIsOpen, false)
|
|
32
33
|
|
|
33
|
-
constructor({ api, socket, credits }: TeacherFeedbackModelProps) {
|
|
34
|
+
constructor({ api, socket, credits, defaults }: TeacherFeedbackModelProps) {
|
|
34
35
|
this.api = new TeacherFeedbackAPI(api)
|
|
35
36
|
this.sockets = new TeacherFeedbackSockets(socket)
|
|
36
|
-
this.comments = new TeacherComments()
|
|
37
|
+
this.comments = new TeacherComments(this.api, this.$isOpen, defaults.EMPTY_COMMENT)
|
|
37
38
|
|
|
38
39
|
sample({
|
|
39
40
|
clock: credits.$problemId,
|
|
@@ -41,6 +42,28 @@ export class TeacherFeedbackModel {
|
|
|
41
42
|
target: this.setIsOpen,
|
|
42
43
|
})
|
|
43
44
|
|
|
45
|
+
// Deletes entity when closing list with no comments
|
|
46
|
+
sample({
|
|
47
|
+
clock: this.setIsOpen,
|
|
48
|
+
source: {
|
|
49
|
+
data: this.comments.$data,
|
|
50
|
+
assignmentId: credits.$assignmentId,
|
|
51
|
+
problemId: credits.$problemId,
|
|
52
|
+
},
|
|
53
|
+
filter: ({ data, assignmentId, problemId }, isOpen) => {
|
|
54
|
+
const comments = data?.get(assignmentId)?.[problemId].comments
|
|
55
|
+
const isOnlyNoCommentsMessage =
|
|
56
|
+
comments?.length === 1 && comments[0]._id === EMPTY_COMMENT_ID
|
|
57
|
+
return !isOpen && isOnlyNoCommentsMessage
|
|
58
|
+
},
|
|
59
|
+
fn: ({ assignmentId, problemId }, comment) => ({
|
|
60
|
+
assignmentId,
|
|
61
|
+
problemId,
|
|
62
|
+
commentId: EMPTY_COMMENT_ID,
|
|
63
|
+
}),
|
|
64
|
+
target: this.comments.delete,
|
|
65
|
+
})
|
|
66
|
+
|
|
44
67
|
sample({
|
|
45
68
|
clock: this.setIsOpen,
|
|
46
69
|
source: {
|
|
@@ -80,7 +103,7 @@ export class TeacherFeedbackModel {
|
|
|
80
103
|
problemId: comment.problemId,
|
|
81
104
|
commentId: comment._id,
|
|
82
105
|
}),
|
|
83
|
-
target: this.comments.
|
|
106
|
+
target: this.comments.delete,
|
|
84
107
|
})
|
|
85
108
|
|
|
86
109
|
sample({
|
|
@@ -91,12 +114,12 @@ export class TeacherFeedbackModel {
|
|
|
91
114
|
isOpen: this.$isOpen,
|
|
92
115
|
},
|
|
93
116
|
fn: ({ assignmentId, problemId, isOpen }, comment) => ({
|
|
94
|
-
assignmentId,
|
|
95
|
-
problemId,
|
|
96
117
|
comment,
|
|
118
|
+
assignmentId,
|
|
119
|
+
problemId: comment.problemId,
|
|
97
120
|
isRead: isOpen && comment.problemId === problemId,
|
|
98
121
|
}),
|
|
99
|
-
target: this.comments.
|
|
122
|
+
target: this.comments.add,
|
|
100
123
|
})
|
|
101
124
|
}
|
|
102
125
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { EMPTY_COMMENT_ID } from './constants'
|
|
2
|
+
|
|
1
3
|
export type GetCommentsPayload = {
|
|
2
4
|
id: string
|
|
3
5
|
}
|
|
@@ -24,6 +26,10 @@ export type TeacherComment = {
|
|
|
24
26
|
__v: number
|
|
25
27
|
}
|
|
26
28
|
|
|
29
|
+
export type NoCommentsMessage = Omit<TeacherComment, '_id' | 'problemId' | 'exerciseId'> & {
|
|
30
|
+
_id: typeof EMPTY_COMMENT_ID
|
|
31
|
+
}
|
|
32
|
+
|
|
27
33
|
export type FeedbackEntity = {
|
|
28
34
|
comments: TeacherComment[]
|
|
29
35
|
unreadMessagesCount: number
|