stream-chat-react 11.13.1 → 11.14.0

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 (40) hide show
  1. package/dist/{Window-44a85f63.js → Window-64e7e4c0.js} +174 -158
  2. package/dist/browser.full-bundle.js +171 -271
  3. package/dist/browser.full-bundle.js.map +1 -1
  4. package/dist/browser.full-bundle.min.js +4 -4
  5. package/dist/browser.full-bundle.min.js.map +1 -1
  6. package/dist/components/Attachment/components/FileSizeIndicator.js +2 -2
  7. package/dist/components/Emojis/index.cjs.js +1 -2
  8. package/dist/components/Message/MessageSimple.d.ts.map +1 -1
  9. package/dist/components/Message/MessageSimple.js +3 -2
  10. package/dist/components/MessageInput/hooks/utils.d.ts +1 -0
  11. package/dist/components/MessageInput/hooks/utils.d.ts.map +1 -1
  12. package/dist/components/MessageInput/hooks/utils.js +24 -7
  13. package/dist/constants/limits.d.ts +1 -0
  14. package/dist/constants/limits.d.ts.map +1 -1
  15. package/dist/constants/limits.js +1 -0
  16. package/dist/css/v2/index.css +3 -1
  17. package/dist/css/v2/index.layout.css +3 -1
  18. package/dist/i18n/Streami18n.d.ts +1 -0
  19. package/dist/i18n/Streami18n.d.ts.map +1 -1
  20. package/dist/i18n/de.json +1 -0
  21. package/dist/i18n/en.json +1 -0
  22. package/dist/i18n/es.json +1 -0
  23. package/dist/i18n/fr.json +1 -0
  24. package/dist/i18n/hi.json +1 -0
  25. package/dist/i18n/it.json +1 -0
  26. package/dist/i18n/ja.json +1 -0
  27. package/dist/i18n/ko.json +1 -0
  28. package/dist/i18n/nl.json +1 -0
  29. package/dist/i18n/pt.json +1 -0
  30. package/dist/i18n/ru.json +1 -0
  31. package/dist/i18n/tr.json +1 -0
  32. package/dist/index.cjs.js +2 -3
  33. package/dist/scss/v2/AttachmentList/AttachmentList-layout.scss +56 -8
  34. package/dist/scss/v2/AttachmentList/AttachmentList-theme.scss +22 -4
  35. package/dist/scss/v2/ImageCarousel/ImageCarousel-layout.scss +11 -2
  36. package/dist/scss/v2/ImageCarousel/ImageCarousel-theme.scss +14 -0
  37. package/dist/scss/v2/_global-theme-variables.scss +13 -13
  38. package/dist/version.d.ts +1 -1
  39. package/dist/version.js +1 -1
  40. package/package.json +2 -3
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
- import prettybytes from 'pretty-bytes';
2
+ import { prettifyFileSize } from '../../MessageInput/hooks/utils';
3
3
  export var FileSizeIndicator = function (_a) {
4
4
  var fileSize = _a.fileSize, maximumFractionDigits = _a.maximumFractionDigits;
5
5
  if (!(fileSize && Number.isFinite(Number(fileSize))))
6
6
  return null;
7
- return (React.createElement("span", { className: 'str-chat__message-attachment-file--item-size', "data-testid": 'file-size-indicator' }, prettybytes(fileSize, { maximumFractionDigits: maximumFractionDigits })));
7
+ return (React.createElement("span", { className: 'str-chat__message-attachment-file--item-size', "data-testid": 'file-size-indicator' }, prettifyFileSize(fileSize, maximumFractionDigits)));
8
8
  };
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var Window = require('../../Window-44a85f63.js');
5
+ var Window = require('../../Window-64e7e4c0.js');
6
6
  var React = require('react');
7
7
  var Picker = require('@emoji-mart/react');
8
8
  require('dayjs');
@@ -28,7 +28,6 @@ require('dayjs/locale/tr');
28
28
  require('dayjs/locale/en');
29
29
  require('react-player');
30
30
  require('@braintree/sanitize-url');
31
- require('pretty-bytes');
32
31
  require('prop-types');
33
32
  require('react-image-gallery');
34
33
  require('linkifyjs');
@@ -1 +1 @@
1
- {"version":3,"file":"MessageSimple.d.ts","sourceRoot":"","sources":["../../../src/components/Message/MessageSimple.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAgCxC,OAAO,EAAE,mBAAmB,EAAqB,MAAM,8BAA8B,CAAC;AAEtF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEvD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AA2NnE;;GAEG;AACH,eAAO,MAAM,aAAa,kKAQzB,CAAC"}
1
+ {"version":3,"file":"MessageSimple.d.ts","sourceRoot":"","sources":["../../../src/components/Message/MessageSimple.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAgCxC,OAAO,EAAE,mBAAmB,EAAqB,MAAM,8BAA8B,CAAC;AAEtF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEvD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AA6NnE;;GAEG;AACH,eAAO,MAAM,aAAa,kKAQzB,CAAC"}
@@ -28,7 +28,7 @@ var MessageSimpleWithContext = function (props) {
28
28
  var t = useTranslationContext('MessageSimple').t;
29
29
  var _b = useState(false), isBounceDialogOpen = _b[0], setIsBounceDialogOpen = _b[1];
30
30
  var _c = useState(false), isEditedTimestampOpen = _c[0], setEditedTimestampOpen = _c[1];
31
- var _d = useComponentContext('MessageSimple'), Attachment = _d.Attachment, _e = _d.Avatar, Avatar = _e === void 0 ? DefaultAvatar : _e, _f = _d.EditMessageInput, EditMessageInput = _f === void 0 ? DefaultEditMessageForm : _f, _g = _d.MessageDeleted, MessageDeleted = _g === void 0 ? DefaultMessageDeleted : _g, _h = _d.MessageBouncePrompt, MessageBouncePrompt = _h === void 0 ? DefaultMessageBouncePrompt : _h, _j = _d.MessageOptions, MessageOptions = _j === void 0 ? DefaultMessageOptions : _j, _k = _d.MessageRepliesCountButton, MessageRepliesCountButton = _k === void 0 ? DefaultMessageRepliesCountButton : _k, _l = _d.MessageStatus, MessageStatus = _l === void 0 ? DefaultMessageStatus : _l, _m = _d.MessageTimestamp, MessageTimestamp = _m === void 0 ? DefaultMessageTimestamp : _m, _o = _d.ReactionSelector, ReactionSelector = _o === void 0 ? DefaultReactionSelector : _o, _p = _d.ReactionsList, ReactionsList = _p === void 0 ? DefaultReactionList : _p;
31
+ var _d = useComponentContext('MessageSimple'), Attachment = _d.Attachment, _e = _d.Avatar, Avatar = _e === void 0 ? DefaultAvatar : _e, _f = _d.EditMessageInput, EditMessageInput = _f === void 0 ? DefaultEditMessageForm : _f, _g = _d.MessageDeleted, MessageDeleted = _g === void 0 ? DefaultMessageDeleted : _g, _h = _d.MessageBouncePrompt, MessageBouncePrompt = _h === void 0 ? DefaultMessageBouncePrompt : _h, _j = _d.MessageOptions, MessageOptions = _j === void 0 ? DefaultMessageOptions : _j, _k = _d.MessageRepliesCountButton, MessageRepliesCountButton = _k === void 0 ? DefaultMessageRepliesCountButton : _k, _l = _d.MessageStatus, MessageStatus = _l === void 0 ? DefaultMessageStatus : _l, _m = _d.MessageTimestamp, MessageTimestamp = _m === void 0 ? DefaultMessageTimestamp : _m, _o = _d.ReactionSelector, ReactionSelector = _o === void 0 ? DefaultReactionSelector : _o, _p = _d.ReactionsList, ReactionsList = _p === void 0 ? DefaultReactionList : _p, PinIndicator = _d.PinIndicator;
32
32
  var themeVersion = useChatContext('MessageSimple').themeVersion;
33
33
  var hasAttachment = messageHasAttachments(message);
34
34
  var hasReactions = messageHasReactions(message);
@@ -63,9 +63,9 @@ var MessageSimpleWithContext = function (props) {
63
63
  var rootClassName = clsx('str-chat__message str-chat__message-simple', "str-chat__message--".concat(message.type), "str-chat__message--".concat(message.status), isMyMessage()
64
64
  ? 'str-chat__message--me str-chat__message-simple--me'
65
65
  : 'str-chat__message--other', message.text ? 'str-chat__message--has-text' : 'has-no-text', {
66
- 'pinned-message': message.pinned,
67
66
  'str-chat__message--has-attachment': hasAttachment,
68
67
  'str-chat__message--highlighted': highlighted,
68
+ 'str-chat__message--pinned pinned-message': message.pinned,
69
69
  'str-chat__message--with-reactions str-chat__message-with-thread-link': canShowReactions,
70
70
  'str-chat__message-send-can-be-retried': (message === null || message === void 0 ? void 0 : message.status) === 'failed' && (message === null || message === void 0 ? void 0 : message.errorStatusCode) !== 403,
71
71
  'str-chat__virtual-message__wrapper--end': endOfGroup,
@@ -77,6 +77,7 @@ var MessageSimpleWithContext = function (props) {
77
77
  React.createElement(MessageInput, __assign({ clearEditingState: clearEditingState, grow: true, hideSendButton: true, Input: EditMessageInput, message: message }, additionalMessageInputProps)))),
78
78
  isBounceDialogOpen && (React.createElement(MessageBounceModal, { MessageBouncePrompt: MessageBouncePrompt, onClose: function () { return setIsBounceDialogOpen(false); }, open: isBounceDialogOpen })),
79
79
  React.createElement("div", { className: rootClassName, key: message.id },
80
+ PinIndicator && React.createElement(PinIndicator, null),
80
81
  themeVersion === '1' && React.createElement(MessageStatus, null),
81
82
  message.user && (React.createElement(Avatar, { image: message.user.image, name: message.user.name || message.user.id, onClick: onUserClick, onMouseOver: onUserHover, user: message.user })),
82
83
  React.createElement("div", { className: clsx('str-chat__message-inner', {
@@ -25,5 +25,6 @@ type CheckUploadPermissionsParams<StreamChatGenerics extends DefaultStreamChatGe
25
25
  uploadType: 'image' | 'file';
26
26
  };
27
27
  export declare const checkUploadPermissions: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>(params: CheckUploadPermissionsParams<StreamChatGenerics>) => Promise<boolean>;
28
+ export declare function prettifyFileSize(bytes: number, precision?: number): string;
28
29
  export {};
29
30
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/components/MessageInput/hooks/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAA4C,YAAY,EAAE,MAAM,aAAa,CAAC;AAE1F,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEtE,eAAO,MAAM,UAAU,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAQ/C,CAAC;AAEF,eAAO,MAAM,gBAAgB,UAAW,MAAM,WAM7C,CAAC;AAEF,eAAO,MAAM,oBAAoB,UAAW,MAAM,QAAQ,MAAM,WAiC/D,CAAC;AAEF,MAAM,MAAM,qBAAqB,CAC/B,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E;IACF,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC,kBAAkB,CAAC,EAAE,CAAC;IAC1C,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC,CAAC;AAEF,eAAO,MAAM,gBAAgB,6KAwC5B,CAAC;AAEF,KAAK,4BAA4B,CAC/B,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E;IACF,eAAe,EAAE,yBAAyB,CAAC,kBAAkB,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAClF,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1B,cAAc,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACvE,CAAC,EAAE,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAChC,UAAU,EAAE,OAAO,GAAG,MAAM,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,sBAAsB,kKAuElC,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/components/MessageInput/hooks/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAA4C,YAAY,EAAE,MAAM,aAAa,CAAC;AAE1F,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAGtE,eAAO,MAAM,UAAU,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAQ/C,CAAC;AAEF,eAAO,MAAM,gBAAgB,UAAW,MAAM,WAM7C,CAAC;AAEF,eAAO,MAAM,oBAAoB,UAAW,MAAM,QAAQ,MAAM,WAiC/D,CAAC;AAEF,MAAM,MAAM,qBAAqB,CAC/B,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E;IACF,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC,kBAAkB,CAAC,EAAE,CAAC;IAC1C,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC,CAAC;AAEF,eAAO,MAAM,gBAAgB,6KAwC5B,CAAC;AAEF,KAAK,4BAA4B,CAC/B,kBAAkB,SAAS,yBAAyB,GAAG,yBAAyB,IAC9E;IACF,eAAe,EAAE,yBAAyB,CAAC,kBAAkB,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAClF,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1B,cAAc,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACvE,CAAC,EAAE,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAChC,UAAU,EAAE,OAAO,GAAG,MAAM,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,sBAAsB,kKAoFlC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAI,UAO5D"}
@@ -1,4 +1,5 @@
1
1
  import { __awaiter, __generator } from "tslib";
2
+ import { DEFAULT_UPLOAD_SIZE_LIMIT_BYTES } from '../../../constants/limits';
2
3
  export var accentsMap = {
3
4
  a: 'á|à|ã|â|À|Á|Ã|Â',
4
5
  c: 'ç|Ç',
@@ -81,7 +82,7 @@ export var searchLocalUsers = function (params) {
81
82
  return matchingUsers;
82
83
  };
83
84
  export var checkUploadPermissions = function (params) { return __awaiter(void 0, void 0, void 0, function () {
84
- var addNotification, file, getAppSettings, t, uploadType, appSettings, _a, allowed_file_extensions, allowed_mime_types, blocked_file_extensions, blocked_mime_types, sendErrorNotification, allowed, blocked, allowed, blocked;
85
+ var addNotification, file, getAppSettings, t, uploadType, appSettings, _a, allowed_file_extensions, allowed_mime_types, blocked_file_extensions, blocked_mime_types, size_limit, sendNotAllowedErrorNotification, allowed, blocked, allowed, blocked, sizeLimit;
85
86
  var _b, _c;
86
87
  return __generator(this, function (_d) {
87
88
  switch (_d.label) {
@@ -93,8 +94,8 @@ export var checkUploadPermissions = function (params) { return __awaiter(void 0,
93
94
  appSettings = _d.sent();
94
95
  _a = (uploadType === 'image'
95
96
  ? (_b = appSettings === null || appSettings === void 0 ? void 0 : appSettings.app) === null || _b === void 0 ? void 0 : _b.image_upload_config
96
- : (_c = appSettings === null || appSettings === void 0 ? void 0 : appSettings.app) === null || _c === void 0 ? void 0 : _c.file_upload_config) || {}, allowed_file_extensions = _a.allowed_file_extensions, allowed_mime_types = _a.allowed_mime_types, blocked_file_extensions = _a.blocked_file_extensions, blocked_mime_types = _a.blocked_mime_types;
97
- sendErrorNotification = function () {
97
+ : (_c = appSettings === null || appSettings === void 0 ? void 0 : appSettings.app) === null || _c === void 0 ? void 0 : _c.file_upload_config) || {}, allowed_file_extensions = _a.allowed_file_extensions, allowed_mime_types = _a.allowed_mime_types, blocked_file_extensions = _a.blocked_file_extensions, blocked_mime_types = _a.blocked_mime_types, size_limit = _a.size_limit;
98
+ sendNotAllowedErrorNotification = function () {
98
99
  return addNotification(t("Upload type: \"{{ type }}\" is not allowed", { type: file.type || 'unknown type' }), 'error');
99
100
  };
100
101
  if (allowed_file_extensions === null || allowed_file_extensions === void 0 ? void 0 : allowed_file_extensions.length) {
@@ -102,7 +103,7 @@ export var checkUploadPermissions = function (params) { return __awaiter(void 0,
102
103
  return file.name.toLowerCase().endsWith(ext.toLowerCase());
103
104
  });
104
105
  if (!allowed) {
105
- sendErrorNotification();
106
+ sendNotAllowedErrorNotification();
106
107
  return [2 /*return*/, false];
107
108
  }
108
109
  }
@@ -111,25 +112,41 @@ export var checkUploadPermissions = function (params) { return __awaiter(void 0,
111
112
  return file.name.toLowerCase().endsWith(ext.toLowerCase());
112
113
  });
113
114
  if (blocked) {
114
- sendErrorNotification();
115
+ sendNotAllowedErrorNotification();
115
116
  return [2 /*return*/, false];
116
117
  }
117
118
  }
118
119
  if (allowed_mime_types === null || allowed_mime_types === void 0 ? void 0 : allowed_mime_types.length) {
119
120
  allowed = allowed_mime_types.some(function (type) { var _a; return type.toLowerCase() === ((_a = file.type) === null || _a === void 0 ? void 0 : _a.toLowerCase()); });
120
121
  if (!allowed) {
121
- sendErrorNotification();
122
+ sendNotAllowedErrorNotification();
122
123
  return [2 /*return*/, false];
123
124
  }
124
125
  }
125
126
  if (blocked_mime_types === null || blocked_mime_types === void 0 ? void 0 : blocked_mime_types.length) {
126
127
  blocked = blocked_mime_types.some(function (type) { var _a; return type.toLowerCase() === ((_a = file.type) === null || _a === void 0 ? void 0 : _a.toLowerCase()); });
127
128
  if (blocked) {
128
- sendErrorNotification();
129
+ sendNotAllowedErrorNotification();
129
130
  return [2 /*return*/, false];
130
131
  }
131
132
  }
133
+ sizeLimit = size_limit || DEFAULT_UPLOAD_SIZE_LIMIT_BYTES;
134
+ if (file.size && file.size > sizeLimit) {
135
+ addNotification(t('File is too large: {{ size }}, maximum upload size is {{ limit }}', {
136
+ limit: prettifyFileSize(sizeLimit),
137
+ size: prettifyFileSize(file.size),
138
+ }), 'error');
139
+ return [2 /*return*/, false];
140
+ }
132
141
  return [2 /*return*/, true];
133
142
  }
134
143
  });
135
144
  }); };
145
+ export function prettifyFileSize(bytes, precision) {
146
+ if (precision === void 0) { precision = 3; }
147
+ var units = ['B', 'kB', 'MB', 'GB'];
148
+ var exponent = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);
149
+ var mantissa = bytes / Math.pow(1024, exponent);
150
+ var formattedMantissa = precision === 0 ? Math.round(mantissa).toString() : mantissa.toPrecision(precision);
151
+ return "".concat(formattedMantissa, " ").concat(units[exponent]);
152
+ }
@@ -3,4 +3,5 @@ export declare const DEFAULT_NEXT_CHANNEL_PAGE_SIZE = 100;
3
3
  export declare const DEFAULT_JUMP_TO_PAGE_SIZE = 100;
4
4
  export declare const DEFAULT_THREAD_PAGE_SIZE = 50;
5
5
  export declare const DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD = 250;
6
+ export declare const DEFAULT_UPLOAD_SIZE_LIMIT_BYTES: number;
6
7
  //# sourceMappingURL=limits.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../src/constants/limits.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iCAAiC,KAAK,CAAC;AACpD,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAClD,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,kCAAkC,MAAM,CAAC"}
1
+ {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../src/constants/limits.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iCAAiC,KAAK,CAAC;AACpD,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAClD,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,kCAAkC,MAAM,CAAC;AACtD,eAAO,MAAM,+BAA+B,QAAoB,CAAC"}
@@ -3,3 +3,4 @@ export var DEFAULT_NEXT_CHANNEL_PAGE_SIZE = 100;
3
3
  export var DEFAULT_JUMP_TO_PAGE_SIZE = 100;
4
4
  export var DEFAULT_THREAD_PAGE_SIZE = 50;
5
5
  export var DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD = 250;
6
+ export var DEFAULT_UPLOAD_SIZE_LIMIT_BYTES = 100 * 1024 * 1024; // 100 MB