From 4ca90eb2df5d94eabd70194118f3828f6ba11362 Mon Sep 17 00:00:00 2001 From: misha Date: Wed, 8 Apr 2026 12:14:43 +0300 Subject: [PATCH] feat(push_navigation): fixed navigation to chat screen --- .../bloc/chat_room_cubit/chat_room_cubit.dart | 21 ++++++++----------- .../chat/presentation/pages/chat_screen.dart | 8 +++++++ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/lib/features/chat/presentation/bloc/chat_room_cubit/chat_room_cubit.dart b/lib/features/chat/presentation/bloc/chat_room_cubit/chat_room_cubit.dart index d61f8ddc..dc56a0c1 100644 --- a/lib/features/chat/presentation/bloc/chat_room_cubit/chat_room_cubit.dart +++ b/lib/features/chat/presentation/bloc/chat_room_cubit/chat_room_cubit.dart @@ -93,6 +93,7 @@ class ChatRoomCubit extends Cubit { Future initChat(String uuid, {bool sendInitialMessage = false}) async { try { + emit(const ChatRoomState.loading()); final chatRoom = await chatRepository.getChatRoom(uuid); ChosenPlanModel? chosenPlan; if (chatRoom.chosenPlanId != null) { @@ -175,12 +176,12 @@ class ChatRoomCubit extends Cubit { AudioPlayer().play((AssetSource('audio/recive_message.wav'))); final message = ChatMessageModel.fromJson(jsonDecode(event.data)); final currentState = state as ChatRoomStateLoaded; - + // Сообщения от текущего пользователя не приходят через WebSocket, // они обрабатываются через ответ API в sendMessage // Здесь обрабатываем только входящие сообщения от других пользователей List messagesList = [message, ...currentState.chatMessages]; - + chatRepository.emitNewMessageToChats(message); emit(currentState.copyWith(chatMessages: messagesList, isLoading: isLoading)); EasyDebounce.debounce('searchChatRoom', const Duration(milliseconds: 300), () => sl().getChatRooms()); @@ -201,7 +202,7 @@ class ChatRoomCubit extends Cubit { final messageUuid = uuid.v4(); final compressedFiles = files != null ? await ImageCompressUtility.compressFilesList(List.from(files)) : null; AudioPlayer().play((AssetSource('audio/send_message.wav'))); - + // Создаем временное сообщение с состоянием loading emit( (state as ChatRoomStateLoaded).copyWith( @@ -226,7 +227,7 @@ class ChatRoomCubit extends Cubit { try { // Отправляем сообщение и получаем ответ от сервера с правильными данными final serverMessage = await chatRepository.sendMessage(data: data, files: compressedFiles, slug: userSlug); - + // Заменяем локальное сообщение данными с сервера (с правильными URL файлов) emit( (state as ChatRoomStateLoaded).copyWith( @@ -357,7 +358,7 @@ class ChatRoomCubit extends Cubit { if (message != null) { try { AudioPlayer().play((AssetSource('audio/send_message.wav'))); - + // Определяем, есть ли файлы для повторной отправки List? filesToResend; if (message.mediaData != null && message.mediaData!.isNotEmpty) { @@ -368,7 +369,7 @@ class ChatRoomCubit extends Cubit { filesToResend = message.mediaData!.cast(); } } - + emit( (state as ChatRoomStateLoaded).copyWith( chatMessages: [ @@ -391,12 +392,8 @@ class ChatRoomCubit extends Cubit { try { // Отправляем сообщение и получаем ответ от сервера - final serverMessage = await chatRepository.sendMessage( - data: message.data, - files: filesToResend, - slug: userSlug, - ); - + final serverMessage = await chatRepository.sendMessage(data: message.data, files: filesToResend, slug: userSlug); + // Заменяем локальное сообщение данными с сервера emit( (state as ChatRoomStateLoaded).copyWith( diff --git a/lib/features/chat/presentation/pages/chat_screen.dart b/lib/features/chat/presentation/pages/chat_screen.dart index f5e4105b..423b6980 100644 --- a/lib/features/chat/presentation/pages/chat_screen.dart +++ b/lib/features/chat/presentation/pages/chat_screen.dart @@ -63,6 +63,14 @@ class _ChatScreenState extends State { chatRoomCubit.setTimer(); } + @override + void didUpdateWidget(ChatScreen oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.uuid != widget.uuid) { + chatRoomCubit.initChat(widget.uuid, sendInitialMessage: widget.sendInitialMessage ?? false); + } + } + @override void initState() { super.initState();