@@ -35,6 +35,12 @@ class _ChatPageState extends State<ChatPage> {
3535 super .initState ();
3636 }
3737
38+ @override
39+ void dispose () {
40+ _chatController.dispose ();
41+ super .dispose ();
42+ }
43+
3844 void _handleAttachmentPressed () {
3945 showModalBottomSheet <void >(
4046 context: context,
@@ -106,7 +112,7 @@ class _ChatPageState extends State<ChatPage> {
106112 uri: url,
107113 );
108114
109- SupabaseChatCore .instance.sendMessage (message, widget.room.id);
115+ await SupabaseChatCore .instance.sendMessage (message, widget.room.id);
110116 _setAttachmentUploading (false );
111117 } finally {
112118 _setAttachmentUploading (false );
@@ -143,7 +149,7 @@ class _ChatPageState extends State<ChatPage> {
143149 uri: url,
144150 width: image.width.toDouble (),
145151 );
146- SupabaseChatCore .instance.sendMessage (
152+ await SupabaseChatCore .instance.sendMessage (
147153 message,
148154 widget.room.id,
149155 );
@@ -182,8 +188,9 @@ class _ChatPageState extends State<ChatPage> {
182188 .updateMessage (updatedMessage, widget.room.id);
183189 }
184190
185- void _handleSendPressed (types.PartialText message) {
186- SupabaseChatCore .instance.sendMessage (
191+ Future <void > _handleSendPressed (types.PartialText message) async {
192+ await _chatController.endTyping ();
193+ await SupabaseChatCore .instance.sendMessage (
187194 message,
188195 widget.room.id,
189196 );
@@ -204,30 +211,44 @@ class _ChatPageState extends State<ChatPage> {
204211 body: StreamBuilder <List <types.Message >>(
205212 initialData: const [],
206213 stream: _chatController.messages,
207- builder: (context, snapshot) => Chat (
208- showUserNames: true ,
209- showUserAvatars: true ,
210- isAttachmentUploading: _isAttachmentUploading,
211- messages: snapshot.data ?? [],
212- onAttachmentPressed: _handleAttachmentPressed,
213- onMessageTap: _handleMessageTap,
214- onPreviewDataFetched: _handlePreviewDataFetched,
215- onSendPressed: _handleSendPressed,
216- user: types.User (
217- id: SupabaseChatCore .instance.supabaseUser! .id,
214+ builder: (context, messages) => StreamBuilder <List <types.User >>(
215+ initialData: const [],
216+ stream: _chatController.typingUsers,
217+ builder: (context, users) => Chat (
218+ showUserNames: true ,
219+ showUserAvatars: true ,
220+ theme: const DefaultChatTheme (
221+ messageMaxWidth: 600 ,
222+ ),
223+ typingIndicatorOptions: TypingIndicatorOptions (
224+ typingUsers: users.data ?? [],
225+ ),
226+ isAttachmentUploading: _isAttachmentUploading,
227+ messages: messages.data ?? [],
228+ onAttachmentPressed: _handleAttachmentPressed,
229+ onMessageTap: _handleMessageTap,
230+ onPreviewDataFetched: _handlePreviewDataFetched,
231+ onSendPressed: _handleSendPressed,
232+ user: types.User (
233+ id: SupabaseChatCore .instance.supabaseUser! .id,
234+ ),
235+ imageHeaders: storageHeaders,
236+ onMessageVisibilityChanged: (message, visible) async {
237+ if (message.status != types.Status .seen &&
238+ message.author.id !=
239+ SupabaseChatCore .instance.supabaseUser! .id) {
240+ await SupabaseChatCore .instance.updateMessage (
241+ message.copyWith (status: types.Status .seen),
242+ widget.room.id,
243+ );
244+ }
245+ },
246+ onEndReached: _chatController.loadPreviousMessages,
247+ inputOptions: InputOptions (
248+ enabled: true ,
249+ onTextChanged: (text) => _chatController.onTyping (),
250+ ),
218251 ),
219- imageHeaders: storageHeaders,
220- onMessageVisibilityChanged: (message, visible) async {
221- if (message.status != types.Status .seen &&
222- message.author.id !=
223- SupabaseChatCore .instance.supabaseUser! .id) {
224- await SupabaseChatCore .instance.updateMessage (
225- message.copyWith (status: types.Status .seen),
226- widget.room.id,
227- );
228- }
229- },
230- onEndReached: _chatController.loadPreviousMessages,
231252 ),
232253 ),
233254 );
0 commit comments