diff --git a/assets/images/img_send.svg b/assets/images/img_send.svg
new file mode 100644
index 00000000..5dedda3d
--- /dev/null
+++ b/assets/images/img_send.svg
@@ -0,0 +1,3 @@
+
diff --git a/lib/core/utils/image_constant.dart b/lib/core/utils/image_constant.dart
index 8c9c0981..07aa9abb 100644
--- a/lib/core/utils/image_constant.dart
+++ b/lib/core/utils/image_constant.dart
@@ -106,6 +106,8 @@ class ImageConstant {
static String imgMic = '$imagePath/img_mic.svg';
+ static String imgSend = '$imagePath/img_send.svg';
+
static String imgAttach = '$imagePath/img_attach.svg';
static String imgExit = '$imagePath/img_nav_exit.svg';
diff --git a/lib/data/apiClient/api_client.dart b/lib/data/apiClient/api_client.dart
deleted file mode 100644
index d629b311..00000000
--- a/lib/data/apiClient/api_client.dart
+++ /dev/null
@@ -1,3 +0,0 @@
-//import 'package:eatvio_app/core/app_export.dart';
-
-class ApiClient {}
diff --git a/lib/presentation/chat/chat_select_screen/models/chat_select_model.dart b/lib/presentation/chat/chat_select_screen/models/chat_select_model.dart
index cc47e820..2b90449e 100644
--- a/lib/presentation/chat/chat_select_screen/models/chat_select_model.dart
+++ b/lib/presentation/chat/chat_select_screen/models/chat_select_model.dart
@@ -7,7 +7,6 @@ import 'package:eatvio_app/presentation/chat/chat_select_screen/models/chat_entr
/// and is typically used to hold data that is passed between different parts of the application.
class ChatSelectModel extends Equatable {
ChatSelectModel({this.chatList = const []});
-
List chatList;
ChatSelectModel copyWith({List? chatList}) {
return ChatSelectModel(
diff --git a/lib/presentation/feed/blog_post_screen/bloc/blog_post_bloc.dart b/lib/presentation/feed/blog_post_screen/bloc/blog_post_bloc.dart
index 74afd4d1..e1a98497 100644
--- a/lib/presentation/feed/blog_post_screen/bloc/blog_post_bloc.dart
+++ b/lib/presentation/feed/blog_post_screen/bloc/blog_post_bloc.dart
@@ -1,10 +1,12 @@
import 'dart:async';
+import 'package:eatvio_app/presentation/feed/blog_post_screen/models/comment_model.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/feed/blog_post_screen/models/blog_post_model.dart';
@@ -16,6 +18,7 @@ class BlogPostBloc extends Bloc {
BlogPostBloc(BlogPostState initialState) : super(initialState) {
on(_onInitialize);
on(_deleteEntry);
+ on(_createComment);
}
_onInitialize(
@@ -44,9 +47,17 @@ class BlogPostBloc extends Bloc {
var currentState = state as BlogPostLoadedState;
emit(currentState.copyWith(
blog_postModelObj: currentState.blog_postModelObj,
- blog_post: currentState.blog_post));
+ blog_post: currentState.blog_post,
+ author: currentState.author,
+ comments: currentState.comments,
+ token: currentState.token));
} else {
- emit(BlogPostLoadedState(blog_post: data));
+ emit(BlogPostLoadedState(
+ blog_post: data,
+ token: token,
+ commentController: TextEditingController(),
+ author: await _fetchAuthor(data['id']),
+ comments: fillCommentList(await _fetchComments(data['id']))));
}
} else {
// Один или несколько ключевых полей отсутствуют, обрабатываем ошибку
@@ -62,6 +73,27 @@ class BlogPostBloc extends Bloc {
}
}
+ FutureOr _createComment(
+ CreateComment event, Emitter emit) async {
+ if (state is BlogPostLoadedState) {
+ var currentState = state as BlogPostLoadedState;
+ // Отправляем данные по HTTP маршруту и ждем ответ
+ var response = await _sendCommentData(
+ currentState.token, event.body, currentState.blog_post?['id']);
+
+ if (response.statusCode == 200) {
+ var updatedComments = fillCommentList(
+ await _fetchComments(currentState.blog_post?['id']));
+ var updatedState = currentState.copyWith(
+ comments: updatedComments,
+ commentController:
+ TextEditingController(), // Clear the comment input field
+ );
+ emit(updatedState); // Emit the updated state to trigger a screen update
+ }
+ }
+ }
+
FutureOr _deleteEntry(
DeleteEntry event, Emitter emit) async {
final box = await Hive.openBox('token');
@@ -85,4 +117,75 @@ class BlogPostBloc extends Bloc {
emit(BlogPostErrorState('Ошибка: ${response.statusCode}'));
}
}
+
+ _fetchAuthor(int id) async {
+ final box = await Hive.openBox('token');
+ final token = box.get('token');
+
+ if (token == null) {
+ NavigatorService.popAndPushNamed(
+ AppRoutes.authScreen,
+ );
+ }
+
+ final response = await http.get(
+ Uri.parse(dotenv.env['SERVER_ROOT']! + '/feed/getAuthor/$id'),
+ headers: {
+ 'Authorization': 'Bearer $token',
+ },
+ );
+ final data = jsonDecode(response.body);
+ return data;
+ }
+
+ Future _fetchComments(int id) async {
+ final box = await Hive.openBox('token');
+ final token = box.get('token');
+ if (token == null) {
+ NavigatorService.popAndPushNamed(
+ AppRoutes.authScreen,
+ );
+ }
+ final response = await http.get(
+ Uri.parse(dotenv.env['SERVER_ROOT']! + '/feed/getComments/$id'),
+ headers: {
+ 'Authorization': 'Bearer $token',
+ },
+ );
+ final data = jsonDecode(response.body);
+ return data;
+ }
+
+ List fillCommentList(List comments) {
+ List list = [];
+ for (int i = 0; i < comments.length; i++) {
+ print(comments[i]);
+ list.add(CommentModel(
+ id: comments[i]['id'].toString(),
+ userImage: comments[i]['profile_photo_path'],
+ username: comments[i]['name'],
+ dateText: DateFormat('dd.MM')
+ .format(DateTime.parse(comments[i]['updated_at'])),
+ greetingText: comments[i]['body']));
+ }
+ return list;
+ }
+
+ Future _sendCommentData(
+ String? token, String body, int id) async {
+ String url = dotenv.env['SERVER_ROOT']! + '/feed/createComment/$id';
+ final Map credentials = {
+ 'body': body,
+ };
+
+ var response = await http.post(Uri.parse(url),
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Bearer $token',
+ },
+ body: json.encode(credentials),
+ encoding: utf8);
+
+ return response;
+ }
}
diff --git a/lib/presentation/feed/blog_post_screen/bloc/blog_post_event.dart b/lib/presentation/feed/blog_post_screen/bloc/blog_post_event.dart
index de77e332..e1435112 100644
--- a/lib/presentation/feed/blog_post_screen/bloc/blog_post_event.dart
+++ b/lib/presentation/feed/blog_post_screen/bloc/blog_post_event.dart
@@ -21,3 +21,24 @@ class DeleteEntry extends BlogPostEvent {
@override
List