stream-chat 9.7.0 → 9.9.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 (35) hide show
  1. package/dist/cjs/index.browser.cjs +200 -8
  2. package/dist/cjs/index.browser.cjs.map +3 -3
  3. package/dist/cjs/index.node.cjs +205 -8
  4. package/dist/cjs/index.node.cjs.map +3 -3
  5. package/dist/esm/index.js +200 -8
  6. package/dist/esm/index.js.map +3 -3
  7. package/dist/types/client.d.ts +17 -1
  8. package/dist/types/messageComposer/middleware/messageComposer/commandInjection.d.ts +4 -0
  9. package/dist/types/messageComposer/middleware/messageComposer/index.d.ts +1 -0
  10. package/dist/types/messageComposer/middleware/textComposer/activeCommandGuard.d.ts +4 -0
  11. package/dist/types/messageComposer/middleware/textComposer/commandStringExtraction.d.ts +5 -0
  12. package/dist/types/messageComposer/middleware/textComposer/index.d.ts +2 -0
  13. package/dist/types/messageComposer/middleware/textComposer/textMiddlewareUtils.d.ts +6 -0
  14. package/dist/types/messageComposer/middleware/textComposer/types.d.ts +1 -0
  15. package/dist/types/messageComposer/textComposer.d.ts +6 -3
  16. package/dist/types/pagination/BasePaginator.d.ts +1 -1
  17. package/dist/types/pagination/ReminderPaginator.d.ts +6 -2
  18. package/dist/types/reminders/ReminderManager.d.ts +3 -3
  19. package/dist/types/types.d.ts +26 -1
  20. package/package.json +1 -1
  21. package/src/client.ts +28 -2
  22. package/src/messageComposer/messageComposer.ts +1 -0
  23. package/src/messageComposer/middleware/messageComposer/commandInjection.ts +72 -0
  24. package/src/messageComposer/middleware/messageComposer/index.ts +1 -0
  25. package/src/messageComposer/middleware/textComposer/activeCommandGuard.ts +20 -0
  26. package/src/messageComposer/middleware/textComposer/commandStringExtraction.ts +56 -0
  27. package/src/messageComposer/middleware/textComposer/commands.ts +22 -4
  28. package/src/messageComposer/middleware/textComposer/index.ts +2 -0
  29. package/src/messageComposer/middleware/textComposer/textMiddlewareUtils.ts +14 -0
  30. package/src/messageComposer/middleware/textComposer/types.ts +1 -0
  31. package/src/messageComposer/textComposer.ts +23 -3
  32. package/src/pagination/BasePaginator.ts +1 -1
  33. package/src/pagination/ReminderPaginator.ts +20 -2
  34. package/src/reminders/ReminderManager.ts +16 -2
  35. package/src/types.ts +30 -2
@@ -10750,12 +10750,16 @@ __export(index_exports, {
10750
10750
  calculateLevenshtein: () => calculateLevenshtein,
10751
10751
  channelManagerEventToHandlerMapping: () => channelManagerEventToHandlerMapping,
10752
10752
  chatCodes: () => chatCodes,
10753
+ createActiveCommandGuardMiddleware: () => createActiveCommandGuardMiddleware,
10753
10754
  createAttachmentsCompositionMiddleware: () => createAttachmentsCompositionMiddleware,
10755
+ createCommandInjectionMiddleware: () => createCommandInjectionMiddleware,
10756
+ createCommandStringExtractionMiddleware: () => createCommandStringExtractionMiddleware,
10754
10757
  createCommandsMiddleware: () => createCommandsMiddleware,
10755
10758
  createCompositionDataCleanupMiddleware: () => createCompositionDataCleanupMiddleware,
10756
10759
  createCompositionValidationMiddleware: () => createCompositionValidationMiddleware,
10757
10760
  createCustomDataCompositionMiddleware: () => createCustomDataCompositionMiddleware,
10758
10761
  createDraftAttachmentsCompositionMiddleware: () => createDraftAttachmentsCompositionMiddleware,
10762
+ createDraftCommandInjectionMiddleware: () => createDraftCommandInjectionMiddleware,
10759
10763
  createDraftCompositionValidationMiddleware: () => createDraftCompositionValidationMiddleware,
10760
10764
  createDraftCustomDataCompositionMiddleware: () => createDraftCustomDataCompositionMiddleware,
10761
10765
  createDraftLinkPreviewsCompositionMiddleware: () => createDraftLinkPreviewsCompositionMiddleware,
@@ -10779,6 +10783,7 @@ __export(index_exports, {
10779
10783
  formatMessage: () => formatMessage,
10780
10784
  generateFileName: () => generateFileName,
10781
10785
  getAttachmentTypeFromMimeType: () => getAttachmentTypeFromMimeType,
10786
+ getCompleteCommandInString: () => getCompleteCommandInString,
10782
10787
  getExtensionFromMimeType: () => getExtensionFromMimeType,
10783
10788
  getTokenizedSuggestionDisplayName: () => getTokenizedSuggestionDisplayName,
10784
10789
  getTriggerCharWithToken: () => getTriggerCharWithToken,
@@ -17652,6 +17657,76 @@ var MessageDraftComposerMiddlewareExecutor = class extends MiddlewareExecutor {
17652
17657
  }
17653
17658
  };
17654
17659
 
17660
+ // src/messageComposer/middleware/messageComposer/commandInjection.ts
17661
+ var createCommandInjectionMiddleware = (composer) => ({
17662
+ handlers: {
17663
+ compose: ({
17664
+ forward,
17665
+ next,
17666
+ state
17667
+ }) => {
17668
+ const command = composer.textComposer.command;
17669
+ if (!command) {
17670
+ return forward();
17671
+ }
17672
+ const { text } = state.localMessage;
17673
+ const injection = `/${command?.name}`;
17674
+ const enrichedText = `${injection} ${text}`;
17675
+ return next({
17676
+ ...state,
17677
+ localMessage: {
17678
+ ...state.localMessage,
17679
+ text: enrichedText
17680
+ },
17681
+ message: {
17682
+ ...state.message,
17683
+ text: enrichedText
17684
+ }
17685
+ });
17686
+ }
17687
+ },
17688
+ id: "stream-io/message-composer-middleware/command-string-injection"
17689
+ });
17690
+ var createDraftCommandInjectionMiddleware = (composer) => ({
17691
+ handlers: {
17692
+ compose: ({
17693
+ forward,
17694
+ next,
17695
+ state
17696
+ }) => {
17697
+ const command = composer.textComposer.command;
17698
+ if (!command) {
17699
+ return forward();
17700
+ }
17701
+ const { text } = state.draft;
17702
+ const injection = `/${command?.name}`;
17703
+ const enrichedText = `${injection} ${text}`;
17704
+ return next({
17705
+ ...state,
17706
+ draft: {
17707
+ ...state.draft,
17708
+ text: enrichedText
17709
+ }
17710
+ });
17711
+ }
17712
+ },
17713
+ id: "stream-io/message-composer-middleware/draft-command-string-injection"
17714
+ });
17715
+
17716
+ // src/messageComposer/middleware/textComposer/activeCommandGuard.ts
17717
+ var createActiveCommandGuardMiddleware = () => ({
17718
+ handlers: {
17719
+ onChange: ({ complete, forward, state }) => {
17720
+ if (state.command) {
17721
+ return complete(state);
17722
+ }
17723
+ return forward();
17724
+ },
17725
+ onSuggestionItemSelect: ({ forward }) => forward()
17726
+ },
17727
+ id: "stream-io/text-composer/active-command-guard"
17728
+ });
17729
+
17655
17730
  // src/search/BaseSearchSource.ts
17656
17731
  var DEFAULT_SEARCH_SOURCE_OPTIONS = {
17657
17732
  debounceMs: 300,
@@ -18055,6 +18130,11 @@ var getTriggerCharWithToken = ({
18055
18130
  );
18056
18131
  return match && match[match.length - 1].trim();
18057
18132
  };
18133
+ var getCompleteCommandInString = (text) => {
18134
+ const match = text.match(/^\/(\S+)\s+.*/);
18135
+ const commandName = match && match[1];
18136
+ return commandName;
18137
+ };
18058
18138
  var insertItemWithTrigger = ({
18059
18139
  insertText,
18060
18140
  selection,
@@ -18171,9 +18251,21 @@ var createCommandsMiddleware = (channel, options) => {
18171
18251
  handlers: {
18172
18252
  onChange: ({ state, next, complete, forward }) => {
18173
18253
  if (!state.selection) return forward();
18254
+ const finalText = state.text.slice(0, state.selection.end);
18255
+ const commandName = getCompleteCommandInString(finalText);
18256
+ if (commandName) {
18257
+ const command = searchSource?.query(commandName).items[0];
18258
+ if (command) {
18259
+ return next({
18260
+ ...state,
18261
+ command,
18262
+ suggestions: void 0
18263
+ });
18264
+ }
18265
+ }
18174
18266
  const triggerWithToken = getTriggerCharWithToken({
18175
18267
  trigger: finalOptions.trigger,
18176
- text: state.text.slice(0, state.selection.end),
18268
+ text: finalText,
18177
18269
  acceptTrailingSpaces: false,
18178
18270
  isCommand: true
18179
18271
  });
@@ -18192,6 +18284,7 @@ var createCommandsMiddleware = (channel, options) => {
18192
18284
  }
18193
18285
  return complete({
18194
18286
  ...state,
18287
+ command: null,
18195
18288
  suggestions: {
18196
18289
  query: triggerWithToken.slice(1),
18197
18290
  searchSource,
@@ -18199,12 +18292,12 @@ var createCommandsMiddleware = (channel, options) => {
18199
18292
  }
18200
18293
  });
18201
18294
  },
18202
- onSuggestionItemSelect: ({ state, complete, forward }) => {
18295
+ onSuggestionItemSelect: ({ state, next, forward }) => {
18203
18296
  const { selectedSuggestion } = state.change ?? {};
18204
18297
  if (!selectedSuggestion || state.suggestions?.trigger !== finalOptions.trigger)
18205
18298
  return forward();
18206
18299
  searchSource.resetStateAndActivate();
18207
- return complete({
18300
+ return next({
18208
18301
  ...state,
18209
18302
  ...insertItemWithTrigger({
18210
18303
  insertText: `/${selectedSuggestion.name} `,
@@ -18212,6 +18305,7 @@ var createCommandsMiddleware = (channel, options) => {
18212
18305
  text: state.text,
18213
18306
  trigger: finalOptions.trigger
18214
18307
  }),
18308
+ command: selectedSuggestion,
18215
18309
  suggestions: void 0
18216
18310
  });
18217
18311
  }
@@ -18219,6 +18313,45 @@ var createCommandsMiddleware = (channel, options) => {
18219
18313
  };
18220
18314
  };
18221
18315
 
18316
+ // src/messageComposer/middleware/textComposer/commandStringExtraction.ts
18317
+ var stripCommandFromText = (text, commandName) => text.replace(new RegExp(`^${escapeRegExp(`/${commandName}`)}\\s*`), "");
18318
+ var createCommandStringExtractionMiddleware = () => ({
18319
+ handlers: {
18320
+ onChange: ({ complete, forward, state }) => {
18321
+ const { command } = state;
18322
+ if (!command?.name) {
18323
+ return forward();
18324
+ }
18325
+ const newText = stripCommandFromText(state.text, command.name);
18326
+ return complete({
18327
+ ...state,
18328
+ selection: {
18329
+ end: newText.length,
18330
+ start: newText.length
18331
+ },
18332
+ text: newText
18333
+ });
18334
+ },
18335
+ onSuggestionItemSelect: ({ next, forward, state }) => {
18336
+ const { command } = state;
18337
+ if (!command) {
18338
+ return forward();
18339
+ }
18340
+ const triggerWithCommand = `/${command?.name} `;
18341
+ const newText = state.text.slice(triggerWithCommand.length);
18342
+ return next({
18343
+ ...state,
18344
+ selection: {
18345
+ end: newText.length,
18346
+ start: newText.length
18347
+ },
18348
+ text: newText
18349
+ });
18350
+ }
18351
+ },
18352
+ id: "stream-io/text-composer/command-string-extraction"
18353
+ });
18354
+
18222
18355
  // src/messageComposer/middleware/textComposer/mentions.ts
18223
18356
  var accentsMap = {
18224
18357
  a: "\xE1|\xE0|\xE3|\xE2|\xC0|\xC1|\xC3|\xC2",
@@ -18551,6 +18684,7 @@ var initState4 = ({
18551
18684
  if (!message) {
18552
18685
  const text2 = composer.config.text.defaultValue ?? "";
18553
18686
  return {
18687
+ command: null,
18554
18688
  mentionedUsers: [],
18555
18689
  text: text2,
18556
18690
  selection: { start: text2.length, end: text2.length }
@@ -18589,6 +18723,10 @@ var TextComposer = class {
18589
18723
  mentionedUsers.splice(existingUserIndex, 1);
18590
18724
  this.state.partialNext({ mentionedUsers });
18591
18725
  };
18726
+ this.setCommand = (command) => {
18727
+ if (command?.name === this.command?.name) return;
18728
+ this.state.partialNext({ command });
18729
+ };
18592
18730
  this.setText = (text) => {
18593
18731
  if (!this.enabled || text === this.text) return;
18594
18732
  this.state.partialNext({ text });
@@ -18598,7 +18736,10 @@ var TextComposer = class {
18598
18736
  if (!this.enabled || !selectionChanged) return;
18599
18737
  this.state.partialNext({ selection });
18600
18738
  };
18601
- this.insertText = ({ text, selection }) => {
18739
+ this.insertText = async ({
18740
+ text,
18741
+ selection
18742
+ }) => {
18602
18743
  if (!this.enabled) return;
18603
18744
  const finalSelection = selection ?? this.selection;
18604
18745
  const { maxLengthOnEdit } = this.composer.config.text ?? {};
@@ -18614,7 +18755,7 @@ var TextComposer = class {
18614
18755
  );
18615
18756
  const expectedCursorPosition = currentText.slice(0, finalSelection.start).length + text.length;
18616
18757
  const cursorPosition = expectedCursorPosition >= finalText.length ? finalText.length : currentText.slice(0, expectedCursorPosition).length;
18617
- this.state.partialNext({
18758
+ await this.handleChange({
18618
18759
  text: finalText,
18619
18760
  selection: {
18620
18761
  start: cursorPosition,
@@ -18734,6 +18875,9 @@ var TextComposer = class {
18734
18875
  this.composer.updateConfig({ text: { publishTypingEvents } });
18735
18876
  }
18736
18877
  // --- START STATE API ---
18878
+ get command() {
18879
+ return this.state.getLatestValue().command;
18880
+ }
18737
18881
  get mentionedUsers() {
18738
18882
  return this.state.getLatestValue().mentionedUsers;
18739
18883
  }
@@ -18752,6 +18896,9 @@ var TextComposer = class {
18752
18896
  setMentionedUsers(users) {
18753
18897
  this.state.partialNext({ mentionedUsers: users });
18754
18898
  }
18899
+ clearCommand() {
18900
+ this.state.partialNext({ command: null });
18901
+ }
18755
18902
  // --- END TEXT PROCESSING ----
18756
18903
  };
18757
18904
 
@@ -19503,6 +19650,7 @@ var _MessageComposer = class _MessageComposer extends WithSubscriptions {
19503
19650
  this.state.partialNext({ showReplyInChannel: !this.showReplyInChannel });
19504
19651
  };
19505
19652
  this.clear = () => {
19653
+ this.setQuotedMessage(null);
19506
19654
  this.initState();
19507
19655
  };
19508
19656
  this.restore = () => {
@@ -24300,6 +24448,20 @@ var ReminderPaginator = class extends BasePaginator {
24300
24448
  this.filterQueryResults = (items) => items;
24301
24449
  this.client = client;
24302
24450
  }
24451
+ get filters() {
24452
+ return this._filters;
24453
+ }
24454
+ get sort() {
24455
+ return this._sort;
24456
+ }
24457
+ set filters(filters) {
24458
+ this._filters = filters;
24459
+ this.resetState();
24460
+ }
24461
+ set sort(sort) {
24462
+ this._sort = sort;
24463
+ this.resetState();
24464
+ }
24303
24465
  };
24304
24466
 
24305
24467
  // src/reminders/ReminderManager.ts
@@ -24314,7 +24476,8 @@ var DEFAULT_REMINDER_MANAGER_CONFIG = {
24314
24476
  2 * oneHour2,
24315
24477
  8 * oneHour2,
24316
24478
  oneDay2
24317
- ]
24479
+ ],
24480
+ stopTimerRefreshBoundaryMs: DEFAULT_STOP_REFRESH_BOUNDARY_MS
24318
24481
  };
24319
24482
  var isReminderExistsError = (error) => error.message.match("already has reminder created for this message_id");
24320
24483
  var isReminderDoesNotExistError = (error) => error.message.match("reminder does not exist");
@@ -24465,13 +24628,19 @@ var _ReminderManager = class _ReminderManager extends WithSubscriptions {
24465
24628
  };
24466
24629
  this.client = client;
24467
24630
  this.configState = new StateStore({
24468
- scheduledOffsetsMs: config?.scheduledOffsetsMs ?? DEFAULT_REMINDER_MANAGER_CONFIG.scheduledOffsetsMs
24631
+ scheduledOffsetsMs: config?.scheduledOffsetsMs ?? DEFAULT_REMINDER_MANAGER_CONFIG.scheduledOffsetsMs,
24632
+ stopTimerRefreshBoundaryMs: config?.stopTimerRefreshBoundaryMs ?? DEFAULT_REMINDER_MANAGER_CONFIG.stopTimerRefreshBoundaryMs
24469
24633
  });
24470
24634
  this.state = new StateStore({ reminders: /* @__PURE__ */ new Map() });
24471
24635
  this.paginator = new ReminderPaginator(client);
24472
24636
  }
24473
24637
  // Config API START //
24474
24638
  updateConfig(config) {
24639
+ if (typeof config.stopTimerRefreshBoundaryMs === "number" && config.stopTimerRefreshBoundaryMs !== this.stopTimerRefreshBoundaryMs) {
24640
+ this.reminders.forEach((reminder) => {
24641
+ reminder.timer.stopRefreshBoundaryMs = config?.stopTimerRefreshBoundaryMs;
24642
+ });
24643
+ }
24475
24644
  this.configState.partialNext(config);
24476
24645
  }
24477
24646
  get stopTimerRefreshBoundaryMs() {
@@ -26159,6 +26328,16 @@ var StreamChat = class _StreamChat {
26159
26328
  ...userID ? { user_id: userID } : {}
26160
26329
  });
26161
26330
  }
26331
+ /** getSharedLocations
26332
+ *
26333
+ * @returns {Promise<ActiveLiveLocationsAPIResponse>} The server response
26334
+ *
26335
+ */
26336
+ async getSharedLocations() {
26337
+ return await this.get(
26338
+ this.baseURL + `/users/live_locations`
26339
+ );
26340
+ }
26162
26341
  /** muteUser - mutes a user
26163
26342
  *
26164
26343
  * @param {string} targetID
@@ -26713,7 +26892,7 @@ var StreamChat = class _StreamChat {
26713
26892
  if (this.userAgent) {
26714
26893
  return this.userAgent;
26715
26894
  }
26716
- const version = "9.7.0";
26895
+ const version = "9.9.0";
26717
26896
  const clientBundle = "node-cjs";
26718
26897
  let userAgentString = "";
26719
26898
  if (this.sdkIdentifier) {
@@ -27802,6 +27981,19 @@ var StreamChat = class _StreamChat {
27802
27981
  ...rest
27803
27982
  });
27804
27983
  }
27984
+ /**
27985
+ * updateLocation - Updates a location
27986
+ *
27987
+ * @param location UserLocation the location data to update
27988
+ *
27989
+ * @returns {Promise<APIResponse>} The server response
27990
+ */
27991
+ async updateLocation(location) {
27992
+ return await this.put(
27993
+ this.baseURL + `/users/live_locations`,
27994
+ location
27995
+ );
27996
+ }
27805
27997
  /**
27806
27998
  * uploadFile - Uploads a file to the configured storage (defaults to Stream CDN)
27807
27999
  *
@@ -28910,12 +29102,16 @@ var FixedSizeQueueCache = class {
28910
29102
  calculateLevenshtein,
28911
29103
  channelManagerEventToHandlerMapping,
28912
29104
  chatCodes,
29105
+ createActiveCommandGuardMiddleware,
28913
29106
  createAttachmentsCompositionMiddleware,
29107
+ createCommandInjectionMiddleware,
29108
+ createCommandStringExtractionMiddleware,
28914
29109
  createCommandsMiddleware,
28915
29110
  createCompositionDataCleanupMiddleware,
28916
29111
  createCompositionValidationMiddleware,
28917
29112
  createCustomDataCompositionMiddleware,
28918
29113
  createDraftAttachmentsCompositionMiddleware,
29114
+ createDraftCommandInjectionMiddleware,
28919
29115
  createDraftCompositionValidationMiddleware,
28920
29116
  createDraftCustomDataCompositionMiddleware,
28921
29117
  createDraftLinkPreviewsCompositionMiddleware,
@@ -28939,6 +29135,7 @@ var FixedSizeQueueCache = class {
28939
29135
  formatMessage,
28940
29136
  generateFileName,
28941
29137
  getAttachmentTypeFromMimeType,
29138
+ getCompleteCommandInString,
28942
29139
  getExtensionFromMimeType,
28943
29140
  getTokenizedSuggestionDisplayName,
28944
29141
  getTriggerCharWithToken,