forked from eatvio/eatvio_app
81 lines
3.1 KiB
Dart
81 lines
3.1 KiB
Dart
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 'package:intl/intl.dart';
|
||
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<ChatEvent, ChatState> {
|
||
ChatBloc(ChatState initialState) : super(initialState) {
|
||
on<ChatInitialEvent>(_onInitialize);
|
||
}
|
||
|
||
_onInitialize(
|
||
ChatInitialEvent event,
|
||
Emitter<ChatState> 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<String, dynamic> &&
|
||
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<ChatMessageModel> fillMessages(List<dynamic> messagesJSON) {
|
||
List<ChatMessageModel> 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;
|
||
}
|
||
}
|