sceyt-chat-react-uikit 1.8.9-beta.16 → 1.8.9-beta.18

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 +1,11 @@
1
1
  export declare const hasSendableTextOrPoll: (messageText: string, isPoll: boolean) => boolean;
2
+ export declare const DEFAULT_MEDIA_EXTENSIONS: string[];
3
+ export declare const isDefaultSupportedMediaMimeType: (mimeType: string) => boolean;
4
+ declare type MediaAttachmentValidationOptions = {
5
+ allowedExtensions?: string[];
6
+ sizeLimitKb?: number;
7
+ invalidTypeMessage?: string;
8
+ sizeLimitMessage?: string;
9
+ };
10
+ export declare const getMediaAttachmentValidationError: (file: Pick<File, 'name' | 'size'>, { allowedExtensions, sizeLimitKb, invalidTypeMessage, sizeLimitMessage }: MediaAttachmentValidationOptions) => string | null;
11
+ export {};
package/index.js CHANGED
@@ -46854,6 +46854,10 @@ function useChatController(_ref5) {
46854
46854
  var highlightTimeoutRef = React.useRef(null);
46855
46855
  var unreadRestoreCompletedRef = React.useRef(false);
46856
46856
  var previousUnreadScrollToRef = React.useRef(unreadScrollTo);
46857
+ var unreadScrollToRef = React.useRef(unreadScrollTo);
46858
+ var tabIsActiveRef = React.useRef(tabIsActive);
46859
+ var hasNextMessagesRef = React.useRef(hasNextMessages);
46860
+ var needsVisibleUnreadCheckRef = React.useRef(false);
46857
46861
  var historyLoadArmedRef = React.useRef(true);
46858
46862
  var latestLoadArmedRef = React.useRef(true);
46859
46863
  var pendingNewestCountRef = React.useRef(0);
@@ -46965,6 +46969,9 @@ function useChatController(_ref5) {
46965
46969
  visibleMessagesMapRef.current = visibleMessagesMap;
46966
46970
  channelRef.current = channel;
46967
46971
  connectionStatusRef.current = connectionStatus;
46972
+ unreadScrollToRef.current = unreadScrollTo;
46973
+ tabIsActiveRef.current = tabIsActive;
46974
+ hasNextMessagesRef.current = hasNext;
46968
46975
  });
46969
46976
  var oldestConfirmedMessage = getFirstConfirmedMessage(messages);
46970
46977
  var newestConfirmedMessage = getLastConfirmedMessage(messages);
@@ -46998,6 +47005,7 @@ function useChatController(_ref5) {
46998
47005
  });
46999
47006
  }, [channel.id, messages]);
47000
47007
  var hasNext = hasNextMessages || (newestConfirmedMessage ? hasNextContiguousInMap(channel.id, newestConfirmedMessage) : false) || (newestConfirmedMessageId && (_channel$lastMessage = channel.lastMessage) !== null && _channel$lastMessage !== void 0 && _channel$lastMessage.id ? compareMessageIds(channel.lastMessage.id, newestConfirmedMessageId) > 0 : false) || hiddenPendingTailExists;
47008
+ hasNextMessagesRef.current = hasNext;
47001
47009
  var isScrollInteractionActive = React.useCallback(function () {
47002
47010
  return Date.now() - lastScrollActivityAtRef.current < SCROLL_IDLE_MS;
47003
47011
  }, []);
@@ -47102,21 +47110,32 @@ function useChatController(_ref5) {
47102
47110
  }, lockDuration);
47103
47111
  }, [clearJumpScrollingLock]);
47104
47112
  var queueVisibleUnreadCheck = React.useCallback(function () {
47105
- if (pendingVisibleUnreadFrameRef.current !== null || unreadScrollTo || !tabIsActive) {
47113
+ if (pendingVisibleUnreadFrameRef.current !== null) {
47114
+ return;
47115
+ }
47116
+ if (unreadScrollToRef.current || !tabIsActiveRef.current || connectionStatusRef.current !== CONNECTION_STATUS.CONNECTED) {
47117
+ needsVisibleUnreadCheckRef.current = true;
47106
47118
  return;
47107
47119
  }
47120
+ var scheduledChannelId = channel.id;
47108
47121
  pendingVisibleUnreadFrameRef.current = requestAnimationFrame(function () {
47109
47122
  pendingVisibleUnreadFrameRef.current = null;
47123
+ var currentChannel = channelRef.current;
47124
+ if (currentChannel.id !== scheduledChannelId || unreadScrollToRef.current || !tabIsActiveRef.current || connectionStatusRef.current !== CONNECTION_STATUS.CONNECTED) {
47125
+ needsVisibleUnreadCheckRef.current = true;
47126
+ return;
47127
+ }
47110
47128
  var container = scrollRef.current;
47111
47129
  if (!container) {
47112
47130
  return;
47113
47131
  }
47114
- var unreadStartIndex = getUnreadTrackingStartIndex(messages);
47132
+ var currentMessages = messagesRef.current;
47133
+ var unreadStartIndex = getUnreadTrackingStartIndex(currentMessages);
47115
47134
  if (unreadStartIndex < 0) {
47116
47135
  return;
47117
47136
  }
47118
- var candidateUnreadMessages = messages.slice(unreadStartIndex);
47119
- var pinnedToLatestWithoutMorePages = !hasNext && isPinnedToLatest(container);
47137
+ var candidateUnreadMessages = currentMessages.slice(unreadStartIndex);
47138
+ var pinnedToLatestWithoutMorePages = !hasNextMessagesRef.current && isPinnedToLatest(container);
47120
47139
  var containerRect = pinnedToLatestWithoutMorePages ? null : container.getBoundingClientRect();
47121
47140
  var visibleUnreadMessages = candidateUnreadMessages.map(function (message) {
47122
47141
  if (visibleUnreadReportedRef.current.has(message.id)) {
@@ -47137,16 +47156,17 @@ function useChatController(_ref5) {
47137
47156
  var ids = visibleUnreadMessages.filter(isUnreadIncomingMessage).map(function (message) {
47138
47157
  return message.id;
47139
47158
  });
47140
- if (!ids.length || !channel.id || !channel.newMessageCount) {
47159
+ if (!ids.length || !currentChannel.id || !currentChannel.newMessageCount) {
47141
47160
  return;
47142
47161
  }
47143
47162
  ids.forEach(function (id) {
47144
47163
  visibleUnreadReportedRef.current.add(id);
47145
47164
  });
47165
+ needsVisibleUnreadCheckRef.current = false;
47146
47166
  registerLocallyReadUnreadMessages(ids.length);
47147
- dispatch(markMessagesAsReadAC(channel.id, ids));
47167
+ dispatch(markMessagesAsReadAC(currentChannel.id, ids));
47148
47168
  });
47149
- }, [channel.id, channel.lastDisplayedMessageId, channel.newMessageCount, dispatch, hasNext, messages, registerLocallyReadUnreadMessages, unreadScrollTo, tabIsActive]);
47169
+ }, [channel.id, dispatch, registerLocallyReadUnreadMessages]);
47150
47170
  var timelineItems = React.useMemo(function () {
47151
47171
  var unreadStartIndex = getUnreadDividerIndex(messages, unreadMessageId);
47152
47172
  return messages.flatMap(function (message, index) {
@@ -48574,8 +48594,15 @@ function useChatController(_ref5) {
48574
48594
  if (!previousUnreadScrollTo || unreadScrollTo) {
48575
48595
  return;
48576
48596
  }
48597
+ needsVisibleUnreadCheckRef.current = true;
48577
48598
  queueVisibleUnreadCheck();
48578
48599
  }, [queueVisibleUnreadCheck, unreadScrollTo]);
48600
+ React.useEffect(function () {
48601
+ if (!needsVisibleUnreadCheckRef.current || unreadScrollTo || !tabIsActive || connectionStatus !== CONNECTION_STATUS.CONNECTED) {
48602
+ return;
48603
+ }
48604
+ queueVisibleUnreadCheck();
48605
+ }, [connectionStatus, queueVisibleUnreadCheck, tabIsActive, unreadScrollTo]);
48579
48606
  React.useEffect(function () {
48580
48607
  return function () {
48581
48608
  var _pendingWindowLoadRef3, _pendingEdgeLoadRefs$5, _pendingEdgeLoadRefs$6;
@@ -48851,6 +48878,33 @@ var createMessageMarkerBatcher = function createMessageMarkerBatcher(_ref) {
48851
48878
  };
48852
48879
  };
48853
48880
 
48881
+ var hasSendableTextOrPoll = function hasSendableTextOrPoll(messageText, isPoll) {
48882
+ return Boolean(messageText.trim() || isPoll);
48883
+ };
48884
+ var DEFAULT_MEDIA_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'mp4', 'mov', 'avi', 'wmv', 'flv', 'webm', 'jfif'];
48885
+ var DEFAULT_MEDIA_MIME_TYPES = new Set(['image/jpeg', 'image/png', 'image/gif', 'image/jfif', 'image/pjpeg', 'video/mp4', 'video/quicktime', 'video/x-msvideo', 'video/avi', 'video/x-ms-wmv', 'video/x-flv', 'video/webm']);
48886
+ var isDefaultSupportedMediaMimeType = function isDefaultSupportedMediaMimeType(mimeType) {
48887
+ return DEFAULT_MEDIA_MIME_TYPES.has(mimeType.toLowerCase());
48888
+ };
48889
+ var getMediaAttachmentValidationError = function getMediaAttachmentValidationError(file, _ref) {
48890
+ var _file$name$split$pop;
48891
+ var allowedExtensions = _ref.allowedExtensions,
48892
+ sizeLimitKb = _ref.sizeLimitKb,
48893
+ invalidTypeMessage = _ref.invalidTypeMessage,
48894
+ sizeLimitMessage = _ref.sizeLimitMessage;
48895
+ if (sizeLimitKb && file.size / 1024 > sizeLimitKb) {
48896
+ return sizeLimitMessage != null ? sizeLimitMessage : "File size exceeds the limit of " + sizeLimitKb + " KB.";
48897
+ }
48898
+ var supportedExtensions = (allowedExtensions !== null && allowedExtensions !== void 0 && allowedExtensions.length ? allowedExtensions : DEFAULT_MEDIA_EXTENSIONS).map(function (extension) {
48899
+ return extension.replace(/^\./, '').toLowerCase();
48900
+ });
48901
+ var extension = (_file$name$split$pop = file.name.split('.').pop()) === null || _file$name$split$pop === void 0 ? void 0 : _file$name$split$pop.toLowerCase();
48902
+ if (!extension || !supportedExtensions.includes(extension)) {
48903
+ return invalidTypeMessage != null ? invalidTypeMessage : "Invalid file type. Allowed extensions are: " + supportedExtensions.join(', ') + ".";
48904
+ }
48905
+ return null;
48906
+ };
48907
+
48854
48908
  var _templateObject$P, _templateObject2$K, _templateObject3$C, _templateObject4$x, _templateObject5$s, _templateObject6$o, _templateObject7$m, _templateObject8$k, _templateObject9$i, _templateObject0$h, _templateObject1$e, _templateObject10$b, _templateObject11$8;
48855
48909
  var MessageList = function MessageList(_ref) {
48856
48910
  var _scrollRef$current, _scrollRef$current$of, _scrollRef$current2;
@@ -49237,8 +49291,7 @@ var MessageList = function MessageList(_ref) {
49237
49291
  } else {
49238
49292
  var fileList = Array.from(e.dataTransfer.items);
49239
49293
  var hasMedia = fileList.some(function (item) {
49240
- var fileType = item.type.split('/')[0];
49241
- return fileType === 'image' || fileType === 'video';
49294
+ return isDefaultSupportedMediaMimeType(item.type);
49242
49295
  });
49243
49296
  filesType = hasMedia ? 'media' : 'file';
49244
49297
  }
@@ -53198,10 +53251,6 @@ var SettingItem = styled__default.div(_templateObject9$j || (_templateObject9$j
53198
53251
  return props.color;
53199
53252
  });
53200
53253
 
53201
- var hasSendableTextOrPoll = function hasSendableTextOrPoll(messageText, isPoll) {
53202
- return Boolean(messageText.trim() || isPoll);
53203
- };
53204
-
53205
53254
  var _templateObject$W, _templateObject2$R, _templateObject3$I, _templateObject4$C, _templateObject5$x, _templateObject6$t, _templateObject7$q, _templateObject8$n, _templateObject9$k, _templateObject0$i, _templateObject1$f, _templateObject10$c, _templateObject11$9, _templateObject12$7, _templateObject13$6, _templateObject14$5, _templateObject15$3, _templateObject16$2, _templateObject17$2, _templateObject18$2, _templateObject19$2, _templateObject20$2, _templateObject21$2, _templateObject22$1, _templateObject23$1, _templateObject24$1, _templateObject25$1, _templateObject26$1, _templateObject27$1, _templateObject28$1, _templateObject29$1, _templateObject30$1, _templateObject31$1, _templateObject32$1, _templateObject33$1, _templateObject34$1, _templateObject35$1, _templateObject36$1, _templateObject37$1, _templateObject38$1, _templateObject39$1, _templateObject40$1, _templateObject41$1, _templateObject42, _templateObject43, _templateObject44, _templateObject45, _templateObject46;
53206
53255
  function AutoFocusPlugin(_ref) {
53207
53256
  var messageForReply = _ref.messageForReply;
@@ -54073,6 +54122,14 @@ var SendMessageInput = function SendMessageInput(_ref3) {
54073
54122
  setUploadErrorMessage('');
54074
54123
  }, 3000);
54075
54124
  };
54125
+ var validateMediaAttachment = function validateMediaAttachment(file) {
54126
+ return getMediaAttachmentValidationError(file, {
54127
+ allowedExtensions: allowedMediaExtensions,
54128
+ sizeLimitKb: mediaAttachmentSizeLimit,
54129
+ invalidTypeMessage: allowedMediaExtensionsErrorMessage,
54130
+ sizeLimitMessage: attachmentSizeLimitErrorMessage
54131
+ });
54132
+ };
54076
54133
  var handleFileUpload = function handleFileUpload(e) {
54077
54134
  var isMediaAttachment = e.target.accept === mediaExtensions;
54078
54135
  var fileList = Object.values(e.target.files);
@@ -54089,27 +54146,12 @@ var SendMessageInput = function SendMessageInput(_ref3) {
54089
54146
  }
54090
54147
  filesToProcess.forEach(function (file) {
54091
54148
  try {
54092
- var allowUpload = true;
54093
- var errorMessage = '';
54094
- if (isMediaAttachment) {
54095
- if (mediaAttachmentSizeLimit && file.size / 1024 > mediaAttachmentSizeLimit) {
54096
- allowUpload = false;
54097
- errorMessage = attachmentSizeLimitErrorMessage != null ? attachmentSizeLimitErrorMessage : "File size exceeds the limit of " + mediaAttachmentSizeLimit + " KB.";
54098
- }
54099
- if (allowedMediaExtensions !== null && allowedMediaExtensions !== void 0 && allowedMediaExtensions.length) {
54100
- var fileName = file.name;
54101
- var fileExtension = fileName.split('.').pop().toLowerCase();
54102
- if (!allowedMediaExtensions.includes(fileExtension)) {
54103
- allowUpload = false;
54104
- errorMessage = allowedMediaExtensionsErrorMessage != null ? allowedMediaExtensionsErrorMessage : "Invalid file type. Allowed extensions are: " + allowedMediaExtensions.join(', ') + ".";
54105
- }
54106
- }
54107
- }
54149
+ var validationError = isMediaAttachment ? validateMediaAttachment(file) : null;
54108
54150
  var _temp8 = function () {
54109
- if (allowUpload) {
54151
+ if (!validationError) {
54110
54152
  return Promise.resolve(handleAddAttachmentWithViewOnceCheck(file, isMediaAttachment)).then(function () {});
54111
54153
  } else {
54112
- showFileUploadError(errorMessage);
54154
+ showFileUploadError(validationError);
54113
54155
  }
54114
54156
  }();
54115
54157
  return Promise.resolve(_temp8 && _temp8.then ? _temp8.then(function () {}) : void 0);
@@ -54149,25 +54191,12 @@ var SendMessageInput = function SendMessageInput(_ref3) {
54149
54191
  }
54150
54192
  filesToProcess.forEach(function (file) {
54151
54193
  try {
54152
- var allowUpload = true;
54153
- var errorMessage = '';
54154
- if (mediaAttachmentSizeLimit && file.size / 1024 > mediaAttachmentSizeLimit) {
54155
- allowUpload = false;
54156
- errorMessage = attachmentSizeLimitErrorMessage != null ? attachmentSizeLimitErrorMessage : "File size exceeds the limit of " + mediaAttachmentSizeLimit + " KB.";
54157
- }
54158
- if (allowedMediaExtensions !== null && allowedMediaExtensions !== void 0 && allowedMediaExtensions.length) {
54159
- var fileName = file.name;
54160
- var fileExtension = fileName.split('.').pop().toLowerCase();
54161
- if (!allowedMediaExtensions.includes(fileExtension)) {
54162
- allowUpload = false;
54163
- errorMessage = allowedMediaExtensionsErrorMessage != null ? allowedMediaExtensionsErrorMessage : "Invalid file type. Allowed extensions are: " + allowedMediaExtensions.join(', ') + ".";
54164
- }
54165
- }
54194
+ var validationError = validateMediaAttachment(file);
54166
54195
  var _temp9 = function () {
54167
- if (allowUpload) {
54196
+ if (!validationError) {
54168
54197
  return Promise.resolve(handleAddAttachmentWithViewOnceCheck(file, true)).then(function () {});
54169
54198
  } else {
54170
- showFileUploadError(errorMessage);
54199
+ showFileUploadError(validationError);
54171
54200
  }
54172
54201
  }();
54173
54202
  return Promise.resolve(_temp9 && _temp9.then ? _temp9.then(function () {}) : void 0);
@@ -54503,27 +54532,12 @@ var SendMessageInput = function SendMessageInput(_ref3) {
54503
54532
  var isMediaAttachment = draggedAttachments[0].attachmentType === 'media';
54504
54533
  filesToProcess.forEach(function (file) {
54505
54534
  try {
54506
- var allowUpload = true;
54507
- var errorMessage = '';
54508
- if (isMediaAttachment) {
54509
- if (mediaAttachmentSizeLimit && file.size / 1024 > mediaAttachmentSizeLimit) {
54510
- allowUpload = false;
54511
- errorMessage = attachmentSizeLimitErrorMessage != null ? attachmentSizeLimitErrorMessage : "File size exceeds the limit of " + mediaAttachmentSizeLimit + " KB.";
54512
- }
54513
- if (allowedMediaExtensions !== null && allowedMediaExtensions !== void 0 && allowedMediaExtensions.length) {
54514
- var fileName = file.name;
54515
- var fileExtension = fileName.split('.').pop().toLowerCase();
54516
- if (!allowedMediaExtensions.includes(fileExtension)) {
54517
- allowUpload = false;
54518
- errorMessage = allowedMediaExtensionsErrorMessage != null ? allowedMediaExtensionsErrorMessage : "Invalid file type. Allowed extensions are: " + allowedMediaExtensions.join(', ') + ".";
54519
- }
54520
- }
54521
- }
54535
+ var validationError = isMediaAttachment ? validateMediaAttachment(file) : null;
54522
54536
  var _temp19 = function () {
54523
- if (allowUpload) {
54537
+ if (!validationError) {
54524
54538
  return Promise.resolve(handleAddAttachmentWithViewOnceCheck(file, isMediaAttachment)).then(function () {});
54525
54539
  } else {
54526
- showFileUploadError(errorMessage);
54540
+ showFileUploadError(validationError);
54527
54541
  }
54528
54542
  }();
54529
54543
  return Promise.resolve(_temp19 && _temp19.then ? _temp19.then(function () {}) : void 0);
package/index.modern.js CHANGED
@@ -46834,6 +46834,10 @@ function useChatController(_ref5) {
46834
46834
  var highlightTimeoutRef = useRef(null);
46835
46835
  var unreadRestoreCompletedRef = useRef(false);
46836
46836
  var previousUnreadScrollToRef = useRef(unreadScrollTo);
46837
+ var unreadScrollToRef = useRef(unreadScrollTo);
46838
+ var tabIsActiveRef = useRef(tabIsActive);
46839
+ var hasNextMessagesRef = useRef(hasNextMessages);
46840
+ var needsVisibleUnreadCheckRef = useRef(false);
46837
46841
  var historyLoadArmedRef = useRef(true);
46838
46842
  var latestLoadArmedRef = useRef(true);
46839
46843
  var pendingNewestCountRef = useRef(0);
@@ -46945,6 +46949,9 @@ function useChatController(_ref5) {
46945
46949
  visibleMessagesMapRef.current = visibleMessagesMap;
46946
46950
  channelRef.current = channel;
46947
46951
  connectionStatusRef.current = connectionStatus;
46952
+ unreadScrollToRef.current = unreadScrollTo;
46953
+ tabIsActiveRef.current = tabIsActive;
46954
+ hasNextMessagesRef.current = hasNext;
46948
46955
  });
46949
46956
  var oldestConfirmedMessage = getFirstConfirmedMessage(messages);
46950
46957
  var newestConfirmedMessage = getLastConfirmedMessage(messages);
@@ -46978,6 +46985,7 @@ function useChatController(_ref5) {
46978
46985
  });
46979
46986
  }, [channel.id, messages]);
46980
46987
  var hasNext = hasNextMessages || (newestConfirmedMessage ? hasNextContiguousInMap(channel.id, newestConfirmedMessage) : false) || (newestConfirmedMessageId && (_channel$lastMessage = channel.lastMessage) !== null && _channel$lastMessage !== void 0 && _channel$lastMessage.id ? compareMessageIds(channel.lastMessage.id, newestConfirmedMessageId) > 0 : false) || hiddenPendingTailExists;
46988
+ hasNextMessagesRef.current = hasNext;
46981
46989
  var isScrollInteractionActive = useCallback(function () {
46982
46990
  return Date.now() - lastScrollActivityAtRef.current < SCROLL_IDLE_MS;
46983
46991
  }, []);
@@ -47082,21 +47090,32 @@ function useChatController(_ref5) {
47082
47090
  }, lockDuration);
47083
47091
  }, [clearJumpScrollingLock]);
47084
47092
  var queueVisibleUnreadCheck = useCallback(function () {
47085
- if (pendingVisibleUnreadFrameRef.current !== null || unreadScrollTo || !tabIsActive) {
47093
+ if (pendingVisibleUnreadFrameRef.current !== null) {
47094
+ return;
47095
+ }
47096
+ if (unreadScrollToRef.current || !tabIsActiveRef.current || connectionStatusRef.current !== CONNECTION_STATUS.CONNECTED) {
47097
+ needsVisibleUnreadCheckRef.current = true;
47086
47098
  return;
47087
47099
  }
47100
+ var scheduledChannelId = channel.id;
47088
47101
  pendingVisibleUnreadFrameRef.current = requestAnimationFrame(function () {
47089
47102
  pendingVisibleUnreadFrameRef.current = null;
47103
+ var currentChannel = channelRef.current;
47104
+ if (currentChannel.id !== scheduledChannelId || unreadScrollToRef.current || !tabIsActiveRef.current || connectionStatusRef.current !== CONNECTION_STATUS.CONNECTED) {
47105
+ needsVisibleUnreadCheckRef.current = true;
47106
+ return;
47107
+ }
47090
47108
  var container = scrollRef.current;
47091
47109
  if (!container) {
47092
47110
  return;
47093
47111
  }
47094
- var unreadStartIndex = getUnreadTrackingStartIndex(messages);
47112
+ var currentMessages = messagesRef.current;
47113
+ var unreadStartIndex = getUnreadTrackingStartIndex(currentMessages);
47095
47114
  if (unreadStartIndex < 0) {
47096
47115
  return;
47097
47116
  }
47098
- var candidateUnreadMessages = messages.slice(unreadStartIndex);
47099
- var pinnedToLatestWithoutMorePages = !hasNext && isPinnedToLatest(container);
47117
+ var candidateUnreadMessages = currentMessages.slice(unreadStartIndex);
47118
+ var pinnedToLatestWithoutMorePages = !hasNextMessagesRef.current && isPinnedToLatest(container);
47100
47119
  var containerRect = pinnedToLatestWithoutMorePages ? null : container.getBoundingClientRect();
47101
47120
  var visibleUnreadMessages = candidateUnreadMessages.map(function (message) {
47102
47121
  if (visibleUnreadReportedRef.current.has(message.id)) {
@@ -47117,16 +47136,17 @@ function useChatController(_ref5) {
47117
47136
  var ids = visibleUnreadMessages.filter(isUnreadIncomingMessage).map(function (message) {
47118
47137
  return message.id;
47119
47138
  });
47120
- if (!ids.length || !channel.id || !channel.newMessageCount) {
47139
+ if (!ids.length || !currentChannel.id || !currentChannel.newMessageCount) {
47121
47140
  return;
47122
47141
  }
47123
47142
  ids.forEach(function (id) {
47124
47143
  visibleUnreadReportedRef.current.add(id);
47125
47144
  });
47145
+ needsVisibleUnreadCheckRef.current = false;
47126
47146
  registerLocallyReadUnreadMessages(ids.length);
47127
- dispatch(markMessagesAsReadAC(channel.id, ids));
47147
+ dispatch(markMessagesAsReadAC(currentChannel.id, ids));
47128
47148
  });
47129
- }, [channel.id, channel.lastDisplayedMessageId, channel.newMessageCount, dispatch, hasNext, messages, registerLocallyReadUnreadMessages, unreadScrollTo, tabIsActive]);
47149
+ }, [channel.id, dispatch, registerLocallyReadUnreadMessages]);
47130
47150
  var timelineItems = useMemo(function () {
47131
47151
  var unreadStartIndex = getUnreadDividerIndex(messages, unreadMessageId);
47132
47152
  return messages.flatMap(function (message, index) {
@@ -48554,8 +48574,15 @@ function useChatController(_ref5) {
48554
48574
  if (!previousUnreadScrollTo || unreadScrollTo) {
48555
48575
  return;
48556
48576
  }
48577
+ needsVisibleUnreadCheckRef.current = true;
48557
48578
  queueVisibleUnreadCheck();
48558
48579
  }, [queueVisibleUnreadCheck, unreadScrollTo]);
48580
+ useEffect(function () {
48581
+ if (!needsVisibleUnreadCheckRef.current || unreadScrollTo || !tabIsActive || connectionStatus !== CONNECTION_STATUS.CONNECTED) {
48582
+ return;
48583
+ }
48584
+ queueVisibleUnreadCheck();
48585
+ }, [connectionStatus, queueVisibleUnreadCheck, tabIsActive, unreadScrollTo]);
48559
48586
  useEffect(function () {
48560
48587
  return function () {
48561
48588
  var _pendingWindowLoadRef3, _pendingEdgeLoadRefs$5, _pendingEdgeLoadRefs$6;
@@ -48831,6 +48858,33 @@ var createMessageMarkerBatcher = function createMessageMarkerBatcher(_ref) {
48831
48858
  };
48832
48859
  };
48833
48860
 
48861
+ var hasSendableTextOrPoll = function hasSendableTextOrPoll(messageText, isPoll) {
48862
+ return Boolean(messageText.trim() || isPoll);
48863
+ };
48864
+ var DEFAULT_MEDIA_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'mp4', 'mov', 'avi', 'wmv', 'flv', 'webm', 'jfif'];
48865
+ var DEFAULT_MEDIA_MIME_TYPES = new Set(['image/jpeg', 'image/png', 'image/gif', 'image/jfif', 'image/pjpeg', 'video/mp4', 'video/quicktime', 'video/x-msvideo', 'video/avi', 'video/x-ms-wmv', 'video/x-flv', 'video/webm']);
48866
+ var isDefaultSupportedMediaMimeType = function isDefaultSupportedMediaMimeType(mimeType) {
48867
+ return DEFAULT_MEDIA_MIME_TYPES.has(mimeType.toLowerCase());
48868
+ };
48869
+ var getMediaAttachmentValidationError = function getMediaAttachmentValidationError(file, _ref) {
48870
+ var _file$name$split$pop;
48871
+ var allowedExtensions = _ref.allowedExtensions,
48872
+ sizeLimitKb = _ref.sizeLimitKb,
48873
+ invalidTypeMessage = _ref.invalidTypeMessage,
48874
+ sizeLimitMessage = _ref.sizeLimitMessage;
48875
+ if (sizeLimitKb && file.size / 1024 > sizeLimitKb) {
48876
+ return sizeLimitMessage != null ? sizeLimitMessage : "File size exceeds the limit of " + sizeLimitKb + " KB.";
48877
+ }
48878
+ var supportedExtensions = (allowedExtensions !== null && allowedExtensions !== void 0 && allowedExtensions.length ? allowedExtensions : DEFAULT_MEDIA_EXTENSIONS).map(function (extension) {
48879
+ return extension.replace(/^\./, '').toLowerCase();
48880
+ });
48881
+ var extension = (_file$name$split$pop = file.name.split('.').pop()) === null || _file$name$split$pop === void 0 ? void 0 : _file$name$split$pop.toLowerCase();
48882
+ if (!extension || !supportedExtensions.includes(extension)) {
48883
+ return invalidTypeMessage != null ? invalidTypeMessage : "Invalid file type. Allowed extensions are: " + supportedExtensions.join(', ') + ".";
48884
+ }
48885
+ return null;
48886
+ };
48887
+
48834
48888
  var _templateObject$P, _templateObject2$K, _templateObject3$C, _templateObject4$x, _templateObject5$s, _templateObject6$o, _templateObject7$m, _templateObject8$k, _templateObject9$i, _templateObject0$h, _templateObject1$e, _templateObject10$b, _templateObject11$8;
48835
48889
  var MessageList = function MessageList(_ref) {
48836
48890
  var _scrollRef$current, _scrollRef$current$of, _scrollRef$current2;
@@ -49217,8 +49271,7 @@ var MessageList = function MessageList(_ref) {
49217
49271
  } else {
49218
49272
  var fileList = Array.from(e.dataTransfer.items);
49219
49273
  var hasMedia = fileList.some(function (item) {
49220
- var fileType = item.type.split('/')[0];
49221
- return fileType === 'image' || fileType === 'video';
49274
+ return isDefaultSupportedMediaMimeType(item.type);
49222
49275
  });
49223
49276
  filesType = hasMedia ? 'media' : 'file';
49224
49277
  }
@@ -53178,10 +53231,6 @@ var SettingItem = styled.div(_templateObject9$j || (_templateObject9$j = _tagged
53178
53231
  return props.color;
53179
53232
  });
53180
53233
 
53181
- var hasSendableTextOrPoll = function hasSendableTextOrPoll(messageText, isPoll) {
53182
- return Boolean(messageText.trim() || isPoll);
53183
- };
53184
-
53185
53234
  var _templateObject$W, _templateObject2$R, _templateObject3$I, _templateObject4$C, _templateObject5$x, _templateObject6$t, _templateObject7$q, _templateObject8$n, _templateObject9$k, _templateObject0$i, _templateObject1$f, _templateObject10$c, _templateObject11$9, _templateObject12$7, _templateObject13$6, _templateObject14$5, _templateObject15$3, _templateObject16$2, _templateObject17$2, _templateObject18$2, _templateObject19$2, _templateObject20$2, _templateObject21$2, _templateObject22$1, _templateObject23$1, _templateObject24$1, _templateObject25$1, _templateObject26$1, _templateObject27$1, _templateObject28$1, _templateObject29$1, _templateObject30$1, _templateObject31$1, _templateObject32$1, _templateObject33$1, _templateObject34$1, _templateObject35$1, _templateObject36$1, _templateObject37$1, _templateObject38$1, _templateObject39$1, _templateObject40$1, _templateObject41$1, _templateObject42, _templateObject43, _templateObject44, _templateObject45, _templateObject46;
53186
53235
  function AutoFocusPlugin(_ref) {
53187
53236
  var messageForReply = _ref.messageForReply;
@@ -54053,6 +54102,14 @@ var SendMessageInput = function SendMessageInput(_ref3) {
54053
54102
  setUploadErrorMessage('');
54054
54103
  }, 3000);
54055
54104
  };
54105
+ var validateMediaAttachment = function validateMediaAttachment(file) {
54106
+ return getMediaAttachmentValidationError(file, {
54107
+ allowedExtensions: allowedMediaExtensions,
54108
+ sizeLimitKb: mediaAttachmentSizeLimit,
54109
+ invalidTypeMessage: allowedMediaExtensionsErrorMessage,
54110
+ sizeLimitMessage: attachmentSizeLimitErrorMessage
54111
+ });
54112
+ };
54056
54113
  var handleFileUpload = function handleFileUpload(e) {
54057
54114
  var isMediaAttachment = e.target.accept === mediaExtensions;
54058
54115
  var fileList = Object.values(e.target.files);
@@ -54069,27 +54126,12 @@ var SendMessageInput = function SendMessageInput(_ref3) {
54069
54126
  }
54070
54127
  filesToProcess.forEach(function (file) {
54071
54128
  try {
54072
- var allowUpload = true;
54073
- var errorMessage = '';
54074
- if (isMediaAttachment) {
54075
- if (mediaAttachmentSizeLimit && file.size / 1024 > mediaAttachmentSizeLimit) {
54076
- allowUpload = false;
54077
- errorMessage = attachmentSizeLimitErrorMessage != null ? attachmentSizeLimitErrorMessage : "File size exceeds the limit of " + mediaAttachmentSizeLimit + " KB.";
54078
- }
54079
- if (allowedMediaExtensions !== null && allowedMediaExtensions !== void 0 && allowedMediaExtensions.length) {
54080
- var fileName = file.name;
54081
- var fileExtension = fileName.split('.').pop().toLowerCase();
54082
- if (!allowedMediaExtensions.includes(fileExtension)) {
54083
- allowUpload = false;
54084
- errorMessage = allowedMediaExtensionsErrorMessage != null ? allowedMediaExtensionsErrorMessage : "Invalid file type. Allowed extensions are: " + allowedMediaExtensions.join(', ') + ".";
54085
- }
54086
- }
54087
- }
54129
+ var validationError = isMediaAttachment ? validateMediaAttachment(file) : null;
54088
54130
  var _temp8 = function () {
54089
- if (allowUpload) {
54131
+ if (!validationError) {
54090
54132
  return Promise.resolve(handleAddAttachmentWithViewOnceCheck(file, isMediaAttachment)).then(function () {});
54091
54133
  } else {
54092
- showFileUploadError(errorMessage);
54134
+ showFileUploadError(validationError);
54093
54135
  }
54094
54136
  }();
54095
54137
  return Promise.resolve(_temp8 && _temp8.then ? _temp8.then(function () {}) : void 0);
@@ -54129,25 +54171,12 @@ var SendMessageInput = function SendMessageInput(_ref3) {
54129
54171
  }
54130
54172
  filesToProcess.forEach(function (file) {
54131
54173
  try {
54132
- var allowUpload = true;
54133
- var errorMessage = '';
54134
- if (mediaAttachmentSizeLimit && file.size / 1024 > mediaAttachmentSizeLimit) {
54135
- allowUpload = false;
54136
- errorMessage = attachmentSizeLimitErrorMessage != null ? attachmentSizeLimitErrorMessage : "File size exceeds the limit of " + mediaAttachmentSizeLimit + " KB.";
54137
- }
54138
- if (allowedMediaExtensions !== null && allowedMediaExtensions !== void 0 && allowedMediaExtensions.length) {
54139
- var fileName = file.name;
54140
- var fileExtension = fileName.split('.').pop().toLowerCase();
54141
- if (!allowedMediaExtensions.includes(fileExtension)) {
54142
- allowUpload = false;
54143
- errorMessage = allowedMediaExtensionsErrorMessage != null ? allowedMediaExtensionsErrorMessage : "Invalid file type. Allowed extensions are: " + allowedMediaExtensions.join(', ') + ".";
54144
- }
54145
- }
54174
+ var validationError = validateMediaAttachment(file);
54146
54175
  var _temp9 = function () {
54147
- if (allowUpload) {
54176
+ if (!validationError) {
54148
54177
  return Promise.resolve(handleAddAttachmentWithViewOnceCheck(file, true)).then(function () {});
54149
54178
  } else {
54150
- showFileUploadError(errorMessage);
54179
+ showFileUploadError(validationError);
54151
54180
  }
54152
54181
  }();
54153
54182
  return Promise.resolve(_temp9 && _temp9.then ? _temp9.then(function () {}) : void 0);
@@ -54483,27 +54512,12 @@ var SendMessageInput = function SendMessageInput(_ref3) {
54483
54512
  var isMediaAttachment = draggedAttachments[0].attachmentType === 'media';
54484
54513
  filesToProcess.forEach(function (file) {
54485
54514
  try {
54486
- var allowUpload = true;
54487
- var errorMessage = '';
54488
- if (isMediaAttachment) {
54489
- if (mediaAttachmentSizeLimit && file.size / 1024 > mediaAttachmentSizeLimit) {
54490
- allowUpload = false;
54491
- errorMessage = attachmentSizeLimitErrorMessage != null ? attachmentSizeLimitErrorMessage : "File size exceeds the limit of " + mediaAttachmentSizeLimit + " KB.";
54492
- }
54493
- if (allowedMediaExtensions !== null && allowedMediaExtensions !== void 0 && allowedMediaExtensions.length) {
54494
- var fileName = file.name;
54495
- var fileExtension = fileName.split('.').pop().toLowerCase();
54496
- if (!allowedMediaExtensions.includes(fileExtension)) {
54497
- allowUpload = false;
54498
- errorMessage = allowedMediaExtensionsErrorMessage != null ? allowedMediaExtensionsErrorMessage : "Invalid file type. Allowed extensions are: " + allowedMediaExtensions.join(', ') + ".";
54499
- }
54500
- }
54501
- }
54515
+ var validationError = isMediaAttachment ? validateMediaAttachment(file) : null;
54502
54516
  var _temp19 = function () {
54503
- if (allowUpload) {
54517
+ if (!validationError) {
54504
54518
  return Promise.resolve(handleAddAttachmentWithViewOnceCheck(file, isMediaAttachment)).then(function () {});
54505
54519
  } else {
54506
- showFileUploadError(errorMessage);
54520
+ showFileUploadError(validationError);
54507
54521
  }
54508
54522
  }();
54509
54523
  return Promise.resolve(_temp19 && _temp19.then ? _temp19.then(function () {}) : void 0);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sceyt-chat-react-uikit",
3
- "version": "1.8.9-beta.16",
3
+ "version": "1.8.9-beta.18",
4
4
  "description": "Interactive React UI Components for Sceyt Chat.",
5
5
  "author": "Sceyt",
6
6
  "license": "MIT",