From 22b2e5f249f6e5796374c7b60fea368be1b674cf Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Fri, 19 Dec 2025 15:08:11 +0300 Subject: [PATCH] feat(chat): add plan order message widget and enhance chat bubble to support message types --- .../oauth_verification_confirm_response.dart | 8 ++ .../models/oauth_verification_request.dart | 8 ++ .../oauth_verification_request_response.dart | 8 ++ .../chat/models/chat_message_model.dart | 1 + .../chat/presentation/pages/chat_screen.dart | 121 ++++++++++++----- .../widgets/chat_bubble_widget.dart | 95 ++++++++++++- .../widgets/plan_order_message_widget.dart | 127 ++++++++++++++++++ test/core/constants/app_constants_test.dart | 8 ++ test/core/cubit/state_utils_test.dart | 8 ++ .../core/data/selection_popup_model_test.dart | 8 ++ test/core/enums/prefs_keys_test.dart | 8 ++ .../internet_connection_state_test.dart | 8 ++ test/core/prefs_keys_test.dart | 8 ++ .../routing/main_navigation_routes_test.dart | 8 ++ test/core/routing/other_routes_test.dart | 8 ++ test/core/routing/route_constants_test.dart | 8 ++ test/core/routing/settings_routes_test.dart | 8 ++ test/core/views/cubit/views_state_test.dart | 8 ++ test/core/widgets/add_item_button_test.dart | 8 ++ .../widgets/animated_option_button_test.dart | 8 ++ test/core/widgets/base_button_test.dart | 8 ++ .../widgets/bottom_sheet_with_blur_test.dart | 8 ++ test/core/widgets/cpfc_container_test.dart | 8 ++ test/core/widgets/custom_search_bar_test.dart | 8 ++ test/core/widgets/item_widget_test.dart | 8 ++ test/core/widgets/loader_test.dart | 8 ++ .../widgets/main_background_bouble_test.dart | 8 ++ .../widgets/marketing_bottom_sheet_test.dart | 8 ++ test/core/widgets/option_widget_test.dart | 8 ++ .../widgets/error_widget_test.dart | 8 ++ .../chosen_diet_widget_content_test.dart | 8 ++ .../widgets/comment_container_test.dart | 8 ++ .../finish_day_button_widget_test.dart | 8 ++ .../widgets/meal_summary_widget_test.dart | 8 ++ .../widgets/product_loader_widget_test.dart | 8 ++ .../widgets/info_bouble_test.dart | 8 ++ .../widgets/choice_chip_widget_test.dart | 8 ++ .../widgets/filter_badge_test.dart | 8 ++ .../widgets/status_widget_test.dart | 8 ++ .../glossary_repository_test.dart | 8 ++ .../widgets/notification_widget_test.dart | 8 ++ .../service/notifications_service_test.dart | 8 ++ 42 files changed, 611 insertions(+), 37 deletions(-) create mode 100644 lib/features/chat/presentation/widgets/plan_order_message_widget.dart diff --git a/lib/features/auth/models/oauth_verification_confirm_response.dart b/lib/features/auth/models/oauth_verification_confirm_response.dart index bbd3e9bc..6e7eda52 100644 --- a/lib/features/auth/models/oauth_verification_confirm_response.dart +++ b/lib/features/auth/models/oauth_verification_confirm_response.dart @@ -17,3 +17,11 @@ abstract class OAuthVerificationConfirmResponse with _$OAuthVerificationConfirmR } + + + + + + + + diff --git a/lib/features/auth/models/oauth_verification_request.dart b/lib/features/auth/models/oauth_verification_request.dart index b802bd88..018809aa 100644 --- a/lib/features/auth/models/oauth_verification_request.dart +++ b/lib/features/auth/models/oauth_verification_request.dart @@ -11,3 +11,11 @@ abstract class OAuthVerificationRequest with _$OAuthVerificationRequest { } + + + + + + + + diff --git a/lib/features/auth/models/oauth_verification_request_response.dart b/lib/features/auth/models/oauth_verification_request_response.dart index 6815ed73..a9f814de 100644 --- a/lib/features/auth/models/oauth_verification_request_response.dart +++ b/lib/features/auth/models/oauth_verification_request_response.dart @@ -11,3 +11,11 @@ abstract class OAuthVerificationRequestResponse with _$OAuthVerificationRequestR } + + + + + + + + diff --git a/lib/features/chat/models/chat_message_model.dart b/lib/features/chat/models/chat_message_model.dart index 8dd8545a..86671314 100644 --- a/lib/features/chat/models/chat_message_model.dart +++ b/lib/features/chat/models/chat_message_model.dart @@ -15,6 +15,7 @@ abstract class ChatMessageModel with _$ChatMessageModel { @JsonKey(name: 'read_by_to_user', defaultValue: false) required bool isRead, @JsonKey(name: 'is_author_message_auth_user') required bool? isCurrentUserAuthor, @JsonKey(name: 'room_id') required String? roomId, + @JsonKey(name: 'type') String? type, @Default(MessageState.sent) @JsonKey(includeToJson: false, includeFromJson: false) MessageState messageState, @Default(null) @JsonKey(includeToJson: false, includeFromJson: false) String? uuid, }) = _ChatMessageModel; diff --git a/lib/features/chat/presentation/pages/chat_screen.dart b/lib/features/chat/presentation/pages/chat_screen.dart index b42bf76e..8e185096 100644 --- a/lib/features/chat/presentation/pages/chat_screen.dart +++ b/lib/features/chat/presentation/pages/chat_screen.dart @@ -12,6 +12,7 @@ import 'package:eatvio_app/features/chat/presentation/bloc/chats_cubit/chats_cub import 'package:eatvio_app/features/chat/presentation/pages/photo_view_screen.dart'; import 'package:eatvio_app/features/chat/presentation/widgets/about_order_button.dart'; import 'package:eatvio_app/features/chat/presentation/widgets/chat_bubble_widget.dart'; +import 'package:eatvio_app/features/chat/presentation/widgets/plan_order_message_widget.dart'; import 'package:eatvio_app/core/locator_service.dart'; import 'package:eatvio_app/features/menu/presentation/blocked_user_cubit/blocked_users_cubit.dart'; import 'package:eatvio_app/features/menu/presentation/blocked_user_cubit/blocked_users_state.dart'; @@ -221,14 +222,36 @@ class _ChatScreenState extends State { state.chatMessages[index].updatedAt.day != state.chatMessages[index + 1].updatedAt.day) || index + 1 == state.chatMessages.length) { final isCurrentUserAuthor = state.chatRoom.users.receiver.id != state.chatMessages[index].authorId; + final message = state.chatMessages[index]; + final isPlanOrderMessage = message.type == 'plan_order'; + + PacketOptions? messageOption; + if (isPlanOrderMessage && chosenPlan != null) { + if (chosenPlan.optionType == 'options1') { + messageOption = chosenPlan.plan.packet1Options; + } else if (chosenPlan.optionType == 'options2') { + messageOption = chosenPlan.plan.packet2Options; + } else if (chosenPlan.optionType == 'options3') { + messageOption = chosenPlan.plan.packet3Options; + } + } + return Column( children: [ - _messageDate(state.chatMessages[index].updatedAt), + _messageDate(message.updatedAt), + if (isPlanOrderMessage && chosenPlan != null && messageOption != null) + PlanOrderMessageWidget( + planName: chosenPlan.plan.name, + planSlug: chosenPlan.plan.slug, + price: messageOption.price, + sendTime: message.updatedAt, + isCurrentUser: isCurrentUserAuthor, + ), VisibilityDetector( - key: Key(state.chatMessages[index].id.toString()), + key: Key(message.id.toString()), onVisibilityChanged: (VisibilityInfo info) { - if (!state.chatMessages[index].isRead && !isCurrentUserAuthor && info.visibleFraction > 0) { - unreadMessagesIdsCopy.add((id: state.chatMessages[index].id, index: index)); + if (!message.isRead && !isCurrentUserAuthor && info.visibleFraction > 0) { + unreadMessagesIdsCopy.add((id: message.id, index: index)); EasyDebounce.debounce('mark_as_read', const Duration(milliseconds: 500), () async { final result = await context.read().markMessagesAsRead(state.chatRoom.id, unreadMessagesIdsCopy); if (!result) return; @@ -242,44 +265,74 @@ class _ChatScreenState extends State { } }, child: ChatBubbleWidget( - isRead: state.chatMessages[index].isRead, - sendTime: state.chatMessages[index].updatedAt, - text: state.chatMessages[index].data.trim(), + isRead: message.isRead, + sendTime: message.updatedAt, + text: message.data.trim(), isCurrentUser: isCurrentUserAuthor, - mediaData: state.chatMessages[index].mediaData ?? [], - messageState: state.chatMessages[index].messageState, - messageUuid: state.chatMessages[index].uuid ?? '', + mediaData: message.mediaData ?? [], + messageState: message.messageState, + messageUuid: message.uuid ?? '', userSlug: state.chatRoom.users.receiver.slug, + messageType: message.type, + isConsultant: amIConsultant, ), ), ], ); } final isCurrentUserAuthor = state.chatRoom.users.receiver.id != state.chatMessages[index].authorId; - return VisibilityDetector( - key: Key(state.chatMessages[index].id.toString()), - onVisibilityChanged: (VisibilityInfo info) { - if (!state.chatMessages[index].isRead && !isCurrentUserAuthor && info.visibleFraction > 0) { - unreadMessagesIds.add((id: state.chatMessages[index].id, index: index)); - EasyDebounce.debounce('mark_as_read', const Duration(milliseconds: 500), () async { - final result = await context.read().markMessagesAsRead(state.chatRoom.id, unreadMessagesIds); - if (!result) return; - if (!context.mounted) return; - context.read().reduceUnreadMessagesCount(chatId: state.chatRoom.id, count: unreadMessagesIds.length); - unreadMessagesIds.clear(); - }); - } - }, - child: ChatBubbleWidget( - isRead: state.chatMessages[index].isRead, - sendTime: state.chatMessages[index].updatedAt, - text: state.chatMessages[index].data.trim(), - isCurrentUser: isCurrentUserAuthor, - mediaData: state.chatMessages[index].mediaData ?? [], - messageState: state.chatMessages[index].messageState, - messageUuid: state.chatMessages[index].uuid ?? '', - userSlug: state.chatRoom.users.receiver.slug, - ), + final message = state.chatMessages[index]; + final isPlanOrderMessage = message.type == 'plan_order'; + + PacketOptions? messageOption; + if (isPlanOrderMessage && chosenPlan != null) { + if (chosenPlan.optionType == 'options1') { + messageOption = chosenPlan.plan.packet1Options; + } else if (chosenPlan.optionType == 'options2') { + messageOption = chosenPlan.plan.packet2Options; + } else if (chosenPlan.optionType == 'options3') { + messageOption = chosenPlan.plan.packet3Options; + } + } + + return Column( + children: [ + if (isPlanOrderMessage && chosenPlan != null && messageOption != null) + PlanOrderMessageWidget( + planName: chosenPlan.plan.name, + planSlug: chosenPlan.plan.slug, + price: messageOption.price, + sendTime: message.updatedAt, + isCurrentUser: isCurrentUserAuthor, + ), + VisibilityDetector( + key: Key(message.id.toString()), + onVisibilityChanged: (VisibilityInfo info) { + if (!message.isRead && !isCurrentUserAuthor && info.visibleFraction > 0) { + unreadMessagesIds.add((id: message.id, index: index)); + EasyDebounce.debounce('mark_as_read', const Duration(milliseconds: 500), () async { + final result = await context.read().markMessagesAsRead(state.chatRoom.id, unreadMessagesIds); + if (!result) return; + if (!context.mounted) return; + context.read().reduceUnreadMessagesCount(chatId: state.chatRoom.id, count: unreadMessagesIds.length); + unreadMessagesIds.clear(); + }); + } + }, + child: ChatBubbleWidget( + isRead: message.isRead, + sendTime: message.updatedAt, + text: message.data.trim(), + isCurrentUser: isCurrentUserAuthor, + mediaData: message.mediaData ?? [], + messageState: message.messageState, + messageUuid: message.uuid ?? '', + userSlug: state.chatRoom.users.receiver.slug, + messageType: message.type, + isConsultant: amIConsultant, + ), + ), + ], ); }, itemCount: state.chatMessages.length + (state.isLoading ? 1 : 0), diff --git a/lib/features/chat/presentation/widgets/chat_bubble_widget.dart b/lib/features/chat/presentation/widgets/chat_bubble_widget.dart index eb387691..5f6f8382 100644 --- a/lib/features/chat/presentation/widgets/chat_bubble_widget.dart +++ b/lib/features/chat/presentation/widgets/chat_bubble_widget.dart @@ -9,6 +9,7 @@ import 'package:eatvio_app/features/chat/models/chat_message_model.dart'; import 'package:eatvio_app/features/chat/presentation/bloc/chat_room_cubit/chat_room_cubit.dart'; import 'package:eatvio_app/features/chat/presentation/pages/photo_view_screen.dart'; import 'package:eatvio_app/features/chat/presentation/widgets/message_action_bottom_sheet.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/svg.dart'; @@ -24,7 +25,9 @@ class ChatBubbleWidget extends StatelessWidget { required this.isRead, required this.messageState, required this.messageUuid, - required this.userSlug + required this.userSlug, + this.messageType, + this.isConsultant, }); final DateTime sendTime; @@ -35,6 +38,8 @@ class ChatBubbleWidget extends StatelessWidget { final MessageState messageState; final String messageUuid; final String userSlug; + final String? messageType; + final bool? isConsultant; @override Widget build(BuildContext context) { final size = MediaQuery.sizeOf(context); @@ -144,8 +149,8 @@ class ChatBubbleWidget extends StatelessWidget { ], ), ), - if (mediaData.isNotEmpty && text.isNotEmpty) const SizedBox(height: 8), - if (text.isNotEmpty) Text(text, style: TextStyles.textFS13FW400.copyWith(color: appTheme.black, fontSize: 16)), + if (mediaData.isNotEmpty && _getDisplayText().isNotEmpty) const SizedBox(height: 8), + if (_getDisplayText().isNotEmpty) _buildLinkableText(_getDisplayText()), ], ), ), @@ -163,4 +168,88 @@ class ChatBubbleWidget extends StatelessWidget { ), ); } + + String _getDisplayText() { + if (messageType == 'plan_order') { + if (isConsultant == true) { + // Текст для консультанта + return '1. Уточните у подопечного его цели и пожелания\n' + '2. Согласуйте и выберите дату старта плана\n' + '3. Ожидайте уведомления об успешной оплате\n' + '4. После оплаты предоставьте необходимые данные, согласно вашему плану питания'; + } else { + // Текст для пользователя + return 'Укажите вашу цель в работе с консультантом\n' + 'Согласуйте удобную дату старта плана, после чего вам будет направлена ссылка на оплату.'; + } + } + return text; + } + + Widget _buildLinkableText(String text) { + final urlRegex = RegExp( + r'(?:(?:https?|ftp):\/\/)?(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&\/=]*)', + caseSensitive: false, + ); + + final textStyle = TextStyles.textFS13FW400.copyWith(color: appTheme.black, fontSize: 16); + final linkStyle = textStyle.copyWith( + color: appTheme.blueA400, + decoration: TextDecoration.underline, + ); + + final matches = urlRegex.allMatches(text); + if (matches.isEmpty) { + return Text(text, style: textStyle); + } + + final spans = []; + int lastEnd = 0; + + for (final match in matches) { + // Добавляем текст до ссылки + if (match.start > lastEnd) { + spans.add(TextSpan( + text: text.substring(lastEnd, match.start), + style: textStyle, + )); + } + + // Добавляем кликабельную ссылку + final url = match.group(0)!; + final fullUrl = url.startsWith('http://') || url.startsWith('https://') || url.startsWith('ftp://') + ? url + : 'https://$url'; + + spans.add(TextSpan( + text: url, + style: linkStyle, + recognizer: TapGestureRecognizer() + ..onTap = () async { + try { + final uri = Uri.parse(fullUrl); + if (await canLaunchUrl(uri)) { + await launchUrl(uri, mode: LaunchMode.externalApplication); + } + } catch (e) { + // Игнорируем ошибки открытия ссылок + } + }, + )); + + lastEnd = match.end; + } + + // Добавляем оставшийся текст после последней ссылки + if (lastEnd < text.length) { + spans.add(TextSpan( + text: text.substring(lastEnd), + style: textStyle, + )); + } + + return RichText( + text: TextSpan(children: spans), + ); + } } diff --git a/lib/features/chat/presentation/widgets/plan_order_message_widget.dart b/lib/features/chat/presentation/widgets/plan_order_message_widget.dart new file mode 100644 index 00000000..73581f82 --- /dev/null +++ b/lib/features/chat/presentation/widgets/plan_order_message_widget.dart @@ -0,0 +1,127 @@ +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/date_time_utils.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +class PlanOrderMessageWidget extends StatelessWidget { + const PlanOrderMessageWidget({ + super.key, + required this.planName, + required this.planSlug, + required this.price, + required this.sendTime, + required this.isCurrentUser, + }); + + final String planName; + final String planSlug; + final dynamic price; + final DateTime sendTime; + final bool isCurrentUser; + + String _formatPrice(dynamic price) { + if (price == null) return '0₽'; + if (price is num) { + return '${price.toStringAsFixed(0)}₽'; + } + if (price is String) { + final numPrice = num.tryParse(price); + if (numPrice != null) { + return '${numPrice.toStringAsFixed(0)}₽'; + } + return price.endsWith('₽') ? price : '$price₽'; + } + return '0₽'; + } + + @override + Widget build(BuildContext context) { + final size = MediaQuery.sizeOf(context); + final formattedPrice = _formatPrice(price); + final textStyle = TextStyles.textFS13FW400.copyWith(color: appTheme.black, fontSize: 16); + final linkStyle = textStyle.copyWith( + color: appTheme.blueA400, + decoration: TextDecoration.underline, + ); + + return SizedBox( + width: size.width, + child: Padding( + padding: EdgeInsets.fromLTRB(isCurrentUser ? 64 : 16, 10, isCurrentUser ? 16 : 64, 4), + child: Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: isCurrentUser ? MainAxisAlignment.end : MainAxisAlignment.start, + children: [ + if (isCurrentUser) + Padding( + padding: const EdgeInsets.only(right: 4, bottom: 4), + child: Text( + sendTime.format('HH:mm', 'ru'), + style: const TextStyle(color: Color(0xFF7B8794), height: 1, fontSize: 10), + ), + ), + Container( + constraints: BoxConstraints(maxWidth: size.width * 0.7), + decoration: BoxDecoration( + color: isCurrentUser ? appTheme.gray50 : appTheme.gray60004, + borderRadius: BorderRadius.horizontal( + left: isCurrentUser ? const Radius.circular(32) : const Radius.circular(16), + right: isCurrentUser ? const Radius.circular(16) : const Radius.circular(24), + ), + ), + child: Padding( + padding: EdgeInsets.only( + top: 8, + bottom: 8, + left: isCurrentUser ? 16 : 8, + right: isCurrentUser ? 8 : 16, + ), + child: RichText( + text: TextSpan( + style: textStyle, + children: [ + const TextSpan(text: 'Я хочу заказать '), + TextSpan( + text: planName, + style: linkStyle, + recognizer: TapGestureRecognizer() + ..onTap = () { + GoRouter.of(context).pushNamed( + 'aboutPlanScreen', + extra: { + 'slug': planSlug, + 'index': null, + 'navigateToComments': false, + }, + ); + }, + ), + TextSpan(text: ' по цене $formattedPrice'), + ], + ), + ), + ), + ), + if (!isCurrentUser) + Padding( + padding: const EdgeInsets.only(left: 4, bottom: 4), + child: Text( + sendTime.format('HH:mm', 'ru'), + style: const TextStyle( + color: Color(0xFF7B8794), + height: 1, + fontSize: 10, + fontWeight: FontWeight.w500, + ), + ), + ), + ], + ), + ), + ); + } +} + diff --git a/test/core/constants/app_constants_test.dart b/test/core/constants/app_constants_test.dart index 18be5251..2b4d8d80 100644 --- a/test/core/constants/app_constants_test.dart +++ b/test/core/constants/app_constants_test.dart @@ -139,5 +139,13 @@ void main() { + + + + + + + + diff --git a/test/core/cubit/state_utils_test.dart b/test/core/cubit/state_utils_test.dart index db75a44b..e945e87b 100644 --- a/test/core/cubit/state_utils_test.dart +++ b/test/core/cubit/state_utils_test.dart @@ -73,6 +73,14 @@ void main() { + + + + + + + + diff --git a/test/core/data/selection_popup_model_test.dart b/test/core/data/selection_popup_model_test.dart index a3d38aff..17ed81e2 100644 --- a/test/core/data/selection_popup_model_test.dart +++ b/test/core/data/selection_popup_model_test.dart @@ -87,6 +87,14 @@ void main() { + + + + + + + + diff --git a/test/core/enums/prefs_keys_test.dart b/test/core/enums/prefs_keys_test.dart index b2656a5d..ae964223 100644 --- a/test/core/enums/prefs_keys_test.dart +++ b/test/core/enums/prefs_keys_test.dart @@ -36,6 +36,14 @@ void main() { + + + + + + + + diff --git a/test/core/internet_connection_cubit/internet_connection_state_test.dart b/test/core/internet_connection_cubit/internet_connection_state_test.dart index 034f43e7..60aa037d 100644 --- a/test/core/internet_connection_cubit/internet_connection_state_test.dart +++ b/test/core/internet_connection_cubit/internet_connection_state_test.dart @@ -62,6 +62,14 @@ void main() { + + + + + + + + diff --git a/test/core/prefs_keys_test.dart b/test/core/prefs_keys_test.dart index 08907955..60331f71 100644 --- a/test/core/prefs_keys_test.dart +++ b/test/core/prefs_keys_test.dart @@ -31,6 +31,14 @@ void main() { + + + + + + + + diff --git a/test/core/routing/main_navigation_routes_test.dart b/test/core/routing/main_navigation_routes_test.dart index 905d808c..71f34975 100644 --- a/test/core/routing/main_navigation_routes_test.dart +++ b/test/core/routing/main_navigation_routes_test.dart @@ -28,6 +28,14 @@ void main() { + + + + + + + + diff --git a/test/core/routing/other_routes_test.dart b/test/core/routing/other_routes_test.dart index b5304fca..c2640d00 100644 --- a/test/core/routing/other_routes_test.dart +++ b/test/core/routing/other_routes_test.dart @@ -32,6 +32,14 @@ void main() { + + + + + + + + diff --git a/test/core/routing/route_constants_test.dart b/test/core/routing/route_constants_test.dart index 7e6824ad..35a510b3 100644 --- a/test/core/routing/route_constants_test.dart +++ b/test/core/routing/route_constants_test.dart @@ -112,6 +112,14 @@ void main() { + + + + + + + + diff --git a/test/core/routing/settings_routes_test.dart b/test/core/routing/settings_routes_test.dart index b0faed74..639613e5 100644 --- a/test/core/routing/settings_routes_test.dart +++ b/test/core/routing/settings_routes_test.dart @@ -35,6 +35,14 @@ void main() { + + + + + + + + diff --git a/test/core/views/cubit/views_state_test.dart b/test/core/views/cubit/views_state_test.dart index 24f1dbc1..f1c6533f 100644 --- a/test/core/views/cubit/views_state_test.dart +++ b/test/core/views/cubit/views_state_test.dart @@ -30,6 +30,14 @@ void main() { + + + + + + + + diff --git a/test/core/widgets/add_item_button_test.dart b/test/core/widgets/add_item_button_test.dart index dc61a768..4d35ca93 100644 --- a/test/core/widgets/add_item_button_test.dart +++ b/test/core/widgets/add_item_button_test.dart @@ -66,6 +66,14 @@ void main() { + + + + + + + + diff --git a/test/core/widgets/animated_option_button_test.dart b/test/core/widgets/animated_option_button_test.dart index b539804d..0a1736b7 100644 --- a/test/core/widgets/animated_option_button_test.dart +++ b/test/core/widgets/animated_option_button_test.dart @@ -118,6 +118,14 @@ void main() { + + + + + + + + diff --git a/test/core/widgets/base_button_test.dart b/test/core/widgets/base_button_test.dart index 4313348b..6454fe07 100644 --- a/test/core/widgets/base_button_test.dart +++ b/test/core/widgets/base_button_test.dart @@ -55,6 +55,14 @@ void main() { + + + + + + + + diff --git a/test/core/widgets/bottom_sheet_with_blur_test.dart b/test/core/widgets/bottom_sheet_with_blur_test.dart index 6f50a641..0b207a4a 100644 --- a/test/core/widgets/bottom_sheet_with_blur_test.dart +++ b/test/core/widgets/bottom_sheet_with_blur_test.dart @@ -137,6 +137,14 @@ void main() { + + + + + + + + diff --git a/test/core/widgets/cpfc_container_test.dart b/test/core/widgets/cpfc_container_test.dart index bcd2e51a..6692cb04 100644 --- a/test/core/widgets/cpfc_container_test.dart +++ b/test/core/widgets/cpfc_container_test.dart @@ -98,6 +98,14 @@ void main() { + + + + + + + + diff --git a/test/core/widgets/custom_search_bar_test.dart b/test/core/widgets/custom_search_bar_test.dart index 932204c9..0ae6d1d5 100644 --- a/test/core/widgets/custom_search_bar_test.dart +++ b/test/core/widgets/custom_search_bar_test.dart @@ -166,6 +166,14 @@ void main() { + + + + + + + + diff --git a/test/core/widgets/item_widget_test.dart b/test/core/widgets/item_widget_test.dart index a016d981..b71a81ff 100644 --- a/test/core/widgets/item_widget_test.dart +++ b/test/core/widgets/item_widget_test.dart @@ -59,6 +59,14 @@ void main() { + + + + + + + + diff --git a/test/core/widgets/loader_test.dart b/test/core/widgets/loader_test.dart index 5371c6c3..83c46f35 100644 --- a/test/core/widgets/loader_test.dart +++ b/test/core/widgets/loader_test.dart @@ -44,6 +44,14 @@ void main() { + + + + + + + + diff --git a/test/core/widgets/main_background_bouble_test.dart b/test/core/widgets/main_background_bouble_test.dart index 8c531f72..5589ab7b 100644 --- a/test/core/widgets/main_background_bouble_test.dart +++ b/test/core/widgets/main_background_bouble_test.dart @@ -98,6 +98,14 @@ void main() { + + + + + + + + diff --git a/test/core/widgets/marketing_bottom_sheet_test.dart b/test/core/widgets/marketing_bottom_sheet_test.dart index c5c0b4c7..568dfed7 100644 --- a/test/core/widgets/marketing_bottom_sheet_test.dart +++ b/test/core/widgets/marketing_bottom_sheet_test.dart @@ -78,6 +78,14 @@ void main() { + + + + + + + + diff --git a/test/core/widgets/option_widget_test.dart b/test/core/widgets/option_widget_test.dart index e5083c2d..b03bea45 100644 --- a/test/core/widgets/option_widget_test.dart +++ b/test/core/widgets/option_widget_test.dart @@ -68,5 +68,13 @@ void main() { + + + + + + + + diff --git a/test/features/create_diet/presentation/widgets/error_widget_test.dart b/test/features/create_diet/presentation/widgets/error_widget_test.dart index 16eb0937..9640413e 100644 --- a/test/features/create_diet/presentation/widgets/error_widget_test.dart +++ b/test/features/create_diet/presentation/widgets/error_widget_test.dart @@ -73,6 +73,14 @@ void main() { + + + + + + + + diff --git a/test/features/diary/presentation/widgets/chosen_diet_widget_content_test.dart b/test/features/diary/presentation/widgets/chosen_diet_widget_content_test.dart index 6947feaf..5d19c5ac 100644 --- a/test/features/diary/presentation/widgets/chosen_diet_widget_content_test.dart +++ b/test/features/diary/presentation/widgets/chosen_diet_widget_content_test.dart @@ -82,6 +82,14 @@ void main() { + + + + + + + + diff --git a/test/features/diary/presentation/widgets/comment_container_test.dart b/test/features/diary/presentation/widgets/comment_container_test.dart index 1e5056dc..7f753e68 100644 --- a/test/features/diary/presentation/widgets/comment_container_test.dart +++ b/test/features/diary/presentation/widgets/comment_container_test.dart @@ -60,6 +60,14 @@ void main() { + + + + + + + + diff --git a/test/features/diary/presentation/widgets/finish_day_button_widget_test.dart b/test/features/diary/presentation/widgets/finish_day_button_widget_test.dart index 41aff0e0..128d354f 100644 --- a/test/features/diary/presentation/widgets/finish_day_button_widget_test.dart +++ b/test/features/diary/presentation/widgets/finish_day_button_widget_test.dart @@ -55,6 +55,14 @@ void main() { + + + + + + + + diff --git a/test/features/diary/presentation/widgets/meal_summary_widget_test.dart b/test/features/diary/presentation/widgets/meal_summary_widget_test.dart index 37a5e3be..5a9ec47f 100644 --- a/test/features/diary/presentation/widgets/meal_summary_widget_test.dart +++ b/test/features/diary/presentation/widgets/meal_summary_widget_test.dart @@ -92,6 +92,14 @@ void main() { + + + + + + + + diff --git a/test/features/diary/presentation/widgets/product_loader_widget_test.dart b/test/features/diary/presentation/widgets/product_loader_widget_test.dart index 3419c3c3..5e23e62a 100644 --- a/test/features/diary/presentation/widgets/product_loader_widget_test.dart +++ b/test/features/diary/presentation/widgets/product_loader_widget_test.dart @@ -44,6 +44,14 @@ void main() { + + + + + + + + diff --git a/test/features/diets/presentation/widgets/info_bouble_test.dart b/test/features/diets/presentation/widgets/info_bouble_test.dart index 2f324249..499172d3 100644 --- a/test/features/diets/presentation/widgets/info_bouble_test.dart +++ b/test/features/diets/presentation/widgets/info_bouble_test.dart @@ -110,6 +110,14 @@ void main() { + + + + + + + + diff --git a/test/features/feed/presentation/widgets/choice_chip_widget_test.dart b/test/features/feed/presentation/widgets/choice_chip_widget_test.dart index 0a8ada5f..6b61de56 100644 --- a/test/features/feed/presentation/widgets/choice_chip_widget_test.dart +++ b/test/features/feed/presentation/widgets/choice_chip_widget_test.dart @@ -140,6 +140,14 @@ void main() { + + + + + + + + diff --git a/test/features/feed/presentation/widgets/filter_badge_test.dart b/test/features/feed/presentation/widgets/filter_badge_test.dart index 53115814..f78e9253 100644 --- a/test/features/feed/presentation/widgets/filter_badge_test.dart +++ b/test/features/feed/presentation/widgets/filter_badge_test.dart @@ -52,6 +52,14 @@ void main() { + + + + + + + + diff --git a/test/features/finances_and_consultations_archive/presentation/widgets/status_widget_test.dart b/test/features/finances_and_consultations_archive/presentation/widgets/status_widget_test.dart index 4bf14506..7a6125af 100644 --- a/test/features/finances_and_consultations_archive/presentation/widgets/status_widget_test.dart +++ b/test/features/finances_and_consultations_archive/presentation/widgets/status_widget_test.dart @@ -60,6 +60,14 @@ void main() { + + + + + + + + diff --git a/test/features/glossary/repositories/glossary_repository_test.dart b/test/features/glossary/repositories/glossary_repository_test.dart index 31144e30..5e08f826 100644 --- a/test/features/glossary/repositories/glossary_repository_test.dart +++ b/test/features/glossary/repositories/glossary_repository_test.dart @@ -52,6 +52,14 @@ void main() { + + + + + + + + diff --git a/test/features/notifications/presentation/widgets/notification_widget_test.dart b/test/features/notifications/presentation/widgets/notification_widget_test.dart index e6781201..eba78121 100644 --- a/test/features/notifications/presentation/widgets/notification_widget_test.dart +++ b/test/features/notifications/presentation/widgets/notification_widget_test.dart @@ -1030,6 +1030,14 @@ void main() { + + + + + + + + diff --git a/test/features/notifications/service/notifications_service_test.dart b/test/features/notifications/service/notifications_service_test.dart index f90e2956..a1583d0d 100644 --- a/test/features/notifications/service/notifications_service_test.dart +++ b/test/features/notifications/service/notifications_service_test.dart @@ -65,3 +65,11 @@ void main() { + + + + + + + +