Skip to content

Commit a26e74e

Browse files
authored
Merge pull request #26 from AbdoWa7eed/features/meal-details
Introduce Meal Details Feature with New UI Components and Navigation
2 parents eaa3509 + b4e3122 commit a26e74e

20 files changed

+351
-44
lines changed

lib/core/res/strings_manager.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,4 +190,7 @@ abstract class AppStrings {
190190
static const String breakfast = "Breakfast";
191191
static const String lunch = "Lunch";
192192
static const String dinner = "Dinner";
193+
194+
// Meal Details
195+
static const String ingredients = "Ingredients";
193196
}

lib/core/res/styles_manager.dart

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ abstract class StylesManager {
99
fontWeight: FontWeightManager.medium,
1010
);
1111

12-
static const TextStyle medium14 = TextStyle(
12+
static const TextStyle medium14Black = TextStyle(
1313
fontSize: FontSize.s14,
1414
color: ColorManager.black,
1515
fontWeight: FontWeightManager.medium,
@@ -32,6 +32,12 @@ abstract class StylesManager {
3232
color: ColorManager.white,
3333
);
3434

35+
static const TextStyle medium14 = TextStyle(
36+
fontSize: FontSize.s14,
37+
color: ColorManager.white,
38+
fontWeight: FontWeightManager.medium,
39+
);
40+
3541
static const TextStyle semiBold20black = TextStyle(
3642
fontSize: FontSize.s20,
3743
fontWeight: FontWeightManager.semiBold,
@@ -62,7 +68,13 @@ abstract class StylesManager {
6268
color: ColorManager.white,
6369
);
6470

65-
static const TextStyle medium16Black = TextStyle(
71+
static const TextStyle medium22Black = TextStyle(
72+
fontSize: FontSize.s22,
73+
fontWeight: FontWeightManager.medium,
74+
color: ColorManager.black,
75+
);
76+
77+
static const TextStyle medium16Black = TextStyle(
6678
fontSize: FontSize.s16,
6779
fontWeight: FontWeightManager.medium,
6880
color: ColorManager.black,
@@ -93,6 +105,12 @@ abstract class StylesManager {
93105
color: ColorManager.white,
94106
);
95107

108+
static const TextStyle medium20Black = TextStyle(
109+
fontSize: FontSize.s20,
110+
fontWeight: FontWeightManager.medium,
111+
color: ColorManager.black,
112+
);
113+
96114
static const TextStyle semiBold22 = TextStyle(
97115
fontSize: FontSize.s22,
98116
fontWeight: FontWeightManager.semiBold,

lib/core/res/values_manager.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ abstract class AppSize {
3838
static const double s80 = 80.0;
3939
static const double s100 = 100.0;
4040
static const double s120 = 120.0;
41+
static const double s140 = 150.0;
4142
static const double s150 = 150.0;
4243
static const double s160 = 160.0;
4344
static const double s180 = 180.0;

lib/core/routes/app_routes.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:graduation_project/core/widgets/slide_transition.dart';
44
import 'package:graduation_project/features/auth/presentation/views/login_view.dart';
55
import 'package:graduation_project/features/auth/presentation/views/register_view.dart';
66
import 'package:graduation_project/features/home_layout/presentation/views/home_layout_view.dart';
7+
import 'package:graduation_project/features/meal_details/presentation/views/meal_details_view.dart';
78
import 'package:graduation_project/features/onboarding/presentation/views/onboarding_view.dart';
89
import 'package:graduation_project/features/profile_completion/presentation/views/birth_year_selection_view.dart';
910
import 'package:graduation_project/features/profile_completion/presentation/views/gender_selection_view.dart';

lib/core/routes/app_routes.main.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ abstract class Routes {
1616
static const String targetBodyFatSelectionRoute =
1717
"/target-body-fat-selection";
1818
static const String homeLayoutRoute = "/home-layout";
19+
static const String mealDetailsRoute = "/meal-details";
1920
}
2021

2122
abstract class RouteGenerator {
@@ -106,7 +107,9 @@ abstract class RouteGenerator {
106107
GoRoute(
107108
path: Routes.targetBodyFatSelectionRoute,
108109
pageBuilder: (context, state) {
109-
return PageSlideTransition(child: const TargetBodyFatSelectionView());
110+
return PageSlideTransition(
111+
child: const TargetBodyFatSelectionView(),
112+
);
110113
},
111114
),
112115
],
@@ -115,5 +118,11 @@ abstract class RouteGenerator {
115118
path: Routes.homeLayoutRoute,
116119
builder: (context, state) => const HomeLayoutView(),
117120
),
121+
GoRoute(
122+
path: Routes.mealDetailsRoute,
123+
pageBuilder: (context, state) {
124+
return PageSlideTransition(child: const MealDetailsView());
125+
},
126+
),
118127
];
119128
}

lib/core/widgets/custom_app_bar.dart

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:flutter/material.dart';
22
import 'package:go_router/go_router.dart';
33
import 'package:graduation_project/core/res/styles_manager.dart';
4+
import 'package:graduation_project/core/widgets/custom_back_button.dart';
45

56
class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
67
final String? titleText;
@@ -32,10 +33,7 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
3233
centerTitle: centerTitle,
3334
leading:
3435
context.canPop()
35-
? IconButton(
36-
icon: const Icon(Icons.arrow_back_ios_new_rounded),
37-
onPressed: onBack ?? () => context.pop(),
38-
)
36+
? CustomBackButton()
3937
: null,
4038
elevation: 0,
4139
actions: actions,
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:graduation_project/core/res/values_manager.dart';
3+
import 'package:go_router/go_router.dart';
4+
5+
class CustomBackButton extends StatelessWidget {
6+
const CustomBackButton({super.key, this.color});
7+
8+
final Color? color;
9+
10+
@override
11+
Widget build(BuildContext context) {
12+
return IconButton(
13+
iconSize: AppSize.s22,
14+
icon: Icon(Icons.arrow_back_ios_new_rounded, color: color),
15+
onPressed: () => context.pop(),
16+
);
17+
}
18+
}

lib/features/home/presentation/widgets/daily_workouts_widget.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class DailyWorkoutsWidget extends StatelessWidget {
1818
RichText(
1919
text: TextSpan(
2020
text: '${AppStrings.dailyWorkouts} ',
21-
style: StylesManager.semiBold20black,
21+
style: StylesManager.medium20Black,
2222
children: [
2323
TextSpan(
2424
text: AppStrings.dailyWorkoutsProgress,

lib/features/home/presentation/widgets/meal_card_widget.dart

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import 'package:flutter/material.dart';
2+
import 'package:go_router/go_router.dart';
23
import 'package:graduation_project/core/res/color_manager.dart';
34
import 'package:graduation_project/core/res/styles_manager.dart';
45
import 'package:graduation_project/core/res/values_manager.dart';
6+
import 'package:graduation_project/core/routes/app_routes.dart';
57

68
class MealCard extends StatelessWidget {
79
const MealCard({super.key, required this.title, required this.imageUrl});
@@ -11,35 +13,40 @@ class MealCard extends StatelessWidget {
1113

1214
@override
1315
Widget build(BuildContext context) {
14-
return Card(
15-
elevation: 1,
16-
shadowColor: ColorManager.lightViolet,
17-
color: ColorManager.white,
18-
shape: RoundedRectangleBorder(
19-
borderRadius: BorderRadius.circular(AppSize.s12),
20-
),
21-
child: SizedBox(
22-
width: AppSize.s150,
23-
child: Column(
24-
children: [
25-
ClipRRect(
26-
borderRadius: BorderRadius.only(
27-
topLeft: Radius.circular(AppSize.s12),
28-
topRight: Radius.circular(AppSize.s12),
29-
),
30-
child: Image.network(
31-
imageUrl,
32-
height: AppSize.s120,
33-
width: double.infinity,
34-
fit: BoxFit.cover,
16+
return GestureDetector(
17+
onTap: () {
18+
GoRouter.of(context).push(Routes.mealDetailsRoute);
19+
},
20+
child: Card(
21+
elevation: 1,
22+
shadowColor: ColorManager.lightViolet,
23+
color: ColorManager.white,
24+
shape: RoundedRectangleBorder(
25+
borderRadius: BorderRadius.circular(AppSize.s12),
26+
),
27+
child: SizedBox(
28+
width: AppSize.s150,
29+
child: Column(
30+
children: [
31+
ClipRRect(
32+
borderRadius: BorderRadius.only(
33+
topLeft: Radius.circular(AppSize.s12),
34+
topRight: Radius.circular(AppSize.s12),
35+
),
36+
child: Image.network(
37+
imageUrl,
38+
height: AppSize.s120,
39+
width: double.infinity,
40+
fit: BoxFit.cover,
41+
),
3542
),
36-
),
37-
Expanded(
38-
child: Center(
39-
child: Text(title, style: StylesManager.medium16Black),
43+
Expanded(
44+
child: Center(
45+
child: Text(title, style: StylesManager.medium16Black),
46+
),
4047
),
41-
),
42-
],
48+
],
49+
),
4350
),
4451
),
4552
);

lib/features/home/presentation/widgets/more_workouts_widget.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class _MoreWorkoutsWidgetState extends State<MoreWorkoutsWidget> {
2020
return Column(
2121
crossAxisAlignment: CrossAxisAlignment.start,
2222
children: [
23-
Text(AppStrings.moreWorkouts, style: StylesManager.semiBold20black),
23+
Text(AppStrings.moreWorkouts, style: StylesManager.medium20Black),
2424
SizedBox(height: AppSize.s16),
2525
WorkoutFilterChips(
2626
selectedIndex: _selectedFilterIndex,

0 commit comments

Comments
 (0)