From 4642fea47e2535919eb5eea2fdd625fb0e5e6a11 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Mon, 20 May 2024 16:07:00 +0300 Subject: [PATCH] feat(feed): BlogPost comment creation event and API --- .../blog_post_screen/bloc/blog_post_bloc.dart | 43 ++++++++++++++++++- .../bloc/blog_post_event.dart | 7 +++ .../bloc/blog_post_state.dart | 15 ++++++- .../blog_post_screen/blog_post_screen.dart | 5 ++- 4 files changed, 66 insertions(+), 4 deletions(-) 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 ea2db07e..b4889913 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 @@ -18,6 +18,7 @@ class BlogPostBloc extends Bloc { BlogPostBloc(BlogPostState initialState) : super(initialState) { on(_onInitialize); on(_deleteEntry); + on(_createComment); } _onInitialize( @@ -48,10 +49,13 @@ class BlogPostBloc extends Bloc { 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 { } return list; } + + FutureOr _createComment( + CreateComment event, Emitter 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 _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 415809b3..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 @@ -35,3 +35,10 @@ class FetchComments extends BlogPostEvent { @override List get props => [id]; } + +class CreateComment extends BlogPostEvent { + CreateComment(this.body); + final String body; + @override + List get props => [body]; +} diff --git a/lib/presentation/feed/blog_post_screen/bloc/blog_post_state.dart b/lib/presentation/feed/blog_post_screen/bloc/blog_post_state.dart index 610b528b..76226025 100644 --- a/lib/presentation/feed/blog_post_screen/bloc/blog_post_state.dart +++ b/lib/presentation/feed/blog_post_screen/bloc/blog_post_state.dart @@ -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? blog_post; Map? author; List? comments; + TextEditingController? commentController; + String? token; @override List get props => [blog_postModelObj, blog_post, author, comments]; BlogPostLoadedState copyWith( {BlogPostModel? blog_postModelObj, Map? blog_post, Map? author, + TextEditingController? commentController, + String? token, List? 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); } } diff --git a/lib/presentation/feed/blog_post_screen/blog_post_screen.dart b/lib/presentation/feed/blog_post_screen/blog_post_screen.dart index bdded69c..7312e358 100644 --- a/lib/presentation/feed/blog_post_screen/blog_post_screen.dart +++ b/lib/presentation/feed/blog_post_screen/blog_post_screen.dart @@ -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() + .add(CreateComment(state.commentController!.text)), // Установите прозрачный фон ) ],