feat(feed): BlogPost comment creation event and API

This commit is contained in:
2024-05-20 16:07:00 +03:00
parent e71f15f664
commit 4642fea47e
4 changed files with 66 additions and 4 deletions

View File

@@ -18,6 +18,7 @@ class BlogPostBloc extends Bloc<BlogPostEvent, BlogPostState> {
BlogPostBloc(BlogPostState initialState) : super(initialState) {
on<BlogPostInitialEvent>(_onInitialize);
on<DeleteEntry>(_deleteEntry);
on<CreateComment>(_createComment);
}
_onInitialize(
@@ -48,10 +49,13 @@ class BlogPostBloc extends Bloc<BlogPostEvent, BlogPostState> {
blog_postModelObj: currentState.blog_postModelObj,
blog_post: currentState.blog_post,
author: currentState.author,
comments: currentState.comments));
comments: currentState.comments,
token: currentState.token));
} else {
emit(BlogPostLoadedState(
blog_post: data,
token: token,
commentController: TextEditingController(),
author: await _fetchAuthor(data['id']),
comments: fillCommentList(await _fetchComments(data['id']))));
}
@@ -145,4 +149,41 @@ class BlogPostBloc extends Bloc<BlogPostEvent, BlogPostState> {
}
return list;
}
FutureOr<void> _createComment(
CreateComment event, Emitter<BlogPostState> emit) async {
if (state is BlogPostLoadedState) {
var currentState = state as BlogPostLoadedState;
var updatedState = currentState.copyWith(
commentController: TextEditingController(text: event.body),
);
// Отправляем данные по HTTP маршруту и ждем ответ
var response = await _sendCommentData(
currentState.token, event.body, currentState.blog_post?['id']);
print(response.body);
if (response.statusCode == 200) {
emit(updatedState); // Передаем обновленное состояние в emit
}
}
}
Future<http.Response> _sendCommentData(
String? token, String body, int id) async {
String url = dotenv.env['SERVER_ROOT']! + '/feed/createComment/$id';
final Map<String, dynamic> 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;
}
}

View File

@@ -35,3 +35,10 @@ class FetchComments extends BlogPostEvent {
@override
List<Object?> get props => [id];
}
class CreateComment extends BlogPostEvent {
CreateComment(this.body);
final String body;
@override
List<Object?> get props => [body];
}

View File

@@ -23,24 +23,35 @@ class BlogPostState extends Equatable {
class BlogPostLoadedState extends BlogPostState {
BlogPostLoadedState(
{this.blog_postModelObj, this.blog_post, this.author, this.comments});
{this.blog_postModelObj,
this.blog_post,
this.author,
this.comments,
this.token,
this.commentController});
BlogPostModel? blog_postModelObj;
Map<String, dynamic>? blog_post;
Map<String, dynamic>? author;
List<dynamic>? comments;
TextEditingController? commentController;
String? token;
@override
List<Object?> get props => [blog_postModelObj, blog_post, author, comments];
BlogPostLoadedState copyWith(
{BlogPostModel? blog_postModelObj,
Map<String, dynamic>? blog_post,
Map<String, dynamic>? author,
TextEditingController? commentController,
String? token,
List<dynamic>? comments}) {
return BlogPostLoadedState(
blog_postModelObj: blog_postModelObj ?? this.blog_postModelObj,
blog_post: blog_post ?? this.blog_post,
author: author ?? this.author,
comments: comments ?? this.comments);
comments: comments ?? this.comments,
token: token ?? this.token,
commentController: commentController ?? this.commentController);
}
}

View File

@@ -337,6 +337,7 @@ class BlogPostScreen extends StatelessWidget {
Column(
children: [
CustomTextFormField(
controller: state.commentController,
maxLines: 4,
),
SizedBox(height: 15.h),
@@ -347,7 +348,9 @@ class BlogPostScreen extends StatelessWidget {
decoration: BoxDecoration(
color: Colors.transparent,
),
onPressed: () => print("tap"),
onPressed: () => context
.read<BlogPostBloc>()
.add(CreateComment(state.commentController!.text)),
// Установите прозрачный фон
)
],