diff --git a/recipients_app/README.md b/recipients_app/README.md index a0a83e115..57fdce2f6 100644 --- a/recipients_app/README.md +++ b/recipients_app/README.md @@ -142,8 +142,8 @@ translations after you changed something run: flutter gen-l10n ``` -To use a translated string in the code use: -`AppLocalizations.of(context).helloWorld` and import: +To use a translated string in the code use: `context.l10n.helloWorld` +and import: `import 'package:flutter_gen/gen_l10n/app_localizations.dart';` ### Upgrade flutter version @@ -177,9 +177,10 @@ https://docs.codemagic.io/codemagic-yaml-cheatsheet.html See [How to test](./docu/app_testing_guides/how_to_test.md) -### Run golden tests +### Golden tests -Run `flutter test --update-golden` to update golden files. +- Run `flutter test` to run all tests incl. all golden tests. +- Run `flutter test --update-goldens` to update golden files. ## Releasing diff --git a/recipients_app/ios/Podfile b/recipients_app/ios/Podfile index c4cf526aa..35cba9821 100644 --- a/recipients_app/ios/Podfile +++ b/recipients_app/ios/Podfile @@ -30,7 +30,7 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! use_modular_headers! - pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '11.4.0' + pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '11.7.0' flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) end diff --git a/recipients_app/ios/Podfile.lock b/recipients_app/ios/Podfile.lock index 8ae9b0083..398a77872 100644 --- a/recipients_app/ios/Podfile.lock +++ b/recipients_app/ios/Podfile.lock @@ -3,70 +3,70 @@ PODS: - GoogleUtilities/Environment (~> 8.0) - GoogleUtilities/UserDefaults (~> 8.0) - PromisesObjC (~> 2.4) - - cloud_firestore (5.6.0): - - Firebase/Firestore (= 11.4.0) + - cloud_firestore (5.6.3): + - Firebase/Firestore (= 11.7.0) - firebase_core - Flutter - - Firebase/Auth (11.4.0): + - Firebase/Auth (11.7.0): - Firebase/CoreOnly - - FirebaseAuth (~> 11.4.0) - - Firebase/CoreOnly (11.4.0): - - FirebaseCore (= 11.4.0) - - Firebase/Firestore (11.4.0): + - FirebaseAuth (~> 11.7.0) + - Firebase/CoreOnly (11.7.0): + - FirebaseCore (~> 11.7.0) + - Firebase/Firestore (11.7.0): - Firebase/CoreOnly - - FirebaseFirestore (~> 11.4.0) - - Firebase/Messaging (11.4.0): + - FirebaseFirestore (~> 11.7.0) + - Firebase/Messaging (11.7.0): - Firebase/CoreOnly - - FirebaseMessaging (~> 11.4.0) - - firebase_app_check (0.3.1-7): - - Firebase/CoreOnly (~> 11.4.0) + - FirebaseMessaging (~> 11.7.0) + - firebase_app_check (0.3.2-2): + - Firebase/CoreOnly (~> 11.7.0) - firebase_core - - FirebaseAppCheck (~> 11.4.0) + - FirebaseAppCheck (~> 11.7.0) - Flutter - - firebase_auth (5.3.4): - - Firebase/Auth (= 11.4.0) + - firebase_auth (5.4.2): + - Firebase/Auth (= 11.7.0) - firebase_core - Flutter - - firebase_core (3.9.0): - - Firebase/CoreOnly (= 11.4.0) + - firebase_core (3.11.0): + - Firebase/CoreOnly (= 11.7.0) - Flutter - - firebase_messaging (15.1.6): - - Firebase/Messaging (= 11.4.0) + - firebase_messaging (15.2.2): + - Firebase/Messaging (= 11.7.0) - firebase_core - Flutter - - FirebaseAppCheck (11.4.0): + - FirebaseAppCheck (11.7.0): - AppCheckCore (~> 11.0) - FirebaseAppCheckInterop (~> 11.0) - - FirebaseCore (~> 11.0) + - FirebaseCore (~> 11.7.0) - GoogleUtilities/Environment (~> 8.0) - GoogleUtilities/UserDefaults (~> 8.0) - - FirebaseAppCheckInterop (11.6.0) - - FirebaseAuth (11.4.0): + - FirebaseAppCheckInterop (11.8.0) + - FirebaseAuth (11.7.0): - FirebaseAppCheckInterop (~> 11.0) - FirebaseAuthInterop (~> 11.0) - - FirebaseCore (~> 11.4) - - FirebaseCoreExtension (~> 11.4) + - FirebaseCore (~> 11.7.0) + - FirebaseCoreExtension (~> 11.7.0) - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - GoogleUtilities/Environment (~> 8.0) - GTMSessionFetcher/Core (< 5.0, >= 3.4) - RecaptchaInterop (~> 100.0) - - FirebaseAuthInterop (11.6.0) - - FirebaseCore (11.4.0): - - FirebaseCoreInternal (~> 11.0) + - FirebaseAuthInterop (11.8.0) + - FirebaseCore (11.7.0): + - FirebaseCoreInternal (~> 11.7.0) - GoogleUtilities/Environment (~> 8.0) - GoogleUtilities/Logger (~> 8.0) - - FirebaseCoreExtension (11.4.0): - - FirebaseCore (~> 11.0) - - FirebaseCoreInternal (11.6.0): + - FirebaseCoreExtension (11.7.0): + - FirebaseCore (~> 11.7.0) + - FirebaseCoreInternal (11.7.0): - "GoogleUtilities/NSData+zlib (~> 8.0)" - - FirebaseFirestore (11.4.0): - - FirebaseFirestoreBinary (= 11.4.0) + - FirebaseFirestore (11.7.0): + - FirebaseFirestoreBinary (= 11.7.0) - FirebaseFirestoreAbseilBinary (1.2024011602.0) - - FirebaseFirestoreBinary (11.4.0): - - FirebaseCore (= 11.4.0) - - FirebaseCoreExtension (= 11.4.0) - - FirebaseFirestoreInternalBinary (= 11.4.0) - - FirebaseSharedSwift (= 11.4.0) + - FirebaseFirestoreBinary (11.7.0): + - FirebaseCore (= 11.7.0) + - FirebaseCoreExtension (= 11.7.0) + - FirebaseFirestoreInternalBinary (= 11.7.0) + - FirebaseSharedSwift (= 11.7.0) - FirebaseFirestoreGRPCBoringSSLBinary (1.65.1) - FirebaseFirestoreGRPCCoreBinary (1.65.1): - FirebaseFirestoreAbseilBinary (= 1.2024011602.0) @@ -74,19 +74,19 @@ PODS: - FirebaseFirestoreGRPCCPPBinary (1.65.1): - FirebaseFirestoreAbseilBinary (= 1.2024011602.0) - FirebaseFirestoreGRPCCoreBinary (= 1.65.1) - - FirebaseFirestoreInternalBinary (11.4.0): - - FirebaseCore (= 11.4.0) + - FirebaseFirestoreInternalBinary (11.7.0): + - FirebaseCore (= 11.7.0) - FirebaseFirestoreAbseilBinary (= 1.2024011602.0) - FirebaseFirestoreGRPCCPPBinary (= 1.65.1) - leveldb-library (~> 1.22) - nanopb (~> 3.30910.0) - - FirebaseInstallations (11.4.0): - - FirebaseCore (~> 11.0) + - FirebaseInstallations (11.7.0): + - FirebaseCore (~> 11.7.0) - GoogleUtilities/Environment (~> 8.0) - GoogleUtilities/UserDefaults (~> 8.0) - PromisesObjC (~> 2.4) - - FirebaseMessaging (11.4.0): - - FirebaseCore (~> 11.0) + - FirebaseMessaging (11.7.0): + - FirebaseCore (~> 11.7.0) - FirebaseInstallations (~> 11.0) - GoogleDataTransport (~> 10.0) - GoogleUtilities/AppDelegateSwizzler (~> 8.0) @@ -94,7 +94,7 @@ PODS: - GoogleUtilities/Reachability (~> 8.0) - GoogleUtilities/UserDefaults (~> 8.0) - nanopb (~> 3.30910.0) - - FirebaseSharedSwift (11.4.0) + - FirebaseSharedSwift (11.7.0) - Flutter (1.0.0) - flutter_native_splash (2.4.3): - Flutter @@ -125,7 +125,7 @@ PODS: - GoogleUtilities/UserDefaults (8.0.2): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GTMSessionFetcher/Core (4.1.0) + - GTMSessionFetcher/Core (4.3.0) - leveldb-library (1.22.6) - nanopb (3.30910.0): - nanopb/decode (= 3.30910.0) @@ -153,7 +153,7 @@ DEPENDENCIES: - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - - FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `11.4.0`) + - FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `11.7.0`) - Flutter (from `Flutter`) - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) @@ -203,7 +203,7 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/firebase_messaging/ios" FirebaseFirestore: :git: https://github.com/invertase/firestore-ios-sdk-frameworks.git - :tag: 11.4.0 + :tag: 11.7.0 Flutter: :path: Flutter flutter_native_splash: @@ -220,38 +220,38 @@ EXTERNAL SOURCES: CHECKOUT OPTIONS: FirebaseFirestore: :git: https://github.com/invertase/firestore-ios-sdk-frameworks.git - :tag: 11.4.0 + :tag: 11.7.0 SPEC CHECKSUMS: AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f - cloud_firestore: 50c9e447367f07951ec36e06dffbce8e38bc2149 - Firebase: cf1b19f21410b029b6786a54e9764a0cacad3c99 - firebase_app_check: 106382d86713329d844a412d44eccfc1779ee8d1 - firebase_auth: dee97e7428ef7c304083839d4e3bc4313c03afd5 - firebase_core: 726c34112998e66d1ddaf4b1bef78ed2dd4b9804 - firebase_messaging: a538130cb2bca3ea0ff0892b8c948bd7d20ecaed - FirebaseAppCheck: 933cbda29279ed316b82360bca77602ac1af1ff2 - FirebaseAppCheckInterop: 347aa09a805219a31249b58fc956888e9fcb314b - FirebaseAuth: c359af98bd703cbf4293eec107a40de08ede6ce6 - FirebaseAuthInterop: a919d415797d23b7bfe195a04f322b86c65020ef - FirebaseCore: e0510f1523bc0eb21653cac00792e1e2bd6f1771 - FirebaseCoreExtension: 4445e4cd877e0790c4af33bedca61eaef27b7513 - FirebaseCoreInternal: d98ab91e2d80a56d7b246856a8885443b302c0c2 - FirebaseFirestore: 97f18b411aaca686a9e94ba742341228643b1a46 + cloud_firestore: 176d7a2e629c6473b1f99c413e27efe08715e7af + Firebase: a64bf6a8546e6eab54f1c715cd6151f39d2329f4 + firebase_app_check: 0fe3abd6014c23d8cb1c865f7e9d34d5e44ca983 + firebase_auth: a1aa0a20e8de111be5b9a5a2ba73201877f9f53d + firebase_core: 3d36094af9b47c46bfb965943413a39eebaca4db + firebase_messaging: 5881ea6744fe41f0759bc52844c530d64f3c37e3 + FirebaseAppCheck: 2bd832b48faa38f7d86f902c57f78af93eae4cdc + FirebaseAppCheckInterop: 7bf86d55a2b7e9bd91464120eba3e52e4b63b2e2 + FirebaseAuth: 77e25aa24f3e1c626c5babd3338551fc1669ee0e + FirebaseAuthInterop: 651756e70d9a0b9160db39ead71fd5507dbb6c84 + FirebaseCore: 3227e35f4197a924206fbcdc0349325baf4f5de4 + FirebaseCoreExtension: 206c1b399f0d103055207c16f299b28e3dbd1949 + FirebaseCoreInternal: d6c17dafc8dc33614733a8b52df78fcb4394c881 + FirebaseFirestore: 61305c5ac196ec1526dde68ac132543a7749a081 FirebaseFirestoreAbseilBinary: fa2ebd2ed02cadef5382e4f7c93f1b265c812c85 - FirebaseFirestoreBinary: d0380b879b58d663b22467017d0e348d5b17b36b + FirebaseFirestoreBinary: 86eaad2ff00b789242734496029a3d08d4d86a89 FirebaseFirestoreGRPCBoringSSLBinary: d86ebbe2adc8d15d7ebf305fff7d6358385327f8 FirebaseFirestoreGRPCCoreBinary: 472bd808e1886a5efb2fd03dd09b98d34641a335 FirebaseFirestoreGRPCCPPBinary: db76d83d2b7517623f8426ed7f7a17bad2478084 - FirebaseFirestoreInternalBinary: 01c33a6d789b95dce32dbdfcaf30d60ddf8902d8 - FirebaseInstallations: 6ef4a1c7eb2a61ee1f74727d7f6ce2e72acf1414 - FirebaseMessaging: f8a160d99c2c2e5babbbcc90c4a3e15db036aee2 - FirebaseSharedSwift: 505dae2d05969dbf6d43749a642bb1bf230f0252 + FirebaseFirestoreInternalBinary: 1850c8c72f3d7933a00a4d0bae88021df87c9e10 + FirebaseInstallations: 9347e719c3d52d8d7b9074b2c32407dd027305e9 + FirebaseMessaging: 00ece041b71ddb52a2862ffdee73fb6e9824bd0c + FirebaseSharedSwift: a45efd84d60ebbfdcdbaebc66948af3630459e62 Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 flutter_native_splash: 576fbd69b830a63594ae678396fa17e43abbc5f8 GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d - GTMSessionFetcher: 923b710231ad3d6f3f0495ac1ced35421e07d9a6 + GTMSessionFetcher: 257ead9ba8e15a2d389d79496e02b9cc5dd0c62c leveldb-library: cc8b8f8e013647a295ad3f8cd2ddf49a6f19be19 nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 @@ -262,6 +262,6 @@ SPEC CHECKSUMS: url_launcher_ios: 694010445543906933d732453a59da0a173ae33d webview_flutter_wkwebview: 44d4dee7d7056d5ad185d25b38404436d56c547c -PODFILE CHECKSUM: 9a0f6acd578ce2f2c9bd914d243f7f5d4c09eda4 +PODFILE CHECKSUM: 071e7eec1de34b6d35023216246825eb65a204cb COCOAPODS: 1.16.2 diff --git a/recipients_app/l10n.yaml b/recipients_app/l10n.yaml index 146c2176c..d55f5b400 100644 --- a/recipients_app/l10n.yaml +++ b/recipients_app/l10n.yaml @@ -1,4 +1,5 @@ -arb-dir: lib/l10n +arb-dir: lib/l10n/arb template-arb-file: app_en.arb output-localization-file: app_localizations.dart untranslated-messages-file: untranslated_messages.txt +nullable-getter: false diff --git a/recipients_app/lib/data/datasource/demo/no_op_document_reference.dart b/recipients_app/lib/data/datasource/demo/no_op_document_reference.dart index 8006c327c..d94aea133 100644 --- a/recipients_app/lib/data/datasource/demo/no_op_document_reference.dart +++ b/recipients_app/lib/data/datasource/demo/no_op_document_reference.dart @@ -3,6 +3,7 @@ import "package:cloud_firestore/cloud_firestore.dart"; // We are using DocumentReference in repository / data source. That's why we need to get // no-op implementation for it for demo data source. +// NoOpDocumentReference is a no-op implementation of DocumentReference. // ignore: subtype_of_sealed_class class NoOpDocumentReference implements DocumentReference> { const NoOpDocumentReference(); diff --git a/recipients_app/lib/data/models/payment/payment_ui_status.dart b/recipients_app/lib/data/models/payment/payment_ui_status.dart index 05b04bc5a..b347b03a2 100644 --- a/recipients_app/lib/data/models/payment/payment_ui_status.dart +++ b/recipients_app/lib/data/models/payment/payment_ui_status.dart @@ -1,10 +1,80 @@ +import "package:app/ui/configs/app_colors.dart"; +import "package:flutter/material.dart"; + enum PaymentUiStatus { - confirmed, - contested, - toReview, - recentToReview, - onHoldContested, - onHoldToReview, - toBePaid, - empty, + /// blue label, white font, confirm icon + confirmed( + color: AppColors.primaryColor, + icon: Icons.check_rounded, + textColor: Colors.white, + iconColor: Colors.white, + ), + + /// yellow label, dark font, warning icon + contested( + color: AppColors.yellowColor, + icon: Icons.priority_high_rounded, + textColor: AppColors.fontColorDark, + iconColor: AppColors.fontColorDark, + ), + + /// yellow label, dark font, warning icon + toReview( + color: AppColors.yellowColor, + icon: Icons.priority_high_rounded, + textColor: AppColors.fontColorDark, + iconColor: AppColors.fontColorDark, + ), + + /// blue label, white font, question mark icon + recentToReview( + color: AppColors.primaryColor, + icon: Icons.question_mark_rounded, + textColor: Colors.white, + iconColor: Colors.white, + ), + + /// red label, dark font, close icon + onHoldContested( + color: AppColors.redColor, + icon: Icons.close_rounded, + textColor: AppColors.fontColorDark, + iconColor: AppColors.fontColorDark, + ), + + /// red label, dark font, close icon + onHoldToReview( + color: AppColors.redColor, + icon: Icons.close_rounded, + textColor: AppColors.fontColorDark, + iconColor: AppColors.fontColorDark, + ), + + /// backgroundColor label, dark font, no visbible icon (That's why iconColor is same as color) + toBePaid( + color: AppColors.backgroundColor, + icon: Icons.timer_outlined, + textColor: AppColors.fontColorDark, + iconColor: AppColors.backgroundColor, + ), + + /// backgroundColor label, dark font, no visbible icon (That's why iconColor is same as color) + empty( + color: AppColors.backgroundColor, + icon: Icons.question_mark_rounded, + textColor: AppColors.fontColorDark, + iconColor: AppColors.backgroundColor, + ); + + final Color color; + final IconData icon; + final Color textColor; + final Color iconColor; + + const PaymentUiStatus({ + required this.color, + required this.icon, + required this.textColor, + required this.iconColor, + }); } diff --git a/recipients_app/lib/data/repositories/crash_reporting_repository.dart b/recipients_app/lib/data/repositories/crash_reporting_repository.dart index 4df9b0921..a7d12b016 100644 --- a/recipients_app/lib/data/repositories/crash_reporting_repository.dart +++ b/recipients_app/lib/data/repositories/crash_reporting_repository.dart @@ -3,7 +3,7 @@ import "dart:developer"; import "package:sentry_flutter/sentry_flutter.dart"; class CrashReportingRepository { - CrashReportingRepository(); + const CrashReportingRepository(); Future logError(Exception exception, StackTrace stackTrace) async { log("--- SENTRY: Logging error: $exception"); @@ -12,7 +12,6 @@ class CrashReportingRepository { Future logInfo(String message) async { log("--- SENTRY: Logging info: $message"); - Sentry.captureMessage(message); } } diff --git a/recipients_app/lib/data/repositories/messaging_repository.dart b/recipients_app/lib/data/repositories/messaging_repository.dart index 8d0434c2d..134364f19 100644 --- a/recipients_app/lib/data/repositories/messaging_repository.dart +++ b/recipients_app/lib/data/repositories/messaging_repository.dart @@ -1,3 +1,4 @@ +// "unreachable_from_main" is ignored beacuse of the vm:entry-point function "_firebaseMessagingBackgroundHandler" // ignore_for_file: unreachable_from_main import "dart:developer"; import "package:firebase_messaging/firebase_messaging.dart"; diff --git a/recipients_app/lib/data/repositories/organization_repository.dart b/recipients_app/lib/data/repositories/organization_repository.dart index b95b94655..1f9ba692a 100644 --- a/recipients_app/lib/data/repositories/organization_repository.dart +++ b/recipients_app/lib/data/repositories/organization_repository.dart @@ -1,20 +1,18 @@ -import "package:app/data/datasource/demo/organization_demo_data_source.dart"; import "package:app/data/datasource/organization_data_source.dart"; -import "package:app/data/datasource/remote/organization_remote_data_source.dart"; import "package:app/data/models/organization.dart"; import "package:app/demo_manager.dart"; import "package:cloud_firestore/cloud_firestore.dart"; class OrganizationRepository { - late OrganizationDataSource remoteDataSource = OrganizationRemoteDataSource(firestore: firestore); - late OrganizationDataSource demoDataSource = OrganizationDemoDataSource(); + final OrganizationDataSource remoteDataSource; + final OrganizationDataSource demoDataSource; final DemoManager demoManager; - final FirebaseFirestore firestore; - OrganizationRepository({ - required this.firestore, + const OrganizationRepository({ required this.demoManager, + required this.remoteDataSource, + required this.demoDataSource, }); OrganizationDataSource get _activeDataSource => demoManager.isDemoEnabled ? demoDataSource : remoteDataSource; diff --git a/recipients_app/lib/data/repositories/payment_repository.dart b/recipients_app/lib/data/repositories/payment_repository.dart index 78893d503..309d3fd40 100644 --- a/recipients_app/lib/data/repositories/payment_repository.dart +++ b/recipients_app/lib/data/repositories/payment_repository.dart @@ -1,19 +1,16 @@ -import "package:app/data/datasource/demo/payment_demo_data_source.dart"; import "package:app/data/datasource/payment_data_source.dart"; -import "package:app/data/datasource/remote/payment_remote_data_source.dart"; import "package:app/data/models/models.dart"; import "package:app/demo_manager.dart"; -import "package:cloud_firestore/cloud_firestore.dart"; class PaymentRepository { - late PaymentDataSource remoteDataSource = PaymentRemoteDataSource(firestore: firestore); - late PaymentDataSource demoDataSource = PaymentDemoDataSource(); + final PaymentDataSource remoteDataSource; + final PaymentDataSource demoDataSource; final DemoManager demoManager; - final FirebaseFirestore firestore; - PaymentRepository({ - required this.firestore, + const PaymentRepository({ + required this.remoteDataSource, + required this.demoDataSource, required this.demoManager, }); diff --git a/recipients_app/lib/data/repositories/survey_repository.dart b/recipients_app/lib/data/repositories/survey_repository.dart index 5c6e73fbd..05eee06d7 100644 --- a/recipients_app/lib/data/repositories/survey_repository.dart +++ b/recipients_app/lib/data/repositories/survey_repository.dart @@ -1,24 +1,21 @@ -import "package:app/data/datasource/demo/survey_demo_data_source.dart"; -import "package:app/data/datasource/remote/survey_remote_data_source.dart"; import "package:app/data/datasource/survey_data_source.dart"; import "package:app/data/models/models.dart"; import "package:app/data/models/survey/survey.dart"; import "package:app/demo_manager.dart"; -import "package:cloud_firestore/cloud_firestore.dart"; class SurveyRepository { - late SurveyDataSource remoteDataSource = SurveyRemoteDataSource(firestore: firestore); - late SurveyDataSource demoDataSource = SurveyDemoDataSource(); + final SurveyDataSource remoteDataSource; + final SurveyDataSource demoDataSource; final DemoManager demoManager; - final FirebaseFirestore firestore; - SurveyRepository({ - required this.firestore, + const SurveyRepository({ + required this.remoteDataSource, + required this.demoDataSource, required this.demoManager, }); - SurveyDataSource get _activeDataSource => demoManager.isDemoEnabled ? demoDataSource : remoteDataSource; + SurveyDataSource get _activeDataSource => demoManager.isDemoEnabled ? demoDataSource : remoteDataSource; Future> fetchSurveys({ required String recipientId, diff --git a/recipients_app/lib/data/repositories/user_repository.dart b/recipients_app/lib/data/repositories/user_repository.dart index 21b6e52fb..460e7ad63 100644 --- a/recipients_app/lib/data/repositories/user_repository.dart +++ b/recipients_app/lib/data/repositories/user_repository.dart @@ -1,24 +1,19 @@ import "dart:async"; -import "package:app/data/datasource/demo/user_demo_data_source.dart"; -import "package:app/data/datasource/remote/user_remote_data_source.dart"; import "package:app/data/datasource/user_data_source.dart"; import "package:app/data/models/models.dart"; import "package:app/demo_manager.dart"; -import "package:cloud_firestore/cloud_firestore.dart"; import "package:firebase_auth/firebase_auth.dart"; class UserRepository { - late UserDataSource remoteDataSource = UserRemoteDataSource(firestore: firestore, firebaseAuth: firebaseAuth); - late UserDataSource demoDataSource = UserDemoDataSource(); + final UserDataSource remoteDataSource; + final UserDataSource demoDataSource; final DemoManager demoManager; - final FirebaseFirestore firestore; - final FirebaseAuth firebaseAuth; - UserRepository({ - required this.firestore, - required this.firebaseAuth, + const UserRepository({ + required this.remoteDataSource, + required this.demoDataSource, required this.demoManager, }); diff --git a/recipients_app/lib/l10n/app_en.arb b/recipients_app/lib/l10n/arb/app_en.arb similarity index 100% rename from recipients_app/lib/l10n/app_en.arb rename to recipients_app/lib/l10n/arb/app_en.arb diff --git a/recipients_app/lib/l10n/app_kri.arb b/recipients_app/lib/l10n/arb/app_kri.arb similarity index 100% rename from recipients_app/lib/l10n/app_kri.arb rename to recipients_app/lib/l10n/arb/app_kri.arb diff --git a/recipients_app/lib/l10n/l10n.dart b/recipients_app/lib/l10n/l10n.dart new file mode 100644 index 000000000..92a67a576 --- /dev/null +++ b/recipients_app/lib/l10n/l10n.dart @@ -0,0 +1,8 @@ +import "package:flutter/widgets.dart"; +import "package:flutter_gen/gen_l10n/app_localizations.dart"; + +export "package:flutter_gen/gen_l10n/app_localizations.dart"; + +extension AppLocalizationsX on BuildContext { + AppLocalizations get l10n => AppLocalizations.of(this); +} diff --git a/recipients_app/lib/main.dart b/recipients_app/lib/main.dart index 6fa31ab22..1adcf6465 100644 --- a/recipients_app/lib/main.dart +++ b/recipients_app/lib/main.dart @@ -1,4 +1,12 @@ import "package:app/core/helpers/custom_bloc_observer.dart"; +import "package:app/data/datasource/demo/organization_demo_data_source.dart"; +import "package:app/data/datasource/demo/payment_demo_data_source.dart"; +import "package:app/data/datasource/demo/survey_demo_data_source.dart"; +import "package:app/data/datasource/demo/user_demo_data_source.dart"; +import "package:app/data/datasource/remote/organization_remote_data_source.dart"; +import "package:app/data/datasource/remote/payment_remote_data_source.dart"; +import "package:app/data/datasource/remote/survey_remote_data_source.dart"; +import "package:app/data/datasource/remote/user_remote_data_source.dart"; import "package:app/demo_manager.dart"; import "package:app/my_app.dart"; import "package:cloud_firestore/cloud_firestore.dart"; @@ -34,6 +42,18 @@ Future main() async { final messaging = FirebaseMessaging.instance; final demoManager = DemoManager(); + final userRemoteDataSource = UserRemoteDataSource(firestore: firestore, firebaseAuth: firebaseAuth); + final userDemoDataSource = UserDemoDataSource(); + + final paymentRemoteDataSource = PaymentRemoteDataSource(firestore: firestore); + final paymentDemoDataSource = PaymentDemoDataSource(); + + final surveyRemoteDataSource = SurveyRemoteDataSource(firestore: firestore); + final surveyDemoDataSource = SurveyDemoDataSource(); + + final organizationRemoteDataSource = OrganizationRemoteDataSource(firestore: firestore); + final organizationDemoDataSource = OrganizationDemoDataSource(); + if (appFlavor == "dev") { firestore.useFirestoreEmulator("localhost", 8080); firebaseAuth.useAuthEmulator("localhost", 9099); @@ -51,10 +71,16 @@ Future main() async { }, appRunner: () => runApp( MyApp( - firebaseAuth: firebaseAuth, - firestore: firestore, messaging: messaging, demoManager: demoManager, + userRemoteDataSource: userRemoteDataSource, + userDemoDataSource: userDemoDataSource, + paymentRemoteDataSource: paymentRemoteDataSource, + paymentDemoDataSource: paymentDemoDataSource, + surveyRemoteDataSource: surveyRemoteDataSource, + surveyDemoDataSource: surveyDemoDataSource, + organizationRemoteDataSource: organizationRemoteDataSource, + organizationDemoDataSource: organizationDemoDataSource, ), ), ); diff --git a/recipients_app/lib/my_app.dart b/recipients_app/lib/my_app.dart index ab2c0988f..ef81fde37 100644 --- a/recipients_app/lib/my_app.dart +++ b/recipients_app/lib/my_app.dart @@ -1,5 +1,13 @@ import "package:app/core/cubits/auth/auth_cubit.dart"; import "package:app/core/cubits/settings/settings_cubit.dart"; +import "package:app/data/datasource/demo/organization_demo_data_source.dart"; +import "package:app/data/datasource/demo/payment_demo_data_source.dart"; +import "package:app/data/datasource/demo/survey_demo_data_source.dart"; +import "package:app/data/datasource/demo/user_demo_data_source.dart"; +import "package:app/data/datasource/remote/organization_remote_data_source.dart"; +import "package:app/data/datasource/remote/payment_remote_data_source.dart"; +import "package:app/data/datasource/remote/survey_remote_data_source.dart"; +import "package:app/data/datasource/remote/user_remote_data_source.dart"; import "package:app/data/repositories/repositories.dart"; import "package:app/demo_manager.dart"; import "package:app/kri_intl.dart"; @@ -7,8 +15,6 @@ import "package:app/ui/configs/configs.dart"; import "package:app/view/pages/main_app_page.dart"; import "package:app/view/pages/terms_and_conditions_page.dart"; import "package:app/view/pages/welcome_page.dart"; -import "package:cloud_firestore/cloud_firestore.dart"; -import "package:firebase_auth/firebase_auth.dart"; import "package:firebase_messaging/firebase_messaging.dart"; import "package:flutter/material.dart"; import "package:flutter_bloc/flutter_bloc.dart"; @@ -17,17 +23,33 @@ import "package:flutter_localizations/flutter_localizations.dart"; import "package:flutter_native_splash/flutter_native_splash.dart"; class MyApp extends StatelessWidget { - final FirebaseAuth firebaseAuth; - final FirebaseFirestore firestore; final FirebaseMessaging messaging; final DemoManager demoManager; + final UserRemoteDataSource userRemoteDataSource; + final UserDemoDataSource userDemoDataSource; + + final PaymentRemoteDataSource paymentRemoteDataSource; + final PaymentDemoDataSource paymentDemoDataSource; + + final SurveyRemoteDataSource surveyRemoteDataSource; + final SurveyDemoDataSource surveyDemoDataSource; + + final OrganizationRemoteDataSource organizationRemoteDataSource; + final OrganizationDemoDataSource organizationDemoDataSource; + const MyApp({ super.key, - required this.firebaseAuth, - required this.firestore, required this.messaging, required this.demoManager, + required this.userRemoteDataSource, + required this.userDemoDataSource, + required this.paymentRemoteDataSource, + required this.paymentDemoDataSource, + required this.surveyRemoteDataSource, + required this.surveyDemoDataSource, + required this.organizationRemoteDataSource, + required this.organizationDemoDataSource, }); // This widget is the root of your application. @@ -45,29 +67,32 @@ class MyApp extends StatelessWidget { ), RepositoryProvider( create: (context) => UserRepository( - firebaseAuth: firebaseAuth, - firestore: firestore, + remoteDataSource: userRemoteDataSource, + demoDataSource: userDemoDataSource, demoManager: demoManager, ), ), RepositoryProvider( - create: (context) => CrashReportingRepository(), + create: (context) => const CrashReportingRepository(), ), RepositoryProvider( create: (context) => PaymentRepository( - firestore: firestore, + remoteDataSource: paymentRemoteDataSource, + demoDataSource: paymentDemoDataSource, demoManager: demoManager, ), ), RepositoryProvider( create: (context) => SurveyRepository( - firestore: firestore, + remoteDataSource: surveyRemoteDataSource, + demoDataSource: surveyDemoDataSource, demoManager: demoManager, ), ), RepositoryProvider( create: (context) => OrganizationRepository( - firestore: firestore, + remoteDataSource: organizationRemoteDataSource, + demoDataSource: organizationDemoDataSource, demoManager: demoManager, ), ), diff --git a/recipients_app/lib/ui/design_components_screen.dart b/recipients_app/lib/ui/design_components_screen.dart index a24949ec0..c622ca8ba 100644 --- a/recipients_app/lib/ui/design_components_screen.dart +++ b/recipients_app/lib/ui/design_components_screen.dart @@ -24,8 +24,41 @@ class DesignComponentsScreen extends StatelessWidget { style: AppStyles.headlineLarge, ), const SizedBox(height: 16), - const Row( + const Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + PaymentStatusIcon( + status: PaymentUiStatus.confirmed, + ), + SizedBox(height: 5), + PaymentStatusIcon( + status: PaymentUiStatus.contested, + ), + SizedBox(height: 5), + PaymentStatusIcon( + status: PaymentUiStatus.onHoldContested, + ), + SizedBox(height: 5), + PaymentStatusIcon( + status: PaymentUiStatus.onHoldToReview, + ), + SizedBox(height: 5), + PaymentStatusIcon( + status: PaymentUiStatus.recentToReview, + ), + SizedBox(height: 5), + PaymentStatusIcon( + status: PaymentUiStatus.toBePaid, + ), + SizedBox(height: 5), + PaymentStatusIcon( + status: PaymentUiStatus.empty, + ), + SizedBox(height: 5), + PaymentStatusIcon( + status: PaymentUiStatus.toReview, + ), + ], ), const SizedBox(height: 32), const Text( @@ -54,33 +87,44 @@ class DesignComponentsScreen extends StatelessWidget { style: AppStyles.headlineLarge, ), const SizedBox(height: 16), - const Row( + const Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ PaymentStatusIconWithText( status: PaymentUiStatus.confirmed, text: "Confirmed", ), + SizedBox(height: 5), PaymentStatusIconWithText( status: PaymentUiStatus.contested, text: "Contested", ), + SizedBox(height: 5), PaymentStatusIconWithText( status: PaymentUiStatus.onHoldContested, text: "On Hold contested", ), + SizedBox(height: 5), PaymentStatusIconWithText( status: PaymentUiStatus.onHoldToReview, text: "On Hold to review", ), + SizedBox(height: 5), PaymentStatusIconWithText( status: PaymentUiStatus.recentToReview, text: "Recent To Review", ), + SizedBox(height: 5), PaymentStatusIconWithText( status: PaymentUiStatus.toBePaid, text: "To Be Paid", ), + SizedBox(height: 5), + PaymentStatusIconWithText( + status: PaymentUiStatus.empty, + text: "Empty", + ), + SizedBox(height: 5), PaymentStatusIconWithText( status: PaymentUiStatus.toReview, text: "To Review", diff --git a/recipients_app/lib/ui/icons/payment_status_icon.dart b/recipients_app/lib/ui/icons/payment_status_icon.dart index b125d9d5a..1553ab5db 100644 --- a/recipients_app/lib/ui/icons/payment_status_icon.dart +++ b/recipients_app/lib/ui/icons/payment_status_icon.dart @@ -1,5 +1,4 @@ import "package:app/data/models/payment/payment_ui_status.dart"; -import "package:app/ui/configs/configs.dart"; import "package:flutter/material.dart"; const statusIconRadius = 10.0; @@ -14,50 +13,14 @@ class PaymentStatusIcon extends StatelessWidget { @override Widget build(BuildContext context) { - late Color backgroundColor; - late Widget? child; - - switch (status) { - case PaymentUiStatus.confirmed: - backgroundColor = AppColors.primaryColor; - child = const Icon( - size: 14, - Icons.check_rounded, - color: Colors.white, - ); - case PaymentUiStatus.empty: - case PaymentUiStatus.toBePaid: - backgroundColor = AppColors.backgroundColor; - child = null; - case PaymentUiStatus.toReview: - case PaymentUiStatus.contested: - backgroundColor = AppColors.yellowColor; - child = const Icon( - size: 14, - Icons.priority_high_rounded, - color: Colors.black, - ); - case PaymentUiStatus.recentToReview: - backgroundColor = AppColors.primaryColor; - child = const Icon( - size: 14, - Icons.question_mark_rounded, - color: Colors.white, - ); - case PaymentUiStatus.onHoldToReview: - case PaymentUiStatus.onHoldContested: - backgroundColor = AppColors.redColor; - child = const Icon( - size: 14, - Icons.close_rounded, - color: Colors.black, - ); - } - return CircleAvatar( radius: statusIconRadius, - backgroundColor: backgroundColor, - child: child, + backgroundColor: status.color, + child: Icon( + size: 14, + status.icon, + color: status.iconColor, + ), ); } } diff --git a/recipients_app/lib/ui/icons/payment_status_icon_with_text.dart b/recipients_app/lib/ui/icons/payment_status_icon_with_text.dart index 27fc77586..5eadb6213 100644 --- a/recipients_app/lib/ui/icons/payment_status_icon_with_text.dart +++ b/recipients_app/lib/ui/icons/payment_status_icon_with_text.dart @@ -8,63 +8,20 @@ class PaymentStatusIconWithText extends StatelessWidget { final PaymentUiStatus status; final String text; final bool isInverted; - final Color iconColor; const PaymentStatusIconWithText({ super.key, required this.status, required this.text, this.isInverted = false, - this.iconColor = Colors.white, }); @override Widget build(BuildContext context) { - late Color color; - late IconData icon; - late Color textColor; - - Color iconColor = this.iconColor; - - switch (status) { - // blue label, white font, confirm icon - case PaymentUiStatus.confirmed: - color = AppColors.primaryColor; - icon = Icons.check_rounded; - textColor = Colors.white; - // blue label, white font, question mark icon - case PaymentUiStatus.recentToReview: - color = AppColors.primaryColor; - icon = Icons.question_mark_rounded; - textColor = Colors.white; - // red label, dark font, close icon - case PaymentUiStatus.onHoldContested: - case PaymentUiStatus.onHoldToReview: - color = AppColors.redColor; - icon = Icons.close_rounded; - textColor = AppColors.fontColorDark; - iconColor = AppColors.fontColorDark; - // yellow label, dark font, warning icon - case PaymentUiStatus.toReview: - case PaymentUiStatus.contested: - color = AppColors.yellowColor; - icon = Icons.priority_high_rounded; - textColor = AppColors.fontColorDark; - iconColor = AppColors.fontColorDark; - // grey label, dark font, timer icon - case PaymentUiStatus.toBePaid: - color = AppColors.lightGrey; - icon = Icons.timer_outlined; - textColor = AppColors.fontColorDark; - iconColor = AppColors.fontColorDark; - case PaymentUiStatus.empty: - // // TODO: Handle this case. - } - return Container( padding: AppSpacings.h8, decoration: BoxDecoration( - color: color, + color: status.color, borderRadius: BorderRadius.circular(AppSizes.radiusMedium), ), height: statusIconHeight, @@ -73,14 +30,14 @@ class PaymentStatusIconWithText extends StatelessWidget { Text( text, style: AppStyles.iconLabel.copyWith( - color: textColor, + color: status.textColor, ), ), const SizedBox(width: 4), Icon( size: 14, - icon, - color: iconColor, + status.icon, + color: status.iconColor, ), ], ), diff --git a/recipients_app/lib/view/pages/account_page.dart b/recipients_app/lib/view/pages/account_page.dart index ed4fc3f2f..82e3e86a7 100644 --- a/recipients_app/lib/view/pages/account_page.dart +++ b/recipients_app/lib/view/pages/account_page.dart @@ -2,6 +2,7 @@ import "package:app/core/cubits/auth/auth_cubit.dart"; import "package:app/core/cubits/settings/settings_cubit.dart"; import "package:app/core/helpers/flushbar_helper.dart"; import "package:app/data/models/models.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/buttons/buttons.dart"; import "package:app/ui/configs/app_colors.dart"; import "package:app/ui/configs/app_spacings.dart"; @@ -12,7 +13,6 @@ import "package:app/view/widgets/dialogs/social_income_contact_dialog.dart"; import "package:cloud_firestore/cloud_firestore.dart"; import "package:flutter/material.dart"; import "package:flutter_bloc/flutter_bloc.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; import "package:intl/intl.dart"; import "package:package_info_plus/package_info_plus.dart"; @@ -109,7 +109,6 @@ class AccountPageState extends State { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; final locale = Localizations.localeOf(context).toLanguageTag(); final recipient = context.watch().state.recipient ?? widget.recipient; @@ -119,12 +118,12 @@ class AccountPageState extends State { if (state.status == AuthStatus.updateRecipientSuccess) { FlushbarHelper.showFlushbar( context, - message: localizations.profileUpdateSuccess, + message: context.l10n.profileUpdateSuccess, ); } else if (state.status == AuthStatus.updateRecipientFailure) { FlushbarHelper.showFlushbar( context, - message: localizations.profileUpdateError, + message: context.l10n.profileUpdateError, type: FlushbarType.error, ); } else if (state.status == AuthStatus.unauthenticated) { @@ -134,7 +133,7 @@ class AccountPageState extends State { builder: (context, state) { return Scaffold( appBar: AppBar( - title: Text(localizations.profile), + title: Text(context.l10n.profile), centerTitle: true, elevation: 0, ), @@ -145,16 +144,17 @@ class AccountPageState extends State { padding: AppSpacings.a16, children: [ Text( - localizations.personal, + context.l10n.personal, style: Theme.of(context).textTheme.bodyLarge, ), const SizedBox(height: 16), + InputText( - hintText: "${localizations.name}*", + hintText: "${context.l10n.name}*", controller: _nameController, validator: (value) { if (value == null || value.isEmpty) { - return localizations.nameError; + return context.l10n.nameError; } return null; }, @@ -169,10 +169,10 @@ class AccountPageState extends State { const SizedBox(height: 16), InputText( controller: _surnameController, - hintText: "${localizations.surname}*", + hintText: "${context.l10n.surname}*", validator: (value) { if (value == null || value.isEmpty) { - return localizations.surnameError; + return context.l10n.surnameError; } return null; }, @@ -189,32 +189,32 @@ class AccountPageState extends State { const SizedBox(height: 16), InputText( controller: _callingNameController, - hintText: localizations.callingName, + hintText: context.l10n.callingName, onSubmitted: (value) => context.read().updateRecipient( recipient.copyWith(callingName: value), ), ), const SizedBox(height: 16), InputDropdown( - label: "${localizations.gender}*", + label: "${context.l10n.gender}*", items: [ DropdownMenuItem( value: "male", - child: Text(localizations.male), + child: Text(context.l10n.male), ), DropdownMenuItem( value: "female", - child: Text(localizations.female), + child: Text(context.l10n.female), ), DropdownMenuItem( value: "other", - child: Text(localizations.other), + child: Text(context.l10n.other), ), ], value: recipient.gender, validator: (value) { if (value == null || value.isEmpty) { - return localizations.genderError; + return context.l10n.genderError; } return null; }, @@ -226,7 +226,7 @@ class AccountPageState extends State { ), const SizedBox(height: 16), InputText( - hintText: "${localizations.dateOfBirth}*", + hintText: "${context.l10n.dateOfBirth}*", controller: _birthDateController, isReadOnly: true, onTap: () async => showDatePicker( @@ -256,27 +256,27 @@ class AccountPageState extends State { ), validator: (value) { if (value == null || value.isEmpty) { - return localizations.dateOfBirthError; + return context.l10n.dateOfBirthError; } return null; }, ), const SizedBox(height: 16), InputDropdown( - label: "${localizations.language}*", + label: "${context.l10n.language}*", items: [ DropdownMenuItem( value: "en", - child: Text(localizations.english), + child: Text(context.l10n.english), ), DropdownMenuItem( value: "kri", - child: Text(localizations.krio), + child: Text(context.l10n.krio), ), ], validator: (value) { if (value == null || value.isEmpty) { - return localizations.languageError; + return context.l10n.languageError; } return null; }, @@ -292,7 +292,7 @@ class AccountPageState extends State { const SizedBox(height: 16), InputText( - hintText: localizations.email, + hintText: context.l10n.email, controller: _emailController, onSubmitted: (value) { if (value != null && value.isNotEmpty) { @@ -309,7 +309,7 @@ class AccountPageState extends State { r"^[\w-]+(\.[\w-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,})$", ); if (!emailRegex.hasMatch(value)) { - return localizations.errorEmailInvalid; + return context.l10n.errorEmailInvalid; } return null; @@ -317,12 +317,12 @@ class AccountPageState extends State { ), const SizedBox(height: 24), Text( - localizations.paymentPhone, + context.l10n.paymentPhone, style: Theme.of(context).textTheme.bodyLarge, ), const SizedBox(height: 16), InputText( - hintText: "${localizations.paymentNumber}*", + hintText: "${context.l10n.paymentNumber}*", isReadOnly: true, controller: _paymentNumberController, keyboardType: TextInputType.number, @@ -337,11 +337,11 @@ class AccountPageState extends State { }, validator: (value) { if (value == null || value.isEmpty) { - return localizations.paymentNumberError; + return context.l10n.paymentNumberError; } if (int.tryParse(value) == null) { - return localizations.paymentNumberError2; + return context.l10n.paymentNumberError2; } return null; @@ -349,7 +349,7 @@ class AccountPageState extends State { ), const SizedBox(height: 16), InputDropdown( - label: "${localizations.mobilePaymentProvider}*", + label: "${context.l10n.mobilePaymentProvider}*", items: const [ DropdownMenuItem( value: "orange_money_sl", @@ -363,7 +363,7 @@ class AccountPageState extends State { value: recipient.paymentProvider, validator: (value) { if (value == null || value.isEmpty) { - return localizations.paymentProviderError; + return context.l10n.paymentProviderError; } return null; }, @@ -375,21 +375,21 @@ class AccountPageState extends State { /// CONTACT PHONE Text( - localizations.contactPhone, + context.l10n.contactPhone, style: Theme.of(context).textTheme.bodyLarge, ), const SizedBox(height: 16), InputText( - hintText: "${localizations.contactNumber}*", + hintText: "${context.l10n.contactNumber}*", controller: _contactNumberController, keyboardType: TextInputType.number, validator: (value) { if (value == null || value.isEmpty) { - return localizations.contactNumberError; + return context.l10n.contactNumberError; } if (int.tryParse(value) == null) { - return localizations.contactNumberError2; + return context.l10n.contactNumberError2; } return null; @@ -428,17 +428,17 @@ class AccountPageState extends State { /// SUCCESSOR IN THE CASE OF DEATH Text( - localizations.inCaseOfDeathTitle, + context.l10n.inCaseOfDeathTitle, style: Theme.of(context).textTheme.bodyLarge, ), const SizedBox(height: 16), Text( - localizations.inCaseOfDeathDescription, + context.l10n.inCaseOfDeathDescription, style: Theme.of(context).textTheme.bodySmall, ), const SizedBox(height: 16), InputText( - hintText: localizations.successorName, + hintText: context.l10n.successorName, controller: _successorNameController, keyboardType: TextInputType.name, onSubmitted: (value) { @@ -452,34 +452,34 @@ class AccountPageState extends State { if (widget.organization != null) OrganizationInfo(organization: widget.organization!), const SizedBox(height: 24), Text( - localizations.support, + context.l10n.support, style: Theme.of(context).textTheme.bodyLarge, ), const SizedBox(height: 16), - Text(localizations.supportInfo), + Text(context.l10n.supportInfo), const SizedBox(height: 16), ButtonBig( onPressed: () => showDialog( context: context, builder: (context) => const SocialIncomeContactDialog(), ), - label: localizations.getInTouch, + label: context.l10n.getInTouch, ), const SizedBox(height: 24), Text( - localizations.account, + context.l10n.account, style: Theme.of(context).textTheme.bodyLarge, ), const SizedBox(height: 16), - Text(localizations.accountInfo), + Text(context.l10n.accountInfo), const SizedBox(height: 16), ButtonBig( onPressed: () => context.read().logout(), - label: localizations.signOut, + label: context.l10n.signOut, ), const SizedBox(height: 16), Text( - "${localizations.appVersion} ${_packageInfo.version} (${_packageInfo.buildNumber})", + "${context.l10n.appVersion} ${_packageInfo.version} (${_packageInfo.buildNumber})", textAlign: TextAlign.center, style: Theme.of(context).textTheme.labelSmall, ), diff --git a/recipients_app/lib/view/pages/main_app_page.dart b/recipients_app/lib/view/pages/main_app_page.dart index e1d755f22..6e6858a05 100644 --- a/recipients_app/lib/view/pages/main_app_page.dart +++ b/recipients_app/lib/view/pages/main_app_page.dart @@ -1,12 +1,12 @@ import "package:app/core/cubits/auth/auth_cubit.dart"; import "package:app/data/models/recipient.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/buttons/button_small.dart"; import "package:app/ui/configs/app_colors.dart"; import "package:app/view/pages/account_page.dart"; import "package:app/view/pages/dashboard_page.dart"; import "package:flutter/material.dart"; import "package:flutter_bloc/flutter_bloc.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; class MainAppPage extends StatefulWidget { const MainAppPage({super.key}); @@ -18,8 +18,6 @@ class MainAppPage extends StatefulWidget { class _MainAppPageState extends State { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - final recipient = context.watch().state.recipient; final editButtonRow = Row( @@ -39,7 +37,7 @@ class _MainAppPageState extends State { ), ); }, - label: localizations.edit, + label: context.l10n.edit, buttonType: ButtonSmallType.outlined, color: AppColors.fontColorDark, ), diff --git a/recipients_app/lib/view/pages/payment_tile.dart b/recipients_app/lib/view/pages/payment_tile.dart index 5d599fa30..4b5bc972d 100644 --- a/recipients_app/lib/view/pages/payment_tile.dart +++ b/recipients_app/lib/view/pages/payment_tile.dart @@ -1,8 +1,8 @@ import "package:app/data/models/models.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/icons/payment_status_icon_with_text.dart"; import "package:app/view/pages/payment_tile_bottom_action.dart"; import "package:flutter/material.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; import "package:intl/intl.dart"; const _reviewUiStatuses = [ @@ -20,7 +20,6 @@ class PaymentTile extends StatelessWidget { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; final locale = Localizations.localeOf(context).toLanguageTag(); return Card( @@ -38,7 +37,7 @@ class PaymentTile extends StatelessWidget { Text( _formatDate( mappedPayment.payment.paymentAt?.toDate(), - localizations, + context.l10n, locale, ), style: Theme.of(context).textTheme.bodyMedium?.copyWith( diff --git a/recipients_app/lib/view/pages/payment_tile_bottom_action.dart b/recipients_app/lib/view/pages/payment_tile_bottom_action.dart index 44a281336..c5ea0a252 100644 --- a/recipients_app/lib/view/pages/payment_tile_bottom_action.dart +++ b/recipients_app/lib/view/pages/payment_tile_bottom_action.dart @@ -1,11 +1,11 @@ import "package:app/core/cubits/payment/payments_cubit.dart"; import "package:app/data/models/payment/payment.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/buttons/button_small.dart"; import "package:app/ui/configs/configs.dart"; import "package:app/view/widgets/income/review_payment_modal.dart"; import "package:flutter/material.dart"; import "package:flutter_bloc/flutter_bloc.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; class PaymentTileBottomAction extends StatelessWidget { final MappedPayment mappedPayment; @@ -17,8 +17,6 @@ class PaymentTileBottomAction extends StatelessWidget { @override Widget build(BuildContext context) { - final localization = AppLocalizations.of(context)!; - final foregroundColor = _getForegroundColor(mappedPayment.uiStatus); final isContested = mappedPayment.uiStatus == PaymentUiStatus.contested || mappedPayment.uiStatus == PaymentUiStatus.onHoldContested; @@ -32,19 +30,15 @@ class PaymentTileBottomAction extends StatelessWidget { children: [ Expanded( child: Text( - isContested - ? localization.underInvestigation - : localization.didYouGetSocialIncome, + isContested ? context.l10n.underInvestigation : context.l10n.didYouGetSocialIncome, style: TextStyle(color: foregroundColor), ), ), Row( children: [ ButtonSmall( - onPressed: () => context - .read() - .confirmPayment(mappedPayment.payment), - label: isContested ? localization.resolved : localization.yes, + onPressed: () => context.read().confirmPayment(mappedPayment.payment), + label: isContested ? context.l10n.resolved : context.l10n.yes, buttonType: ButtonSmallType.outlined, color: foregroundColor, fontColor: foregroundColor, @@ -53,7 +47,7 @@ class PaymentTileBottomAction extends StatelessWidget { const SizedBox(width: 8), ButtonSmall( onPressed: () => _onPressedNo(context), - label: localization.no, + label: context.l10n.no, buttonType: ButtonSmallType.outlined, color: foregroundColor, fontColor: foregroundColor, diff --git a/recipients_app/lib/view/pages/payments_page.dart b/recipients_app/lib/view/pages/payments_page.dart index 9e9a06b74..5d2f57e66 100644 --- a/recipients_app/lib/view/pages/payments_page.dart +++ b/recipients_app/lib/view/pages/payments_page.dart @@ -1,11 +1,11 @@ import "package:app/core/cubits/auth/auth_cubit.dart"; import "package:app/core/cubits/payment/payments_cubit.dart"; import "package:app/data/models/models.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/configs/configs.dart"; import "package:app/view/pages/payment_tile.dart"; import "package:flutter/material.dart"; import "package:flutter_bloc/flutter_bloc.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; class PaymentsPage extends StatefulWidget { const PaymentsPage({super.key}); @@ -19,15 +19,13 @@ class _PaymentsPageState extends State { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - final recipient = context.watch().state.recipient; final paymentsUiState = context.watch().state.paymentsUiState!; return Scaffold( appBar: AppBar( elevation: 0, - title: Text(localizations.payments), + title: Text(context.l10n.payments), centerTitle: true, ), body: RefreshIndicator( @@ -48,7 +46,7 @@ class _PaymentsPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - localizations.orangeMoneyNumber, + context.l10n.orangeMoneyNumber, style: Theme.of(context).textTheme.bodyMedium, ), const SizedBox(height: 4), @@ -67,7 +65,7 @@ class _PaymentsPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - localizations.pastPayments, + context.l10n.pastPayments, style: Theme.of(context).textTheme.bodyMedium, ), const SizedBox(height: 4), @@ -86,7 +84,7 @@ class _PaymentsPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - localizations.futurePayments, + context.l10n.futurePayments, style: Theme.of(context).textTheme.bodyMedium, ), const SizedBox(height: 4), @@ -95,7 +93,7 @@ class _PaymentsPageState extends State { ? _calculateFuturePayments( paymentsUiState.payments, ) - : localizations.paymentsSuspended, + : context.l10n.paymentsSuspended, style: Theme.of(context).textTheme.headlineLarge?.copyWith( color: paymentsUiState.status != BalanceCardStatus.onHold ? AppColors.primaryColor @@ -118,7 +116,7 @@ class _PaymentsPageState extends State { padding: AppSpacings.a8, child: Center( child: Text( - localizations.paymentsEmptyList, + context.l10n.paymentsEmptyList, textAlign: TextAlign.center, ), ), diff --git a/recipients_app/lib/view/pages/survey_page.dart b/recipients_app/lib/view/pages/survey_page.dart index a1c012c68..569306bcc 100644 --- a/recipients_app/lib/view/pages/survey_page.dart +++ b/recipients_app/lib/view/pages/survey_page.dart @@ -1,8 +1,8 @@ import "package:app/core/cubits/survey/survey_cubit.dart"; import "package:app/data/models/survey/mapped_survey.dart"; +import "package:app/l10n/l10n.dart"; import "package:flutter/material.dart"; import "package:flutter_bloc/flutter_bloc.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; import "package:webview_flutter/webview_flutter.dart"; class SurveyPage extends StatefulWidget { @@ -41,12 +41,10 @@ class SurveyPageState extends State { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - return Scaffold( appBar: AppBar( elevation: 0, - title: Text(localizations.survey), + title: Text(context.l10n.survey), leading: BackButton( onPressed: () { context.read().getSurveys(); diff --git a/recipients_app/lib/view/pages/surveys_page.dart b/recipients_app/lib/view/pages/surveys_page.dart index 5734301b4..c1ff0eb18 100644 --- a/recipients_app/lib/view/pages/surveys_page.dart +++ b/recipients_app/lib/view/pages/surveys_page.dart @@ -1,9 +1,9 @@ import "package:app/core/cubits/survey/survey_cubit.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/configs/configs.dart"; import "package:app/view/widgets/survey/survey_list_card.dart"; import "package:flutter/material.dart"; import "package:flutter_bloc/flutter_bloc.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; class SurveysPage extends StatefulWidget { const SurveysPage({super.key}); @@ -17,14 +17,12 @@ class _SurveysPageState extends State { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - final mappedSurveys = context.watch().state.mappedSurveys; return Scaffold( appBar: AppBar( elevation: 0, - title: Text(localizations.surveysTitle), + title: Text(context.l10n.surveysTitle), leading: BackButton( onPressed: () { context.read().getSurveys(); @@ -46,7 +44,7 @@ class _SurveysPageState extends State { padding: AppSpacings.a8, child: Center( child: Text( - localizations.surveysEmpty, + context.l10n.surveysEmpty, textAlign: TextAlign.center, ), ), diff --git a/recipients_app/lib/view/pages/terms_and_conditions_page.dart b/recipients_app/lib/view/pages/terms_and_conditions_page.dart index ed4fb74de..f2aa2caba 100644 --- a/recipients_app/lib/view/pages/terms_and_conditions_page.dart +++ b/recipients_app/lib/view/pages/terms_and_conditions_page.dart @@ -1,13 +1,13 @@ import "package:app/core/cubits/auth/auth_cubit.dart"; import "package:app/core/helpers/flushbar_helper.dart"; import "package:app/demo_manager.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/buttons/buttons.dart"; import "package:app/ui/configs/configs.dart"; import "package:flutter/gestures.dart"; import "package:flutter/material.dart"; import "package:flutter/services.dart"; import "package:flutter_bloc/flutter_bloc.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; import "package:url_launcher/url_launcher_string.dart"; class TermsAndConditionsPage extends StatelessWidget { @@ -15,13 +15,12 @@ class TermsAndConditionsPage extends StatelessWidget { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - final demoManager = RepositoryProvider.of(context); + final demoManager = context.read(); return Scaffold( appBar: AppBar( elevation: 0, - title: Text(localizations.account), + title: Text(context.l10n.account), centerTitle: true, ), body: Padding( @@ -39,14 +38,14 @@ class TermsAndConditionsPage extends StatelessWidget { text: TextSpan( children: [ TextSpan( - text: localizations.createAccountInfo, + text: context.l10n.createAccountInfo, style: Theme.of(context).textTheme.headlineLarge!.copyWith( color: AppColors.primaryColor, fontWeight: FontWeight.bold, ), ), TextSpan( - text: localizations.privacyPolicy, + text: context.l10n.privacyPolicy, style: Theme.of(context).textTheme.headlineLarge!.copyWith( color: AppColors.primaryColor, fontWeight: FontWeight.bold, @@ -67,7 +66,7 @@ class TermsAndConditionsPage extends StatelessWidget { if (context.mounted) { FlushbarHelper.showFlushbar( context, - message: localizations.privacyPolicyError, + message: context.l10n.privacyPolicyError, type: FlushbarType.error, ); } @@ -97,7 +96,7 @@ class TermsAndConditionsPage extends StatelessWidget { context.read().updateRecipient(updated); } }, - label: demoManager.isDemoEnabled ? localizations.createAccountDemo : localizations.createAccount, + label: demoManager.isDemoEnabled ? context.l10n.createAccountDemo : context.l10n.createAccount, ), ], ), diff --git a/recipients_app/lib/view/pages/welcome_page.dart b/recipients_app/lib/view/pages/welcome_page.dart index 769317a6b..f35ec91dd 100644 --- a/recipients_app/lib/view/pages/welcome_page.dart +++ b/recipients_app/lib/view/pages/welcome_page.dart @@ -1,13 +1,12 @@ - import "package:app/core/cubits/signup/signup_cubit.dart"; import "package:app/core/helpers/flushbar_helper.dart"; import "package:app/data/repositories/repositories.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/view/error_localization_helper.dart"; import "package:app/view/widgets/welcome/otp_input_page.dart"; import "package:app/view/widgets/welcome/phone_input_page.dart"; import "package:flutter/material.dart"; import "package:flutter_bloc/flutter_bloc.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; class WelcomePage extends StatelessWidget { const WelcomePage(); @@ -29,21 +28,19 @@ class _WelcomeView extends StatelessWidget { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - return Scaffold( body: BlocConsumer( listener: (context, state) { if (state.status == SignupStatus.verificationFailure) { FlushbarHelper.showFlushbar( context, - message: localizeExceptionMessage(state.exception, localizations), + message: localizeExceptionMessage(state.exception, context.l10n), type: FlushbarType.error, ); } else if (state.status == SignupStatus.phoneNumberFailure) { FlushbarHelper.showFlushbar( context, - message: localizeExceptionMessage(state.exception, localizations), + message: localizeExceptionMessage(state.exception, context.l10n), type: FlushbarType.error, ); } diff --git a/recipients_app/lib/view/widgets/account/organization_info.dart b/recipients_app/lib/view/widgets/account/organization_info.dart index 6fa17e2bb..066a1fd85 100644 --- a/recipients_app/lib/view/widgets/account/organization_info.dart +++ b/recipients_app/lib/view/widgets/account/organization_info.dart @@ -1,8 +1,8 @@ import "package:app/data/models/organization.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/buttons/buttons.dart"; import "package:app/ui/configs/configs.dart"; import "package:flutter/material.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; import "package:url_launcher/url_launcher_string.dart"; class OrganizationInfo extends StatelessWidget { @@ -15,14 +15,12 @@ class OrganizationInfo extends StatelessWidget { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 24), Text( - localizations.recommendingOrganization, + context.l10n.recommendingOrganization, style: Theme.of(context).textTheme.bodyLarge, ), const SizedBox(height: 16), @@ -41,15 +39,12 @@ class OrganizationInfo extends StatelessWidget { const SizedBox(width: 8), Text( organization.name, - style: Theme.of(context) - .textTheme - .bodyLarge! - .copyWith(fontWeight: FontWeight.bold), + style: Theme.of(context).textTheme.bodyLarge!.copyWith(fontWeight: FontWeight.bold), ), const Spacer(), if (organization.contactNumber != null) ButtonSmall( - label: localizations.call, + label: context.l10n.call, buttonType: ButtonSmallType.outlined, color: Colors.black, onPressed: () => launchUrlString( diff --git a/recipients_app/lib/view/widgets/dialogs/social_income_contact_dialog.dart b/recipients_app/lib/view/widgets/dialogs/social_income_contact_dialog.dart index a4abd377c..c9139d810 100644 --- a/recipients_app/lib/view/widgets/dialogs/social_income_contact_dialog.dart +++ b/recipients_app/lib/view/widgets/dialogs/social_income_contact_dialog.dart @@ -1,8 +1,8 @@ import "package:app/core/helpers/flushbar_helper.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/buttons/buttons.dart"; import "package:app/ui/configs/configs.dart"; import "package:flutter/material.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; import "package:url_launcher/url_launcher_string.dart"; class SocialIncomeContactDialog extends StatelessWidget { @@ -10,8 +10,6 @@ class SocialIncomeContactDialog extends StatelessWidget { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - return FractionallySizedBox( widthFactor: 0.9, heightFactor: 0.8, @@ -34,11 +32,11 @@ class SocialIncomeContactDialog extends StatelessWidget { width: MediaQuery.sizeOf(context).width * 0.6, ), Text( - localizations.supportTeam, + context.l10n.supportTeam, style: Theme.of(context).textTheme.headlineLarge, ), Text( - localizations.getInTouch, + context.l10n.getInTouch, style: Theme.of(context).textTheme.bodyLarge, ), ], @@ -52,13 +50,13 @@ class SocialIncomeContactDialog extends StatelessWidget { ), const SizedBox(height: 16), _IconAndContact( - contactMethod: localizations.phone, + contactMethod: context.l10n.phone, contactDetails: "+232 75 588647", onOpen: (String value) => makePhoneCall(value), ), const SizedBox(height: 16), _IconAndContact( - contactMethod: localizations.email, + contactMethod: context.l10n.email, contactDetails: "hello@socialincome.org", onOpen: (String value) => writeEmail(value), ), @@ -66,7 +64,7 @@ class SocialIncomeContactDialog extends StatelessWidget { ), ButtonBig( onPressed: () => Navigator.of(context).pop(), - label: localizations.close, + label: context.l10n.close, ), ], ), @@ -77,8 +75,6 @@ class SocialIncomeContactDialog extends StatelessWidget { } Future openWhatsapp(BuildContext context, String number) async { - final localizations = AppLocalizations.of(context)!; - final whatsappURL = "whatsapp://send?phone=$number&text=hello"; if (await canLaunchUrlString(whatsappURL)) { await launchUrlString(whatsappURL); @@ -86,7 +82,7 @@ class SocialIncomeContactDialog extends StatelessWidget { if (context.mounted) { FlushbarHelper.showFlushbar( context, - message: localizations.whatsappError, + message: context.l10n.whatsappError, type: FlushbarType.error, ); } diff --git a/recipients_app/lib/view/widgets/empty_item.dart b/recipients_app/lib/view/widgets/empty_item.dart index ccfa086f0..a271d6f4e 100644 --- a/recipients_app/lib/view/widgets/empty_item.dart +++ b/recipients_app/lib/view/widgets/empty_item.dart @@ -1,22 +1,20 @@ +import "package:app/l10n/l10n.dart"; import "package:app/ui/configs/configs.dart"; import "package:app/view/widgets/dashboard_item.dart"; import "package:flutter/material.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; class EmptyItem extends DashboardItem { const EmptyItem({super.key}); @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - return ConstrainedBox( constraints: const BoxConstraints(minHeight: 200), child: Padding( padding: AppSpacings.a8, child: Center( child: Text( - localizations.dashboardUp2Date, + context.l10n.dashboardUp2Date, textAlign: TextAlign.center, ), ), diff --git a/recipients_app/lib/view/widgets/income/balance_card/balance_card_bottom_action.dart b/recipients_app/lib/view/widgets/income/balance_card/balance_card_bottom_action.dart index 2e1bc866f..2c1815c37 100644 --- a/recipients_app/lib/view/widgets/income/balance_card/balance_card_bottom_action.dart +++ b/recipients_app/lib/view/widgets/income/balance_card/balance_card_bottom_action.dart @@ -1,5 +1,6 @@ import "package:app/core/cubits/payment/payments_cubit.dart"; import "package:app/data/models/payment/payment.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/buttons/button_small.dart"; import "package:app/ui/configs/configs.dart"; import "package:app/view/pages/payments_page.dart"; @@ -7,7 +8,6 @@ import "package:app/view/widgets/income/review_payment_modal.dart"; import "package:collection/collection.dart"; import "package:flutter/material.dart"; import "package:flutter_bloc/flutter_bloc.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; class BalanceCardBottomAction extends StatelessWidget { final PaymentsUiState paymentsUiState; @@ -19,8 +19,6 @@ class BalanceCardBottomAction extends StatelessWidget { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - final foregroundColor = _getForegroundColor(paymentsUiState.status); final shouldShowSecondaryActionButton = _shouldShowSecondaryActionButton( @@ -36,7 +34,7 @@ class BalanceCardBottomAction extends StatelessWidget { children: [ Expanded( child: Text( - _getStatusLabel(paymentsUiState, localizations), + _getStatusLabel(paymentsUiState, context.l10n), style: TextStyle(color: foregroundColor), ), ), @@ -47,7 +45,7 @@ class BalanceCardBottomAction extends StatelessWidget { shouldShowSecondaryActionButton, context, ), - label: _getPrimaryActionLabel(paymentsUiState, localizations), + label: _getPrimaryActionLabel(paymentsUiState, context.l10n), buttonType: ButtonSmallType.outlined, color: foregroundColor, fontColor: foregroundColor, @@ -56,7 +54,7 @@ class BalanceCardBottomAction extends StatelessWidget { const SizedBox(width: 8), ButtonSmall( onPressed: () => _onPressedNo(context), - label: localizations.no, + label: context.l10n.no, buttonType: ButtonSmallType.outlined, color: foregroundColor, fontColor: foregroundColor, @@ -76,9 +74,7 @@ class BalanceCardBottomAction extends StatelessWidget { ) { if (shouldShowSecondaryActionButton) { final MappedPayment? mappedPayment = paymentsUiState.payments.firstWhereOrNull( - (element) => - element.uiStatus == PaymentUiStatus.toReview || - element.uiStatus == PaymentUiStatus.recentToReview, + (element) => element.uiStatus == PaymentUiStatus.toReview || element.uiStatus == PaymentUiStatus.recentToReview, ); if (mappedPayment != null) { context.read().confirmPayment(mappedPayment.payment); @@ -90,9 +86,7 @@ class BalanceCardBottomAction extends StatelessWidget { void _onPressedNo(BuildContext context) { final MappedPayment? mappedPayment = paymentsUiState.payments.firstWhereOrNull( - (element) => - element.uiStatus == PaymentUiStatus.toReview || - element.uiStatus == PaymentUiStatus.recentToReview, + (element) => element.uiStatus == PaymentUiStatus.toReview || element.uiStatus == PaymentUiStatus.recentToReview, ); if (mappedPayment != null) { diff --git a/recipients_app/lib/view/widgets/income/balance_card/balance_card_container.dart b/recipients_app/lib/view/widgets/income/balance_card/balance_card_container.dart index 70ab7a9f8..2644de77d 100644 --- a/recipients_app/lib/view/widgets/income/balance_card/balance_card_container.dart +++ b/recipients_app/lib/view/widgets/income/balance_card/balance_card_container.dart @@ -1,5 +1,6 @@ import "package:app/core/cubits/payment/payments_cubit.dart"; import "package:app/data/models/payment/payment.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/configs/configs.dart"; import "package:app/view/pages/payment_tile.dart"; import "package:app/view/pages/payments_page.dart"; @@ -9,7 +10,6 @@ import "package:app/view/widgets/income/balance_card/balance_card_header.dart"; import "package:app/view/widgets/income/balance_card/on_hold_bottom_card.dart"; import "package:flutter/material.dart"; import "package:flutter_bloc/flutter_bloc.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; const _kShowPaymentCardStatuses = [ PaymentUiStatus.contested, @@ -22,10 +22,7 @@ class BalanceCardContainer extends DashboardItem { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - - final paymentsUiState = - context.watch().state.paymentsUiState; + final paymentsUiState = context.watch().state.paymentsUiState; final MappedPayment? lastPaidPayment = paymentsUiState?.lastPaidPayment; @@ -51,12 +48,11 @@ class BalanceCardContainer extends DashboardItem { BalanceCardHeader( daysTo: paymentsUiState?.nextPayment.daysToPayment ?? 0, amount: paymentsUiState?.nextPayment.amount ?? 0, - balanceCardStatus: paymentsUiState?.status ?? - BalanceCardStatus.allConfirmed, + balanceCardStatus: paymentsUiState?.status ?? BalanceCardStatus.allConfirmed, ), const SizedBox(height: 16), Text( - localizations.myPayments, + context.l10n.myPayments, style: const TextStyle( color: Colors.black, fontSize: 13.0, @@ -74,14 +70,12 @@ class BalanceCardContainer extends DashboardItem { ), ), ), - if (paymentsUiState != null && - paymentsUiState.status == BalanceCardStatus.onHold) ...[ + if (paymentsUiState != null && paymentsUiState.status == BalanceCardStatus.onHold) ...[ OnHoldBottomCard( reviewAction: () => _navigateToPaymentsList(context), ), ], - if (lastPaidPayment != null && - _kShowPaymentCardStatuses.contains(lastPaidPayment.uiStatus)) ...[ + if (lastPaidPayment != null && _kShowPaymentCardStatuses.contains(lastPaidPayment.uiStatus)) ...[ PaymentTile(mappedPayment: lastPaidPayment), ], const SizedBox(height: 4), diff --git a/recipients_app/lib/view/widgets/income/balance_card/balance_card_header.dart b/recipients_app/lib/view/widgets/income/balance_card/balance_card_header.dart index 1016ed5e9..9042d37d8 100644 --- a/recipients_app/lib/view/widgets/income/balance_card/balance_card_header.dart +++ b/recipients_app/lib/view/widgets/income/balance_card/balance_card_header.dart @@ -1,7 +1,7 @@ import "package:app/data/models/payment/payment.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/configs/configs.dart"; import "package:flutter/material.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; class BalanceCardHeader extends StatelessWidget { final int daysTo; @@ -17,8 +17,6 @@ class BalanceCardHeader extends StatelessWidget { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - final dynamicTextStyle = Theme.of(context).textTheme.headlineLarge!.copyWith( fontWeight: FontWeight.bold, color: _getTextColor(), @@ -32,12 +30,12 @@ class BalanceCardHeader extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - localizations.nextPayment, + context.l10n.nextPayment, style: const TextStyle(fontSize: 13), ), const SizedBox(height: 4), Text( - _getNextDateText(localizations), + _getNextDateText(context.l10n), style: dynamicTextStyle, ), ], @@ -48,7 +46,7 @@ class BalanceCardHeader extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - localizations.amount, + context.l10n.amount, style: const TextStyle(fontSize: 13), ), const SizedBox(height: 4), diff --git a/recipients_app/lib/view/widgets/income/balance_card/on_hold_bottom_card.dart b/recipients_app/lib/view/widgets/income/balance_card/on_hold_bottom_card.dart index cdf8e227d..661471e64 100644 --- a/recipients_app/lib/view/widgets/income/balance_card/on_hold_bottom_card.dart +++ b/recipients_app/lib/view/widgets/income/balance_card/on_hold_bottom_card.dart @@ -1,8 +1,8 @@ +import "package:app/l10n/l10n.dart"; import "package:app/ui/buttons/buttons.dart"; import "package:app/ui/configs/app_colors.dart"; import "package:app/ui/configs/app_spacings.dart"; import "package:flutter/material.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; class OnHoldBottomCard extends StatelessWidget { final VoidCallback reviewAction; @@ -11,8 +11,6 @@ class OnHoldBottomCard extends StatelessWidget { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - return Card( clipBehavior: Clip.antiAlias, color: AppColors.redColor, @@ -28,7 +26,7 @@ class OnHoldBottomCard extends StatelessWidget { children: [ Expanded( child: Text( - localizations.paymentsSuspended, + context.l10n.paymentsSuspended, style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: Colors.black, ), @@ -37,7 +35,7 @@ class OnHoldBottomCard extends StatelessWidget { const SizedBox(width: 8), ButtonSmall( onPressed: reviewAction, - label: localizations.review, + label: context.l10n.review, buttonType: ButtonSmallType.outlined, color: AppColors.fontColorDark, ), diff --git a/recipients_app/lib/view/widgets/income/review_payment_header.dart b/recipients_app/lib/view/widgets/income/review_payment_header.dart index 4185f1eb3..c9722c739 100644 --- a/recipients_app/lib/view/widgets/income/review_payment_header.dart +++ b/recipients_app/lib/view/widgets/income/review_payment_header.dart @@ -1,18 +1,16 @@ +import "package:app/l10n/l10n.dart"; import "package:app/ui/configs/configs.dart"; import "package:flutter/material.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; class ReviewPaymentModalHeader extends StatelessWidget { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - return Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(localizations.contestPayment), + Text(context.l10n.contestPayment), GestureDetector( onTap: () { Navigator.pop(context); @@ -33,7 +31,7 @@ class ReviewPaymentModalHeader extends StatelessWidget { child: Padding( padding: const EdgeInsets.only(top: 24), child: Text( - localizations.contestPaymentInfo, + context.l10n.contestPaymentInfo, textAlign: TextAlign.center, style: AppStyles.headlineLarge.copyWith( color: AppColors.primaryColor, diff --git a/recipients_app/lib/view/widgets/income/review_payment_modal.dart b/recipients_app/lib/view/widgets/income/review_payment_modal.dart index b8844cd10..5601d3e31 100644 --- a/recipients_app/lib/view/widgets/income/review_payment_modal.dart +++ b/recipients_app/lib/view/widgets/income/review_payment_modal.dart @@ -1,5 +1,6 @@ import "package:app/core/cubits/payment/payments_cubit.dart"; import "package:app/data/models/payment/payment.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/configs/configs.dart"; import "package:app/ui/inputs/input_text_area.dart"; import "package:app/ui/inputs/radio_row.dart"; @@ -7,7 +8,6 @@ import "package:app/view/widgets/income/review_payment_bottom_action.dart"; import "package:app/view/widgets/income/review_payment_header.dart"; import "package:flutter/material.dart"; import "package:flutter_bloc/flutter_bloc.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; class ReviewPaymentModal extends StatefulWidget { final SocialIncomePayment _payment; @@ -37,8 +37,6 @@ class _ReviewPaymentModalState extends State { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - return FractionallySizedBox( widthFactor: 0.95, heightFactor: 0.8, @@ -84,13 +82,13 @@ class _ReviewPaymentModalState extends State { ), if (_selectedReason != null && _selectedReason != ContestReason.other) ...[ ReviewPaymentBottomAction( - actionLabel: localizations.submit, + actionLabel: context.l10n.submit, onAction: () => _onPressedContest(context, _selectedReason!), ), ], if (_selectedReason != null && _selectedReason == ContestReason.other) ...[ ReviewPaymentBottomAction( - actionLabel: localizations.next, + actionLabel: context.l10n.next, onAction: () => setState(() { _firstContestStep = false; }), @@ -111,14 +109,14 @@ class _ReviewPaymentModalState extends State { const SizedBox(height: 16), InputTextArea( controller: inputController, - hintText: localizations.describeWhatHappened, + hintText: context.l10n.describeWhatHappened, ), ], ), ), ), ReviewPaymentBottomAction( - actionLabel: localizations.submit, + actionLabel: context.l10n.submit, onAction: () { _onPressedContest( context, diff --git a/recipients_app/lib/view/widgets/survey/survey_card_bottom_action.dart b/recipients_app/lib/view/widgets/survey/survey_card_bottom_action.dart index a2fc10a89..874c3edc7 100644 --- a/recipients_app/lib/view/widgets/survey/survey_card_bottom_action.dart +++ b/recipients_app/lib/view/widgets/survey/survey_card_bottom_action.dart @@ -1,13 +1,13 @@ import "package:app/core/cubits/survey/survey_cubit.dart"; import "package:app/data/models/survey/mapped_survey.dart"; import "package:app/data/models/survey/survey_card_status.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/buttons/button_small.dart"; import "package:app/ui/configs/configs.dart"; import "package:app/ui/icons/survey_status_icon_with_text.dart"; import "package:app/view/pages/survey_page.dart"; import "package:flutter/material.dart"; import "package:flutter_bloc/flutter_bloc.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; import "package:intl/intl.dart"; class SurveyCardBottomAction extends StatelessWidget { @@ -20,7 +20,6 @@ class SurveyCardBottomAction extends StatelessWidget { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; final locale = Localizations.localeOf(context).toLanguageTag(); final foregroundColor = _getForegroundColor(mappedSurvey.cardStatus); @@ -33,14 +32,14 @@ class SurveyCardBottomAction extends StatelessWidget { children: [ Expanded( child: Text( - _getStatusLabel(mappedSurvey, localizations, locale), + _getStatusLabel(mappedSurvey, context.l10n, locale), style: TextStyle(color: foregroundColor), ), ), if (_shouldShowActionButton(mappedSurvey.cardStatus)) ...[ ButtonSmall( onPressed: () => _navigateToSurvey(context), - label: localizations.startSurvey, + label: context.l10n.startSurvey, buttonType: ButtonSmallType.outlined, color: foregroundColor, fontColor: foregroundColor, @@ -48,12 +47,12 @@ class SurveyCardBottomAction extends StatelessWidget { ] else if (mappedSurvey.cardStatus == SurveyCardStatus.answered) ...[ SurveyStatusIconWithText( status: SurveyCardStatus.answered, - text: localizations.surveyStatusAnswered, + text: context.l10n.surveyStatusAnswered, ), ] else if (mappedSurvey.cardStatus == SurveyCardStatus.missed) ...[ SurveyStatusIconWithText( status: SurveyCardStatus.missed, - text: localizations.surveyStatusMissed, + text: context.l10n.surveyStatusMissed, ), ], ], diff --git a/recipients_app/lib/view/widgets/survey/survey_card_container.dart b/recipients_app/lib/view/widgets/survey/survey_card_container.dart index f5defd2ef..2b2944d88 100644 --- a/recipients_app/lib/view/widgets/survey/survey_card_container.dart +++ b/recipients_app/lib/view/widgets/survey/survey_card_container.dart @@ -1,9 +1,9 @@ import "package:app/data/models/survey/mapped_survey.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/configs/configs.dart"; import "package:app/view/widgets/dashboard_item.dart"; import "package:app/view/widgets/survey/survey_card_bottom_action.dart"; import "package:flutter/material.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; class SurveyCardContainer extends DashboardItem { final MappedSurvey mappedSurvey; @@ -15,8 +15,6 @@ class SurveyCardContainer extends DashboardItem { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - return Card( clipBehavior: Clip.antiAlias, color: Colors.white, @@ -33,7 +31,7 @@ class SurveyCardContainer extends DashboardItem { mainAxisSize: MainAxisSize.min, children: [ Text( - "${mappedSurvey.name} ${localizations.surveyCardTitle}", + "${mappedSurvey.name} ${context.l10n.surveyCardTitle}", style: const TextStyle( color: Colors.black, fontSize: 13.0, @@ -52,7 +50,7 @@ class SurveyCardContainer extends DashboardItem { ), const SizedBox(height: 4), Text( - localizations.surveyCardInfo, + context.l10n.surveyCardInfo, textAlign: TextAlign.center, style: const TextStyle( color: Colors.black, diff --git a/recipients_app/lib/view/widgets/survey/survey_list_card.dart b/recipients_app/lib/view/widgets/survey/survey_list_card.dart index 73547720c..9fabdc326 100644 --- a/recipients_app/lib/view/widgets/survey/survey_list_card.dart +++ b/recipients_app/lib/view/widgets/survey/survey_list_card.dart @@ -1,10 +1,10 @@ import "package:app/data/models/models.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/configs/app_colors.dart"; import "package:app/ui/configs/app_sizes.dart"; import "package:app/view/widgets/survey/survey_card_bottom_action.dart"; import "package:app/view/widgets/survey/survey_status_chip.dart"; import "package:flutter/material.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; import "package:intl/intl.dart"; const _kOpenableSurveyStatuses = [ @@ -20,7 +20,6 @@ class SurveyListCard extends StatelessWidget { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; final locale = Localizations.localeOf(context).toLanguageTag(); return Card( @@ -48,7 +47,7 @@ class SurveyListCard extends StatelessWidget { Text( _formatDate( mappedSurvey.survey.dueDateAt?.toDate(), - localizations, + context.l10n, locale, ), style: Theme.of(context).textTheme.bodyMedium?.copyWith( diff --git a/recipients_app/lib/view/widgets/survey/survey_status_chip.dart b/recipients_app/lib/view/widgets/survey/survey_status_chip.dart index 794eff5d4..8c767a091 100644 --- a/recipients_app/lib/view/widgets/survey/survey_status_chip.dart +++ b/recipients_app/lib/view/widgets/survey/survey_status_chip.dart @@ -1,8 +1,8 @@ import "package:app/data/models/survey/survey.dart"; import "package:app/data/models/survey/survey_card_status.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/configs/configs.dart"; import "package:flutter/material.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; const statusIconHeight = 26.0; @@ -18,8 +18,6 @@ class SurveyServerStatusChip extends StatelessWidget { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - late Color color; late Color textColor; @@ -54,7 +52,7 @@ class SurveyServerStatusChip extends StatelessWidget { _getStatusName( status, serverStatus, - localizations, + context.l10n, ), style: AppStyles.iconLabel.copyWith( color: textColor, diff --git a/recipients_app/lib/view/widgets/survey/surveys_overview_card.dart b/recipients_app/lib/view/widgets/survey/surveys_overview_card.dart index 9e01f14ee..5952542ec 100644 --- a/recipients_app/lib/view/widgets/survey/surveys_overview_card.dart +++ b/recipients_app/lib/view/widgets/survey/surveys_overview_card.dart @@ -1,5 +1,6 @@ import "package:app/core/cubits/survey/survey_cubit.dart"; import "package:app/data/models/models.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/buttons/button_small.dart"; import "package:app/ui/configs/app_colors.dart"; import "package:app/ui/configs/app_sizes.dart"; @@ -7,7 +8,6 @@ import "package:app/view/pages/surveys_page.dart"; import "package:app/view/widgets/dashboard_item.dart"; import "package:flutter/material.dart"; import "package:flutter_bloc/flutter_bloc.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; const _doneStatuses = [ SurveyCardStatus.missed, @@ -21,8 +21,6 @@ class SurveysOverviewCard extends DashboardItem { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - return Column( children: [ GestureDetector( @@ -43,14 +41,14 @@ class SurveysOverviewCard extends DashboardItem { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - localizations.mySurveysTitle, + context.l10n.mySurveysTitle, style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: Colors.black, ), ), const SizedBox(height: 4), Text( - localizations.completedSurveysCount( + context.l10n.completedSurveysCount( _getDoneSurveysCount(), mappedSurveys.length, ), @@ -63,7 +61,7 @@ class SurveysOverviewCard extends DashboardItem { const SizedBox(width: AppSizes.small), ButtonSmall( onPressed: () => _navigateToSurveysPage(context), - label: localizations.overview, + label: context.l10n.overview, buttonType: ButtonSmallType.outlined, color: AppColors.fontColorDark, ), diff --git a/recipients_app/lib/view/widgets/welcome/otp_input_page.dart b/recipients_app/lib/view/widgets/welcome/otp_input_page.dart index b804e27db..4f9dff7ac 100644 --- a/recipients_app/lib/view/widgets/welcome/otp_input_page.dart +++ b/recipients_app/lib/view/widgets/welcome/otp_input_page.dart @@ -1,9 +1,9 @@ import "package:app/core/cubits/signup/signup_cubit.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/configs/configs.dart"; import "package:app/view/widgets/welcome/otp_input.dart"; import "package:flutter/material.dart"; import "package:flutter_bloc/flutter_bloc.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; class OtpInputPage extends StatefulWidget { const OtpInputPage({super.key}); @@ -15,7 +15,6 @@ class OtpInputPage extends StatefulWidget { class _OtpInputPageState extends State { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; final phoneNumber = context.watch().state.phoneNumber ?? ""; return Scaffold( @@ -36,7 +35,7 @@ class _OtpInputPageState extends State { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Text( - localizations.verificationSent(phoneNumber), + context.l10n.verificationSent(phoneNumber), style: AppStyles.headlineLarge.copyWith( color: AppColors.primaryColor, fontWeight: FontWeight.bold, @@ -45,14 +44,13 @@ class _OtpInputPageState extends State { ), const SizedBox(height: 24), OtpInput( - onCodeReady: (verificationCode) => - context.read().submitVerificationCode(verificationCode), + onCodeReady: (verificationCode) => context.read().submitVerificationCode(verificationCode), ), const SizedBox(height: 24), TextButton( onPressed: () async => context.read().resendVerificationCode(), child: Text( - localizations.resendVerificationCode, + context.l10n.resendVerificationCode, style: Theme.of(context).textTheme.headlineMedium!.copyWith( color: AppColors.primaryColor, decoration: TextDecoration.underline, diff --git a/recipients_app/lib/view/widgets/welcome/phone_input_page.dart b/recipients_app/lib/view/widgets/welcome/phone_input_page.dart index 78d100045..5474da3e1 100644 --- a/recipients_app/lib/view/widgets/welcome/phone_input_page.dart +++ b/recipients_app/lib/view/widgets/welcome/phone_input_page.dart @@ -1,10 +1,10 @@ import "package:app/core/cubits/signup/signup_cubit.dart"; import "package:app/demo_manager.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/buttons/buttons.dart"; import "package:app/ui/configs/app_colors.dart"; import "package:flutter/material.dart"; import "package:flutter_bloc/flutter_bloc.dart"; -import "package:flutter_gen/gen_l10n/app_localizations.dart"; import "package:intl_phone_number_input/intl_phone_number_input.dart"; import "package:rounded_loading_button/rounded_loading_button.dart"; @@ -36,7 +36,6 @@ class _PhoneInputPageState extends State { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; final demoManager = RepositoryProvider.of(context); final isLoading = context.watch().state.status == SignupStatus.loadingPhoneNumber; @@ -53,7 +52,7 @@ class _PhoneInputPageState extends State { onPressed: () { demoManager.isDemoEnabled = true; }, - label: localizations.demoCta, + label: context.l10n.demoCta, buttonType: ButtonSmallType.outlined, ), ), @@ -69,7 +68,7 @@ class _PhoneInputPageState extends State { ), const SizedBox(height: 16), Text( - localizations.yourMobilePhone, + context.l10n.yourMobilePhone, textAlign: TextAlign.center, style: const TextStyle( fontSize: 24, @@ -109,7 +108,7 @@ class _PhoneInputPageState extends State { fontSize: 18, ), inputDecoration: InputDecoration( - labelText: localizations.phoneNumber, + labelText: context.l10n.phoneNumber, labelStyle: Theme.of(context).textTheme.headlineMedium!.copyWith(color: AppColors.primaryColor), enabledBorder: const OutlineInputBorder( @@ -147,7 +146,7 @@ class _PhoneInputPageState extends State { ); } }, - label: localizations.continueText, + label: context.l10n.continueText, ), ], ), diff --git a/recipients_app/pubspec.lock b/recipients_app/pubspec.lock index 46c7c9ff8..7451ce193 100644 --- a/recipients_app/pubspec.lock +++ b/recipients_app/pubspec.lock @@ -13,10 +13,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: daa1d780fdecf8af925680c06c86563cdd445deea995d5c9176f1302a2b10bbe + sha256: e051259913915ea5bc8fe18664596bea08592fd123930605d562969cd7315fcd url: "https://pub.dev" source: hosted - version: "1.3.48" + version: "1.3.51" _macros: dependency: transitive description: dart @@ -26,10 +26,10 @@ packages: dependency: "direct dev" description: name: alchemist - sha256: "2efa90870003e10bf01af52329f2ddf9ccc44cd519adb2c8aea1713db2e84760" + sha256: "2dcbfb0fe2b108797831241e48bb8d2abb902d2626332fb98b5680fb1f6bdb3a" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.11.0" analyzer: dependency: transitive description: @@ -202,26 +202,26 @@ packages: dependency: "direct main" description: name: cloud_firestore - sha256: ba89d4ae6ddaea0241f50a2dc1ffe36f32891f1a6bc78540f55d79c7f8ed536a + sha256: d7204f3263ba3236c037972f1ea2821569bd7b896fa348c3d557e3b76b6dc143 url: "https://pub.dev" source: hosted - version: "5.6.0" + version: "5.6.3" cloud_firestore_platform_interface: dependency: transitive description: name: cloud_firestore_platform_interface - sha256: "966cfd6beb2e943f3363a7bced4476533caa55d2338ffd876855c07e5296d1d7" + sha256: "10a8519164a0e38fce52f78d540bce1170fc210d07989fe49597723400fcd0f1" url: "https://pub.dev" source: hosted - version: "6.6.0" + version: "6.6.3" cloud_firestore_web: dependency: transitive description: name: cloud_firestore_web - sha256: "110ba7ff3322c239527e5be3c0d471a3e14fd0a870b2feff96d1e527a2eae2bb" + sha256: "4b9e34f53c32dc9891aea247d82bfb21fe7779c0064d84baea1a4f18210146de" url: "https://pub.dev" source: hosted - version: "4.4.0" + version: "4.4.3" code_builder: dependency: transitive description: @@ -330,58 +330,58 @@ packages: dependency: "direct main" description: name: firebase_app_check - sha256: a43785ac59b3a7dc274c80369e36568dac0cda1122f42faa6ea76149e4953737 + sha256: "4089ab1346844b548ca1111f958d29f1fa74a7dfb838db801a53545eed0a2b3d" url: "https://pub.dev" source: hosted - version: "0.3.1+7" + version: "0.3.2+2" firebase_app_check_platform_interface: dependency: transitive description: name: firebase_app_check_platform_interface - sha256: c350d1a550228d21eafc964648f93224d473e75d7152af651be72a95e5a9fd27 + sha256: "8f537884db880c77da26eda55085cab65f5df762e2c17ff10c164ed28f7f994f" url: "https://pub.dev" source: hosted - version: "0.1.0+41" + version: "0.1.1+2" firebase_app_check_web: dependency: transitive description: name: firebase_app_check_web - sha256: "0ee99f137b91ececce78230a4ce357a6fb694d7e8f3037ac22b96c9025c6c9a5" + sha256: dd2791148c6fa04095b3b2a203afb6a6382912becb02288febe9335b1c4104dc url: "https://pub.dev" source: hosted - version: "0.2.0+3" + version: "0.2.0+6" firebase_auth: dependency: "direct main" description: name: firebase_auth - sha256: "03483af6e67b7c4b696ca9386989a6cd5593569e1ac5af6907ea5f7fd9c16d8b" + sha256: "2886a01a895565722add556510263231390a9f1d1d51eee34c22f9b94a73dd54" url: "https://pub.dev" source: hosted - version: "5.3.4" + version: "5.4.2" firebase_auth_platform_interface: dependency: transitive description: name: firebase_auth_platform_interface - sha256: "3e1409f48c48930635705b1237ebbdee8c54c19106a0a4fb321dbb4b642820c4" + sha256: "2e8fe7e6b5869c981f62c0de1a0abef6f626a1daffe92e1e6881448a9d3da778" url: "https://pub.dev" source: hosted - version: "7.4.10" + version: "7.5.2" firebase_auth_web: dependency: transitive description: name: firebase_auth_web - sha256: d83fe95c44d73c9c29b006ac7df3aa5e1b8ce92b62edc44e8f86250951fe2cd0 + sha256: c9600115b6f74365a51c735d4c43d4632ad44bfde505fe7c13c838701cd01ff2 url: "https://pub.dev" source: hosted - version: "5.13.5" + version: "5.13.8" firebase_core: dependency: "direct main" description: name: firebase_core - sha256: "15d761b95dfa2906dfcc31b7fc6fe293188533d1a3ffe78389ba9e69bd7fdbde" + sha256: "93dc4dd12f9b02c5767f235307f609e61ed9211047132d07f9e02c668f0bfc33" url: "https://pub.dev" source: hosted - version: "3.9.0" + version: "3.11.0" firebase_core_platform_interface: dependency: transitive description: @@ -394,34 +394,34 @@ packages: dependency: transitive description: name: firebase_core_web - sha256: fbc008cf390d909b823763064b63afefe9f02d8afdb13eb3f485b871afee956b + sha256: "0e13c80f0de8acaa5d0519cbe23c8b4cc138a2d5d508b5755c861bdfc9762678" url: "https://pub.dev" source: hosted - version: "2.19.0" + version: "2.20.0" firebase_messaging: dependency: "direct main" description: name: firebase_messaging - sha256: "151a3ee68736abf293aab66d1317ade53c88abe1db09c75a0460aebf7767bbdf" + sha256: "3dee3b0cbfe719e64773cb7d1cad57c58b2235a8c136f5715fe733a54058c783" url: "https://pub.dev" source: hosted - version: "15.1.6" + version: "15.2.2" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface - sha256: f331ee51e40c243f90cc7bc059222dfec4e5df53125b08d31fb28961b00d2a9d + sha256: e9ea726b9bb864fc6223bb66422bd9877b9973ae51967754a769b0d01e201c1e url: "https://pub.dev" source: hosted - version: "4.5.49" + version: "4.6.2" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web - sha256: efaf3fdc54cd77e0eedb8e75f7f01c808828c64d052ddbf94d3009974e47d30f + sha256: "5f7b40e8bf861a37f8b8196e347d8a919750421a45f0b45d1bb74e98fa72726e" url: "https://pub.dev" source: hosted - version: "3.9.5" + version: "3.10.2" fixnum: dependency: transitive description: diff --git a/recipients_app/pubspec.yaml b/recipients_app/pubspec.yaml index 7e25b954a..07c8bb1da 100644 --- a/recipients_app/pubspec.yaml +++ b/recipients_app/pubspec.yaml @@ -2,7 +2,7 @@ name: app description: Social Income App publish_to: "none" -version: 1.1.14+35 +version: 1.1.14+36 environment: sdk: ">=3.6.0 <4.0.0" @@ -11,13 +11,13 @@ environment: dependencies: animations: ^2.0.11 another_flushbar: ^1.12.30 - cloud_firestore: ^5.6.0 + cloud_firestore: ^5.6.3 collection: ^1.19.0 equatable: ^2.0.7 - firebase_app_check: ^0.3.1+7 - firebase_auth: ^5.3.4 - firebase_core: ^3.9.0 - firebase_messaging: ^15.1.6 + firebase_app_check: ^0.3.2+2 + firebase_auth: ^5.4.2 + firebase_core: ^3.11.0 + firebase_messaging: ^15.2.2 flutter: sdk: flutter flutter_bloc: ^8.1.6 @@ -43,7 +43,7 @@ dependencies: webview_flutter: ^4.10.0 dev_dependencies: - alchemist: ^0.7.0 + alchemist: ^0.11.0 bloc_test: ^9.1.7 build_runner: ^2.4.14 diff --git a/recipients_app/test/golden_tests/balance_card_container_golden_test.dart b/recipients_app/test/golden_tests/balance_card_container_golden_test.dart index 57d984e90..bcad6a042 100644 --- a/recipients_app/test/golden_tests/balance_card_container_golden_test.dart +++ b/recipients_app/test/golden_tests/balance_card_container_golden_test.dart @@ -15,6 +15,7 @@ void main() { setUp(() { mockPaymentsCubit = MockPaymentsCubit(); }); + group("ListTile Golden Tests", () { goldenTest( "renders correctly", diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_contested_isolatedDiff.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_contested_isolatedDiff.png new file mode 100644 index 000000000..6da235400 Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_contested_isolatedDiff.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_contested_maskedDiff.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_contested_maskedDiff.png new file mode 100644 index 000000000..19b3ce086 Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_contested_maskedDiff.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_contested_masterImage.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_contested_masterImage.png new file mode 100644 index 000000000..f0e50d042 Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_contested_masterImage.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_contested_testImage.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_contested_testImage.png new file mode 100644 index 000000000..7822d647c Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_contested_testImage.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_paid_isolatedDiff.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_paid_isolatedDiff.png new file mode 100644 index 000000000..6da235400 Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_paid_isolatedDiff.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_paid_maskedDiff.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_paid_maskedDiff.png new file mode 100644 index 000000000..19b3ce086 Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_paid_maskedDiff.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_paid_masterImage.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_paid_masterImage.png new file mode 100644 index 000000000..f0e50d042 Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_paid_masterImage.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_paid_testImage.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_paid_testImage.png new file mode 100644 index 000000000..7822d647c Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_paid_testImage.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_contested_isolatedDiff.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_contested_isolatedDiff.png new file mode 100644 index 000000000..ce55d94ca Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_contested_isolatedDiff.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_contested_maskedDiff.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_contested_maskedDiff.png new file mode 100644 index 000000000..072e519dd Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_contested_maskedDiff.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_contested_masterImage.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_contested_masterImage.png new file mode 100644 index 000000000..94d7fd615 Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_contested_masterImage.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_contested_testImage.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_contested_testImage.png new file mode 100644 index 000000000..7c9ecb926 Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_contested_testImage.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_inreview_isolatedDiff.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_inreview_isolatedDiff.png new file mode 100644 index 000000000..5df39e272 Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_inreview_isolatedDiff.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_inreview_maskedDiff.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_inreview_maskedDiff.png new file mode 100644 index 000000000..6c6213ce1 Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_inreview_maskedDiff.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_inreview_masterImage.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_inreview_masterImage.png new file mode 100644 index 000000000..7fceb4637 Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_inreview_masterImage.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_inreview_testImage.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_inreview_testImage.png new file mode 100644 index 000000000..8f7325732 Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_and_triple_inreview_testImage.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_isolatedDiff.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_isolatedDiff.png new file mode 100644 index 000000000..bccc91ef5 Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_isolatedDiff.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_maskedDiff.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_maskedDiff.png new file mode 100644 index 000000000..cd8597482 Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_maskedDiff.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_masterImage.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_masterImage.png new file mode 100644 index 000000000..f724afec4 Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_masterImage.png differ diff --git a/recipients_app/test/golden_tests/failures/balance_card_confirmed_testImage.png b/recipients_app/test/golden_tests/failures/balance_card_confirmed_testImage.png new file mode 100644 index 000000000..eec3c344b Binary files /dev/null and b/recipients_app/test/golden_tests/failures/balance_card_confirmed_testImage.png differ diff --git a/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed.png b/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed.png index e386d0590..eec3c344b 100644 Binary files a/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed.png and b/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed.png differ diff --git a/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed_and_contested.png b/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed_and_contested.png index fa55278ca..7822d647c 100644 Binary files a/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed_and_contested.png and b/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed_and_contested.png differ diff --git a/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed_and_paid.png b/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed_and_paid.png index fa55278ca..7822d647c 100644 Binary files a/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed_and_paid.png and b/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed_and_paid.png differ diff --git a/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed_and_triple_contested.png b/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed_and_triple_contested.png index e56621101..7c9ecb926 100644 Binary files a/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed_and_triple_contested.png and b/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed_and_triple_contested.png differ diff --git a/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed_and_triple_inreview.png b/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed_and_triple_inreview.png index b23b4412c..8f7325732 100644 Binary files a/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed_and_triple_inreview.png and b/recipients_app/test/golden_tests/goldens/ci/balance_card_confirmed_and_triple_inreview.png differ diff --git a/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed.png b/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed.png index f4d4e0402..a971c2322 100644 Binary files a/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed.png and b/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed.png differ diff --git a/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed_and_contested.png b/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed_and_contested.png index a5422a40a..22a1016aa 100644 Binary files a/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed_and_contested.png and b/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed_and_contested.png differ diff --git a/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed_and_paid.png b/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed_and_paid.png index f682af7db..173d73ff9 100644 Binary files a/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed_and_paid.png and b/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed_and_paid.png differ diff --git a/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed_and_triple_contested.png b/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed_and_triple_contested.png index 37edc9189..331ff325c 100644 Binary files a/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed_and_triple_contested.png and b/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed_and_triple_contested.png differ diff --git a/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed_and_triple_inreview.png b/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed_and_triple_inreview.png index bb18c07c6..6fea03633 100644 Binary files a/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed_and_triple_inreview.png and b/recipients_app/test/golden_tests/goldens/macos/balance_card_confirmed_and_triple_inreview.png differ diff --git a/recipients_app/test/golden_tests/goldens/windows/balance_card_confirmed.png b/recipients_app/test/golden_tests/goldens/windows/balance_card_confirmed.png new file mode 100644 index 000000000..6959f3f27 Binary files /dev/null and b/recipients_app/test/golden_tests/goldens/windows/balance_card_confirmed.png differ diff --git a/recipients_app/test/golden_tests/goldens/windows/balance_card_confirmed_and_contested.png b/recipients_app/test/golden_tests/goldens/windows/balance_card_confirmed_and_contested.png new file mode 100644 index 000000000..8f08074c9 Binary files /dev/null and b/recipients_app/test/golden_tests/goldens/windows/balance_card_confirmed_and_contested.png differ diff --git a/recipients_app/test/golden_tests/goldens/windows/balance_card_confirmed_and_paid.png b/recipients_app/test/golden_tests/goldens/windows/balance_card_confirmed_and_paid.png new file mode 100644 index 000000000..48dd45fd6 Binary files /dev/null and b/recipients_app/test/golden_tests/goldens/windows/balance_card_confirmed_and_paid.png differ diff --git a/recipients_app/test/golden_tests/goldens/windows/balance_card_confirmed_and_triple_contested.png b/recipients_app/test/golden_tests/goldens/windows/balance_card_confirmed_and_triple_contested.png new file mode 100644 index 000000000..af30ce573 Binary files /dev/null and b/recipients_app/test/golden_tests/goldens/windows/balance_card_confirmed_and_triple_contested.png differ diff --git a/recipients_app/test/golden_tests/goldens/windows/balance_card_confirmed_and_triple_inreview.png b/recipients_app/test/golden_tests/goldens/windows/balance_card_confirmed_and_triple_inreview.png new file mode 100644 index 000000000..b8ac99848 Binary files /dev/null and b/recipients_app/test/golden_tests/goldens/windows/balance_card_confirmed_and_triple_inreview.png differ diff --git a/recipients_app/test/helpers/pump_app.dart b/recipients_app/test/helpers/pump_app.dart index 889fb5830..1029ce587 100644 --- a/recipients_app/test/helpers/pump_app.dart +++ b/recipients_app/test/helpers/pump_app.dart @@ -1,12 +1,13 @@ import "package:app/core/cubits/payment/payments_cubit.dart"; +import "package:app/l10n/l10n.dart"; import "package:app/ui/configs/app_theme.dart"; import "package:bloc_test/bloc_test.dart"; import "package:flutter/material.dart"; import "package:flutter_bloc/flutter_bloc.dart"; +import "package:flutter_localizations/flutter_localizations.dart"; import "package:flutter_test/flutter_test.dart"; -class MockPaymentsCubit extends MockCubit - implements PaymentsCubit {} +class MockPaymentsCubit extends MockCubit implements PaymentsCubit {} extension PumpApp on WidgetTester { Future pumpApp( @@ -25,6 +26,12 @@ extension PumpApp on WidgetTester { Locale("en", ""), Locale("de", ""), ], + localizationsDelegates: const [ + AppLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], theme: AppTheme.lightTheme, home: widget, ),