feat(chat): Messages list fill, message model

This commit is contained in:
2024-05-07 13:02:59 +03:00
parent d537a05fac
commit 7279ff69a8
4 changed files with 67 additions and 21 deletions

View File

@@ -3,9 +3,11 @@ 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';
@@ -28,7 +30,6 @@ class ChatBloc extends Bloc<ChatEvent, ChatState> {
);
}
final String? chatID = state.chatModelObj?.chatID;
print(chatID);
final response = await http.get(
Uri.parse(dotenv.env['SERVER_ROOT']! + '/chat/show/$chatID'),
headers: {
@@ -37,13 +38,17 @@ class ChatBloc extends Bloc<ChatEvent, ChatState> {
);
if (response.statusCode == 200) {
final data = jsonDecode(response.body);
print(data);
if (data is Map<String, dynamic> && data.containsKey('chatRooms')) {
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());
emit(currentState.copyWith(
chatModelObj: currentState.chatModelObj,
messages: currentState.messages));
} else {
emit(ChatLoadedState());
emit(ChatLoadedState(
messages: fillMessages(data['chatRoom']['messages'])));
}
} else {
// Один или несколько ключевых полей отсутствуют, обрабатываем ошибку
@@ -58,4 +63,18 @@ class ChatBloc extends Bloc<ChatEvent, ChatState> {
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;
}
}

View File

@@ -22,26 +22,18 @@ class ChatState extends Equatable {
}
class ChatLoadedState extends ChatState {
ChatLoadedState({
this.selectedDropDownValue,
this.chatModelObj,
});
SelectionPopupModel? selectedDropDownValue;
ChatLoadedState({this.chatModelObj, this.messages});
ChatModel? chatModelObj;
List<ChatMessageModel>? messages;
@override
List<Object?> get props => [
selectedDropDownValue,
chatModelObj,
];
ChatState copyWith({
SelectionPopupModel? selectedDropDownValue,
ChatModel? chatModelObj,
}) {
return ChatState(
List<Object?> get props => [chatModelObj, messages];
ChatLoadedState copyWith(
{ChatModel? chatModelObj, List<ChatMessageModel>? messages}) {
return ChatLoadedState(
chatModelObj: chatModelObj ?? this.chatModelObj,
messages: messages ?? this.messages,
);
}
}

View File

@@ -13,7 +13,6 @@ class ChatScreen extends StatelessWidget {
const ChatScreen({Key? key}) : super(key: key);
static Widget builder(BuildContext context) {
final chatID = ModalRoute.of(context)!.settings.arguments;
print(chatID.toString());
return BlocProvider<ChatBloc>(
create: (context) => ChatBloc(
ChatState(chatModelObj: ChatModel(chatID: chatID.toString())))

View File

@@ -0,0 +1,36 @@
import 'package:equatable/equatable.dart';
class ChatMessageModel extends Equatable {
final int id;
final String data;
final List<dynamic> mediaData;
final int authorId;
final String updatedAt;
ChatMessageModel({
required this.id,
required this.data,
required this.mediaData,
required this.authorId,
required this.updatedAt,
});
ChatMessageModel copyWith({
int? id,
String? data,
List<dynamic>? mediaData,
int? authorId,
String? updatedAt,
}) {
return ChatMessageModel(
id: id ?? this.id,
data: data ?? this.data,
mediaData: mediaData ?? this.mediaData,
authorId: authorId ?? this.authorId,
updatedAt: updatedAt ?? this.updatedAt,
);
}
@override
List<Object?> get props => [id, data, mediaData, authorId, updatedAt];
}