stream-chat 9.16.0 → 9.17.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.
- package/dist/cjs/index.browser.cjs +382 -229
- package/dist/cjs/index.browser.cjs.map +4 -4
- package/dist/cjs/index.node.cjs +383 -229
- package/dist/cjs/index.node.cjs.map +4 -4
- package/dist/esm/index.js +421 -274
- package/dist/esm/index.js.map +4 -4
- package/dist/types/channel_state.d.ts +1 -1
- package/dist/types/client.d.ts +1 -1
- package/dist/types/events.d.ts +1 -0
- package/dist/types/pagination/FilterBuilder.d.ts +41 -0
- package/dist/types/pagination/index.d.ts +1 -0
- package/dist/types/search/BaseSearchSource.d.ts +1 -1
- package/dist/types/search/ChannelSearchSource.d.ts +11 -3
- package/dist/types/search/MessageSearchSource.d.ts +30 -2
- package/dist/types/search/UserSearchSource.d.ts +10 -3
- package/dist/types/search/index.d.ts +3 -3
- package/dist/types/types.d.ts +2 -0
- package/dist/types/utils.d.ts +86 -1
- package/package.json +2 -2
- package/src/channel.ts +9 -0
- package/src/channel_state.ts +24 -48
- package/src/client.ts +19 -3
- package/src/events.ts +1 -0
- package/src/pagination/FilterBuilder.ts +104 -0
- package/src/pagination/index.ts +1 -0
- package/src/search/BaseSearchSource.ts +1 -1
- package/src/search/ChannelSearchSource.ts +47 -8
- package/src/search/MessageSearchSource.ts +139 -21
- package/src/search/UserSearchSource.ts +47 -10
- package/src/search/index.ts +3 -3
- package/src/types.ts +2 -0
- package/src/utils.ts +75 -0
|
@@ -189,6 +189,7 @@ __export(index_exports, {
|
|
|
189
189
|
DevToken: () => DevToken,
|
|
190
190
|
EVENT_MAP: () => EVENT_MAP,
|
|
191
191
|
ErrorFromResponse: () => ErrorFromResponse,
|
|
192
|
+
FilterBuilder: () => FilterBuilder,
|
|
192
193
|
FixedSizeQueueCache: () => FixedSizeQueueCache,
|
|
193
194
|
InsightMetrics: () => InsightMetrics,
|
|
194
195
|
JWTServerToken: () => JWTServerToken,
|
|
@@ -2837,6 +2838,58 @@ var toUpdatedMessagePayload = (message) => {
|
|
|
2837
2838
|
)
|
|
2838
2839
|
};
|
|
2839
2840
|
};
|
|
2841
|
+
var toDeletedMessage = ({
|
|
2842
|
+
message,
|
|
2843
|
+
deletedAt,
|
|
2844
|
+
hardDelete = false
|
|
2845
|
+
}) => {
|
|
2846
|
+
if (hardDelete) {
|
|
2847
|
+
return {
|
|
2848
|
+
attachments: [],
|
|
2849
|
+
cid: message.cid,
|
|
2850
|
+
created_at: message.created_at,
|
|
2851
|
+
deleted_at: deletedAt,
|
|
2852
|
+
id: message.id,
|
|
2853
|
+
latest_reactions: [],
|
|
2854
|
+
mentioned_users: [],
|
|
2855
|
+
own_reactions: [],
|
|
2856
|
+
parent_id: message.parent_id,
|
|
2857
|
+
reply_count: message.reply_count,
|
|
2858
|
+
status: message.status,
|
|
2859
|
+
thread_participants: message.thread_participants,
|
|
2860
|
+
type: "deleted",
|
|
2861
|
+
updated_at: message.updated_at,
|
|
2862
|
+
user: message.user
|
|
2863
|
+
};
|
|
2864
|
+
} else {
|
|
2865
|
+
return {
|
|
2866
|
+
...message,
|
|
2867
|
+
attachments: [],
|
|
2868
|
+
type: "deleted",
|
|
2869
|
+
deleted_at: deletedAt
|
|
2870
|
+
};
|
|
2871
|
+
}
|
|
2872
|
+
};
|
|
2873
|
+
var deleteUserMessages = ({
|
|
2874
|
+
messages,
|
|
2875
|
+
user,
|
|
2876
|
+
hardDelete = false,
|
|
2877
|
+
deletedAt
|
|
2878
|
+
}) => {
|
|
2879
|
+
for (let i = 0; i < messages.length; i++) {
|
|
2880
|
+
const message = messages[i];
|
|
2881
|
+
if (message.user?.id === user.id) {
|
|
2882
|
+
messages[i] = message.type === "deleted" ? message : toDeletedMessage({ message, hardDelete, deletedAt });
|
|
2883
|
+
}
|
|
2884
|
+
if (message.quoted_message?.user?.id === user.id) {
|
|
2885
|
+
messages[i].quoted_message = message.quoted_message.type === "deleted" ? message.quoted_message : toDeletedMessage({
|
|
2886
|
+
message: messages[i].quoted_message,
|
|
2887
|
+
hardDelete,
|
|
2888
|
+
deletedAt
|
|
2889
|
+
});
|
|
2890
|
+
}
|
|
2891
|
+
}
|
|
2892
|
+
};
|
|
2840
2893
|
var findIndexInSortedArray = ({
|
|
2841
2894
|
needle,
|
|
2842
2895
|
sortedArray,
|
|
@@ -3371,46 +3424,24 @@ var ChannelState = class {
|
|
|
3371
3424
|
* @param {UserResponse} user
|
|
3372
3425
|
* @param {boolean} hardDelete
|
|
3373
3426
|
*/
|
|
3374
|
-
this.deleteUserMessages = (user, hardDelete = false) => {
|
|
3375
|
-
const _deleteUserMessages = (messages, user2, hardDelete2 = false) => {
|
|
3376
|
-
for (let i = 0; i < messages.length; i++) {
|
|
3377
|
-
const m = messages[i];
|
|
3378
|
-
if (m.user?.id !== user2.id) {
|
|
3379
|
-
continue;
|
|
3380
|
-
}
|
|
3381
|
-
if (hardDelete2) {
|
|
3382
|
-
messages[i] = {
|
|
3383
|
-
cid: m.cid,
|
|
3384
|
-
created_at: m.created_at,
|
|
3385
|
-
deleted_at: user2.deleted_at,
|
|
3386
|
-
id: m.id,
|
|
3387
|
-
latest_reactions: [],
|
|
3388
|
-
mentioned_users: [],
|
|
3389
|
-
own_reactions: [],
|
|
3390
|
-
parent_id: m.parent_id,
|
|
3391
|
-
reply_count: m.reply_count,
|
|
3392
|
-
status: m.status,
|
|
3393
|
-
thread_participants: m.thread_participants,
|
|
3394
|
-
type: "deleted",
|
|
3395
|
-
updated_at: m.updated_at,
|
|
3396
|
-
user: m.user
|
|
3397
|
-
};
|
|
3398
|
-
} else {
|
|
3399
|
-
messages[i] = {
|
|
3400
|
-
...m,
|
|
3401
|
-
type: "deleted",
|
|
3402
|
-
deleted_at: user2.deleted_at ? new Date(user2.deleted_at) : null
|
|
3403
|
-
};
|
|
3404
|
-
}
|
|
3405
|
-
}
|
|
3406
|
-
};
|
|
3427
|
+
this.deleteUserMessages = (user, hardDelete = false, deletedAt) => {
|
|
3407
3428
|
this.messageSets.forEach(
|
|
3408
|
-
(
|
|
3429
|
+
({ messages }) => deleteUserMessages({ messages, user, hardDelete, deletedAt: deletedAt ?? null })
|
|
3409
3430
|
);
|
|
3410
3431
|
for (const parentId in this.threads) {
|
|
3411
|
-
|
|
3432
|
+
deleteUserMessages({
|
|
3433
|
+
messages: this.threads[parentId],
|
|
3434
|
+
user,
|
|
3435
|
+
hardDelete,
|
|
3436
|
+
deletedAt: deletedAt ?? null
|
|
3437
|
+
});
|
|
3412
3438
|
}
|
|
3413
|
-
|
|
3439
|
+
deleteUserMessages({
|
|
3440
|
+
messages: this.pinnedMessages,
|
|
3441
|
+
user,
|
|
3442
|
+
hardDelete,
|
|
3443
|
+
deletedAt: deletedAt ?? null
|
|
3444
|
+
});
|
|
3414
3445
|
};
|
|
3415
3446
|
this._channel = channel;
|
|
3416
3447
|
this.watcher_count = 0;
|
|
@@ -7001,21 +7032,242 @@ var SearchController = class {
|
|
|
7001
7032
|
}
|
|
7002
7033
|
};
|
|
7003
7034
|
|
|
7035
|
+
// src/pagination/BasePaginator.ts
|
|
7036
|
+
var DEFAULT_PAGINATION_OPTIONS = {
|
|
7037
|
+
debounceMs: 300,
|
|
7038
|
+
pageSize: 10
|
|
7039
|
+
};
|
|
7040
|
+
var BasePaginator = class {
|
|
7041
|
+
constructor(options) {
|
|
7042
|
+
this._isCursorPagination = false;
|
|
7043
|
+
this.setDebounceOptions = ({ debounceMs }) => {
|
|
7044
|
+
this._executeQueryDebounced = debounce(this.executeQuery.bind(this), debounceMs);
|
|
7045
|
+
};
|
|
7046
|
+
this.canExecuteQuery = (direction) => !this.isLoading && direction === "next" && this.hasNext || direction === "prev" && this.hasPrev;
|
|
7047
|
+
this.next = () => this.executeQuery({ direction: "next" });
|
|
7048
|
+
this.prev = () => this.executeQuery({ direction: "prev" });
|
|
7049
|
+
this.nextDebounced = () => {
|
|
7050
|
+
this._executeQueryDebounced({ direction: "next" });
|
|
7051
|
+
};
|
|
7052
|
+
this.prevDebounced = () => {
|
|
7053
|
+
this._executeQueryDebounced({ direction: "prev" });
|
|
7054
|
+
};
|
|
7055
|
+
const { debounceMs, pageSize } = { ...DEFAULT_PAGINATION_OPTIONS, ...options };
|
|
7056
|
+
this.pageSize = pageSize;
|
|
7057
|
+
this.state = new StateStore(this.initialState);
|
|
7058
|
+
this.setDebounceOptions({ debounceMs });
|
|
7059
|
+
}
|
|
7060
|
+
get lastQueryError() {
|
|
7061
|
+
return this.state.getLatestValue().lastQueryError;
|
|
7062
|
+
}
|
|
7063
|
+
get hasNext() {
|
|
7064
|
+
return this.state.getLatestValue().hasNext;
|
|
7065
|
+
}
|
|
7066
|
+
get hasPrev() {
|
|
7067
|
+
return this.state.getLatestValue().hasPrev;
|
|
7068
|
+
}
|
|
7069
|
+
get hasResults() {
|
|
7070
|
+
return Array.isArray(this.state.getLatestValue().items);
|
|
7071
|
+
}
|
|
7072
|
+
get isLoading() {
|
|
7073
|
+
return this.state.getLatestValue().isLoading;
|
|
7074
|
+
}
|
|
7075
|
+
get initialState() {
|
|
7076
|
+
return {
|
|
7077
|
+
hasNext: true,
|
|
7078
|
+
hasPrev: true,
|
|
7079
|
+
//todo: check if optimistic value does not cause problems in UI
|
|
7080
|
+
isLoading: false,
|
|
7081
|
+
items: void 0,
|
|
7082
|
+
lastQueryError: void 0,
|
|
7083
|
+
cursor: void 0,
|
|
7084
|
+
offset: 0
|
|
7085
|
+
};
|
|
7086
|
+
}
|
|
7087
|
+
get items() {
|
|
7088
|
+
return this.state.getLatestValue().items;
|
|
7089
|
+
}
|
|
7090
|
+
get cursor() {
|
|
7091
|
+
return this.state.getLatestValue().cursor;
|
|
7092
|
+
}
|
|
7093
|
+
get offset() {
|
|
7094
|
+
return this.state.getLatestValue().offset;
|
|
7095
|
+
}
|
|
7096
|
+
getStateBeforeFirstQuery() {
|
|
7097
|
+
return {
|
|
7098
|
+
...this.initialState,
|
|
7099
|
+
isLoading: true
|
|
7100
|
+
};
|
|
7101
|
+
}
|
|
7102
|
+
getStateAfterQuery(stateUpdate, isFirstPage) {
|
|
7103
|
+
const current = this.state.getLatestValue();
|
|
7104
|
+
return {
|
|
7105
|
+
...current,
|
|
7106
|
+
lastQueryError: void 0,
|
|
7107
|
+
// reset lastQueryError that can be overridden by the stateUpdate
|
|
7108
|
+
...stateUpdate,
|
|
7109
|
+
isLoading: false,
|
|
7110
|
+
items: isFirstPage ? stateUpdate.items : [...this.items ?? [], ...stateUpdate.items || []]
|
|
7111
|
+
};
|
|
7112
|
+
}
|
|
7113
|
+
async executeQuery({ direction }) {
|
|
7114
|
+
if (!this.canExecuteQuery(direction)) return;
|
|
7115
|
+
const isFirstPage = typeof this.items === "undefined";
|
|
7116
|
+
if (isFirstPage) {
|
|
7117
|
+
this.state.next(this.getStateBeforeFirstQuery());
|
|
7118
|
+
} else {
|
|
7119
|
+
this.state.partialNext({ isLoading: true });
|
|
7120
|
+
}
|
|
7121
|
+
const stateUpdate = {};
|
|
7122
|
+
try {
|
|
7123
|
+
const results = await this.query({ direction });
|
|
7124
|
+
if (!results) return;
|
|
7125
|
+
const { items, next, prev } = results;
|
|
7126
|
+
if (isFirstPage && (next || prev)) {
|
|
7127
|
+
this._isCursorPagination = true;
|
|
7128
|
+
}
|
|
7129
|
+
if (this._isCursorPagination) {
|
|
7130
|
+
stateUpdate.cursor = { next: next || null, prev: prev || null };
|
|
7131
|
+
stateUpdate.hasNext = !!next;
|
|
7132
|
+
stateUpdate.hasPrev = !!prev;
|
|
7133
|
+
} else {
|
|
7134
|
+
stateUpdate.offset = (this.offset ?? 0) + items.length;
|
|
7135
|
+
stateUpdate.hasNext = items.length === this.pageSize;
|
|
7136
|
+
}
|
|
7137
|
+
stateUpdate.items = await this.filterQueryResults(items);
|
|
7138
|
+
} catch (e) {
|
|
7139
|
+
stateUpdate.lastQueryError = e;
|
|
7140
|
+
} finally {
|
|
7141
|
+
this.state.next(this.getStateAfterQuery(stateUpdate, isFirstPage));
|
|
7142
|
+
}
|
|
7143
|
+
}
|
|
7144
|
+
cancelScheduledQuery() {
|
|
7145
|
+
this._executeQueryDebounced.cancel();
|
|
7146
|
+
}
|
|
7147
|
+
resetState() {
|
|
7148
|
+
this.state.next(this.initialState);
|
|
7149
|
+
}
|
|
7150
|
+
};
|
|
7151
|
+
|
|
7152
|
+
// src/pagination/FilterBuilder.ts
|
|
7153
|
+
var FilterBuilder = class {
|
|
7154
|
+
constructor(params) {
|
|
7155
|
+
this.context = new StateStore(params?.initialContext ?? {});
|
|
7156
|
+
this.filterConfig = new StateStore(
|
|
7157
|
+
params?.initialFilterConfig ?? {}
|
|
7158
|
+
);
|
|
7159
|
+
}
|
|
7160
|
+
updateFilterConfig(config) {
|
|
7161
|
+
this.filterConfig.partialNext(config);
|
|
7162
|
+
}
|
|
7163
|
+
enableFilter(filterKey) {
|
|
7164
|
+
const config = this.filterConfig.getLatestValue();
|
|
7165
|
+
if (config[filterKey]) {
|
|
7166
|
+
this.filterConfig.partialNext({
|
|
7167
|
+
[filterKey]: {
|
|
7168
|
+
...config[filterKey],
|
|
7169
|
+
enabled: true
|
|
7170
|
+
}
|
|
7171
|
+
});
|
|
7172
|
+
}
|
|
7173
|
+
}
|
|
7174
|
+
disableFilter(filterKey) {
|
|
7175
|
+
const config = this.filterConfig.getLatestValue();
|
|
7176
|
+
if (config[filterKey]) {
|
|
7177
|
+
this.filterConfig.partialNext({
|
|
7178
|
+
[filterKey]: {
|
|
7179
|
+
...config[filterKey],
|
|
7180
|
+
enabled: false
|
|
7181
|
+
}
|
|
7182
|
+
});
|
|
7183
|
+
}
|
|
7184
|
+
}
|
|
7185
|
+
updateContext(newContext) {
|
|
7186
|
+
this.context.partialNext(newContext);
|
|
7187
|
+
}
|
|
7188
|
+
buildFilters(params) {
|
|
7189
|
+
const filters = {
|
|
7190
|
+
...params?.baseFilters ?? {}
|
|
7191
|
+
};
|
|
7192
|
+
const filterConfig = this.filterConfig.getLatestValue();
|
|
7193
|
+
for (const key in filterConfig) {
|
|
7194
|
+
const configItem = filterConfig[key];
|
|
7195
|
+
if (!configItem?.enabled) continue;
|
|
7196
|
+
const generated = configItem.generate({
|
|
7197
|
+
...this.context.getLatestValue(),
|
|
7198
|
+
...params?.context ?? {}
|
|
7199
|
+
});
|
|
7200
|
+
if (generated) Object.assign(filters, generated);
|
|
7201
|
+
}
|
|
7202
|
+
return filters;
|
|
7203
|
+
}
|
|
7204
|
+
};
|
|
7205
|
+
|
|
7206
|
+
// src/pagination/ReminderPaginator.ts
|
|
7207
|
+
var ReminderPaginator = class extends BasePaginator {
|
|
7208
|
+
constructor(client, options) {
|
|
7209
|
+
super(options);
|
|
7210
|
+
this.query = async ({
|
|
7211
|
+
direction
|
|
7212
|
+
}) => {
|
|
7213
|
+
const cursor = this.cursor?.[direction];
|
|
7214
|
+
const {
|
|
7215
|
+
reminders: items,
|
|
7216
|
+
next,
|
|
7217
|
+
prev
|
|
7218
|
+
} = await this.client.queryReminders({
|
|
7219
|
+
filter: this.filters,
|
|
7220
|
+
sort: this.sort,
|
|
7221
|
+
limit: this.pageSize,
|
|
7222
|
+
[direction]: cursor
|
|
7223
|
+
});
|
|
7224
|
+
return { items, next, prev };
|
|
7225
|
+
};
|
|
7226
|
+
this.filterQueryResults = (items) => items;
|
|
7227
|
+
this.client = client;
|
|
7228
|
+
}
|
|
7229
|
+
get filters() {
|
|
7230
|
+
return this._filters;
|
|
7231
|
+
}
|
|
7232
|
+
get sort() {
|
|
7233
|
+
return this._sort;
|
|
7234
|
+
}
|
|
7235
|
+
set filters(filters) {
|
|
7236
|
+
this._filters = filters;
|
|
7237
|
+
this.resetState();
|
|
7238
|
+
}
|
|
7239
|
+
set sort(sort) {
|
|
7240
|
+
this._sort = sort;
|
|
7241
|
+
this.resetState();
|
|
7242
|
+
}
|
|
7243
|
+
};
|
|
7244
|
+
|
|
7004
7245
|
// src/search/UserSearchSource.ts
|
|
7005
7246
|
var UserSearchSource = class extends BaseSearchSource {
|
|
7006
|
-
constructor(client, options) {
|
|
7247
|
+
constructor(client, options, filterBuilderOptions = {}) {
|
|
7007
7248
|
super(options);
|
|
7008
7249
|
this.type = "users";
|
|
7009
7250
|
this.client = client;
|
|
7251
|
+
this.filterBuilder = new FilterBuilder({
|
|
7252
|
+
initialFilterConfig: {
|
|
7253
|
+
$or: {
|
|
7254
|
+
enabled: true,
|
|
7255
|
+
generate: ({ searchQuery }) => searchQuery ? {
|
|
7256
|
+
$or: [
|
|
7257
|
+
{ id: { $autocomplete: searchQuery } },
|
|
7258
|
+
{ name: { $autocomplete: searchQuery } }
|
|
7259
|
+
]
|
|
7260
|
+
} : null
|
|
7261
|
+
}
|
|
7262
|
+
},
|
|
7263
|
+
...filterBuilderOptions
|
|
7264
|
+
});
|
|
7010
7265
|
}
|
|
7011
7266
|
async query(searchQuery) {
|
|
7012
|
-
const filters = {
|
|
7013
|
-
|
|
7014
|
-
|
|
7015
|
-
|
|
7016
|
-
],
|
|
7017
|
-
...this.filters
|
|
7018
|
-
};
|
|
7267
|
+
const filters = this.filterBuilder.buildFilters({
|
|
7268
|
+
baseFilters: this.filters,
|
|
7269
|
+
context: { searchQuery }
|
|
7270
|
+
});
|
|
7019
7271
|
const sort = { id: 1, ...this.sort };
|
|
7020
7272
|
const options = { ...this.searchOptions, limit: this.pageSize, offset: this.offset };
|
|
7021
7273
|
const { users } = await this.client.queryUsers(filters, sort, options);
|
|
@@ -7028,17 +7280,29 @@ var UserSearchSource = class extends BaseSearchSource {
|
|
|
7028
7280
|
|
|
7029
7281
|
// src/search/ChannelSearchSource.ts
|
|
7030
7282
|
var ChannelSearchSource = class extends BaseSearchSource {
|
|
7031
|
-
constructor(client, options) {
|
|
7283
|
+
constructor(client, options, filterBuilderOptions = {}) {
|
|
7032
7284
|
super(options);
|
|
7033
7285
|
this.type = "channels";
|
|
7034
7286
|
this.client = client;
|
|
7287
|
+
this.filterBuilder = new FilterBuilder({
|
|
7288
|
+
...filterBuilderOptions,
|
|
7289
|
+
initialFilterConfig: {
|
|
7290
|
+
name: {
|
|
7291
|
+
enabled: true,
|
|
7292
|
+
generate: ({ searchQuery }) => searchQuery ? { name: { $autocomplete: searchQuery } } : null
|
|
7293
|
+
},
|
|
7294
|
+
...filterBuilderOptions.initialFilterConfig
|
|
7295
|
+
}
|
|
7296
|
+
});
|
|
7035
7297
|
}
|
|
7036
7298
|
async query(searchQuery) {
|
|
7037
|
-
const filters = {
|
|
7038
|
-
|
|
7039
|
-
|
|
7040
|
-
|
|
7041
|
-
|
|
7299
|
+
const filters = this.filterBuilder.buildFilters({
|
|
7300
|
+
baseFilters: {
|
|
7301
|
+
...this.client.userID ? { members: { $in: [this.client.userID] } } : {},
|
|
7302
|
+
...this.filters
|
|
7303
|
+
},
|
|
7304
|
+
context: { searchQuery }
|
|
7305
|
+
});
|
|
7042
7306
|
const sort = this.sort ?? {};
|
|
7043
7307
|
const options = { ...this.searchOptions, limit: this.pageSize, offset: this.offset };
|
|
7044
7308
|
const items = await this.client.queryChannels(filters, sort, options);
|
|
@@ -7051,23 +7315,48 @@ var ChannelSearchSource = class extends BaseSearchSource {
|
|
|
7051
7315
|
|
|
7052
7316
|
// src/search/MessageSearchSource.ts
|
|
7053
7317
|
var MessageSearchSource = class extends BaseSearchSource {
|
|
7054
|
-
constructor(client, options) {
|
|
7318
|
+
constructor(client, options, filterBuilderOptions) {
|
|
7055
7319
|
super(options);
|
|
7056
7320
|
this.type = "messages";
|
|
7057
7321
|
this.client = client;
|
|
7322
|
+
this.messageSearchChannelFilterBuilder = new FilterBuilder(filterBuilderOptions?.messageSearchChannel);
|
|
7323
|
+
this.messageSearchFilterBuilder = new FilterBuilder({
|
|
7324
|
+
...filterBuilderOptions?.messageSearch,
|
|
7325
|
+
initialFilterConfig: {
|
|
7326
|
+
text: {
|
|
7327
|
+
enabled: true,
|
|
7328
|
+
generate: ({ searchQuery }) => searchQuery ? { text: searchQuery } : null
|
|
7329
|
+
},
|
|
7330
|
+
...filterBuilderOptions?.messageSearch?.initialFilterConfig
|
|
7331
|
+
}
|
|
7332
|
+
});
|
|
7333
|
+
this.channelQueryFilterBuilder = new FilterBuilder({
|
|
7334
|
+
...filterBuilderOptions?.channelQuery,
|
|
7335
|
+
initialFilterConfig: {
|
|
7336
|
+
cid: {
|
|
7337
|
+
enabled: true,
|
|
7338
|
+
generate: ({ cids }) => cids ? { cid: { $in: cids } } : null
|
|
7339
|
+
},
|
|
7340
|
+
...filterBuilderOptions?.channelQuery?.initialFilterConfig
|
|
7341
|
+
}
|
|
7342
|
+
});
|
|
7058
7343
|
}
|
|
7059
7344
|
async query(searchQuery) {
|
|
7060
|
-
if (!this.client.userID) return { items: [] };
|
|
7061
|
-
const channelFilters = {
|
|
7062
|
-
|
|
7063
|
-
|
|
7064
|
-
|
|
7065
|
-
|
|
7066
|
-
|
|
7067
|
-
|
|
7068
|
-
|
|
7069
|
-
|
|
7070
|
-
|
|
7345
|
+
if (!this.client.userID || !searchQuery || this.next === null) return { items: [] };
|
|
7346
|
+
const channelFilters = this.messageSearchChannelFilterBuilder.buildFilters({
|
|
7347
|
+
baseFilters: {
|
|
7348
|
+
...this.client.userID ? { members: { $in: [this.client.userID] } } : {},
|
|
7349
|
+
...this.messageSearchChannelFilters
|
|
7350
|
+
},
|
|
7351
|
+
context: { searchQuery }
|
|
7352
|
+
});
|
|
7353
|
+
const messageFilters = this.messageSearchFilterBuilder.buildFilters({
|
|
7354
|
+
baseFilters: {
|
|
7355
|
+
type: "regular",
|
|
7356
|
+
...this.messageSearchFilters
|
|
7357
|
+
},
|
|
7358
|
+
context: { searchQuery }
|
|
7359
|
+
});
|
|
7071
7360
|
const sort = {
|
|
7072
7361
|
created_at: -1,
|
|
7073
7362
|
...this.messageSearchSort
|
|
@@ -7088,15 +7377,14 @@ var MessageSearchSource = class extends BaseSearchSource {
|
|
|
7088
7377
|
if (message.cid && !this.client.activeChannels[message.cid]) acc.add(message.cid);
|
|
7089
7378
|
return acc;
|
|
7090
7379
|
}, /* @__PURE__ */ new Set())
|
|
7091
|
-
// keep the cids unique
|
|
7092
7380
|
);
|
|
7093
|
-
|
|
7094
|
-
|
|
7381
|
+
if (cids.length > 0) {
|
|
7382
|
+
const channelQueryFilters = this.channelQueryFilterBuilder.buildFilters({
|
|
7383
|
+
baseFilters: this.channelQueryFilters,
|
|
7384
|
+
context: { cids }
|
|
7385
|
+
});
|
|
7095
7386
|
await this.client.queryChannels(
|
|
7096
|
-
|
|
7097
|
-
cid: { $in: cids },
|
|
7098
|
-
...this.channelQueryFilters
|
|
7099
|
-
},
|
|
7387
|
+
channelQueryFilters,
|
|
7100
7388
|
{
|
|
7101
7389
|
last_message_at: -1,
|
|
7102
7390
|
...this.channelQuerySort
|
|
@@ -10494,6 +10782,15 @@ var Channel = class {
|
|
|
10494
10782
|
}
|
|
10495
10783
|
}
|
|
10496
10784
|
break;
|
|
10785
|
+
case "user.messages.deleted":
|
|
10786
|
+
if (event.user) {
|
|
10787
|
+
this.state.deleteUserMessages(
|
|
10788
|
+
event.user,
|
|
10789
|
+
!!event.hard_delete,
|
|
10790
|
+
new Date(event.created_at ?? Date.now())
|
|
10791
|
+
);
|
|
10792
|
+
}
|
|
10793
|
+
break;
|
|
10497
10794
|
case "message.new":
|
|
10498
10795
|
if (event.message) {
|
|
10499
10796
|
const ownMessage = event.user?.id === this.getClient().user?.id;
|
|
@@ -13412,162 +13709,6 @@ _Reminder.toStateValue = (data) => ({
|
|
|
13412
13709
|
});
|
|
13413
13710
|
var Reminder = _Reminder;
|
|
13414
13711
|
|
|
13415
|
-
// src/pagination/BasePaginator.ts
|
|
13416
|
-
var DEFAULT_PAGINATION_OPTIONS = {
|
|
13417
|
-
debounceMs: 300,
|
|
13418
|
-
pageSize: 10
|
|
13419
|
-
};
|
|
13420
|
-
var BasePaginator = class {
|
|
13421
|
-
constructor(options) {
|
|
13422
|
-
this._isCursorPagination = false;
|
|
13423
|
-
this.setDebounceOptions = ({ debounceMs }) => {
|
|
13424
|
-
this._executeQueryDebounced = debounce(this.executeQuery.bind(this), debounceMs);
|
|
13425
|
-
};
|
|
13426
|
-
this.canExecuteQuery = (direction) => !this.isLoading && direction === "next" && this.hasNext || direction === "prev" && this.hasPrev;
|
|
13427
|
-
this.next = () => this.executeQuery({ direction: "next" });
|
|
13428
|
-
this.prev = () => this.executeQuery({ direction: "prev" });
|
|
13429
|
-
this.nextDebounced = () => {
|
|
13430
|
-
this._executeQueryDebounced({ direction: "next" });
|
|
13431
|
-
};
|
|
13432
|
-
this.prevDebounced = () => {
|
|
13433
|
-
this._executeQueryDebounced({ direction: "prev" });
|
|
13434
|
-
};
|
|
13435
|
-
const { debounceMs, pageSize } = { ...DEFAULT_PAGINATION_OPTIONS, ...options };
|
|
13436
|
-
this.pageSize = pageSize;
|
|
13437
|
-
this.state = new StateStore(this.initialState);
|
|
13438
|
-
this.setDebounceOptions({ debounceMs });
|
|
13439
|
-
}
|
|
13440
|
-
get lastQueryError() {
|
|
13441
|
-
return this.state.getLatestValue().lastQueryError;
|
|
13442
|
-
}
|
|
13443
|
-
get hasNext() {
|
|
13444
|
-
return this.state.getLatestValue().hasNext;
|
|
13445
|
-
}
|
|
13446
|
-
get hasPrev() {
|
|
13447
|
-
return this.state.getLatestValue().hasPrev;
|
|
13448
|
-
}
|
|
13449
|
-
get hasResults() {
|
|
13450
|
-
return Array.isArray(this.state.getLatestValue().items);
|
|
13451
|
-
}
|
|
13452
|
-
get isLoading() {
|
|
13453
|
-
return this.state.getLatestValue().isLoading;
|
|
13454
|
-
}
|
|
13455
|
-
get initialState() {
|
|
13456
|
-
return {
|
|
13457
|
-
hasNext: true,
|
|
13458
|
-
hasPrev: true,
|
|
13459
|
-
//todo: check if optimistic value does not cause problems in UI
|
|
13460
|
-
isLoading: false,
|
|
13461
|
-
items: void 0,
|
|
13462
|
-
lastQueryError: void 0,
|
|
13463
|
-
cursor: void 0,
|
|
13464
|
-
offset: 0
|
|
13465
|
-
};
|
|
13466
|
-
}
|
|
13467
|
-
get items() {
|
|
13468
|
-
return this.state.getLatestValue().items;
|
|
13469
|
-
}
|
|
13470
|
-
get cursor() {
|
|
13471
|
-
return this.state.getLatestValue().cursor;
|
|
13472
|
-
}
|
|
13473
|
-
get offset() {
|
|
13474
|
-
return this.state.getLatestValue().offset;
|
|
13475
|
-
}
|
|
13476
|
-
getStateBeforeFirstQuery() {
|
|
13477
|
-
return {
|
|
13478
|
-
...this.initialState,
|
|
13479
|
-
isLoading: true
|
|
13480
|
-
};
|
|
13481
|
-
}
|
|
13482
|
-
getStateAfterQuery(stateUpdate, isFirstPage) {
|
|
13483
|
-
const current = this.state.getLatestValue();
|
|
13484
|
-
return {
|
|
13485
|
-
...current,
|
|
13486
|
-
lastQueryError: void 0,
|
|
13487
|
-
// reset lastQueryError that can be overridden by the stateUpdate
|
|
13488
|
-
...stateUpdate,
|
|
13489
|
-
isLoading: false,
|
|
13490
|
-
items: isFirstPage ? stateUpdate.items : [...this.items ?? [], ...stateUpdate.items || []]
|
|
13491
|
-
};
|
|
13492
|
-
}
|
|
13493
|
-
async executeQuery({ direction }) {
|
|
13494
|
-
if (!this.canExecuteQuery(direction)) return;
|
|
13495
|
-
const isFirstPage = typeof this.items === "undefined";
|
|
13496
|
-
if (isFirstPage) {
|
|
13497
|
-
this.state.next(this.getStateBeforeFirstQuery());
|
|
13498
|
-
} else {
|
|
13499
|
-
this.state.partialNext({ isLoading: true });
|
|
13500
|
-
}
|
|
13501
|
-
const stateUpdate = {};
|
|
13502
|
-
try {
|
|
13503
|
-
const results = await this.query({ direction });
|
|
13504
|
-
if (!results) return;
|
|
13505
|
-
const { items, next, prev } = results;
|
|
13506
|
-
if (isFirstPage && (next || prev)) {
|
|
13507
|
-
this._isCursorPagination = true;
|
|
13508
|
-
}
|
|
13509
|
-
if (this._isCursorPagination) {
|
|
13510
|
-
stateUpdate.cursor = { next: next || null, prev: prev || null };
|
|
13511
|
-
stateUpdate.hasNext = !!next;
|
|
13512
|
-
stateUpdate.hasPrev = !!prev;
|
|
13513
|
-
} else {
|
|
13514
|
-
stateUpdate.offset = (this.offset ?? 0) + items.length;
|
|
13515
|
-
stateUpdate.hasNext = items.length === this.pageSize;
|
|
13516
|
-
}
|
|
13517
|
-
stateUpdate.items = await this.filterQueryResults(items);
|
|
13518
|
-
} catch (e) {
|
|
13519
|
-
stateUpdate.lastQueryError = e;
|
|
13520
|
-
} finally {
|
|
13521
|
-
this.state.next(this.getStateAfterQuery(stateUpdate, isFirstPage));
|
|
13522
|
-
}
|
|
13523
|
-
}
|
|
13524
|
-
cancelScheduledQuery() {
|
|
13525
|
-
this._executeQueryDebounced.cancel();
|
|
13526
|
-
}
|
|
13527
|
-
resetState() {
|
|
13528
|
-
this.state.next(this.initialState);
|
|
13529
|
-
}
|
|
13530
|
-
};
|
|
13531
|
-
|
|
13532
|
-
// src/pagination/ReminderPaginator.ts
|
|
13533
|
-
var ReminderPaginator = class extends BasePaginator {
|
|
13534
|
-
constructor(client, options) {
|
|
13535
|
-
super(options);
|
|
13536
|
-
this.query = async ({
|
|
13537
|
-
direction
|
|
13538
|
-
}) => {
|
|
13539
|
-
const cursor = this.cursor?.[direction];
|
|
13540
|
-
const {
|
|
13541
|
-
reminders: items,
|
|
13542
|
-
next,
|
|
13543
|
-
prev
|
|
13544
|
-
} = await this.client.queryReminders({
|
|
13545
|
-
filter: this.filters,
|
|
13546
|
-
sort: this.sort,
|
|
13547
|
-
limit: this.pageSize,
|
|
13548
|
-
[direction]: cursor
|
|
13549
|
-
});
|
|
13550
|
-
return { items, next, prev };
|
|
13551
|
-
};
|
|
13552
|
-
this.filterQueryResults = (items) => items;
|
|
13553
|
-
this.client = client;
|
|
13554
|
-
}
|
|
13555
|
-
get filters() {
|
|
13556
|
-
return this._filters;
|
|
13557
|
-
}
|
|
13558
|
-
get sort() {
|
|
13559
|
-
return this._sort;
|
|
13560
|
-
}
|
|
13561
|
-
set filters(filters) {
|
|
13562
|
-
this._filters = filters;
|
|
13563
|
-
this.resetState();
|
|
13564
|
-
}
|
|
13565
|
-
set sort(sort) {
|
|
13566
|
-
this._sort = sort;
|
|
13567
|
-
this.resetState();
|
|
13568
|
-
}
|
|
13569
|
-
};
|
|
13570
|
-
|
|
13571
13712
|
// src/reminders/ReminderManager.ts
|
|
13572
13713
|
var oneMinute2 = 60 * 1e3;
|
|
13573
13714
|
var oneHour2 = 60 * oneMinute2;
|
|
@@ -14130,13 +14271,13 @@ var StreamChat = class _StreamChat {
|
|
|
14130
14271
|
* @param {UserResponse} user
|
|
14131
14272
|
* @param {boolean} hardDelete
|
|
14132
14273
|
*/
|
|
14133
|
-
this._deleteUserMessageReference = (user, hardDelete = false) => {
|
|
14274
|
+
this._deleteUserMessageReference = (user, hardDelete = false, deletedAt) => {
|
|
14134
14275
|
const refMap = this.state.userChannelReferences[user.id] || {};
|
|
14135
14276
|
for (const channelID in refMap) {
|
|
14136
14277
|
const channel = this.activeChannels[channelID];
|
|
14137
14278
|
if (channel) {
|
|
14138
14279
|
const state = channel.state;
|
|
14139
|
-
state?.deleteUserMessages(user, hardDelete);
|
|
14280
|
+
state?.deleteUserMessages(user, hardDelete, deletedAt);
|
|
14140
14281
|
}
|
|
14141
14282
|
}
|
|
14142
14283
|
};
|
|
@@ -14182,7 +14323,11 @@ var StreamChat = class _StreamChat {
|
|
|
14182
14323
|
this._updateUserMessageReferences(event.user);
|
|
14183
14324
|
}
|
|
14184
14325
|
if (event.type === "user.deleted" && event.user.deleted_at && (event.mark_messages_deleted || event.hard_delete)) {
|
|
14185
|
-
this._deleteUserMessageReference(
|
|
14326
|
+
this._deleteUserMessageReference(
|
|
14327
|
+
event.user,
|
|
14328
|
+
event.hard_delete,
|
|
14329
|
+
event.user.deleted_at ? new Date(event.user.deleted_at) : null
|
|
14330
|
+
);
|
|
14186
14331
|
}
|
|
14187
14332
|
};
|
|
14188
14333
|
this._callClientListeners = (event) => {
|
|
@@ -14752,6 +14897,13 @@ var StreamChat = class _StreamChat {
|
|
|
14752
14897
|
if (event.type === "user.presence.changed" || event.type === "user.updated" || event.type === "user.deleted") {
|
|
14753
14898
|
this._handleUserEvent(event);
|
|
14754
14899
|
}
|
|
14900
|
+
if (event.type === "user.messages.deleted" && !event.cid && event.user) {
|
|
14901
|
+
this._deleteUserMessageReference(
|
|
14902
|
+
event.user,
|
|
14903
|
+
event.hard_delete,
|
|
14904
|
+
event.created_at ? new Date(event.created_at) : null
|
|
14905
|
+
);
|
|
14906
|
+
}
|
|
14755
14907
|
if (event.type === "health.check" && event.me) {
|
|
14756
14908
|
client.user = event.me;
|
|
14757
14909
|
client.state.updateUser(event.me);
|
|
@@ -16012,7 +16164,7 @@ var StreamChat = class _StreamChat {
|
|
|
16012
16164
|
if (this.userAgent) {
|
|
16013
16165
|
return this.userAgent;
|
|
16014
16166
|
}
|
|
16015
|
-
const version = "9.
|
|
16167
|
+
const version = "9.17.0";
|
|
16016
16168
|
const clientBundle = "browser-cjs";
|
|
16017
16169
|
let userAgentString = "";
|
|
16018
16170
|
if (this.sdkIdentifier) {
|
|
@@ -17210,6 +17362,7 @@ var EVENT_MAP = {
|
|
|
17210
17362
|
"typing.stop": true,
|
|
17211
17363
|
"user.banned": true,
|
|
17212
17364
|
"user.deleted": true,
|
|
17365
|
+
"user.messages.deleted": true,
|
|
17213
17366
|
"user.presence.changed": true,
|
|
17214
17367
|
"user.unbanned": true,
|
|
17215
17368
|
"user.unread_message_reminder": true,
|