From 6cdd0ac2a6f1914b88338dca4923e1b7c1aed5b8 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Wed, 15 May 2024 14:33:15 +0300 Subject: [PATCH] feat(feed): Author fetch API connect --- .../blog_post_screen/bloc/blog_post_bloc.dart | 59 ++++++++++++++++++- .../bloc/blog_post_event.dart | 14 +++++ .../bloc/blog_post_state.dart | 19 ++++-- 3 files changed, 85 insertions(+), 7 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 74afd4d1..7c9f9ab3 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 @@ -44,9 +44,13 @@ 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)); } else { emit(BlogPostLoadedState(blog_post: data)); + Future> author = _fetchAuthor(data['id']); + emit(BlogPostLoadedState(blog_post: data, author: author)); } } else { // Один или несколько ключевых полей отсутствуют, обрабатываем ошибку @@ -85,4 +89,57 @@ class BlogPostBloc extends Bloc { emit(BlogPostErrorState('Ошибка: ${response.statusCode}')); } } + + Future> _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.post( + Uri.parse(dotenv.env['SERVER_ROOT']! + '/feed/getAuthor/$id'), + headers: { + 'Authorization': 'Bearer $token', + }, + ); + + final data = jsonDecode(response.body); + return data; + } + + FutureOr _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.post( + Uri.parse(dotenv.env['SERVER_ROOT']! + '/feed/getComments/$id'), + headers: { + 'Authorization': 'Bearer $token', + }, + ); + if (response.statusCode == 200) { + final data = jsonDecode(response.body); + if (data is List>) { + print(data); + var currentState = state as BlogPostLoadedState; + emit(currentState.copyWith( + blog_postModelObj: currentState.blog_postModelObj, + blog_post: currentState.blog_post, + author: currentState.author, + comments: currentState.comments)); + } else { + emit(BlogPostErrorState('Неверный формат комментариев')); + } + } else { + emit(BlogPostErrorState('Ошибка сервера: ${response.statusCode}')); + } + } } 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..415809b3 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,17 @@ class DeleteEntry extends BlogPostEvent { @override List get props => [id]; } + +class FetchAuthor extends BlogPostEvent { + FetchAuthor(this.id); + final int id; + @override + List get props => [id]; +} + +class FetchComments extends BlogPostEvent { + FetchComments(this.id); + final int id; + @override + List get props => [id]; +} 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 033ba293..d95856a0 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 @@ -22,18 +22,25 @@ class BlogPostState extends Equatable { } class BlogPostLoadedState extends BlogPostState { - BlogPostLoadedState({this.blog_postModelObj, this.blog_post}); + BlogPostLoadedState( + {this.blog_postModelObj, this.blog_post, this.author, this.comments}); BlogPostModel? blog_postModelObj; Map? blog_post; + Map? author; + List?>? comments; @override - List get props => [blog_postModelObj, blog_post]; + List get props => [blog_postModelObj, blog_post, author, comments]; BlogPostLoadedState copyWith( - {BlogPostModel? blog_postModelObj, Map? blog_post}) { + {BlogPostModel? blog_postModelObj, + Map? blog_post, + Map? author, + List?>? comments}) { return BlogPostLoadedState( - blog_postModelObj: blog_postModelObj ?? this.blog_postModelObj, - blog_post: blog_post ?? this.blog_post, - ); + blog_postModelObj: blog_postModelObj ?? this.blog_postModelObj, + blog_post: blog_post ?? this.blog_post, + author: author ?? this.author, + comments: comments ?? this.comments); } }