diff --git a/assets/icons/consultant_rating_icon.svg b/assets/icons/consultant_rating_icon.svg new file mode 100644 index 00000000..493b4d95 --- /dev/null +++ b/assets/icons/consultant_rating_icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/core/di/cubit_registrations.dart b/lib/core/di/cubit_registrations.dart index babff4f6..ec2de9ce 100644 --- a/lib/core/di/cubit_registrations.dart +++ b/lib/core/di/cubit_registrations.dart @@ -135,7 +135,7 @@ class CubitRegistrations { sl.registerFactory(() => UserPurchasesCubit(consultationsRepository: sl())); sl.registerFactory(() => BlockedUsersCubit(blockedUsersRepository: sl())); sl.registerFactory(() => NotificationSettingsCubit(notificationSettingsRepository: sl())); - sl.registerFactory(() => ConsultantRatingCubit(sl())); + sl.registerFactory(() => ConsultantRatingCubit(feedRepository: sl(), repository: sl(), profileRepository: sl())); sl.registerFactory(() => ViewsCubit(viewsRepository: sl())); sl.registerFactory(() => UserDetailsCubit(profileRepository: sl())); } diff --git a/lib/features/consultant_rating/models/statistics_model.dart b/lib/features/consultant_rating/models/statistics_model.dart index bbac675b..1e04eebc 100644 --- a/lib/features/consultant_rating/models/statistics_model.dart +++ b/lib/features/consultant_rating/models/statistics_model.dart @@ -13,6 +13,7 @@ abstract class StatisticsModel with _$StatisticsModel { @JsonKey(name: 'count_diets') int? dietsCount, @JsonKey(name: 'count_consultants') int? consultationsCount, @JsonKey(name: 'count_products_nutritional_values') int? qwe, + @JsonKey(name: 'referral_link') String? refLink, }) = _StatisticsModel; factory StatisticsModel.fromJson(Map json) => _$StatisticsModelFromJson(json); diff --git a/lib/features/consultant_rating/presentation/consultant_rating_screen.dart b/lib/features/consultant_rating/presentation/consultant_rating_screen.dart index 8c6cb3d4..000367e0 100644 --- a/lib/features/consultant_rating/presentation/consultant_rating_screen.dart +++ b/lib/features/consultant_rating/presentation/consultant_rating_screen.dart @@ -1,6 +1,7 @@ import 'package:eatvio_app/core/locator_service.dart'; import 'package:eatvio_app/core/theme/custom_text_style.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart'; +import 'package:eatvio_app/core/utils/toasts.dart'; import 'package:eatvio_app/core/widgets/custom_outlined_button.dart'; import 'package:eatvio_app/core/widgets/data_error_widget.dart'; import 'package:eatvio_app/features/consultant_rating/presentation/cubit/consultant_rating_cubit.dart'; @@ -10,6 +11,7 @@ import 'package:eatvio_app/features/consultant_rating/presentation/widgets/ratin import 'package:eatvio_app/features/consultant_rating/presentation/widgets/statistic_widget.dart'; import 'package:eatvio_app/generated/l10n.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; class ConsultantRatingScreen extends StatelessWidget { @@ -53,8 +55,8 @@ class ConsultantRatingPageContent extends StatelessWidget { child: Column( children: [ const SizedBox(height: 16), - const RatingWidget( - rating: 1058, + RatingWidget( + rating: state.absoluteRating!, ), const SizedBox(height: 16), Padding( @@ -67,7 +69,10 @@ class ConsultantRatingPageContent extends StatelessWidget { side: const WidgetStatePropertyAll(BorderSide.none), backgroundColor: WidgetStatePropertyAll(appTheme.blueA400), ), - onPressed: () {}, + onPressed: () { + Clipboard.setData(ClipboardData(text: state.statistics?.refLink ?? '')); + showInfoToast(s.link_was_copied); + }, ), ), const SizedBox(height: 16), diff --git a/lib/features/consultant_rating/presentation/cubit/consultant_rating_cubit.dart b/lib/features/consultant_rating/presentation/cubit/consultant_rating_cubit.dart index 291f450c..d3ff72a9 100644 --- a/lib/features/consultant_rating/presentation/cubit/consultant_rating_cubit.dart +++ b/lib/features/consultant_rating/presentation/cubit/consultant_rating_cubit.dart @@ -2,17 +2,23 @@ import 'dart:developer'; import 'package:eatvio_app/features/consultant_rating/presentation/cubit/consultant_rating_state.dart'; import 'package:eatvio_app/features/consultant_rating/repositories/consultant_rating_repository.dart'; +import 'package:eatvio_app/features/feed/repositories/feed_repository.dart'; +import 'package:eatvio_app/features/profile/repositories/profile_repository.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; class ConsultantRatingCubit extends Cubit { final ConsultantRatingRepository repository; - ConsultantRatingCubit(this.repository) : super(ConsultantRatingState()); + final FeedRepository feedRepository; + final ProfileRepository profileRepository; + + ConsultantRatingCubit({required this.repository, required this.feedRepository, required this.profileRepository}) : super(ConsultantRatingState()); Future getConsultantStatistics({String? date}) async { try { emit(state.copyWith(isStatisticsLoading: true)); final statistics = await repository.getConsultantStatistics(date: date); - emit(state.copyWith(isStatisticsLoading: false, statistics: statistics, error: null)); + final absoluteRating = await feedRepository.getConsultants((await profileRepository.getMyProfile()).name); + emit(state.copyWith(isStatisticsLoading: false, statistics: statistics, error: null, absoluteRating: absoluteRating.first.totalScores)); } catch (e, st) { emit(state.copyWith(isStatisticsLoading: true, error: e.toString())); log(e.toString(), stackTrace: st); diff --git a/lib/features/consultant_rating/presentation/cubit/consultant_rating_state.dart b/lib/features/consultant_rating/presentation/cubit/consultant_rating_state.dart index 20cc458f..7c1e0942 100644 --- a/lib/features/consultant_rating/presentation/cubit/consultant_rating_state.dart +++ b/lib/features/consultant_rating/presentation/cubit/consultant_rating_state.dart @@ -12,5 +12,6 @@ abstract class ConsultantRatingState with _$ConsultantRatingState { @Default(null) StatisticsModel? statistics, @Default(null) String? error, @Default([]) List ratings, + @Default(0) int? absoluteRating, }) = _ConsultantRatingState; } diff --git a/lib/features/consultant_rating/presentation/widgets/statistic_widget.dart b/lib/features/consultant_rating/presentation/widgets/statistic_widget.dart index 3be44129..ef148adf 100644 --- a/lib/features/consultant_rating/presentation/widgets/statistic_widget.dart +++ b/lib/features/consultant_rating/presentation/widgets/statistic_widget.dart @@ -71,7 +71,7 @@ class StatisticWidget extends StatelessWidget { children: [ Expanded(child: StatisticBouble(number: statistics?.consultationsCount ?? 0, title: s.consultations_count)), const SizedBox(width: 8), - Expanded(child: StatisticBouble(number: statistics?.qwe ?? 0, title: s.active_consultations_count)), + Expanded(child: StatisticBouble(number: statistics?.qwe ?? 0, title: s.added_products_in_glossary)), ], ), const SizedBox( diff --git a/lib/features/feed/repositories/feed_repository.dart b/lib/features/feed/repositories/feed_repository.dart index 108a8b11..e540486f 100644 --- a/lib/features/feed/repositories/feed_repository.dart +++ b/lib/features/feed/repositories/feed_repository.dart @@ -133,9 +133,9 @@ class FeedRepository { } } - Future> getConsultants() async { + Future> getConsultants([String? name]) async { try { - return (await feedService.getConsultants()).data; + return (await feedService.getConsultants(name: name)).data; } catch (e) { rethrow; } diff --git a/lib/features/feed/services/feed_service.dart b/lib/features/feed/services/feed_service.dart index 265c2d38..c756f8c7 100644 --- a/lib/features/feed/services/feed_service.dart +++ b/lib/features/feed/services/feed_service.dart @@ -16,15 +16,10 @@ abstract class FeedService { factory FeedService(Dio dio, {String baseUrl}) = _FeedService; @GET('/api/blogPosts/index') - Future getBlogPostList({ - @Query('page') required int page, - @Query('query_search') String? query, - }); + Future getBlogPostList({@Query('page') required int page, @Query('query_search') String? query}); @GET('/api/blogPosts/show/{postId}') - Future getBlogPost({ - @Path('postId') required int postId, - }); + Future getBlogPost({@Path('postId') required int postId}); @GET('/api/recipes/index') Future getRecipes({ @@ -53,88 +48,50 @@ abstract class FeedService { }); @GET('/api/blogPosts/{id}/comments/show') - Future getBlogPostComments({ - @Path() required String id, - }); + Future getBlogPostComments({@Path() required String id}); @POST('/api/blogPosts/{id}/comment/create') - Future sendBlogPostComment({ - @Path() required String id, - @Part() required String body, - @Part() int? parentCommentId, - }); + Future sendBlogPostComment({@Path() required String id, @Part() required String body, @Part() int? parentCommentId}); @GET('/api/diets/{id}/comments/show') - Future getDietsComments({ - @Path() required String id, - }); + Future getDietsComments({@Path() required String id}); @POST('/api/diets/{id}/comment/create') - Future sendDietsComment({ - @Path() required String id, - @Part() required String body, - @Part() int? parentCommentId, - }); + Future sendDietsComment({@Path() required String id, @Part() required String body, @Part() int? parentCommentId}); @GET('/api/plans/{slug}/comments/show') - Future getPlansComments({ - @Path() required String slug, - }); + Future getPlansComments({@Path() required String slug}); @POST('/api/plans/{slug}/comment/create') - Future sendPlansComment({ - @Path() required String slug, - @Part() required String body, - @Part() int? parentCommentId, - }); + Future sendPlansComment({@Path() required String slug, @Part() required String body, @Part() int? parentCommentId}); @GET('/api/recipes/{id}/comments/show') - Future getRecipesComments({ - @Path() required String id, - }); + Future getRecipesComments({@Path() required String id}); @POST('/api/recipes/{id}/comment/create') - Future sendRecipesComment({ - @Path() required String id, - @Part() required String body, - @Part() int? parentCommentId, - }); + Future sendRecipesComment({@Path() required String id, @Part() required String body, @Part() int? parentCommentId}); @POST('/api/blogPosts/{id}/like') - Future likeBlogPost({ - @Path() required int id, - }); + Future likeBlogPost({@Path() required int id}); @POST('/api/blogPosts/{id}/unliked') - Future unlikedBlogPost({ - @Path() required int id, - }); + Future unlikedBlogPost({@Path() required int id}); @GET('/api/consultants/index') - Future getConsultants(); + Future getConsultants({@Query('filters[name][\$startsWith]') String? name}); @POST('/api/blogPosts/{id}/view') - Future viewPost({ - @Path() required int id, - }); + Future viewPost({@Path() required int id}); @POST('/api/recipes/{slug}/view') - Future viewRecipe({ - @Path() required String slug, - }); + Future viewRecipe({@Path() required String slug}); @POST('/api/diets/{id}/view') - Future viewDiet({ - @Path() required int id, - }); + Future viewDiet({@Path() required int id}); @POST('/api/plans/{slug}/view') - Future viewPlan({ - @Path() required String slug, - }); + Future viewPlan({@Path() required String slug}); @POST('/api/views') - Future viewContent({ - @Body() required ViewModel viewModel, - }); + Future viewContent({@Body() required ViewModel viewModel}); } diff --git a/lib/features/menu/presentation/pages/menu_screen.dart b/lib/features/menu/presentation/pages/menu_screen.dart index 5c350d3c..123e5faf 100644 --- a/lib/features/menu/presentation/pages/menu_screen.dart +++ b/lib/features/menu/presentation/pages/menu_screen.dart @@ -58,7 +58,7 @@ class MenuScreen extends StatelessWidget { if (profileModel.roles.contains('consultant')) _divider(context), if (profileModel.roles.contains('consultant')) _tile( - leading: 'assets/icons/finance.svg', + leading: 'assets/icons/consultant_rating_icon.svg', title: 'Мой рейтинг', onTap: () { GoRouter.of(context).push(ConsultantRatingScreen.path); diff --git a/lib/generated/intl/messages_en.dart b/lib/generated/intl/messages_en.dart index c054a4b5..dc9e4c16 100644 --- a/lib/generated/intl/messages_en.dart +++ b/lib/generated/intl/messages_en.dart @@ -66,6 +66,9 @@ class MessageLookup extends MessageLookupByLibrary { "add_card": MessageLookupByLibrary.simpleMessage("Привязать карту"), "add_cover": MessageLookupByLibrary.simpleMessage("Добавьте обложку"), "add_measure": MessageLookupByLibrary.simpleMessage("Добавить замер"), + "added_products_in_glossary": MessageLookupByLibrary.simpleMessage( + "Кол-во продуктов добавленных в глоссарий", + ), "adding_plan": MessageLookupByLibrary.simpleMessage("Добавление плана"), "additional_information": MessageLookupByLibrary.simpleMessage( "Дополнительная информация", diff --git a/lib/generated/l10n.dart b/lib/generated/l10n.dart index 85f74918..0ccdeac3 100644 --- a/lib/generated/l10n.dart +++ b/lib/generated/l10n.dart @@ -2399,6 +2399,16 @@ class S { ); } + /// `Кол-во продуктов добавленных в глоссарий` + String get added_products_in_glossary { + return Intl.message( + 'Кол-во продуктов добавленных в глоссарий', + name: 'added_products_in_glossary', + desc: '', + args: [], + ); + } + /// `Кол-во активных консультаций` String get active_consultations_count { return Intl.message( diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 57145fb9..1fc575a8 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -300,6 +300,7 @@ "published_recipes_count": "Кол-во опубликованных рецептов", "published_diets_count": "Кол-во опубликованных диет", "consultations_count": "Кол-во проведенных консулдьтаций", + "added_products_in_glossary": "Кол-во продуктов добавленных в глоссарий", "active_consultations_count": "Кол-во активных консультаций", "rating_history": "Начисление рейтинга", "something_went_wrong": "Упс! Что-то пошло не так",