diff --git a/lib/presentation/chat_screen/chat_screen.dart b/lib/presentation/chat_screen/chat_screen.dart index 321f8bb..24be257 100644 --- a/lib/presentation/chat_screen/chat_screen.dart +++ b/lib/presentation/chat_screen/chat_screen.dart @@ -68,14 +68,20 @@ class _ChatScreenState extends State { child: CustomProgressIndicatorWidget(), ); } - print(_chatStore.chatThreads); return ListView.builder( controller: _controller, itemCount: - _chatStore.chatThreads[chatThreadIndex].messages.length, + _chatStore.chatThreads[chatThreadIndex].messages.length + + (_chatStore.isLoading ? 1 : 0), shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index) { + if (index > 0 && + index == + _chatStore + .chatThreads[chatThreadIndex].messages.length) { + return CustomProgressIndicatorWidget(); + } return Container( padding: EdgeInsets.only( left: (_chatStore.chatThreads[chatThreadIndex] @@ -158,7 +164,7 @@ class _ChatScreenState extends State { ); }), ), - ChatInput(onSend: () {}), + ChatInput(onSend: _chatStore.sendMessage), ], ); } diff --git a/lib/presentation/chat_screen/store/chat_store.dart b/lib/presentation/chat_screen/store/chat_store.dart index 9fc65a7..c98d9a1 100644 --- a/lib/presentation/chat_screen/store/chat_store.dart +++ b/lib/presentation/chat_screen/store/chat_store.dart @@ -4,6 +4,7 @@ import 'package:boilerplate/domain/entity/message/message.dart'; import 'package:boilerplate/domain/entity/message/message_with_time.dart'; import 'package:boilerplate/domain/usecase/message/get_all_chat_threads_usecase.dart'; import 'package:boilerplate/domain/usecase/message/send_message_usecase.dart'; +import 'package:boilerplate/domain/usecase/message/update_chat_thread_usecase.dart'; import 'package:mobx/mobx.dart'; @@ -17,6 +18,7 @@ abstract class _ChatStore with Store { this.errorStore, this._sendMessageUseCase, this._getAllChatThreadsUseCase, + this._updateChatThreadUseCase, ) { // load all chat threads getAllChatThreads(); @@ -27,6 +29,7 @@ abstract class _ChatStore with Store { // use cases:----------------------------------------------------------------- final SendMessageUseCase _sendMessageUseCase; final GetAllChatThreadsUseCase _getAllChatThreadsUseCase; + final UpdateChatThreadUseCase _updateChatThreadUseCase; // store for handling error messages final ErrorStore errorStore; @@ -58,8 +61,13 @@ abstract class _ChatStore with Store { @observable ObservableFuture sendMessageFuture = ObservableFuture.value(null); + @observable + ObservableFuture updateChatThreadFuture = ObservableFuture.value(null); + @computed - bool get isLoading => sendMessageFuture.status == FutureStatus.pending; + bool get isLoading => + sendMessageFuture.status == FutureStatus.pending || + updateChatThreadFuture.status == FutureStatus.pending; @computed bool get isLoadingChatThreads => @@ -110,18 +118,20 @@ abstract class _ChatStore with Store { await future.then((value) async { print('response message ${value.toMap()}'); - // TODO: update chat thread in db - // await _saveChatThreadUseCase.call( - // params: ChatThread( - // id: time.millisecondsSinceEpoch, - // subject: message.content, - // messages: [ - // MessageWithTime(message, time), - // MessageWithTime(value, time), - // ], - // ), - // ); - this.success = true; + final newChatThread = + chatThreads.firstWhere((element) => element.id == id); + newChatThread.messages.add( + MessageWithTime( + value, + DateTime.now(), + ), + ); + print(newChatThread); + final future = _updateChatThreadUseCase.call( + params: newChatThread, + ); + updateChatThreadFuture = ObservableFuture(future); + await future.then((value) => {this.success = true}); }).catchError((e) { print(e); this.success = false; diff --git a/lib/presentation/di/module/store_module.dart b/lib/presentation/di/module/store_module.dart index 5330db9..1c1a5d4 100644 --- a/lib/presentation/di/module/store_module.dart +++ b/lib/presentation/di/module/store_module.dart @@ -6,6 +6,7 @@ import 'package:boilerplate/domain/repository/setting/setting_repository.dart'; import 'package:boilerplate/domain/usecase/message/get_all_chat_threads_usecase.dart'; import 'package:boilerplate/domain/usecase/message/save_chat_thread_usecase.dart'; import 'package:boilerplate/domain/usecase/message/send_message_usecase.dart'; +import 'package:boilerplate/domain/usecase/message/update_chat_thread_usecase.dart'; import 'package:boilerplate/domain/usecase/post/get_post_usecase.dart'; import 'package:boilerplate/domain/usecase/user/is_logged_in_usecase.dart'; import 'package:boilerplate/domain/usecase/user/login_usecase.dart'; @@ -73,6 +74,7 @@ mixin StoreModule { getIt(), getIt(), getIt(), + getIt(), ), ); }