@amityco/ts-sdk-react-native 6.35.1 → 6.35.2

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.
@@ -1,3 +1,5 @@
1
+ export declare const handleMessageCreatedOnSubChannel: (message: Amity.InternalMessage) => Promise<void>;
2
+ export declare const handleMessageUpdatedOnSubChannel: (message: Amity.InternalMessage) => Promise<void>;
1
3
  export declare const handleMessageCreated: (message: Amity.InternalMessage) => Promise<void>;
2
4
  export declare const handleMessageUpdated: (message: Amity.InternalMessage) => Promise<void>;
3
5
  export declare const handleSubChannelUpdated: (subChannel: Amity.SubChannel) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"updateMessagePreviewFromMessage.d.ts","sourceRoot":"","sources":["../../../src/messagePreview/utils/updateMessagePreviewFromMessage.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,YAAmB,MAAM,eAAe,kBA2FxE,CAAC;AAEF,eAAO,MAAM,oBAAoB,YAAmB,MAAM,eAAe,kBA8FxE,CAAC;AAEF,eAAO,MAAM,uBAAuB,eAAsB,MAAM,UAAU,kBAgDzE,CAAC"}
1
+ {"version":3,"file":"updateMessagePreviewFromMessage.d.ts","sourceRoot":"","sources":["../../../src/messagePreview/utils/updateMessagePreviewFromMessage.ts"],"names":[],"mappings":"AA+CA,eAAO,MAAM,gCAAgC,YAAmB,MAAM,eAAe,kBAyDpF,CAAC;AAEF,eAAO,MAAM,gCAAgC,YAAmB,MAAM,eAAe,kBAyCpF,CAAC;AAEF,eAAO,MAAM,oBAAoB,YAAmB,MAAM,eAAe,kBAgCxE,CAAC;AAEF,eAAO,MAAM,oBAAoB,YAAmB,MAAM,eAAe,kBA4CxE,CAAC;AAEF,eAAO,MAAM,uBAAuB,eAAsB,MAAM,UAAU,kBAgDzE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"getSubChannel.d.ts","sourceRoot":"","sources":["../../../src/subChannelRepository/observers/getSubChannel.ts"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,aAAa,iBACV,MAAM,UAAU,CAAC,cAAc,CAAC,YACpC,MAAM,kBAAkB,CAAC,MAAM,UAAU,CAAC,KACnD,MAAM,YAoLR,CAAC"}
1
+ {"version":3,"file":"getSubChannel.d.ts","sourceRoot":"","sources":["../../../src/subChannelRepository/observers/getSubChannel.ts"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,aAAa,iBACV,MAAM,UAAU,CAAC,cAAc,CAAC,YACpC,MAAM,kBAAkB,CAAC,MAAM,UAAU,CAAC,KACnD,MAAM,YA2IR,CAAC"}
@@ -10,5 +10,6 @@ export declare class SubChannelLiveCollectionController extends LiveCollectionCo
10
10
  startSubscription(): Amity.Unsubscriber[];
11
11
  notifyChange({ origin, loading, error }: Amity.LiveCollectionNotifyParams): void;
12
12
  applyFilter(data: Amity.SubChannel[]): Amity.SubChannel[];
13
+ isRelatedCollection(subChannelId: string): boolean | undefined;
13
14
  }
14
15
  //# sourceMappingURL=SubChannelLiveCollectionController.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SubChannelLiveCollectionController.d.ts","sourceRoot":"","sources":["../../../../src/subChannelRepository/observers/getSubChannels/SubChannelLiveCollectionController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gDAAgD,CAAC;AAE1F,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AA6BlF,qBAAa,kCAAmC,SAAQ,wBAAwB,CAC9E,YAAY,EACZ,KAAK,CAAC,wBAAwB,EAC9B,KAAK,CAAC,UAAU,EAChB,8BAA8B,CAC/B;IACC,OAAO,CAAC,qBAAqB,CAAkC;IAE/D,OAAO,CAAC,KAAK,CAAiC;gBAG5C,KAAK,EAAE,KAAK,CAAC,wBAAwB,EACrC,QAAQ,EAAE,KAAK,CAAC,sBAAsB,CAAC,KAAK,CAAC,UAAU,CAAC;IAmB1D,SAAS,CAAC,KAAK;cASC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,UAAU;IAIjF,SAAS,CAAC,kBAAkB,CAAC,EAC3B,QAAQ,EACR,SAAS,EACT,OAAO,GACR,EAAE,KAAK,CAAC,sCAAsC,CAAC,YAAY,CAAC;IAI7D,iBAAiB;IAyNjB,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,0BAA0B;IAuBzE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE;CAWrC"}
1
+ {"version":3,"file":"SubChannelLiveCollectionController.d.ts","sourceRoot":"","sources":["../../../../src/subChannelRepository/observers/getSubChannels/SubChannelLiveCollectionController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gDAAgD,CAAC;AAE1F,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AA6BlF,qBAAa,kCAAmC,SAAQ,wBAAwB,CAC9E,YAAY,EACZ,KAAK,CAAC,wBAAwB,EAC9B,KAAK,CAAC,UAAU,EAChB,8BAA8B,CAC/B;IACC,OAAO,CAAC,qBAAqB,CAAkC;IAE/D,OAAO,CAAC,KAAK,CAAiC;gBAG5C,KAAK,EAAE,KAAK,CAAC,wBAAwB,EACrC,QAAQ,EAAE,KAAK,CAAC,sBAAsB,CAAC,KAAK,CAAC,UAAU,CAAC;IAmB1D,SAAS,CAAC,KAAK;cASC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,UAAU;IAIjF,SAAS,CAAC,kBAAkB,CAAC,EAC3B,QAAQ,EACR,SAAS,EACT,OAAO,GACR,EAAE,KAAK,CAAC,sCAAsC,CAAC,YAAY,CAAC;IAI7D,iBAAiB;IAmJjB,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,0BAA0B;IAuBzE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE;IAYpC,mBAAmB,CAAC,YAAY,EAAE,MAAM;CAIzC"}
@@ -0,0 +1,2 @@
1
+ export declare const convertDateStringToTimestamp: (dateString: string) => number;
2
+ //# sourceMappingURL=dateTime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dateTime.d.ts","sourceRoot":"","sources":["../../src/utils/dateTime.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,eAAgB,MAAM,WAE9D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amityco/ts-sdk-react-native",
3
- "version": "6.35.1",
3
+ "version": "6.35.2",
4
4
  "license": "CC-BY-ND-4.0",
5
5
  "author": "amity.co <developers@amity.co> (https://amity.co)",
6
6
  "description": "Amity Social Cloud Typescript SDK",
@@ -1,7 +1,53 @@
1
1
  import { pullFromCache, pushToCache } from '~/cache/api';
2
2
  import { updateSubChannelCache } from '../../subChannelRepository/utils/updateSubChannelCache';
3
+ import { getSubChannel } from '~/subChannelRepository/api/getSubChannel';
4
+ import { getActiveClient } from '~/client/api/activeClient';
5
+ import { convertDateStringToTimestamp } from '~/utils/dateTime';
6
+
7
+ const getMessagePreviewSetting = async () => {
8
+ const client = getActiveClient();
9
+ return client.getMessagePreviewSetting(false);
10
+ };
11
+
12
+ const getSubChannelCache = async (subChannelId: string): Promise<Amity.SubChannel> => {
13
+ let subChannelCache = pullFromCache<Amity.SubChannel>(['subChannel', 'get', subChannelId])?.data;
14
+
15
+ if (!subChannelCache) {
16
+ subChannelCache = (await getSubChannel(subChannelId)).data;
17
+ }
18
+
19
+ return subChannelCache;
20
+ };
21
+
22
+ const isLastestMessageOnSubchannel = (message: Amity.InternalMessage) => {
23
+ const cache = pullFromCache<Amity.InternalMessagePreview>([
24
+ 'messagePreviewSubChannel',
25
+ 'get',
26
+ message.subChannelId,
27
+ ])?.data;
28
+ // The message payload from optimistic created event has no segment, so we check createdAt instead.
29
+ return (
30
+ !cache ||
31
+ cache.segment <= message.channelSegment ||
32
+ convertDateStringToTimestamp(cache.createdAt) <= convertDateStringToTimestamp(message.createdAt)
33
+ );
34
+ };
35
+
36
+ const isLastestMessageOnChannel = (message: Amity.InternalMessage) => {
37
+ const cache = pullFromCache<Amity.InternalMessagePreview>([
38
+ 'messagePreviewChannel',
39
+ 'get',
40
+ message.channelId,
41
+ ])?.data;
42
+ return (
43
+ !cache ||
44
+ convertDateStringToTimestamp(cache.createdAt) <= convertDateStringToTimestamp(message.createdAt)
45
+ );
46
+ };
47
+
48
+ export const handleMessageCreatedOnSubChannel = async (message: Amity.InternalMessage) => {
49
+ const messagePreviewSetting = await getMessagePreviewSetting();
3
50
 
4
- export const handleMessageCreated = async (message: Amity.InternalMessage) => {
5
51
  const {
6
52
  channelId,
7
53
  messageId: messagePreviewId,
@@ -15,69 +61,76 @@ export const handleMessageCreated = async (message: Amity.InternalMessage) => {
15
61
  isDeleted,
16
62
  } = message;
17
63
 
18
- /**
19
- * SubChannel Case
20
- *
21
- */
64
+ // 1. get subChannel from cache, if not exist fetch from server
65
+ const subChannelCache = await getSubChannelCache(subChannelId);
22
66
 
23
- const messagePreviewSubChannelCache = pullFromCache<Amity.InternalMessagePreview>([
24
- 'messagePreviewSubChannel',
25
- 'get',
26
- message.subChannelId,
27
- ])?.data;
67
+ // 2. if messagePreviewSetting is NO_MESSAGE_PREVEIW, update only lastActiviy in subChannel cache
68
+ if (messagePreviewSetting === Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW) {
69
+ // 2.1 if the message is the latest message, update lastActivity to be createdAt in subChannel cache
70
+ if (
71
+ convertDateStringToTimestamp(subChannelCache.lastActivity) <
72
+ convertDateStringToTimestamp(createdAt)
73
+ )
74
+ updateSubChannelCache(message.subChannelId, subChannelCache as Amity.SubChannel, {
75
+ lastActivity: createdAt,
76
+ });
28
77
 
29
- if (
30
- !messagePreviewSubChannelCache ||
31
- messagePreviewSubChannelCache.segment <= message.channelSegment
32
- ) {
33
- const subChannelCache = pullFromCache<Amity.SubChannel>([
34
- 'subChannel',
35
- 'get',
36
- subChannelId,
37
- ])?.data;
78
+ return;
79
+ }
38
80
 
39
- pushToCache(['messagePreviewSubChannel', 'get', message.subChannelId], {
40
- channelId,
41
- creatorId,
42
- messagePreviewId,
43
- createdAt,
44
- updatedAt,
45
- subChannelId,
46
- data,
47
- dataType,
48
- segment,
49
- isDeleted,
50
- subChannelUpdatedAt: subChannelCache?.updatedAt!,
51
- subChannelName: subChannelCache?.displayName,
52
- } as Amity.InternalMessagePreview);
81
+ // 3. if messagePreviewSetting is `NOT` NO_MESSAGE_PREVEIW, update messagePreviewSubChannel and subChannel cache
82
+ // 3.1 check if the message is the latest message, if not ignore the message.
83
+ if (!isLastestMessageOnSubchannel(message)) return;
53
84
 
54
- updateSubChannelCache(message.subChannelId, subChannelCache!, {
55
- messagePreviewId,
56
- });
57
- }
85
+ // 3.2 if the message is the latest message, update messagePreviewSubChannel and subChannel cache
86
+ pushToCache(['messagePreviewSubChannel', 'get', message.subChannelId], {
87
+ channelId,
88
+ creatorId,
89
+ messagePreviewId,
90
+ createdAt,
91
+ updatedAt,
92
+ subChannelId,
93
+ data,
94
+ dataType,
95
+ segment,
96
+ isDeleted,
97
+ subChannelUpdatedAt: subChannelCache?.updatedAt!,
98
+ subChannelName: subChannelCache?.displayName,
99
+ } as Amity.InternalMessagePreview);
58
100
 
59
- /**
60
- * Channel Case
61
- */
101
+ updateSubChannelCache(message.subChannelId, subChannelCache as Amity.SubChannel, {
102
+ lastActivity: createdAt,
103
+ messagePreviewId,
104
+ });
105
+ };
62
106
 
63
- const messagePreviewChannelCache = pullFromCache<Amity.InternalMessagePreview>([
64
- 'messagePreviewChannel',
107
+ export const handleMessageUpdatedOnSubChannel = async (message: Amity.InternalMessage) => {
108
+ const {
109
+ channelId,
110
+ messageId: messagePreviewId,
111
+ creatorId,
112
+ createdAt,
113
+ updatedAt,
114
+ data,
115
+ dataType,
116
+ subChannelId,
117
+ channelSegment: segment,
118
+ isDeleted,
119
+ } = message;
120
+
121
+ const messagePreviewSubChannelCache = pullFromCache<Amity.InternalMessagePreview>([
122
+ 'messagePreviewSubChannel',
65
123
  'get',
66
- message.channelId,
124
+ message.subChannelId,
67
125
  ])?.data;
68
126
 
127
+ // if messagePreviewSubChannel is not exist, ignore the message.
69
128
  if (
70
- !messagePreviewChannelCache ||
71
- new Date(messagePreviewChannelCache.createdAt).valueOf() <=
72
- new Date(message.createdAt).valueOf()
129
+ messagePreviewSubChannelCache &&
130
+ messagePreviewSubChannelCache.messagePreviewId === message.messageId
73
131
  ) {
74
- const subChannelCache = pullFromCache<Amity.SubChannel>([
75
- 'subChannel',
76
- 'get',
77
- subChannelId,
78
- ])?.data;
79
-
80
- pushToCache(['messagePreviewChannel', 'get', message.channelId], {
132
+ const subChannelCache = await getSubChannelCache(subChannelId);
133
+ pushToCache(['messagePreviewSubChannel', 'get', message.subChannelId], {
81
134
  channelId,
82
135
  creatorId,
83
136
  messagePreviewId,
@@ -88,13 +141,13 @@ export const handleMessageCreated = async (message: Amity.InternalMessage) => {
88
141
  dataType,
89
142
  segment,
90
143
  isDeleted,
91
- subChannelUpdatedAt: subChannelCache?.updatedAt!,
92
- subChannelName: subChannelCache?.displayName,
144
+ subChannelUpdatedAt: subChannelCache.updatedAt,
145
+ subChannelName: messagePreviewSubChannelCache.subChannelName,
93
146
  } as Amity.InternalMessagePreview);
94
147
  }
95
148
  };
96
149
 
97
- export const handleMessageUpdated = async (message: Amity.InternalMessage) => {
150
+ export const handleMessageCreated = async (message: Amity.InternalMessage) => {
98
151
  const {
99
152
  channelId,
100
153
  messageId: messagePreviewId,
@@ -108,36 +161,10 @@ export const handleMessageUpdated = async (message: Amity.InternalMessage) => {
108
161
  isDeleted,
109
162
  } = message;
110
163
 
111
- /**
112
- * SubChannel Case
113
- *
114
- */
115
-
116
- const messagePreviewSubChannelCache = pullFromCache<Amity.InternalMessagePreview>([
117
- 'messagePreviewSubChannel',
118
- 'get',
119
- message.subChannelId,
120
- ])?.data;
164
+ if (isLastestMessageOnChannel(message)) {
165
+ const subChannelCache = await getSubChannelCache(subChannelId);
121
166
 
122
- if (
123
- messagePreviewSubChannelCache &&
124
- messagePreviewSubChannelCache.messagePreviewId === message.messageId
125
- ) {
126
- /**
127
- * subChannelCache not have messagePreviewId so update it directly
128
- * because this function allow only corresponding subChannel
129
- */
130
- const subChannelCache = pullFromCache<Amity.SubChannel>([
131
- 'subChannel',
132
- 'get',
133
- subChannelId,
134
- ])?.data;
135
-
136
- updateSubChannelCache(message.subChannelId, subChannelCache!, {
137
- messagePreviewId,
138
- });
139
-
140
- pushToCache(['messagePreviewSubChannel', 'get', message.subChannelId], {
167
+ pushToCache(['messagePreviewChannel', 'get', message.channelId], {
141
168
  channelId,
142
169
  creatorId,
143
170
  messagePreviewId,
@@ -148,15 +175,30 @@ export const handleMessageUpdated = async (message: Amity.InternalMessage) => {
148
175
  dataType,
149
176
  segment,
150
177
  isDeleted,
151
- subChannelUpdatedAt: message?.updatedAt!,
178
+ subChannelUpdatedAt: subChannelCache?.updatedAt!,
152
179
  subChannelName: subChannelCache?.displayName,
153
180
  } as Amity.InternalMessagePreview);
154
181
  }
182
+ };
155
183
 
184
+ export const handleMessageUpdated = async (message: Amity.InternalMessage) => {
156
185
  /**
157
186
  * Channel Case
158
187
  */
159
188
 
189
+ const {
190
+ channelId,
191
+ messageId: messagePreviewId,
192
+ creatorId,
193
+ createdAt,
194
+ updatedAt,
195
+ data,
196
+ dataType,
197
+ subChannelId,
198
+ channelSegment: segment,
199
+ isDeleted,
200
+ } = message;
201
+
160
202
  const messagePreviewChannelCache = pullFromCache<Amity.InternalMessagePreview>([
161
203
  'messagePreviewChannel',
162
204
  'get',
@@ -167,12 +209,7 @@ export const handleMessageUpdated = async (message: Amity.InternalMessage) => {
167
209
  messagePreviewChannelCache &&
168
210
  messagePreviewChannelCache.messagePreviewId === message.messageId
169
211
  ) {
170
- const subChannelCache = pullFromCache<Amity.SubChannel>([
171
- 'subChannel',
172
- 'get',
173
- subChannelId,
174
- ])?.data;
175
-
212
+ const subChannelCache = await getSubChannelCache(subChannelId);
176
213
  pushToCache(['messagePreviewChannel', 'get', message.channelId], {
177
214
  channelId,
178
215
  creatorId,
@@ -184,8 +221,8 @@ export const handleMessageUpdated = async (message: Amity.InternalMessage) => {
184
221
  dataType,
185
222
  segment,
186
223
  isDeleted,
187
- subChannelUpdatedAt: subChannelCache?.updatedAt!,
188
- subChannelName: subChannelCache?.displayName,
224
+ subChannelUpdatedAt: subChannelCache.updatedAt,
225
+ subChannelName: messagePreviewChannelCache.subChannelName,
189
226
  } as Amity.InternalMessagePreview);
190
227
  }
191
228
  };
@@ -12,8 +12,8 @@ import {
12
12
  onMessageUpdated,
13
13
  } from '~/messageRepository';
14
14
  import {
15
- handleMessageCreated,
16
- handleMessageUpdated,
15
+ handleMessageCreatedOnSubChannel,
16
+ handleMessageUpdatedOnSubChannel,
17
17
  handleSubChannelUpdated,
18
18
  } from '../../messagePreview/utils/updateMessagePreviewFromMessage';
19
19
  import { getActiveClient } from '~/client';
@@ -117,28 +117,9 @@ export const getSubChannel = (
117
117
  },
118
118
  convertEventPayload(
119
119
  (callback: Amity.Listener<Amity.InternalMessage>) => {
120
- const updateMessagePreview = async (message: Amity.InternalMessage) => {
121
- const messagePreviewSetting = await client.getMessagePreviewSetting(false);
122
- if (messagePreviewSetting === Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW) return;
123
-
124
- await handleMessageCreated(message);
125
-
126
- if (message.subChannelId !== subChannelId) return;
127
-
128
- const subChannel = pullFromCache<Amity.SubChannel>([
129
- 'subChannel',
130
- 'get',
131
- subChannelId,
132
- ])?.data;
133
- if (!subChannel) return;
134
-
135
- updateSubChannelCache(message.subChannelId, subChannel, {
136
- messagePreviewId: message.messageId,
137
- });
138
- };
139
-
140
120
  return onMessageCreatedMqtt(async (message: Amity.InternalMessage) => {
141
- await updateMessagePreview(message);
121
+ if (message.subChannelId !== subChannelId) return;
122
+ await handleMessageCreatedOnSubChannel(message);
142
123
  callback(message);
143
124
  });
144
125
  },
@@ -147,28 +128,9 @@ export const getSubChannel = (
147
128
  ),
148
129
  convertEventPayload(
149
130
  (callback: Amity.Listener<Amity.InternalMessage>) => {
150
- const updateMessagePreview = async (message: Amity.InternalMessage) => {
151
- const messagePreviewSetting = await client.getMessagePreviewSetting(false);
152
- if (messagePreviewSetting === Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW) return;
153
-
154
- await handleMessageCreated(message);
155
-
156
- if (message.subChannelId !== subChannelId) return;
157
-
158
- const subChannel = pullFromCache<Amity.SubChannel>([
159
- 'subChannel',
160
- 'get',
161
- subChannelId,
162
- ])?.data;
163
- if (!subChannel) return;
164
-
165
- updateSubChannelCache(message.subChannelId, subChannel, {
166
- messagePreviewId: message.messageId,
167
- });
168
- };
169
-
170
131
  return onMessageCreatedLocal(async (message: Amity.InternalMessage) => {
171
- await updateMessagePreview(message);
132
+ if (message.subChannelId !== subChannelId) return;
133
+ await handleMessageCreatedOnSubChannel(message);
172
134
  callback(message);
173
135
  });
174
136
  },
@@ -180,11 +142,9 @@ export const getSubChannel = (
180
142
  const updateMessagePreview = async (message: Amity.InternalMessage) => {
181
143
  const messagePreviewSetting = await client.getMessagePreviewSetting(false);
182
144
  if (messagePreviewSetting === Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW) return;
183
-
184
145
  if (message.subChannelId !== subChannelId) return;
185
146
 
186
- handleMessageUpdated(message);
187
-
147
+ handleMessageUpdatedOnSubChannel(message);
188
148
  callback(message);
189
149
 
190
150
  // TODO: messageFeeds on onMessageUpdated event does not have messagePreviewId and it will save before that cause messagePreview
@@ -201,11 +161,10 @@ export const getSubChannel = (
201
161
  if (messagePreviewSetting === Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW) return;
202
162
 
203
163
  if (message.subChannelId !== subChannelId) return;
204
-
205
164
  if (
206
165
  messagePreviewSetting === Amity.MessagePreviewSetting.MESSAGE_PREVIEW_INCLUDE_DELETED
207
166
  )
208
- await handleMessageUpdated(message);
167
+ await handleMessageUpdatedOnSubChannel(message);
209
168
 
210
169
  if (
211
170
  messagePreviewSetting ===
@@ -22,14 +22,14 @@ import { getActiveClient } from '~/client';
22
22
  import {
23
23
  getSubChannelMessagePreview,
24
24
  getSubChannelMessagePreviewWithUser,
25
- handleMessageCreated,
26
- handleMessageUpdated,
25
+ handleMessageCreatedOnSubChannel,
26
+ handleMessageUpdatedOnSubChannel,
27
27
  } from '~/messagePreview/utils';
28
28
  import { getSubChannel } from '~/subChannelRepository/api/getSubChannel';
29
- import { updateSubChannelCache } from '~/subChannelRepository/utils/updateSubChannelCache';
30
29
  import { prepareSubChannelPayload } from '~/subChannelRepository/utils';
31
30
  import { onSubChannelFetched } from '~/subChannelRepository/events/onSubChannelFetched';
32
31
  import { onSubChannelUnreadUpdatedLocal } from '~/marker/events/onSubChannelUnreadUpdatedLocal';
32
+ import { convertDateStringToTimestamp } from '~/utils/dateTime';
33
33
 
34
34
  export class SubChannelLiveCollectionController extends LiveCollectionController<
35
35
  'subChannel',
@@ -91,19 +91,18 @@ export class SubChannelLiveCollectionController extends LiveCollectionController
91
91
  {
92
92
  fn: callback => {
93
93
  return onSubChannelUpdated(async (subChannel: Amity.SubChannel) => {
94
- const collection = pullFromCache<Amity.SubChannelLiveCollectionCache>(
95
- this.cacheKey,
96
- )?.data;
97
-
98
- if (!collection || !collection.data.includes(subChannel.subChannelId)) return;
99
-
94
+ if (!this.isRelatedCollection(subChannel.subChannelId)) return;
100
95
  const client = getActiveClient();
101
- const messagePreviewSetting = await client.getMessagePreviewSetting(false);
102
96
 
97
+ const messagePreviewSetting = await client.getMessagePreviewSetting(false);
103
98
  if (messagePreviewSetting !== Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW) {
104
99
  const messagePreview = getSubChannelMessagePreview(subChannel.subChannelId);
105
100
 
106
- if (messagePreview?.subChannelId === subChannel.subChannelId) {
101
+ if (
102
+ messagePreview?.subChannelId === subChannel.subChannelId &&
103
+ convertDateStringToTimestamp(subChannel.updatedAt!) >
104
+ convertDateStringToTimestamp(messagePreview.subChannelUpdatedAt)
105
+ ) {
107
106
  pushToCache(['messagePreviewSubChannel', 'get', subChannel.subChannelId], {
108
107
  ...messagePreview,
109
108
  subChannelName: subChannel.displayName,
@@ -118,98 +117,33 @@ export class SubChannelLiveCollectionController extends LiveCollectionController
118
117
  action: 'onUpdate',
119
118
  },
120
119
  {
121
- fn: callback => {
122
- const updateMessagePreview = async (message: Amity.InternalMessage) => {
123
- const client = getActiveClient();
124
- const messagePreviewSetting = await client.getMessagePreviewSetting(false);
125
-
126
- if (messagePreviewSetting === Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW) return;
127
-
128
- handleMessageCreated(message);
129
- };
130
- return onMessageCreatedMqtt(async message => {
131
- const cacheData = pullFromCache<Amity.SubChannel>([
132
- 'subChannel',
133
- 'get',
134
- message.subChannelId,
135
- ]);
136
-
137
- if (!cacheData) return;
138
-
139
- const collection = pullFromCache<Amity.SubChannelLiveCollectionCache>(
140
- this.cacheKey,
141
- )?.data;
142
-
143
- if (!collection || !collection.data.includes(message.subChannelId)) return;
144
-
145
- await updateMessagePreview(message);
146
-
147
- const subChannelCache = pullFromCache<Amity.SubChannel>([
148
- 'subChannel',
149
- 'get',
150
- message.subChannelId,
151
- ])?.data;
152
- if (!subChannelCache) return;
153
-
154
- updateSubChannelCache(message.subChannelId, subChannelCache, {
155
- lastActivity: message.createdAt,
156
- messagePreviewId: message.messageId,
157
- });
158
-
159
- callback({
160
- ...cacheData.data,
161
- messagePreviewId: message.messageId,
162
- subChannelId: message.subChannelId,
163
- lastActivity: message.createdAt,
120
+ fn: convertEventPayload(
121
+ (callback: Amity.Listener<Amity.InternalMessage>) => {
122
+ return onMessageCreatedMqtt(async message => {
123
+ if (!this.isRelatedCollection(message.subChannelId)) return;
124
+ // Update related cache including message preview and subChannel cache (lastActivity, messagePreviewId)
125
+ await handleMessageCreatedOnSubChannel(message);
126
+ callback(message);
164
127
  });
165
- });
166
- },
128
+ },
129
+ 'subChannelId',
130
+ 'subChannel',
131
+ ),
167
132
  action: 'onUpdate',
168
133
  },
169
134
  {
170
- fn: callback => {
171
- return onMessageCreatedLocal(async message => {
172
- const cacheData = pullFromCache<Amity.SubChannel>([
173
- 'subChannel',
174
- 'get',
175
- message.subChannelId,
176
- ]);
177
-
178
- if (!cacheData) return;
179
-
180
- const collection = pullFromCache<Amity.SubChannelLiveCollectionCache>(
181
- this.cacheKey,
182
- )?.data;
183
-
184
- if (!collection || !collection.data.includes(message.subChannelId)) return;
185
-
186
- const client = getActiveClient();
187
- const messagePreviewSetting = await client.getMessagePreviewSetting(false);
188
-
189
- if (messagePreviewSetting === Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW) return;
190
-
191
- handleMessageCreated(message);
192
-
193
- const subChannelCache = pullFromCache<Amity.SubChannel>([
194
- 'subChannel',
195
- 'get',
196
- message.subChannelId,
197
- ])?.data;
198
- if (!subChannelCache) return;
199
-
200
- updateSubChannelCache(message.subChannelId, subChannelCache, {
201
- lastActivity: message.createdAt,
202
- messagePreviewId: message.messageId,
203
- });
204
-
205
- callback({
206
- ...cacheData.data,
207
- messagePreviewId: message.messageId,
208
- subChannelId: message.subChannelId,
209
- lastActivity: message.createdAt,
135
+ fn: convertEventPayload(
136
+ (callback: Amity.Listener<Amity.InternalMessage>) => {
137
+ return onMessageCreatedLocal(async message => {
138
+ if (!this.isRelatedCollection(message.subChannelId)) return;
139
+ // Update related cache including message preview and subChannel cache (lastActivity, messagePreviewId)
140
+ await handleMessageCreatedOnSubChannel(message);
141
+ callback(message);
210
142
  });
211
- });
212
- },
143
+ },
144
+ 'subChannelId',
145
+ 'subChannel',
146
+ ),
213
147
  action: 'onUpdate',
214
148
  },
215
149
  {
@@ -248,7 +182,7 @@ export class SubChannelLiveCollectionController extends LiveCollectionController
248
182
 
249
183
  if (!collection || !collection.data.includes(message.subChannelId)) return;
250
184
 
251
- handleMessageUpdated(message);
185
+ handleMessageUpdatedOnSubChannel(message);
252
186
 
253
187
  callback(message);
254
188
  };
@@ -268,11 +202,7 @@ export class SubChannelLiveCollectionController extends LiveCollectionController
268
202
 
269
203
  if (messagePreviewSetting === Amity.MessagePreviewSetting.NO_MESSAGE_PREVIEW) return;
270
204
 
271
- const collection = pullFromCache<Amity.SubChannelLiveCollectionCache>(
272
- this.cacheKey,
273
- )?.data;
274
-
275
- if (!collection || !collection.data.includes(message.subChannelId)) return;
205
+ if (!this.isRelatedCollection(message.subChannelId)) return;
276
206
 
277
207
  if (
278
208
  messagePreviewSetting ===
@@ -280,7 +210,7 @@ export class SubChannelLiveCollectionController extends LiveCollectionController
280
210
  ) {
281
211
  await getSubChannel(message.subChannelId);
282
212
  } else {
283
- await handleMessageUpdated(message);
213
+ await handleMessageUpdatedOnSubChannel(message);
284
214
  }
285
215
 
286
216
  callback(message);
@@ -334,4 +264,9 @@ export class SubChannelLiveCollectionController extends LiveCollectionController
334
264
 
335
265
  return subChannels;
336
266
  }
267
+
268
+ isRelatedCollection(subChannelId: string) {
269
+ const collection = pullFromCache<Amity.SubChannelLiveCollectionCache>(this.cacheKey)?.data;
270
+ return collection && collection.data.includes(subChannelId);
271
+ }
337
272
  }
@@ -0,0 +1,3 @@
1
+ export const convertDateStringToTimestamp = (dateString: string) => {
2
+ return new Date(dateString).getTime();
3
+ };