diff --git a/packages/uni_app/lib/generated/intl/messages_en.dart b/packages/uni_app/lib/generated/intl/messages_en.dart index 78c57858a..f4db274a0 100644 --- a/packages/uni_app/lib/generated/intl/messages_en.dart +++ b/packages/uni_app/lib/generated/intl/messages_en.dart @@ -400,6 +400,10 @@ class MessageLookup extends MessageLookupByLibrary { ), "restaurant_period": m4, "restaurants": MessageLookupByLibrary.simpleMessage("Restaurants"), + "tomorrows_meals": MessageLookupByLibrary.simpleMessage("Tomorrow's Menu"), + "no_menu_tomorrow": MessageLookupByLibrary.simpleMessage( + "Tomorrow's Menu Unavailable", + ), "room": MessageLookupByLibrary.simpleMessage("Room"), "save": MessageLookupByLibrary.simpleMessage("Save"), "schedule": MessageLookupByLibrary.simpleMessage("Schedule"), diff --git a/packages/uni_app/lib/generated/intl/messages_pt_PT.dart b/packages/uni_app/lib/generated/intl/messages_pt_PT.dart index 61687ce69..449e6820e 100644 --- a/packages/uni_app/lib/generated/intl/messages_pt_PT.dart +++ b/packages/uni_app/lib/generated/intl/messages_pt_PT.dart @@ -420,6 +420,10 @@ class MessageLookup extends MessageLookupByLibrary { ), "restaurant_period": m4, "restaurants": MessageLookupByLibrary.simpleMessage("Restaurantes"), + "tomorrows_meals": MessageLookupByLibrary.simpleMessage("Menu de Amanhã"), + "no_menu_tomorrow": MessageLookupByLibrary.simpleMessage( + "Menu de Amanhã Indisponível", + ), "room": MessageLookupByLibrary.simpleMessage("Sala"), "save": MessageLookupByLibrary.simpleMessage("Guardar"), "schedule": MessageLookupByLibrary.simpleMessage("Aulas"), diff --git a/packages/uni_app/lib/generated/l10n.dart b/packages/uni_app/lib/generated/l10n.dart index 917909f1d..41e56d5dd 100644 --- a/packages/uni_app/lib/generated/l10n.dart +++ b/packages/uni_app/lib/generated/l10n.dart @@ -1846,6 +1846,26 @@ class S { return Intl.message('Restaurants', name: 'restaurants', desc: '', args: []); } + /// `Tomorrow's Menu` + String get tomorrows_meals { + return Intl.message( + 'Tomorrow\'s Menu', + name: 'tomorrows_meals', + desc: '', + args: [], + ); + } + + /// `Tomorrow's Menu Unavailable` + String get no_menu_tomorrow { + return Intl.message( + 'Tomorrow\'s Menu Unavailable', + name: 'no_menu_tomorrow', + desc: '', + args: [], + ); + } + /// `Calendar` String get calendar { return Intl.message('Calendar', name: 'calendar', desc: '', args: []); diff --git a/packages/uni_app/lib/l10n/intl_en.arb b/packages/uni_app/lib/l10n/intl_en.arb index c0b4e484c..feb8ab792 100644 --- a/packages/uni_app/lib/l10n/intl_en.arb +++ b/packages/uni_app/lib/l10n/intl_en.arb @@ -438,6 +438,10 @@ "@library": {}, "restaurants": "Restaurants", "@restaurants": {}, + "tomorrows_meals": "Tomorrow's Menu", + "@tomorrows_meals": {}, + "no_menu_tomorrow": "Tomorrow's Menu Unavailable", + "@no_menu_tomorrow": {}, "calendar": "Calendar", "@calendar": {}, "ucs": "UCS", diff --git a/packages/uni_app/lib/l10n/intl_pt_PT.arb b/packages/uni_app/lib/l10n/intl_pt_PT.arb index be34c41ca..323077627 100644 --- a/packages/uni_app/lib/l10n/intl_pt_PT.arb +++ b/packages/uni_app/lib/l10n/intl_pt_PT.arb @@ -440,6 +440,10 @@ "@library": {}, "restaurants": "Restaurantes", "@restaurants": {}, + "tomorrows_meals": "Menu de Amanhã", + "@tomorrows_meals": {}, + "no_menu_tomorrow": "Menu de Amanhã Indisponível", + "@no_menu_tomorrow": {}, "calendar": "Calendário", "@calendar": {}, "ucs": "UCS", diff --git a/packages/uni_app/lib/view/home/widgets/restaurants/restaurant_home_card.dart b/packages/uni_app/lib/view/home/widgets/restaurants/restaurant_home_card.dart index b07ec1a32..d2cd18152 100644 --- a/packages/uni_app/lib/view/home/widgets/restaurants/restaurant_home_card.dart +++ b/packages/uni_app/lib/view/home/widgets/restaurants/restaurant_home_card.dart @@ -122,13 +122,30 @@ List getRestaurantInformation( ) { final locale = ref.watch(localeProvider); - final today = parseDateTime(DateTime.now()); + final now = DateTime.now(); + var today = parseDateTime(now); + + final showTomorrow = RestaurantUtils.shouldShowTomorrowMenu(now); + final isSundayNight = RestaurantUtils.isSundayNight(now); + + if (showTomorrow) { + final tomorrowIndex = (today.index + 1) % DayOfWeek.values.length; + today = DayOfWeek.values[tomorrowIndex]; + } final restaurantsWidgets = favoriteRestaurants .where((element) => element.getMealsOfDay(today).isNotEmpty) .map((restaurant) { final menuItems = getMainMenus(today, restaurant, locale); + + String? subtitle; + if (showTomorrow) { + subtitle = S.of(context).tomorrows_meals; + } else if (isSundayNight) { + subtitle = S.of(context).no_menu_tomorrow; + } + return RestaurantCard( name: RestaurantUtils.getRestaurantName( context, @@ -145,6 +162,7 @@ List getRestaurantInformation( onFavoriteToggle: () => {}, menuItems: menuItems, showFavoriteButton: false, + subtitle: subtitle, ); }) .toList(); diff --git a/packages/uni_app/lib/view/restaurant/tab_controller_provider.dart b/packages/uni_app/lib/view/restaurant/tab_controller_provider.dart index 80bd7e67c..052f38a91 100644 --- a/packages/uni_app/lib/view/restaurant/tab_controller_provider.dart +++ b/packages/uni_app/lib/view/restaurant/tab_controller_provider.dart @@ -1,12 +1,29 @@ import 'package:flutter_riverpod/legacy.dart'; import 'package:uni/model/utils/day_of_week.dart'; +import 'package:uni/view/restaurant/widgets/restaurant_utils.dart'; final tabControllerProvider = StateNotifierProvider( (ref) => TabControllerProvider(), ); class TabControllerProvider extends StateNotifier { - TabControllerProvider() : super(DateTime.now().weekday - 1); + TabControllerProvider() : super(_getInitialIndex()); + + static int _getInitialIndex() { + final now = DateTime.now(); + + int index = now.weekday - 1; + + if (RestaurantUtils.shouldShowTomorrowMenu(now)) { + index++; + } + + if (index >= DayOfWeek.values.length) { + index = 0; + } + + return index; + } void setTabIndex(int index) { if (index >= 0 && index < DayOfWeek.values.length) { diff --git a/packages/uni_app/lib/view/restaurant/widgets/restaurant_utils.dart b/packages/uni_app/lib/view/restaurant/widgets/restaurant_utils.dart index fd0eddc27..f17464f35 100644 --- a/packages/uni_app/lib/view/restaurant/widgets/restaurant_utils.dart +++ b/packages/uni_app/lib/view/restaurant/widgets/restaurant_utils.dart @@ -4,6 +4,21 @@ import 'package:uni/model/entities/app_locale.dart'; import 'package:uni_ui/icons.dart'; class RestaurantUtils { + // Hour after which to show tomorrow's menu (except on Sunday) + static const int menuSwitchHour = 21; + + /// Determines if tomorrow's menu should be shown based on current time + /// Returns true if it's after menuSwitchHour and not Sunday + static bool shouldShowTomorrowMenu(DateTime now) { + return now.hour >= menuSwitchHour && now.weekday != DateTime.sunday; + } + + /// Determines if it's Sunday night after menuSwitchHour + /// (when tomorrow's menu is not available) + static bool isSundayNight(DateTime now) { + return now.hour >= menuSwitchHour && now.weekday == DateTime.sunday; + } + // Method to get a restaurant related UniIcon based on a specific type static UniIcon getIcon(String? type, {double size = 24, Color? color}) { switch (type) { diff --git a/packages/uni_ui/lib/cards/restaurant_card.dart b/packages/uni_ui/lib/cards/restaurant_card.dart index ec9945110..2094d1614 100644 --- a/packages/uni_ui/lib/cards/restaurant_card.dart +++ b/packages/uni_ui/lib/cards/restaurant_card.dart @@ -13,6 +13,7 @@ class RestaurantCard extends StatelessWidget { required this.onFavoriteToggle, this.showFavoriteButton = true, this.onClick, + this.subtitle, }); final String name; @@ -22,6 +23,7 @@ class RestaurantCard extends StatelessWidget { final VoidCallback onFavoriteToggle; final bool showFavoriteButton; final Function()? onClick; + final String? subtitle; @override Widget build(BuildContext context) { @@ -40,6 +42,7 @@ class RestaurantCard extends StatelessWidget { isFavorite: isFavorite, onFavoriteToggle: onFavoriteToggle, showFavoriteButton: showFavoriteButton, + subtitle: subtitle, ), Column(children: menuItems), ], @@ -57,6 +60,7 @@ class RestaurantCardHeader extends StatelessWidget { required this.isFavorite, required this.onFavoriteToggle, this.showFavoriteButton = true, + this.subtitle, }); final String name; @@ -64,6 +68,7 @@ class RestaurantCardHeader extends StatelessWidget { final bool isFavorite; final VoidCallback onFavoriteToggle; final bool showFavoriteButton; + final String? subtitle; @override Widget build(BuildContext context) { @@ -80,10 +85,36 @@ class RestaurantCardHeader extends StatelessWidget { flex: 4, child: Padding( padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Text( - name, - style: Theme.of(context).textTheme.headlineSmall, - overflow: TextOverflow.clip, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + name, + style: Theme.of(context).textTheme.headlineSmall, + overflow: TextOverflow.clip, + ), + if (subtitle != null) + Container( + margin: const EdgeInsets.only(top: 4), + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 2, + ), + decoration: BoxDecoration( + color: Theme.of(context).primaryColor.withAlpha(0x20), + borderRadius: BorderRadius.circular(4), + ), + child: Text( + subtitle!, + style: Theme.of(context).textTheme.bodySmall?.copyWith( + fontWeight: FontWeight.w600, + color: + Theme.of(context).colorScheme.onPrimaryContainer, + ), + ), + ), + ], ), ), ),