@magmamath/students-features 0.2.4 → 0.2.6

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.
Files changed (26) hide show
  1. package/dist/commonjs/features/feedback/model/comments.js +61 -10
  2. package/dist/commonjs/features/feedback/model/comments.js.map +1 -1
  3. package/dist/commonjs/features/feedback/model/model.js +38 -6
  4. package/dist/commonjs/features/feedback/model/model.js.map +1 -1
  5. package/dist/commonjs/features/feedback/types.js.map +1 -1
  6. package/dist/module/features/feedback/model/comments.js +61 -10
  7. package/dist/module/features/feedback/model/comments.js.map +1 -1
  8. package/dist/module/features/feedback/model/model.js +38 -6
  9. package/dist/module/features/feedback/model/model.js.map +1 -1
  10. package/dist/module/features/feedback/types.js.map +1 -1
  11. package/dist/typescript/commonjs/features/feedback/model/comments.d.ts +7 -3
  12. package/dist/typescript/commonjs/features/feedback/model/comments.d.ts.map +1 -1
  13. package/dist/typescript/commonjs/features/feedback/model/model.d.ts +7 -4
  14. package/dist/typescript/commonjs/features/feedback/model/model.d.ts.map +1 -1
  15. package/dist/typescript/commonjs/features/feedback/types.d.ts +4 -0
  16. package/dist/typescript/commonjs/features/feedback/types.d.ts.map +1 -1
  17. package/dist/typescript/module/features/feedback/model/comments.d.ts +7 -3
  18. package/dist/typescript/module/features/feedback/model/comments.d.ts.map +1 -1
  19. package/dist/typescript/module/features/feedback/model/model.d.ts +7 -4
  20. package/dist/typescript/module/features/feedback/model/model.d.ts.map +1 -1
  21. package/dist/typescript/module/features/feedback/types.d.ts +4 -0
  22. package/dist/typescript/module/features/feedback/types.d.ts.map +1 -1
  23. package/package.json +1 -1
  24. package/src/features/feedback/model/comments.ts +54 -9
  25. package/src/features/feedback/model/model.ts +35 -9
  26. 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
- addComment = (0, _effector.createEvent)();
11
- deleteComment = (0, _effector.createEvent)();
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.addComment, (state, {
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.deleteComment, (state, {
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: data.comments.filter(({
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.deleteComment
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","setAllCommentsRead","createEvent","addComment","deleteComment","setData","$data","restore","on","state","assignmentId","problemId","update","fn","data","comments","map","comment","isRead","unreadMessagesCount","commentId","commentToDelete","find","_id","filter","constructor","sample","clock","updatedState","Map","assignmentMap","get","currentData","updatedData","undefined","Object","keys","length","delete","set","exports"],"sourceRoot":"../../../../../src","sources":["features/feedback/model/comments.ts"],"mappings":"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","ignoreList":[]}
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,54 @@ 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);
16
+ setIsFeedbackIconDisplayed = (0, _effector.createEvent)();
17
+ $isFeedbackIconDisplayed = (0, _effector.restore)(this.setIsFeedbackIconDisplayed, true);
15
18
  constructor({
16
19
  api,
17
20
  socket,
18
- credits
21
+ credits,
22
+ defaults
19
23
  }) {
20
24
  this.api = new _api.TeacherFeedbackAPI(api);
21
25
  this.sockets = new _sockets.TeacherFeedbackSockets(socket);
22
- this.comments = new _comments.TeacherComments();
26
+ this.comments = new _comments.TeacherComments(this.api, this.$isOpen, defaults.EMPTY_COMMENT);
23
27
  (0, _effector.sample)({
24
28
  clock: credits.$problemId,
25
29
  fn: () => false,
26
30
  target: this.setIsOpen
27
31
  });
32
+
33
+ // Deletes entity when closing list with no comments
34
+ (0, _effector.sample)({
35
+ clock: this.setIsOpen,
36
+ source: {
37
+ data: this.comments.$data,
38
+ assignmentId: credits.$assignmentId,
39
+ problemId: credits.$problemId
40
+ },
41
+ filter: ({
42
+ data,
43
+ assignmentId,
44
+ problemId
45
+ }, isOpen) => {
46
+ const comments = data?.get(assignmentId)?.[problemId].comments;
47
+ const isOnlyNoCommentsMessage = comments?.length === 1 && comments[0]._id === _constants.EMPTY_COMMENT_ID;
48
+ return !isOpen && isOnlyNoCommentsMessage;
49
+ },
50
+ fn: ({
51
+ assignmentId,
52
+ problemId
53
+ }, comment) => ({
54
+ assignmentId,
55
+ problemId,
56
+ commentId: _constants.EMPTY_COMMENT_ID
57
+ }),
58
+ target: this.comments.delete
59
+ });
28
60
  (0, _effector.sample)({
29
61
  clock: this.setIsOpen,
30
62
  source: {
@@ -77,7 +109,7 @@ class TeacherFeedbackModel {
77
109
  problemId: comment.problemId,
78
110
  commentId: comment._id
79
111
  }),
80
- target: this.comments.deleteComment
112
+ target: this.comments.delete
81
113
  });
82
114
  (0, _effector.sample)({
83
115
  clock: this.sockets.commentAdded,
@@ -91,12 +123,12 @@ class TeacherFeedbackModel {
91
123
  problemId,
92
124
  isOpen
93
125
  }, comment) => ({
94
- assignmentId,
95
- problemId,
96
126
  comment,
127
+ assignmentId,
128
+ problemId: comment.problemId,
97
129
  isRead: isOpen && comment.problemId === problemId
98
130
  }),
99
- target: this.comments.addComment
131
+ target: this.comments.add
100
132
  });
101
133
  }
102
134
  }
@@ -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","_id","updateCommentStatusSeenFx","pending","setAllCommentsRead","getCommentsFx","done","params","result","generateCommentsMap","id","setData","commentDeleted","comment","commentId","deleteComment","commentAdded","addComment","exports"],"sourceRoot":"../../../../../src","sources":["features/feedback/model/model.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_effector","require","_api","_sockets","_comments","_helpers","_constants","TeacherFeedbackModel","setIsOpen","createEvent","$isOpen","restore","setIsFeedbackIconDisplayed","$isFeedbackIconDisplayed","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":";;;;;;IAsCYA,oBAAoB,GAAAC,OAAA,CAAAD,oBAAA,0BAApBA,oBAAoB;EAApBA,oBAAoB;EAApBA,oBAAoB;EAAA,OAApBA,oBAAoB;AAAA","ignoreList":[]}
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
- addComment = createEvent();
7
- deleteComment = createEvent();
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.addComment, (state, {
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.deleteComment, (state, {
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: data.comments.filter(({
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.deleteComment
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","addComment","deleteComment","setData","$data","on","state","assignmentId","problemId","update","fn","data","comments","map","comment","isRead","unreadMessagesCount","commentId","commentToDelete","find","_id","filter","constructor","clock","updatedState","Map","assignmentMap","get","currentData","updatedData","undefined","Object","keys","length","delete","set"],"sourceRoot":"../../../../../src","sources":["features/feedback/model/comments.ts"],"mappings":"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","ignoreList":[]}
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":"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","ignoreList":[]}
@@ -5,22 +5,54 @@ 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);
12
+ setIsFeedbackIconDisplayed = createEvent();
13
+ $isFeedbackIconDisplayed = restore(this.setIsFeedbackIconDisplayed, true);
11
14
  constructor({
12
15
  api,
13
16
  socket,
14
- credits
17
+ credits,
18
+ defaults
15
19
  }) {
16
20
  this.api = new TeacherFeedbackAPI(api);
17
21
  this.sockets = new TeacherFeedbackSockets(socket);
18
- this.comments = new TeacherComments();
22
+ this.comments = new TeacherComments(this.api, this.$isOpen, defaults.EMPTY_COMMENT);
19
23
  sample({
20
24
  clock: credits.$problemId,
21
25
  fn: () => false,
22
26
  target: this.setIsOpen
23
27
  });
28
+
29
+ // Deletes entity when closing list with no comments
30
+ sample({
31
+ clock: this.setIsOpen,
32
+ source: {
33
+ data: this.comments.$data,
34
+ assignmentId: credits.$assignmentId,
35
+ problemId: credits.$problemId
36
+ },
37
+ filter: ({
38
+ data,
39
+ assignmentId,
40
+ problemId
41
+ }, isOpen) => {
42
+ const comments = data?.get(assignmentId)?.[problemId].comments;
43
+ const isOnlyNoCommentsMessage = comments?.length === 1 && comments[0]._id === EMPTY_COMMENT_ID;
44
+ return !isOpen && isOnlyNoCommentsMessage;
45
+ },
46
+ fn: ({
47
+ assignmentId,
48
+ problemId
49
+ }, comment) => ({
50
+ assignmentId,
51
+ problemId,
52
+ commentId: EMPTY_COMMENT_ID
53
+ }),
54
+ target: this.comments.delete
55
+ });
24
56
  sample({
25
57
  clock: this.setIsOpen,
26
58
  source: {
@@ -73,7 +105,7 @@ export class TeacherFeedbackModel {
73
105
  problemId: comment.problemId,
74
106
  commentId: comment._id
75
107
  }),
76
- target: this.comments.deleteComment
108
+ target: this.comments.delete
77
109
  });
78
110
  sample({
79
111
  clock: this.sockets.commentAdded,
@@ -87,12 +119,12 @@ export class TeacherFeedbackModel {
87
119
  problemId,
88
120
  isOpen
89
121
  }, comment) => ({
90
- assignmentId,
91
- problemId,
92
122
  comment,
123
+ assignmentId,
124
+ problemId: comment.problemId,
93
125
  isRead: isOpen && comment.problemId === problemId
94
126
  }),
95
- target: this.comments.addComment
127
+ target: this.comments.add
96
128
  });
97
129
  }
98
130
  }
@@ -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","_id","updateCommentStatusSeenFx","pending","setAllCommentsRead","getCommentsFx","done","params","result","id","setData","commentDeleted","comment","commentId","deleteComment","commentAdded","addComment"],"sourceRoot":"../../../../../src","sources":["features/feedback/model/model.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,OAAO,EAAEC,MAAM,QAAe,UAAU;AAC9D,SAASC,kBAAkB,QAAQ,UAAO;AAC1C,SAASC,sBAAsB,QAAQ,cAAW;AAClD,SAASC,eAAe,QAAQ,eAAY;AAC5C,SAASC,qBAAqB,EAAEC,mBAAmB,QAAQ,eAAY;AAqBvE,OAAO,MAAMC,oBAAoB,CAAC;EAIhBC,SAAS,GAAGT,WAAW,CAAU,CAAC;EAClCU,OAAO,GAAGT,OAAO,CAAC,IAAI,CAACQ,SAAS,EAAE,KAAK,CAAC;EAExDE,WAAWA,CAAC;IAAEC,GAAG;IAAEC,MAAM;IAAEC;EAAmC,CAAC,EAAE;IAC/D,IAAI,CAACF,GAAG,GAAG,IAAIT,kBAAkB,CAACS,GAAG,CAAC;IACtC,IAAI,CAACG,OAAO,GAAG,IAAIX,sBAAsB,CAACS,MAAM,CAAC;IACjD,IAAI,CAACG,QAAQ,GAAG,IAAIX,eAAe,CAAC,CAAC;IAErCH,MAAM,CAAC;MACLe,KAAK,EAAEH,OAAO,CAACI,UAAU;MACzBC,EAAE,EAAEA,CAAA,KAAM,KAAK;MACfC,MAAM,EAAE,IAAI,CAACX;IACf,CAAC,CAAC;IAEFP,MAAM,CAAC;MACLe,KAAK,EAAE,IAAI,CAACR,SAAS;MACrBY,MAAM,EAAE;QACNC,IAAI,EAAE,IAAI,CAACN,QAAQ,CAACO,KAAK;QACzBC,YAAY,EAAEV,OAAO,CAACW,aAAa;QACnCC,SAAS,EAAEZ,OAAO,CAACI;MACrB,CAAC;MACDS,MAAM,EAAEA,CAACN,MAAM,EAAEO,MAAM,KAAK;QAC1B,MAAMZ,QAAQ,GAAGV,qBAAqB,CAACe,MAAM,CAAC;QAC9C,MAAMQ,iBAAiB,GAAGb,QAAQ,CAACc,IAAI,CAAC,CAAC;UAAEC;QAAO,CAAC,KAAK,CAACA,MAAM,CAAC;QAChE,OAAOH,MAAM,IAAIC,iBAAiB;MACpC,CAAC;MACDV,EAAE,EAAEE,MAAM,IAAI;QACZ,MAAML,QAAQ,GAAGV,qBAAqB,CAACe,MAAM,CAAC;QAC9C,OAAO;UAAEW,GAAG,EAAEhB,QAAQ,CAACiB,GAAG,CAAC,CAAC;YAAEC;UAAI,CAAC,KAAKA,GAAG;QAAE,CAAC;MAChD,CAAC;MACDd,MAAM,EAAE,IAAI,CAACR,GAAG,CAACuB;IACnB,CAAC,CAAC;IAEFjC,MAAM,CAAC;MACLe,KAAK,EAAE,IAAI,CAACL,GAAG,CAACuB,yBAAyB,CAACC,OAAO;MACjDf,MAAM,EAAE;QAAEG,YAAY,EAAEV,OAAO,CAACW,aAAa;QAAEC,SAAS,EAAEZ,OAAO,CAACI;MAAW,CAAC;MAC9EE,MAAM,EAAE,IAAI,CAACJ,QAAQ,CAACqB;IACxB,CAAC,CAAC;IAEFnC,MAAM,CAAC;MACLe,KAAK,EAAE,IAAI,CAACL,GAAG,CAAC0B,aAAa,CAACC,IAAI;MAClCpB,EAAE,EAAEA,CAAC;QAAEqB,MAAM;QAAEC;MAAO,CAAC,KAAKlC,mBAAmB,CAACiC,MAAM,CAACE,EAAE,EAAED,MAAM,CAAC;MAClErB,MAAM,EAAE,IAAI,CAACJ,QAAQ,CAAC2B;IACxB,CAAC,CAAC;IAEFzC,MAAM,CAAC;MACLe,KAAK,EAAE,IAAI,CAACF,OAAO,CAAC6B,cAAc;MAClCvB,MAAM,EAAE;QAAEG,YAAY,EAAEV,OAAO,CAACW;MAAc,CAAC;MAC/CN,EAAE,EAAEA,CAAC;QAAEK;MAAa,CAAC,EAAEqB,OAAO,MAAM;QAClCrB,YAAY;QACZE,SAAS,EAAEmB,OAAO,CAACnB,SAAS;QAC5BoB,SAAS,EAAED,OAAO,CAACX;MACrB,CAAC,CAAC;MACFd,MAAM,EAAE,IAAI,CAACJ,QAAQ,CAAC+B;IACxB,CAAC,CAAC;IAEF7C,MAAM,CAAC;MACLe,KAAK,EAAE,IAAI,CAACF,OAAO,CAACiC,YAAY;MAChC3B,MAAM,EAAE;QACNG,YAAY,EAAEV,OAAO,CAACW,aAAa;QACnCC,SAAS,EAAEZ,OAAO,CAACI,UAAU;QAC7BU,MAAM,EAAE,IAAI,CAAClB;MACf,CAAC;MACDS,EAAE,EAAEA,CAAC;QAAEK,YAAY;QAAEE,SAAS;QAAEE;MAAO,CAAC,EAAEiB,OAAO,MAAM;QACrDrB,YAAY;QACZE,SAAS;QACTmB,OAAO;QACPd,MAAM,EAAEH,MAAM,IAAIiB,OAAO,CAACnB,SAAS,KAAKA;MAC1C,CAAC,CAAC;MACFN,MAAM,EAAE,IAAI,CAACJ,QAAQ,CAACiC;IACxB,CAAC,CAAC;EACJ;AACF","ignoreList":[]}
1
+ {"version":3,"names":["createEvent","restore","sample","TeacherFeedbackAPI","TeacherFeedbackSockets","TeacherComments","findCommentsByCredits","generateCommentsMap","EMPTY_COMMENT_ID","TeacherFeedbackModel","setIsOpen","$isOpen","setIsFeedbackIconDisplayed","$isFeedbackIconDisplayed","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":";;AAsCA,WAAYA,oBAAoB,0BAApBA,oBAAoB;EAApBA,oBAAoB;EAApBA,oBAAoB;EAAA,OAApBA,oBAAoB;AAAA","ignoreList":[]}
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 addComment: import("effector").EventCallable<Credits & {
8
+ readonly add: import("effector").EventCallable<Credits & {
5
9
  comment: TeacherComment;
6
10
  isRead: boolean;
7
11
  }>;
8
- readonly deleteComment: import("effector").EventCallable<Credits & {
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":"AACA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAkB,cAAc,EAAE,MAAM,UAAU,CAAA;AAS/E,qBAAa,eAAe;IAC1B,SAAgB,kBAAkB,4CAAyB;IAC3D,SAAgB,UAAU;iBAAoC,cAAc;gBAAU,OAAO;OAAK;IAClG,SAAgB,aAAa;mBAAsC,MAAM;OAAK;IAE9E,SAAgB,OAAO,gDAA6B;IACpD,SAAgB,KAAK,uDAuClB;;IAQH,OAAO,CAAC,MAAM;CAkBf"}
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,EAAkB,cAAc,EAAE,MAAM,UAAU,CAAA;AAC/E,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, TeacherComment, UpdateCommentStatusSeenPayload } from '../types';
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,17 @@ export type TeacherFeedbackModelProps = {
13
14
  $problemId: Store<string>;
14
15
  };
15
16
  defaults: {
16
- EMPTY_COMMENT: TeacherComment;
17
+ EMPTY_COMMENT: NoCommentsMessage;
17
18
  };
18
19
  };
19
20
  export declare class TeacherFeedbackModel {
20
- private readonly sockets;
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
+ readonly setIsFeedbackIconDisplayed: import("effector").EventCallable<boolean>;
27
+ readonly $isFeedbackIconDisplayed: import("effector").StoreWritable<boolean>;
28
+ constructor({ api, socket, credits, defaults }: TeacherFeedbackModelProps);
26
29
  }
27
30
  //# 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;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,8BAA8B,EAC/B,MAAM,UAAU,CAAA;AAEjB,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,cAAc,CAAA;KAAE,CAAA;CAC5C,CAAA;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,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,EAAE,yBAAyB;CAqEhE"}
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;IAExD,SAAgB,0BAA0B,4CAAyB;IACnE,SAAgB,wBAAwB,4CAAiD;gBAE7E,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 addComment: import("effector").EventCallable<Credits & {
8
+ readonly add: import("effector").EventCallable<Credits & {
5
9
  comment: TeacherComment;
6
10
  isRead: boolean;
7
11
  }>;
8
- readonly deleteComment: import("effector").EventCallable<Credits & {
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":"AACA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAkB,cAAc,EAAE,MAAM,UAAU,CAAA;AAS/E,qBAAa,eAAe;IAC1B,SAAgB,kBAAkB,4CAAyB;IAC3D,SAAgB,UAAU;iBAAoC,cAAc;gBAAU,OAAO;OAAK;IAClG,SAAgB,aAAa;mBAAsC,MAAM;OAAK;IAE9E,SAAgB,OAAO,gDAA6B;IACpD,SAAgB,KAAK,uDAuClB;;IAQH,OAAO,CAAC,MAAM;CAkBf"}
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,EAAkB,cAAc,EAAE,MAAM,UAAU,CAAA;AAC/E,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, TeacherComment, UpdateCommentStatusSeenPayload } from '../types';
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,17 @@ export type TeacherFeedbackModelProps = {
13
14
  $problemId: Store<string>;
14
15
  };
15
16
  defaults: {
16
- EMPTY_COMMENT: TeacherComment;
17
+ EMPTY_COMMENT: NoCommentsMessage;
17
18
  };
18
19
  };
19
20
  export declare class TeacherFeedbackModel {
20
- private readonly sockets;
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
+ readonly setIsFeedbackIconDisplayed: import("effector").EventCallable<boolean>;
27
+ readonly $isFeedbackIconDisplayed: import("effector").StoreWritable<boolean>;
28
+ constructor({ api, socket, credits, defaults }: TeacherFeedbackModelProps);
26
29
  }
27
30
  //# 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;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,8BAA8B,EAC/B,MAAM,UAAU,CAAA;AAEjB,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,cAAc,CAAA;KAAE,CAAA;CAC5C,CAAA;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,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,EAAE,yBAAyB;CAqEhE"}
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;IAExD,SAAgB,0BAA0B,4CAAyB;IACnE,SAAgB,wBAAwB,4CAAiD;gBAE7E,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,6 +1,6 @@
1
1
  {
2
2
  "name": "@magmamath/students-features",
3
- "version": "0.2.4",
3
+ "version": "0.2.6",
4
4
  "description": "Magmamath features library",
5
5
  "source": "src/index.ts",
6
6
  "main": "dist/commonjs/index.js",
@@ -1,5 +1,7 @@
1
- import { createEvent, restore, sample } from 'effector'
1
+ import { createEvent, restore, sample, Store } from 'effector'
2
2
  import { CommentsMap, Credits, FeedbackEntity, 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 addComment = createEvent<Credits & { comment: TeacherComment; isRead: boolean }>()
14
- public readonly deleteComment = createEvent<Credits & { commentId: string }>()
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.addComment, (state, { assignmentId, problemId, comment, isRead }) =>
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.deleteComment, (state, { assignmentId, problemId, commentId }) =>
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: data.comments.filter(({ _id }) => _id !== commentId),
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.deleteComment,
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
- TeacherComment,
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,23 @@ export type TeacherFeedbackModelProps = {
20
21
  $assignmentId: Store<string>
21
22
  $problemId: Store<string>
22
23
  }
23
- defaults: { EMPTY_COMMENT: TeacherComment }
24
+ defaults: { EMPTY_COMMENT: NoCommentsMessage }
24
25
  }
25
26
 
26
27
  export class TeacherFeedbackModel {
27
- private readonly sockets: TeacherFeedbackSockets
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
+ public readonly setIsFeedbackIconDisplayed = createEvent<boolean>()
35
+ public readonly $isFeedbackIconDisplayed = restore(this.setIsFeedbackIconDisplayed, true)
36
+
37
+ constructor({ api, socket, credits, defaults }: TeacherFeedbackModelProps) {
34
38
  this.api = new TeacherFeedbackAPI(api)
35
39
  this.sockets = new TeacherFeedbackSockets(socket)
36
- this.comments = new TeacherComments()
40
+ this.comments = new TeacherComments(this.api, this.$isOpen, defaults.EMPTY_COMMENT)
37
41
 
38
42
  sample({
39
43
  clock: credits.$problemId,
@@ -41,6 +45,28 @@ export class TeacherFeedbackModel {
41
45
  target: this.setIsOpen,
42
46
  })
43
47
 
48
+ // Deletes entity when closing list with no comments
49
+ sample({
50
+ clock: this.setIsOpen,
51
+ source: {
52
+ data: this.comments.$data,
53
+ assignmentId: credits.$assignmentId,
54
+ problemId: credits.$problemId,
55
+ },
56
+ filter: ({ data, assignmentId, problemId }, isOpen) => {
57
+ const comments = data?.get(assignmentId)?.[problemId].comments
58
+ const isOnlyNoCommentsMessage =
59
+ comments?.length === 1 && comments[0]._id === EMPTY_COMMENT_ID
60
+ return !isOpen && isOnlyNoCommentsMessage
61
+ },
62
+ fn: ({ assignmentId, problemId }, comment) => ({
63
+ assignmentId,
64
+ problemId,
65
+ commentId: EMPTY_COMMENT_ID,
66
+ }),
67
+ target: this.comments.delete,
68
+ })
69
+
44
70
  sample({
45
71
  clock: this.setIsOpen,
46
72
  source: {
@@ -80,7 +106,7 @@ export class TeacherFeedbackModel {
80
106
  problemId: comment.problemId,
81
107
  commentId: comment._id,
82
108
  }),
83
- target: this.comments.deleteComment,
109
+ target: this.comments.delete,
84
110
  })
85
111
 
86
112
  sample({
@@ -91,12 +117,12 @@ export class TeacherFeedbackModel {
91
117
  isOpen: this.$isOpen,
92
118
  },
93
119
  fn: ({ assignmentId, problemId, isOpen }, comment) => ({
94
- assignmentId,
95
- problemId,
96
120
  comment,
121
+ assignmentId,
122
+ problemId: comment.problemId,
97
123
  isRead: isOpen && comment.problemId === problemId,
98
124
  }),
99
- target: this.comments.addComment,
125
+ target: this.comments.add,
100
126
  })
101
127
  }
102
128
  }
@@ -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