From 9e8ee708116645e5808249af9d92e9626f29fc7b Mon Sep 17 00:00:00 2001 From: mohamedshemees Date: Fri, 13 Mar 2026 20:25:23 +0200 Subject: [PATCH 1/8] fix: update AppBar surface color and apply color filters to icons --- lib/design_system/widgets/app_bar.dart | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/design_system/widgets/app_bar.dart b/lib/design_system/widgets/app_bar.dart index 75835e6e..644a6605 100644 --- a/lib/design_system/widgets/app_bar.dart +++ b/lib/design_system/widgets/app_bar.dart @@ -71,11 +71,13 @@ width: 40, height: 40, decoration: BoxDecoration( - color: context.colors.surfaceHigh, + color: context.colors.surface, shape: BoxShape.circle, ), alignment: Alignment.center, - child: SvgPicture.asset(assetPath, width: 20, height: 20), + child: SvgPicture.asset(assetPath, + colorFilter: ColorFilter.mode(context.colors.title,BlendMode.srcIn), + width: 20, height: 20), ), ); } @@ -103,7 +105,9 @@ spacing: 4, children: [ Text(date, style: typo.label.small.copyWith(color: contentColor)), - SvgPicture.asset(AppAssets.icNormalArrowDown, width: 20, height: 20), + SvgPicture.asset(AppAssets.icNormalArrowDown, + colorFilter: ColorFilter.mode(contentColor,BlendMode.srcIn), + width: 20, height: 20), ], ), ), From 187d68f3f7a2d20beac662d289508b536d3b896e Mon Sep 17 00:00:00 2001 From: mohamedshemees Date: Fri, 13 Mar 2026 20:28:09 +0200 Subject: [PATCH 2/8] fix: apply color filter to filter icon in TransactionAppBar --- lib/presentation/transactions/widget/transaction_app_bar.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/presentation/transactions/widget/transaction_app_bar.dart b/lib/presentation/transactions/widget/transaction_app_bar.dart index 169adf97..6a6f2343 100644 --- a/lib/presentation/transactions/widget/transaction_app_bar.dart +++ b/lib/presentation/transactions/widget/transaction_app_bar.dart @@ -47,7 +47,9 @@ class TransactionAppBar extends StatelessWidget { borderRadius: BorderRadius.circular(100), ), child: SvgPicture.asset( - AppAssets.icFilter, height: 20, width: 20,), + AppAssets.icFilter, + colorFilter: ColorFilter.mode(colors.title,BlendMode.srcIn), + height: 20, width: 20,), ), ), ], From 980563a8ede764e39446721aafbc7c9bba992eef Mon Sep 17 00:00:00 2001 From: mohamedshemees Date: Fri, 13 Mar 2026 20:44:31 +0200 Subject: [PATCH 3/8] fix: apply theme color filters to icons and localize strings in date picker widgets --- lib/core/l10n/app_ar.arb | 3 ++- lib/core/l10n/app_en.arb | 3 ++- .../widgets/custom_date_picker.dart | 26 +++++++++++++++---- .../widgets/text_field_date_Picker.dart | 7 +++-- .../widgets/drop_down_date_dialog.dart | 8 ++++-- 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/lib/core/l10n/app_ar.arb b/lib/core/l10n/app_ar.arb index 85fa1af5..9c72c247 100644 --- a/lib/core/l10n/app_ar.arb +++ b/lib/core/l10n/app_ar.arb @@ -164,5 +164,6 @@ "system": "النظام", "home": "الرئيسية", "top_spending_category": "أكثر فئات الإنفاق", - "spend": "إنفاق" + "spend": "إنفاق", + "selectMonthYear": "اختر الشهر والسنة" } diff --git a/lib/core/l10n/app_en.arb b/lib/core/l10n/app_en.arb index 4d877f0a..4ffec0f4 100644 --- a/lib/core/l10n/app_en.arb +++ b/lib/core/l10n/app_en.arb @@ -182,5 +182,6 @@ "system": "System", "home": "Home", "top_spending_category": "Top spending category", - "spend": "Spend" + "spend": "Spend", + "selectMonthYear": "Select month & year" } diff --git a/lib/design_system/widgets/custom_date_picker.dart b/lib/design_system/widgets/custom_date_picker.dart index c7d42810..c5bc6c05 100644 --- a/lib/design_system/widgets/custom_date_picker.dart +++ b/lib/design_system/widgets/custom_date_picker.dart @@ -9,6 +9,9 @@ Future showMonthYearDialog( }) { int selectedMonth = initialMonth; int selectedYear = initialYear; + final localization = context.localizations; + final colors = context.colors; + final typography = context.typography; return showDialog( context: context, @@ -16,10 +19,11 @@ Future showMonthYearDialog( return StatefulBuilder( builder: (context, setState) { return AlertDialog( - backgroundColor: context.colors.surface, + backgroundColor: colors.surface, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), title: Text( - "Select month & year", - style: context.typography.title.medium, + localization.selectMonthYear, + style: typography.title.medium.copyWith(color: colors.title), ), content: Row( children: [ @@ -27,6 +31,9 @@ Future showMonthYearDialog( child: DropdownButton( value: selectedMonth, isExpanded: true, + dropdownColor: colors.surface, + style: typography.body.medium.copyWith(color: colors.title), + underline: Container(height: 1, color: colors.primary), items: List.generate(12, (i) => i + 1) .map( (m) => DropdownMenuItem( @@ -47,6 +54,9 @@ Future showMonthYearDialog( child: DropdownButton( value: selectedYear, isExpanded: true, + dropdownColor: colors.surface, + style: typography.body.medium.copyWith(color: colors.title), + underline: Container(height: 1, color: colors.primary), items: List.generate(50, (i) => 2000 + i) .map( (y) => DropdownMenuItem( @@ -67,14 +77,20 @@ Future showMonthYearDialog( actions: [ TextButton( onPressed: () => Navigator.pop(context), - child: const Text("Cancel"), + child: Text( + localization.cancel, + style: typography.label.large.copyWith(color: colors.primary), + ), ), TextButton( onPressed: () => Navigator.pop( context, DateTime(selectedYear, selectedMonth), ), - child: const Text("OK"), + child: Text( + localization.select, + style: typography.label.large.copyWith(color: colors.primary), + ), ), ], ); diff --git a/lib/design_system/widgets/text_field_date_Picker.dart b/lib/design_system/widgets/text_field_date_Picker.dart index 8946fbb8..d87d3d9c 100644 --- a/lib/design_system/widgets/text_field_date_Picker.dart +++ b/lib/design_system/widgets/text_field_date_Picker.dart @@ -73,7 +73,9 @@ class _TextFieldDatePickerState extends State { child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - SvgPicture.asset(AppAssets.icCalender, width: 24, height: 24), + SvgPicture.asset(AppAssets.icCalender, + colorFilter: ColorFilter.mode(colors.body,BlendMode.srcIn), + width: 24, height: 24), SizedBox(width: 8), Expanded( child: TextField( @@ -99,7 +101,7 @@ class _TextFieldDatePickerState extends State { builder: (context, child) { return Theme( data: Theme.of(context).copyWith( - colorScheme: ColorScheme.light( + colorScheme: Theme.of(context).colorScheme.copyWith( primary: colors.primary, onPrimary: colors.onPrimary, onSurface: colors.title, @@ -128,6 +130,7 @@ class _TextFieldDatePickerState extends State { ), SvgPicture.asset( AppAssets.icArrowDownRound, + colorFilter: ColorFilter.mode(colors.body,BlendMode.srcIn), width: 24, height: 24, ), diff --git a/lib/presentation/widgets/drop_down_date_dialog.dart b/lib/presentation/widgets/drop_down_date_dialog.dart index 77078b31..7b7f0c57 100644 --- a/lib/presentation/widgets/drop_down_date_dialog.dart +++ b/lib/presentation/widgets/drop_down_date_dialog.dart @@ -40,13 +40,17 @@ class DropDownDateDialog extends StatelessWidget { borderRadius: BorderRadius.circular(100), ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 4, children: [ Text( "${getMonthNameFromNumber(month, context)}, $year", style: typography.label.small.copyWith(color: colors.title), ), - SvgPicture.asset(AppAssets.arrowDownV2), + SvgPicture.asset(AppAssets.arrowDownV2, + colorFilter: ColorFilter.mode(colors.title,BlendMode.srcIn), + width: 16, + height: 16, + ), ], ), ), From dbf412467ce79fd41ef266daea8a84745d97984e Mon Sep 17 00:00:00 2001 From: mohamedshemees Date: Fri, 13 Mar 2026 20:48:38 +0200 Subject: [PATCH 4/8] feat: enable matchTextDirection for SvgPicture in AppBar --- lib/design_system/widgets/app_bar.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/design_system/widgets/app_bar.dart b/lib/design_system/widgets/app_bar.dart index 644a6605..4df777cd 100644 --- a/lib/design_system/widgets/app_bar.dart +++ b/lib/design_system/widgets/app_bar.dart @@ -76,6 +76,7 @@ ), alignment: Alignment.center, child: SvgPicture.asset(assetPath, + matchTextDirection: true, colorFilter: ColorFilter.mode(context.colors.title,BlendMode.srcIn), width: 20, height: 20), ), From 6b749679a121a85bc540183d2963caeabf1b6b7f Mon Sep 17 00:00:00 2001 From: mohamedshemees Date: Fri, 13 Mar 2026 21:18:50 +0200 Subject: [PATCH 5/8] fix: update statistics layout, state handling, and assets --- assets/icons/ic_celebrate.svg | 14 +++++ lib/design_system/assets/app_assets.dart | 1 + .../statistics/statistics_screen.dart | 57 ++++++++++--------- .../overview_savings_banner.dart | 2 +- 4 files changed, 46 insertions(+), 28 deletions(-) create mode 100644 assets/icons/ic_celebrate.svg diff --git a/assets/icons/ic_celebrate.svg b/assets/icons/ic_celebrate.svg new file mode 100644 index 00000000..8f1879b8 --- /dev/null +++ b/assets/icons/ic_celebrate.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/lib/design_system/assets/app_assets.dart b/lib/design_system/assets/app_assets.dart index e6ba0967..bd77bff6 100644 --- a/lib/design_system/assets/app_assets.dart +++ b/lib/design_system/assets/app_assets.dart @@ -82,4 +82,5 @@ class AppAssets { static const String icEmptyRadioButton = '$_icons/ic_circle.svg'; static const String icSelectedRadioButton = '$_icons/ic_check_circle.svg'; static const String glowBackground = '$_images/money_background.png'; + static const String icCelebrate = '$_images/ic_celebrate.svg'; } diff --git a/lib/presentation/statistics/statistics_screen.dart b/lib/presentation/statistics/statistics_screen.dart index 2d144217..098b9449 100644 --- a/lib/presentation/statistics/statistics_screen.dart +++ b/lib/presentation/statistics/statistics_screen.dart @@ -44,22 +44,32 @@ class _StatisticsViewState extends State { @override Widget build(BuildContext context) { + final state = context.watch().state; + final l10n = context.localizations; + return Scaffold( backgroundColor: context.colors.surface, + appBar: CustomAppBar( + title: l10n.statistics, + trailing: switch (state) { + StatisticsSuccess(:final selectedMonth) => DropDownDateDialog( + onDatePick: (date) => context.read().changeMonth(date), + year: selectedMonth.year, + month: selectedMonth.month, + ), + _ => null, + }, + ), body: SafeArea( - child: BlocBuilder( - builder: (context, state) { - return switch (state) { - StatisticsIdle() => const SizedBox.shrink(), - StatisticsLoading() => const AppLoadingIndicator(), - StatisticsSuccess() => _buildSuccess(context, state), - StatisticsFailure(:final message) => AppErrorView( - message: message, - onRetry: _onRetry, - ), - }; - }, - ), + child: switch (state) { + StatisticsIdle() => const SizedBox.shrink(), + StatisticsLoading() => const AppLoadingIndicator(), + StatisticsSuccess() => _buildSuccess(context, state), + StatisticsFailure(:final message) => AppErrorView( + message: message, + onRetry: _onRetry, + ), + }, ), ); } @@ -77,24 +87,17 @@ class _StatisticsViewState extends State { } return SingleChildScrollView( - padding: const EdgeInsets.all(16), - child: Column( - children: [ - CustomAppBar( - title: l10n.statistics, - trailing: DropDownDateDialog( - onDatePick: (date) => { - context.read().changeMonth(date), - }, - year: state.selectedMonth.year, - month: state.selectedMonth.month, - ), - ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ MonthlyOverviewSection(overview: state.monthlyOverview), + const SizedBox(height: 16), CategoryBreakdownWidget( categoriesBreakdown: state.categoriesBreakdown, ), - ], + ], + ), ), ); } diff --git a/lib/presentation/statistics/widgets/monthly_overview/overview_savings_banner.dart b/lib/presentation/statistics/widgets/monthly_overview/overview_savings_banner.dart index 80adaa8a..75576e69 100644 --- a/lib/presentation/statistics/widgets/monthly_overview/overview_savings_banner.dart +++ b/lib/presentation/statistics/widgets/monthly_overview/overview_savings_banner.dart @@ -37,7 +37,7 @@ class OverviewSavingsBanner extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ SvgPicture.asset( - AppAssets.icWalletAdd, + AppAssets.icCelebrate, width: DesignConstants.iconSizeSmall, height: DesignConstants.iconSizeSmall, colorFilter: ColorFilter.mode( From 591bb12b316ba63c6ccbde5efecb85be87f2a303 Mon Sep 17 00:00:00 2001 From: mohamedshemees Date: Fri, 13 Mar 2026 21:40:21 +0200 Subject: [PATCH 6/8] feat: show add transaction bottom sheet in statistics screen --- lib/presentation/statistics/statistics_screen.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/presentation/statistics/statistics_screen.dart b/lib/presentation/statistics/statistics_screen.dart index 098b9449..15442b63 100644 --- a/lib/presentation/statistics/statistics_screen.dart +++ b/lib/presentation/statistics/statistics_screen.dart @@ -8,7 +8,9 @@ import 'package:moneyplus/design_system/widgets/app_empty_view.dart'; import 'package:moneyplus/design_system/widgets/app_error_view.dart'; import 'package:moneyplus/design_system/widgets/app_loading_indicator.dart'; import 'package:moneyplus/presentation/statistics/widgets/CategoryBreakdown.dart'; +import 'package:moneyplus/presentation/transactions/screen/transactions_screen.dart'; +import '../transactions/widget/add_transaction_bottom_sheet.dart'; import '../widgets/drop_down_date_dialog.dart'; import 'cubit/statistics_cubit.dart'; import 'cubit/statistics_state.dart'; @@ -35,7 +37,7 @@ class StatisticsView extends StatefulWidget { class _StatisticsViewState extends State { void _onAddTransaction() { - // Navigate to add transaction + showAddTransactionBottomSheet(context); } void _onRetry() { From 4100d420699a4c6e5552200ec9a04dec7eff70a7 Mon Sep 17 00:00:00 2001 From: mohamedshemees Date: Fri, 13 Mar 2026 22:07:35 +0200 Subject: [PATCH 7/8] feat: add Arabic translations for missing strings and transactions nav bar label --- lib/core/l10n/app_ar.arb | 10 +++++++++- lib/design_system/widgets/nav_bar.dart | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/core/l10n/app_ar.arb b/lib/core/l10n/app_ar.arb index 2d0d0464..b80607e5 100644 --- a/lib/core/l10n/app_ar.arb +++ b/lib/core/l10n/app_ar.arb @@ -168,5 +168,13 @@ "home": "الرئيسية", "top_spending_category": "أكثر فئات الإنفاق", "spend": "إنفاق", - "selectMonthYear": "اختر الشهر والسنة" + "selectMonthYear": "اختر الشهر والسنة", + "addIncome": "إضافة دخل", + "saving": "ادخار", + "spending": "إنفاق", + "incomeAddedSuccessfully": "تم إضافة الدخل بنجاح!", + "failedToAddIncome": "فشل في إضافة الدخل", + "whereDoYouUsuallySpendYourMoney": "أين تنفق أموالك عادة؟", + "suggestions": "اقتراحات", + "selectedCategories": "التصنيفات المختارة" } diff --git a/lib/design_system/widgets/nav_bar.dart b/lib/design_system/widgets/nav_bar.dart index 698f0cd9..ac4b8d6c 100644 --- a/lib/design_system/widgets/nav_bar.dart +++ b/lib/design_system/widgets/nav_bar.dart @@ -32,7 +32,7 @@ enum NavBarTab { case NavBarTab.home: return l10n.home; case NavBarTab.transaction: - return l10n.transaction; + return l10n.transactions; case NavBarTab.statistics: return l10n.statistics; case NavBarTab.account: From b0a546446aa865e2addb280d490870d3be6488c5 Mon Sep 17 00:00:00 2001 From: mohamedshemees Date: Fri, 13 Mar 2026 23:00:18 +0200 Subject: [PATCH 8/8] fix: visibility icon tint --- lib/presentation/login/widget/login_form.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/presentation/login/widget/login_form.dart b/lib/presentation/login/widget/login_form.dart index 981ee496..6bffb434 100644 --- a/lib/presentation/login/widget/login_form.dart +++ b/lib/presentation/login/widget/login_form.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import '../../../core/l10n/app_localizations.dart'; import '../../../design_system/assets/app_assets.dart'; +import '../../../design_system/theme/money_extension_context.dart'; import '../../../design_system/widgets/text_field.dart'; class LoginForm extends StatefulWidget { @@ -28,6 +29,7 @@ class _LoginFormState extends State { @override Widget build(BuildContext context) { final localizations = AppLocalizations.of(context)!; + final colors = context.colors; return Column( children: [ MTextField( @@ -58,6 +60,8 @@ class _LoginFormState extends State { child: Padding( padding: const EdgeInsets.symmetric(vertical: 14), child: SvgPicture.asset( + width: 20,height: 20, + colorFilter: ColorFilter.mode(colors.hint, BlendMode.srcIn), _isPasswordVisible ? AppAssets.eyeOpen : AppAssets.eyeClose, ), ),