import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; import '/core/app_export.dart'; import 'package:eatvio_app/presentation/chat/chat_screen/models/chat_model.dart'; import 'package:eatvio_app/presentation/chat/chat_screen/models/chat_message_model.dart'; part 'chat_event.dart'; part 'chat_state.dart'; /// A bloc that manages the state of a Chat according to the event that is dispatched to it. class ChatBloc extends Bloc { ChatBloc(ChatState initialState) : super(initialState) { on(_onInitialize); } _onInitialize( ChatInitialEvent event, Emitter emit, ) async { try { final box = await Hive.openBox('token'); final token = box.get('token'); if (token == null) { NavigatorService.popAndPushNamed( AppRoutes.authScreen, ); } final String? chatID = state.chatModelObj?.chatID; final response = await http.get( Uri.parse(dotenv.env['SERVER_ROOT']! + '/chat/show/$chatID'), headers: { 'Authorization': 'Bearer $token', }, ); if (response.statusCode == 200) { final data = jsonDecode(response.body); if (data is Map && data.containsKey('chatRoom') && data['chatRoom'].containsKey('messages')) { if (state is ChatLoadedState) { var currentState = state as ChatLoadedState; emit(currentState.copyWith( chatModelObj: currentState.chatModelObj, messages: currentState.messages)); } else { emit(ChatLoadedState( messages: fillMessages(data['chatRoom']['messages']))); } } else { // Один или несколько ключевых полей отсутствуют, обрабатываем ошибку emit(ChatErrorState('Некоторые необходимые данные отсутствуют.')); } } else { // Статус ответа не равен 200, обрабатываем ошибку emit(ChatErrorState('Ошибка сервера: ${response.statusCode}')); } } catch (e) { // Ошибка при декодировании JSON или другая ошибка выполнения emit(ChatErrorState('Ошибка при получении данных о чатах: $e')); } } List fillMessages(List messagesJSON) { List messages = []; for (int i = 0; i < messagesJSON.length; i++) { messages.add(ChatMessageModel( id: messagesJSON[i]['id'], data: messagesJSON[i]['data'], mediaData: messagesJSON[i]['mediaData'] ?? [], updatedAt: messagesJSON[i]['updated_at'], authorId: messagesJSON[i]['author_id'])); } return messages; } }