stream-chat 9.7.0 → 9.8.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 (32) hide show
  1. package/dist/cjs/index.browser.cjs +176 -8
  2. package/dist/cjs/index.browser.cjs.map +3 -3
  3. package/dist/cjs/index.node.cjs +181 -8
  4. package/dist/cjs/index.node.cjs.map +3 -3
  5. package/dist/esm/index.js +176 -8
  6. package/dist/esm/index.js.map +3 -3
  7. package/dist/types/messageComposer/middleware/messageComposer/commandInjection.d.ts +4 -0
  8. package/dist/types/messageComposer/middleware/messageComposer/index.d.ts +1 -0
  9. package/dist/types/messageComposer/middleware/textComposer/activeCommandGuard.d.ts +4 -0
  10. package/dist/types/messageComposer/middleware/textComposer/commandStringExtraction.d.ts +5 -0
  11. package/dist/types/messageComposer/middleware/textComposer/index.d.ts +2 -0
  12. package/dist/types/messageComposer/middleware/textComposer/textMiddlewareUtils.d.ts +6 -0
  13. package/dist/types/messageComposer/middleware/textComposer/types.d.ts +1 -0
  14. package/dist/types/messageComposer/textComposer.d.ts +6 -3
  15. package/dist/types/pagination/BasePaginator.d.ts +1 -1
  16. package/dist/types/pagination/ReminderPaginator.d.ts +6 -2
  17. package/dist/types/reminders/ReminderManager.d.ts +3 -3
  18. package/dist/types/types.d.ts +1 -1
  19. package/package.json +1 -1
  20. package/src/messageComposer/middleware/messageComposer/commandInjection.ts +72 -0
  21. package/src/messageComposer/middleware/messageComposer/index.ts +1 -0
  22. package/src/messageComposer/middleware/textComposer/activeCommandGuard.ts +20 -0
  23. package/src/messageComposer/middleware/textComposer/commandStringExtraction.ts +56 -0
  24. package/src/messageComposer/middleware/textComposer/commands.ts +22 -4
  25. package/src/messageComposer/middleware/textComposer/index.ts +2 -0
  26. package/src/messageComposer/middleware/textComposer/textMiddlewareUtils.ts +14 -0
  27. package/src/messageComposer/middleware/textComposer/types.ts +1 -0
  28. package/src/messageComposer/textComposer.ts +23 -3
  29. package/src/pagination/BasePaginator.ts +1 -1
  30. package/src/pagination/ReminderPaginator.ts +20 -2
  31. package/src/reminders/ReminderManager.ts +16 -2
  32. package/src/types.ts +1 -1
@@ -239,12 +239,16 @@ __export(index_exports, {
239
239
  calculateLevenshtein: () => calculateLevenshtein,
240
240
  channelManagerEventToHandlerMapping: () => channelManagerEventToHandlerMapping,
241
241
  chatCodes: () => chatCodes,
242
+ createActiveCommandGuardMiddleware: () => createActiveCommandGuardMiddleware,
242
243
  createAttachmentsCompositionMiddleware: () => createAttachmentsCompositionMiddleware,
244
+ createCommandInjectionMiddleware: () => createCommandInjectionMiddleware,
245
+ createCommandStringExtractionMiddleware: () => createCommandStringExtractionMiddleware,
243
246
  createCommandsMiddleware: () => createCommandsMiddleware,
244
247
  createCompositionDataCleanupMiddleware: () => createCompositionDataCleanupMiddleware,
245
248
  createCompositionValidationMiddleware: () => createCompositionValidationMiddleware,
246
249
  createCustomDataCompositionMiddleware: () => createCustomDataCompositionMiddleware,
247
250
  createDraftAttachmentsCompositionMiddleware: () => createDraftAttachmentsCompositionMiddleware,
251
+ createDraftCommandInjectionMiddleware: () => createDraftCommandInjectionMiddleware,
248
252
  createDraftCompositionValidationMiddleware: () => createDraftCompositionValidationMiddleware,
249
253
  createDraftCustomDataCompositionMiddleware: () => createDraftCustomDataCompositionMiddleware,
250
254
  createDraftLinkPreviewsCompositionMiddleware: () => createDraftLinkPreviewsCompositionMiddleware,
@@ -268,6 +272,7 @@ __export(index_exports, {
268
272
  formatMessage: () => formatMessage,
269
273
  generateFileName: () => generateFileName,
270
274
  getAttachmentTypeFromMimeType: () => getAttachmentTypeFromMimeType,
275
+ getCompleteCommandInString: () => getCompleteCommandInString,
271
276
  getExtensionFromMimeType: () => getExtensionFromMimeType,
272
277
  getTokenizedSuggestionDisplayName: () => getTokenizedSuggestionDisplayName,
273
278
  getTriggerCharWithToken: () => getTriggerCharWithToken,
@@ -6309,6 +6314,76 @@ var MessageDraftComposerMiddlewareExecutor = class extends MiddlewareExecutor {
6309
6314
  }
6310
6315
  };
6311
6316
 
6317
+ // src/messageComposer/middleware/messageComposer/commandInjection.ts
6318
+ var createCommandInjectionMiddleware = (composer) => ({
6319
+ handlers: {
6320
+ compose: ({
6321
+ forward,
6322
+ next,
6323
+ state
6324
+ }) => {
6325
+ const command = composer.textComposer.command;
6326
+ if (!command) {
6327
+ return forward();
6328
+ }
6329
+ const { text } = state.localMessage;
6330
+ const injection = `/${command?.name}`;
6331
+ const enrichedText = `${injection} ${text}`;
6332
+ return next({
6333
+ ...state,
6334
+ localMessage: {
6335
+ ...state.localMessage,
6336
+ text: enrichedText
6337
+ },
6338
+ message: {
6339
+ ...state.message,
6340
+ text: enrichedText
6341
+ }
6342
+ });
6343
+ }
6344
+ },
6345
+ id: "stream-io/message-composer-middleware/command-string-injection"
6346
+ });
6347
+ var createDraftCommandInjectionMiddleware = (composer) => ({
6348
+ handlers: {
6349
+ compose: ({
6350
+ forward,
6351
+ next,
6352
+ state
6353
+ }) => {
6354
+ const command = composer.textComposer.command;
6355
+ if (!command) {
6356
+ return forward();
6357
+ }
6358
+ const { text } = state.draft;
6359
+ const injection = `/${command?.name}`;
6360
+ const enrichedText = `${injection} ${text}`;
6361
+ return next({
6362
+ ...state,
6363
+ draft: {
6364
+ ...state.draft,
6365
+ text: enrichedText
6366
+ }
6367
+ });
6368
+ }
6369
+ },
6370
+ id: "stream-io/message-composer-middleware/draft-command-string-injection"
6371
+ });
6372
+
6373
+ // src/messageComposer/middleware/textComposer/activeCommandGuard.ts
6374
+ var createActiveCommandGuardMiddleware = () => ({
6375
+ handlers: {
6376
+ onChange: ({ complete, forward, state }) => {
6377
+ if (state.command) {
6378
+ return complete(state);
6379
+ }
6380
+ return forward();
6381
+ },
6382
+ onSuggestionItemSelect: ({ forward }) => forward()
6383
+ },
6384
+ id: "stream-io/text-composer/active-command-guard"
6385
+ });
6386
+
6312
6387
  // src/search/BaseSearchSource.ts
6313
6388
  var DEFAULT_SEARCH_SOURCE_OPTIONS = {
6314
6389
  debounceMs: 300,
@@ -6712,6 +6787,11 @@ var getTriggerCharWithToken = ({
6712
6787
  );
6713
6788
  return match && match[match.length - 1].trim();
6714
6789
  };
6790
+ var getCompleteCommandInString = (text) => {
6791
+ const match = text.match(/^\/(\S+)\s+.*/);
6792
+ const commandName = match && match[1];
6793
+ return commandName;
6794
+ };
6715
6795
  var insertItemWithTrigger = ({
6716
6796
  insertText,
6717
6797
  selection,
@@ -6828,9 +6908,21 @@ var createCommandsMiddleware = (channel, options) => {
6828
6908
  handlers: {
6829
6909
  onChange: ({ state, next, complete, forward }) => {
6830
6910
  if (!state.selection) return forward();
6911
+ const finalText = state.text.slice(0, state.selection.end);
6912
+ const commandName = getCompleteCommandInString(finalText);
6913
+ if (commandName) {
6914
+ const command = searchSource?.query(commandName).items[0];
6915
+ if (command) {
6916
+ return next({
6917
+ ...state,
6918
+ command,
6919
+ suggestions: void 0
6920
+ });
6921
+ }
6922
+ }
6831
6923
  const triggerWithToken = getTriggerCharWithToken({
6832
6924
  trigger: finalOptions.trigger,
6833
- text: state.text.slice(0, state.selection.end),
6925
+ text: finalText,
6834
6926
  acceptTrailingSpaces: false,
6835
6927
  isCommand: true
6836
6928
  });
@@ -6849,6 +6941,7 @@ var createCommandsMiddleware = (channel, options) => {
6849
6941
  }
6850
6942
  return complete({
6851
6943
  ...state,
6944
+ command: null,
6852
6945
  suggestions: {
6853
6946
  query: triggerWithToken.slice(1),
6854
6947
  searchSource,
@@ -6856,12 +6949,12 @@ var createCommandsMiddleware = (channel, options) => {
6856
6949
  }
6857
6950
  });
6858
6951
  },
6859
- onSuggestionItemSelect: ({ state, complete, forward }) => {
6952
+ onSuggestionItemSelect: ({ state, next, forward }) => {
6860
6953
  const { selectedSuggestion } = state.change ?? {};
6861
6954
  if (!selectedSuggestion || state.suggestions?.trigger !== finalOptions.trigger)
6862
6955
  return forward();
6863
6956
  searchSource.resetStateAndActivate();
6864
- return complete({
6957
+ return next({
6865
6958
  ...state,
6866
6959
  ...insertItemWithTrigger({
6867
6960
  insertText: `/${selectedSuggestion.name} `,
@@ -6869,6 +6962,7 @@ var createCommandsMiddleware = (channel, options) => {
6869
6962
  text: state.text,
6870
6963
  trigger: finalOptions.trigger
6871
6964
  }),
6965
+ command: selectedSuggestion,
6872
6966
  suggestions: void 0
6873
6967
  });
6874
6968
  }
@@ -6876,6 +6970,45 @@ var createCommandsMiddleware = (channel, options) => {
6876
6970
  };
6877
6971
  };
6878
6972
 
6973
+ // src/messageComposer/middleware/textComposer/commandStringExtraction.ts
6974
+ var stripCommandFromText = (text, commandName) => text.replace(new RegExp(`^${escapeRegExp(`/${commandName}`)}\\s*`), "");
6975
+ var createCommandStringExtractionMiddleware = () => ({
6976
+ handlers: {
6977
+ onChange: ({ complete, forward, state }) => {
6978
+ const { command } = state;
6979
+ if (!command?.name) {
6980
+ return forward();
6981
+ }
6982
+ const newText = stripCommandFromText(state.text, command.name);
6983
+ return complete({
6984
+ ...state,
6985
+ selection: {
6986
+ end: newText.length,
6987
+ start: newText.length
6988
+ },
6989
+ text: newText
6990
+ });
6991
+ },
6992
+ onSuggestionItemSelect: ({ next, forward, state }) => {
6993
+ const { command } = state;
6994
+ if (!command) {
6995
+ return forward();
6996
+ }
6997
+ const triggerWithCommand = `/${command?.name} `;
6998
+ const newText = state.text.slice(triggerWithCommand.length);
6999
+ return next({
7000
+ ...state,
7001
+ selection: {
7002
+ end: newText.length,
7003
+ start: newText.length
7004
+ },
7005
+ text: newText
7006
+ });
7007
+ }
7008
+ },
7009
+ id: "stream-io/text-composer/command-string-extraction"
7010
+ });
7011
+
6879
7012
  // src/messageComposer/middleware/textComposer/mentions.ts
6880
7013
  var accentsMap = {
6881
7014
  a: "\xE1|\xE0|\xE3|\xE2|\xC0|\xC1|\xC3|\xC2",
@@ -7208,6 +7341,7 @@ var initState4 = ({
7208
7341
  if (!message) {
7209
7342
  const text2 = composer.config.text.defaultValue ?? "";
7210
7343
  return {
7344
+ command: null,
7211
7345
  mentionedUsers: [],
7212
7346
  text: text2,
7213
7347
  selection: { start: text2.length, end: text2.length }
@@ -7246,6 +7380,10 @@ var TextComposer = class {
7246
7380
  mentionedUsers.splice(existingUserIndex, 1);
7247
7381
  this.state.partialNext({ mentionedUsers });
7248
7382
  };
7383
+ this.setCommand = (command) => {
7384
+ if (command?.name === this.command?.name) return;
7385
+ this.state.partialNext({ command });
7386
+ };
7249
7387
  this.setText = (text) => {
7250
7388
  if (!this.enabled || text === this.text) return;
7251
7389
  this.state.partialNext({ text });
@@ -7255,7 +7393,10 @@ var TextComposer = class {
7255
7393
  if (!this.enabled || !selectionChanged) return;
7256
7394
  this.state.partialNext({ selection });
7257
7395
  };
7258
- this.insertText = ({ text, selection }) => {
7396
+ this.insertText = async ({
7397
+ text,
7398
+ selection
7399
+ }) => {
7259
7400
  if (!this.enabled) return;
7260
7401
  const finalSelection = selection ?? this.selection;
7261
7402
  const { maxLengthOnEdit } = this.composer.config.text ?? {};
@@ -7271,7 +7412,7 @@ var TextComposer = class {
7271
7412
  );
7272
7413
  const expectedCursorPosition = currentText.slice(0, finalSelection.start).length + text.length;
7273
7414
  const cursorPosition = expectedCursorPosition >= finalText.length ? finalText.length : currentText.slice(0, expectedCursorPosition).length;
7274
- this.state.partialNext({
7415
+ await this.handleChange({
7275
7416
  text: finalText,
7276
7417
  selection: {
7277
7418
  start: cursorPosition,
@@ -7391,6 +7532,9 @@ var TextComposer = class {
7391
7532
  this.composer.updateConfig({ text: { publishTypingEvents } });
7392
7533
  }
7393
7534
  // --- START STATE API ---
7535
+ get command() {
7536
+ return this.state.getLatestValue().command;
7537
+ }
7394
7538
  get mentionedUsers() {
7395
7539
  return this.state.getLatestValue().mentionedUsers;
7396
7540
  }
@@ -7409,6 +7553,9 @@ var TextComposer = class {
7409
7553
  setMentionedUsers(users) {
7410
7554
  this.state.partialNext({ mentionedUsers: users });
7411
7555
  }
7556
+ clearCommand() {
7557
+ this.state.partialNext({ command: null });
7558
+ }
7412
7559
  // --- END TEXT PROCESSING ----
7413
7560
  };
7414
7561
 
@@ -12969,6 +13116,20 @@ var ReminderPaginator = class extends BasePaginator {
12969
13116
  this.filterQueryResults = (items) => items;
12970
13117
  this.client = client;
12971
13118
  }
13119
+ get filters() {
13120
+ return this._filters;
13121
+ }
13122
+ get sort() {
13123
+ return this._sort;
13124
+ }
13125
+ set filters(filters) {
13126
+ this._filters = filters;
13127
+ this.resetState();
13128
+ }
13129
+ set sort(sort) {
13130
+ this._sort = sort;
13131
+ this.resetState();
13132
+ }
12972
13133
  };
12973
13134
 
12974
13135
  // src/reminders/ReminderManager.ts
@@ -12983,7 +13144,8 @@ var DEFAULT_REMINDER_MANAGER_CONFIG = {
12983
13144
  2 * oneHour2,
12984
13145
  8 * oneHour2,
12985
13146
  oneDay2
12986
- ]
13147
+ ],
13148
+ stopTimerRefreshBoundaryMs: DEFAULT_STOP_REFRESH_BOUNDARY_MS
12987
13149
  };
12988
13150
  var isReminderExistsError = (error) => error.message.match("already has reminder created for this message_id");
12989
13151
  var isReminderDoesNotExistError = (error) => error.message.match("reminder does not exist");
@@ -13134,13 +13296,19 @@ var _ReminderManager = class _ReminderManager extends WithSubscriptions {
13134
13296
  };
13135
13297
  this.client = client;
13136
13298
  this.configState = new StateStore({
13137
- scheduledOffsetsMs: config?.scheduledOffsetsMs ?? DEFAULT_REMINDER_MANAGER_CONFIG.scheduledOffsetsMs
13299
+ scheduledOffsetsMs: config?.scheduledOffsetsMs ?? DEFAULT_REMINDER_MANAGER_CONFIG.scheduledOffsetsMs,
13300
+ stopTimerRefreshBoundaryMs: config?.stopTimerRefreshBoundaryMs ?? DEFAULT_REMINDER_MANAGER_CONFIG.stopTimerRefreshBoundaryMs
13138
13301
  });
13139
13302
  this.state = new StateStore({ reminders: /* @__PURE__ */ new Map() });
13140
13303
  this.paginator = new ReminderPaginator(client);
13141
13304
  }
13142
13305
  // Config API START //
13143
13306
  updateConfig(config) {
13307
+ if (typeof config.stopTimerRefreshBoundaryMs === "number" && config.stopTimerRefreshBoundaryMs !== this.stopTimerRefreshBoundaryMs) {
13308
+ this.reminders.forEach((reminder) => {
13309
+ reminder.timer.stopRefreshBoundaryMs = config?.stopTimerRefreshBoundaryMs;
13310
+ });
13311
+ }
13144
13312
  this.configState.partialNext(config);
13145
13313
  }
13146
13314
  get stopTimerRefreshBoundaryMs() {
@@ -15382,7 +15550,7 @@ var StreamChat = class _StreamChat {
15382
15550
  if (this.userAgent) {
15383
15551
  return this.userAgent;
15384
15552
  }
15385
- const version = "9.7.0";
15553
+ const version = "9.8.0";
15386
15554
  const clientBundle = "browser-cjs";
15387
15555
  let userAgentString = "";
15388
15556
  if (this.sdkIdentifier) {