Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / docs-core / lib / UseCase / HandleRealtimeCommentsEvent.ts
blob74f9d94c5bed3d38d66a5e7a50017b7f2180e046
1 import { utf8ArrayToString } from '@proton/crypto/lib/utils'
2 import type {
3   AnyCommentMessageData,
4   AddThreadData,
5   AddCommentData,
6   EditCommentData,
7   DeleteThreadData,
8   DeleteCommentData,
9   BeganTypingData,
10   StoppedTypingData,
11 } from '@proton/docs-shared'
12 import { CommentsMessageType } from '@proton/docs-shared'
13 import { Comment, CommentThread } from '../Models'
14 import type { LocalCommentsState } from '../Services/Comments/LocalCommentsState'
15 import type { LiveComments } from '../Realtime/LiveComments/LiveComments'
16 import { getErrorString } from '../Util/GetErrorString'
17 import type { SyncUseCaseInterface } from '../Domain/UseCase/SyncUseCaseInterface'
18 import { Result } from '@proton/docs-shared'
20 /**
21  * Updates the local comment state after receiving a message from the RTS.
22  */
23 export class HandleRealtimeCommentsEvent implements SyncUseCaseInterface<void> {
24   execute(localCommentsState: LocalCommentsState, liveComments: LiveComments, content: Uint8Array): Result<void> {
25     try {
26       const jsonString = utf8ArrayToString(content)
27       const { type, data } = JSON.parse(jsonString) as { type: CommentsMessageType; data: AnyCommentMessageData }
28       switch (type) {
29         case CommentsMessageType.AddThread: {
30           const threadData = data as AddThreadData
31           const thread = CommentThread.fromPayload(threadData)
32           localCommentsState.addThread(thread, true)
33           break
34         }
35         case CommentsMessageType.AddComment: {
36           const commentData = data as AddCommentData
37           const comment = Comment.fromPayload(commentData.comment)
38           localCommentsState.addComment(comment, commentData.threadID, true)
39           break
40         }
41         case CommentsMessageType.EditComment:
42           ;(data as EditCommentData).markThreadUnread = true
43           localCommentsState.editComment(data as EditCommentData)
44           break
45         case CommentsMessageType.DeleteThread:
46           localCommentsState.deleteThread((data as DeleteThreadData).threadId)
47           break
48         case CommentsMessageType.DeleteComment:
49           localCommentsState.deleteComment(data as DeleteCommentData)
50           break
51         case CommentsMessageType.BeganTyping:
52         case CommentsMessageType.StoppedTyping:
53           liveComments.receiveTypingStatusMessage(type, data as BeganTypingData | StoppedTypingData)
54           break
55         case CommentsMessageType.ResolveThread:
56           localCommentsState.resolveThread((data as DeleteThreadData).threadId)
57           break
58         case CommentsMessageType.UnresolveThread:
59           localCommentsState.unresolveThread((data as DeleteThreadData).threadId)
60           break
62         default:
63           break
64       }
65     } catch (error) {
66       return Result.fail(getErrorString(error) ?? 'Failed to handle a realtime comments event.')
67     }
69     return Result.ok()
70   }