Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
2c29a5f
feat: add monthly overview widgets for statistics screen
abdo-essam Feb 6, 2026
9ab3aa9
feat: set statistics screen as initial route and refactor Monthly Ove…
abdo-essam Feb 6, 2026
a84c02d
chore: ignore generated localization files and CMakeLists.txt
abdo-essam Feb 6, 2026
14baec3
refactor: rename SummaryCard to SummaryItem and enhance UI
abdo-essam Feb 6, 2026
d9cf9da
refactor: replace `_AnimatedProgressBar` with `_GradientProgressBar`
abdo-essam Feb 6, 2026
1caf56c
refactor: update ScaleLabels widget styling
abdo-essam Feb 6, 2026
550f6c6
feat: refactor MonthlyOverview and SavingsBanner UI
abdo-essam Feb 6, 2026
35370a8
refactor: simplify border radius in MonthlyOverview
abdo-essam Feb 6, 2026
e381e7f
refactor: update monthly overview summary item UI
abdo-essam Feb 6, 2026
fabe4e1
refactor: adjust spacing in MonthlyOverview widget
abdo-essam Feb 6, 2026
1ba86ea
refactor: use theme colors in ProgressBarSection
abdo-essam Feb 6, 2026
230b706
feat: update scale label text color for monthly overview
abdo-essam Feb 6, 2026
ff643f6
refactor: modularize Statistics screen and introduce dedicated state …
abdo-essam Feb 11, 2026
5c1b85d
Merge remote-tracking branch 'origin/dev' into feature/statistics-mon…
abdo-essam Feb 11, 2026
777ca93
Merge remote-tracking branch 'origin/feature/statistics-monthly-overv…
abdo-essam Feb 11, 2026
6edf027
refactor(core): update DI and navigation routes
abdo-essam Feb 11, 2026
3b1666b
feat: add fake statistics repository for UI development
abdo-essam Feb 11, 2026
97cc3f0
Merge remote-tracking branch 'origin/feature/statistics-monthly-overv…
abdo-essam Feb 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 32 additions & 20 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# ==============================
# Miscellaneous
# ==============================
*.class
*.log
*.pyc
Expand All @@ -15,39 +17,49 @@ migrate_working_dir/
*.secret
*.properties
*.lock
# IntelliJ related

# ==============================
# IDE
# ==============================
*.iml
*.ipr
*.iws
.idea/

# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Uncomment if you DON'T want VS Code settings in git
# .vscode/

# Flutter/Dart/Pub related
# ==============================
# Flutter / Dart / Pub
# ==============================
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins-dependencies
.pub-cache/
.pub/
/build/
/coverage/
pubspec.lock
build/
coverage/

# Symbolication related
app.*.symbols
# ⚠️ If this is a PACKAGE keep this ignored
# ⚠️ If this is an APP you may want to track it
pubspec.lock

# Obfuscation related
app.*.map.json
# Generated files
*.g.dart
*.freezed.dart
*.gen.dart

# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release
# ==============================
# iOS
# ==============================
ios/Flutter/Debug.xcconfig
ios/Flutter/Release.xcconfig
ios/Podfile

# Flutter generated localization files
**/l10n/app_localizations.dart
**/l10n/app_localizations_*.dart
# ===========================
/lib/presentation/navigation/routes.g.dart
/lib/core/l10n/app_localizations.dart
/lib/core/l10n/app_localizations_ar.dart
/lib/core/l10n/app_localizations_en.dart
/lib/utils/CMakeLists.txt
17 changes: 17 additions & 0 deletions assets/icons/ic_money_remove.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 changes: 14 additions & 0 deletions assets/icons/ic_wallet_add.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions ios/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,5 @@ Runner/GeneratedPluginRegistrant.*
!default.mode2v3
!default.pbxuser
!default.perspectivev3
/Flutter/Debug.xcconfig
/Flutter/Release.xcconfig
1 change: 0 additions & 1 deletion ios/Flutter/Debug.xcconfig

This file was deleted.

1 change: 0 additions & 1 deletion ios/Flutter/Release.xcconfig

This file was deleted.

52 changes: 37 additions & 15 deletions lib/di/injection.dart → lib/core/di/injection.dart
Original file line number Diff line number Diff line change
@@ -1,21 +1,25 @@
import 'package:get_it/get_it.dart';
import 'package:moneyplus/domain/repository/transaction_repository.dart';
import 'package:moneyplus/presentation/account_setup/cubit/account_setup_cubit.dart';
import 'package:moneyplus/presentation/transactions/cubit/transaction_cubit.dart';

import '../data/repository/account_repository.dart';
import '../data/repository/authentication_repository.dart';
import '../data/repository/user_money_repository.dart';
import '../data/repository/transaction_repository_stub.dart';
import '../data/service/app_secrets_provider.dart';
import '../data/service/supabase_service.dart';
import '../domain/repository/account_repository.dart';
import '../domain/repository/authentication_repository.dart';
import '../domain/repository/user_money_repository.dart';
import '../domain/validator/authentication_validator.dart';
import '../presentation/home/cubit/home_cubit.dart';
import '../presentation/income/cubit/add_income_cubit.dart';
import '../presentation/login/cubit/login_cubit.dart';
import '../../data/repository/account_repository.dart';
import '../../data/repository/authentication_repository.dart';
import '../../data/repository/statistics_repository_impl.dart';
import '../../data/repository/transaction_repository_stub.dart';
import '../../data/repository/user_money_repository.dart';
import '../../data/repository/fake_statistics_repository.dart';
import '../../data/service/app_secrets_provider.dart';
import '../../data/service/supabase_service.dart';
import '../../domain/repository/account_repository.dart';
import '../../domain/repository/authentication_repository.dart';
import '../../domain/repository/statistics_repository.dart';
import '../../domain/repository/user_money_repository.dart';
import '../../domain/validator/authentication_validator.dart';
import '../../domain/repository/transaction_repository.dart';
import '../../presentation/home/cubit/home_cubit.dart';
import '../../presentation/income/cubit/add_income_cubit.dart';
import '../../presentation/login/cubit/login_cubit.dart';
import '../../presentation/statistics/cubit/statistics_cubit.dart';
import '../../presentation/transactions/cubit/transaction_cubit.dart';

final getIt = GetIt.instance;

Expand Down Expand Up @@ -69,4 +73,22 @@ void initDI() {
() =>
TransactionCubit(transactionRepository: getIt<TransactionRepository>()),
);

// Statistics
// TODO: Remove this when done testing UI
getIt.registerLazySingleton<StatisticsRepository>(
() => FakeStatisticsRepository(),
);

// getIt.registerLazySingleton<StatisticsRepository>(
// () => StatisticsRepositoryImpl(
// supabaseService: getIt<SupabaseService>(),
// ),
// );

getIt.registerFactory<StatisticsCubit>(
() => StatisticsCubit(
repository: getIt<StatisticsRepository>(),
),
);
}
61 changes: 41 additions & 20 deletions lib/core/l10n/app_ar.arb
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,23 @@
"moneyAmount": "{amount} {currency} ",
"date": "التاريخ",
"setUpYourAccount": "لنقم بإعداد حسابك",
"setSalary": "تحديد الراتب",
"currency": "العملة",
"salaryDay": "يوم الراتب",
"fromEachMonth": "من كل شهر",
"salary": "الراتب",
"accountSetup": "إعداد الحساب",
"search": "...بحث",
"select": "اختيار",
"next": "التالي",
"finishSetup": "إنهاء الإعداد",
"stepOf": "الخطوة {current} من {total}",
"stepOfTotal": "الخطوة {current} من {total}",
"setSalary": "تحديد الراتب",
"currency": "العملة",
"salaryDay": "يوم الراتب",
"fromEachMonth": "من كل شهر",
"salary": "الراتب",
"accountSetup": "إعداد الحساب",
"search": "...بحث",
"select": "اختيار",
"next": "التالي",
"finishSetup": "إنهاء الإعداد",
"stepOf": "الخطوة {current} من {total}",
"stepOfTotal": "الخطوة {current} من {total}",
"forgetPasswordAppBarTitle": "نسيت كلمة السر",
"forgetPasswordTitle": "نسيت كلمة المرور الخاصة بك",
"forgetPasswordSubtitle": "أدخل بريدك الإلكتروني وسنرسل لك رابطًا لإعادة التعيين",
"forgetPasswordEmailHint": "البريد الإلكتروني",
"forgetPasswordButton": "إرسال رابط إعادة التعيين",

"updatePasswordAppBarTitle": "تحديث كلمة المرور",
"updatePasswordTitle": "أدخل كلمة مرور جديدة لـ",
"updatePasswordPasswordHint": "كلمة المرور الجديدة",
Expand All @@ -38,9 +37,9 @@
"updatePasswordSuccessMessage": "تم تحديث كلمة المرور بنجاح",
"updatePasswordErrorMessage": "خطأ في تحديث كلمة المرور",
"error": "خطأ",
"success" : "نجاح",
"loading" : "تحميل",
"login_successfully" : "تم تسجيل الدخول بنجاح",
"success": "نجاح",
"loading": "تحميل",
"login_successfully": "تم تسجيل الدخول بنجاح",
"login_welcome_title": "أهلاً بك مجدداً!",
"login_welcome_subtitle": "أدخل بياناتك الخاصة للوصول إلى حسابك",
"login_email_hint": "البريد الإلكتروني",
Expand Down Expand Up @@ -74,6 +73,28 @@
"currencyCode": "دينار",
"spendingTrend": "اتجاه الإنفاق",
"noDataAvailable": "لا توجد بيانات متاحة",
"statistics": "الإحصائيات",
"monthly_overview": "نظرة عامة شهرية",
"savings_message": "لقد وفرت {amount} {currency} هذا الشهر",
"@savings_message": {
"placeholders": {
"amount": {},
"currency": {}
}
},
"highest_spending_message": "أعلى إنفاق لك كان في {date}",
"@highest_spending_message": {
"placeholders": {
"date": {}
}
},
"no_statistics_title": "لا توجد بيانات كافية بعد",
"no_statistics_subtitle": "أضف المزيد من المعاملات لرؤية الإحصائيات",
"add_transaction": "إضافة معاملة",
"no_monthly_overview": "لم يتم تسجيل أي دخل أو مصروفات لهذه الفترة",
"error_loading_statistics": "فشل تحميل الإحصائيات",
"retry": "إعادة المحاولة",
"noDataAvailable": "لا توجد بيانات متاحة",
"no_spending_categories": "لا يوجد معاملات متاحة",
"month_january": "يناير",
"month_february": "فبراير",
Expand All @@ -96,9 +117,9 @@
"transaction": "المعاملات",
"transaction_error_title": "خطأ في المعاملات",
"transaction_error_content": "فشل في تحميل المعاملات",
"manage_categories" : "ادارةالتصنيفات",
"manage_categories": "ادارةالتصنيفات",
"add_new_category": "اضافة تصنيف جديد",
"add_custom_category" : "اضافة تصنيف مخصص",
"category_name" : "اسم التصنيف",
"add" : "اضافة"
"add_custom_category": "اضافة تصنيف مخصص",
"category_name": "اسم التصنيف",
"add": "اضافة"
}
67 changes: 42 additions & 25 deletions lib/core/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -38,31 +38,29 @@
"next": "Next",
"finishSetup": "Finish setup",
"stepOf": "Step {current} of {total}",
"stepOfTotal": "Step {current} of {total}",
"@stepOfTotal": {
"placeholders": {
"current": {},
"total": {}
}
},
"stepOfTotal": "Step {current} of {total}",
"@stepOfTotal": {
"placeholders": {
"current": {},
"total": {}
}
},
"forgetPasswordAppBarTitle": "Forget Password",
"forgetPasswordTitle": "Forget your password",
"forgetPasswordSubtitle": "Enter your email and we’ll send you a reset link",
"forgetPasswordEmailHint": "Email",
"forgetPasswordButton": "Send Reset Link",

"updatePasswordAppBarTitle": "Update Password",
"updatePasswordTitle": "Enter a new password for",
"updatePasswordPasswordHint": "New Password",
"updatePasswordConfirmHint": "Confirm New Password",
"updatePasswordButton": "Update Password",
"updatePasswordSuccessMessage": "Password updated successfully",
"updatePasswordErrorMessage": "Error updating password",

"error": "Error",
"success" : "Success",
"loading" : "Loading",
"login_successfully" : "Login Successfully",
"success": "Success",
"loading": "Loading",
"login_successfully": "Login Successfully",
"login_welcome_title": "Welcome again!",
"login_welcome_subtitle": "Enter your credentials to access your account",
"login_email_hint": "Email",
Expand Down Expand Up @@ -93,7 +91,6 @@
"auth_error_not_implemented": "This feature is not available on the server",
"auth_error_default": "An unexpected error occurred. Please try again later",
"no_internet_connection": "No internet connection",

"no_transaction_record_title": "No transaction records",
"no_transaction_record_content": "Add your first one to get started",
"add_transaction": "Add transaction",
Expand All @@ -103,7 +100,6 @@
"transaction": "Transaction",
"transaction_error_title": "transactions error",
"transaction_error_content": "failed to load transaction",

"currencyCode": "IQD",
"@stepOf": {
"placeholders": {
Expand All @@ -115,13 +111,7 @@
}
}
},
"stepOfTotal": "Step {current} of {total}",
"@stepOfTotal": {
"placeholders": {
"current": {},
"total": {}
}
},
"monthly_overview": "Monthly Overview",
"no_spending_categories": "No spending categories available",
"month_january": "January",
"month_february": "February",
Expand All @@ -135,9 +125,36 @@
"month_october": "October",
"month_november": "November",
"month_december": "December",
"manage_categories" : "Manage categories",
"manage_categories": "Manage categories",
"add_new_category": "Add new category",
"add_custom_category" : "Add custom category",
"category_name" : "Category name",
"add" : "Add"
"add_custom_category": "Add custom category",
"category_name": "Category name",
"stepOfTotal": "Step {current} of {total}",
"@stepOfTotal": {
"placeholders": {
"current": {},
"total": {}
}
},
"statistics": "Statistics",
"monthly_overview": "Monthly Overview",
"savings_message": "You saved {amount} {currency} this month",
"@savings_message": {
"placeholders": {
"amount": {},
"currency": {}
}
},
"highest_spending_message": "Your highest spending was on {date}",
"@highest_spending_message": {
"placeholders": {
"date": {}
}
},
"no_statistics_title": "Not enough data yet",
"no_statistics_subtitle": "Add more transactions to see insights",
"add_transaction": "Add transaction",
"no_monthly_overview": "No income or expenses recorded for this period",
"error_loading_statistics": "Failed to load statistics",
"retry": "Retry"
}
Loading
Loading