Skip to content

Commit 99dfcfc

Browse files
MartinCupelaarnautov-anton
authored andcommitted
feat: add MessageComposer
1 parent e3a1cb8 commit 99dfcfc

28 files changed

+1891
-34
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@
5656
"form-data": "^4.0.0",
5757
"isomorphic-ws": "^5.0.0",
5858
"jsonwebtoken": "^9.0.2",
59-
"ws": "^8.18.1"
59+
"ws": "^8.18.1",
60+
"linkifyjs": "^4.2.0"
6061
},
6162
"devDependencies": {
6263
"@commitlint/cli": "^19.7.1",

src/channel.ts

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ import type {
7373
} from './types';
7474
import type { Role } from './permissions';
7575
import type { CustomChannelData } from './custom_types';
76+
import type { TextComposerMiddleware } from './messageComposer';
77+
import {
78+
createCommandsMiddleware,
79+
createMentionsMiddleware,
80+
MessageComposer,
81+
} from './messageComposer';
7682

7783
/**
7884
* Channel - The Channel class manages it's own state.
@@ -107,6 +113,7 @@ export class Channel {
107113
isTyping: boolean;
108114
disconnected: boolean;
109115
push_preferences?: PushPreference;
116+
private _messageComposer: MessageComposer;
110117

111118
/**
112119
* constructor - Create a channel
@@ -150,6 +157,12 @@ export class Channel {
150157
this.lastTypingEvent = null;
151158
this.isTyping = false;
152159
this.disconnected = false;
160+
161+
this._messageComposer = new MessageComposer({ channel: this });
162+
this._messageComposer.textComposer.use([
163+
createCommandsMiddleware(this),
164+
createMentionsMiddleware(client),
165+
] as TextComposerMiddleware[]);
153166
}
154167

155168
/**
@@ -174,6 +187,17 @@ export class Channel {
174187
return client.configs[this.cid];
175188
}
176189

190+
get messageComposer() {
191+
return this._messageComposer;
192+
}
193+
194+
set messageComposer(messageComposer: MessageComposer) {
195+
if (this.messageComposer) {
196+
this.messageComposer.unregisterSubscriptions();
197+
}
198+
this._messageComposer = messageComposer;
199+
}
200+
177201
/**
178202
* sendMessage - Send a message to this channel
179203
*
@@ -198,7 +222,7 @@ export class Channel {
198222
}
199223

200224
/**
201-
* draftMessage - create a message draft for the channel or a message thread
225+
* draftMessage - create a message draftMessage for the channel or a message thread
202226
*
203227
* @param {DraftMessagePayload} message The DraftMessage object
204228
* @return {Promise<CreateDraftResponse>} The Server Response
@@ -1350,6 +1374,8 @@ export class Channel {
13501374

13511375
this.getClient().polls.hydratePollCache(state.messages, true);
13521376

1377+
this.messageComposer.initState({ composition: state.draft });
1378+
13531379
const areCapabilitiesChanged =
13541380
[...(state.channel.own_capabilities || [])].sort().join() !==
13551381
[
@@ -1623,12 +1649,22 @@ export class Channel {
16231649
}
16241650
break;
16251651
case 'draft.updated':
1626-
if (event.draft && !(event.draft as DraftResponse).parent_id) {
1652+
if (
1653+
this.getClient().options.drafts &&
1654+
event.draft &&
1655+
!(event.draft as DraftResponse).parent_id
1656+
) {
16271657
channelState.messageDraft = event.draft as DraftResponse;
16281658
}
16291659
break;
16301660
case 'draft.deleted':
1631-
channelState.messageDraft = undefined;
1661+
if (
1662+
this.getClient().options.drafts &&
1663+
event.draft &&
1664+
!(event.draft as DraftResponse).parent_id
1665+
) {
1666+
channelState.messageDraft = null;
1667+
}
16321668
break;
16331669
case 'message.deleted':
16341670
if (event.message) {

src/channel_state.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export class ChannelState {
4242
unreadCount: number;
4343
membership: ChannelMemberResponse;
4444
last_message_at: Date | null;
45-
messageDraft?: DraftResponse;
45+
messageDraft: DraftResponse | null;
4646
/**
4747
* Flag which indicates if channel state contain latest/recent messages or no.
4848
* This flag should be managed by UI sdks using a setter - setIsUpToDate.
@@ -84,6 +84,7 @@ export class ChannelState {
8484
channel?.state?.last_message_at != null
8585
? new Date(channel.state.last_message_at)
8686
: null;
87+
this.messageDraft = channel?.state?.messageDraft ?? null;
8788
}
8889

8990
get messages() {

src/client.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ export class StreamChat {
233233
private static _instance?: unknown | StreamChat; // type is undefined|StreamChat, unknown is due to TS limitations with statics
234234

235235
_user?: OwnUserResponse | UserResponse;
236+
appSettingsPromise?: Promise<AppSettingsAPIResponse>;
236237
activeChannels: {
237238
[key: string]: Channel;
238239
};
@@ -791,7 +792,8 @@ export class StreamChat {
791792
* getAppSettings - retrieves application settings
792793
*/
793794
async getAppSettings() {
794-
return await this.get<AppSettingsAPIResponse>(this.baseURL + '/app');
795+
this.appSettingsPromise = this.get<AppSettingsAPIResponse>(this.baseURL + '/app');
796+
return await this.appSettingsPromise;
795797
}
796798

797799
/**
@@ -1824,6 +1826,7 @@ export class StreamChat {
18241826
};
18251827
this.polls.hydratePollCache(channelState.messages, true);
18261828
}
1829+
c.messageComposer.initState({ composition: channelState.draft });
18271830

18281831
channels.push(c);
18291832
}

src/constants.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export const DEFAULT_QUERY_CHANNELS_MESSAGE_LIST_PAGE_SIZE = 25;
22
export const DEFAULT_QUERY_CHANNEL_MESSAGE_LIST_PAGE_SIZE = 100;
3-
43
export const DEFAULT_MESSAGE_SET_PAGINATION = { hasNext: false, hasPrev: false };
4+
export const DEFAULT_UPLOAD_SIZE_LIMIT_BYTES = 100 * 1024 * 1024; // 100 MB
5+
export const API_MAX_FILES_ALLOWED_PER_MESSAGE = 10;

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export * from './channel_state';
77
export * from './connection';
88
export * from './events';
99
export * from './insights';
10+
export * from './messageComposer';
1011
export * from './moderation';
1112
export * from './permissions';
1213
export * from './poll';

0 commit comments

Comments
 (0)