From cebd83648be2cbfae882097525b481bf1f62643b Mon Sep 17 00:00:00 2001 From: bossanyit Date: Wed, 25 Aug 2021 01:05:03 +0200 Subject: [PATCH] WT 1.1.22 reengineering: Training Plan execution, registration --- android/app/build.gradle | 1 + android/app/src/main/AndroidManifest.xml | 59 +- asset/image/WT_zold.jpg | Bin 0 -> 67504 bytes asset/menu/smith_machine_squats.jpg | Bin 0 -> 114775 bytes asset/menu/training_start.jpg | Bin 0 -> 117301 bytes i18n/en.json | 7 +- i18n/hu.json | 7 +- ios/Podfile.lock | 228 +++--- ios/Runner.xcodeproj/project.pbxproj | 18 +- ios/Runner/AppDelegate.swift | 3 + ios/Runner/Info.plist | 158 +++-- ios/Runner/Runner.entitlements | 4 + .../customer_change/customer_change_bloc.dart | 38 +- .../customer_change_event.dart | 20 + lib/bloc/menu/menu_bloc.dart | 23 + lib/bloc/menu/menu_event.dart | 11 + lib/bloc/session/session_bloc.dart | 2 + .../training_evaluation_bloc.dart | 12 +- .../training_plan/training_plan_bloc.dart | 71 +- lib/main.dart | 17 +- lib/model/cache.dart | 30 +- lib/model/customer.dart | 5 +- lib/model/exercise_ability.dart | 2 +- lib/model/workout_menu_tree.dart | 1 + lib/repository/customer_repository.dart | 2 +- lib/repository/training_plan_repository.dart | 54 +- lib/service/exercise_tree_service.dart | 1 + lib/service/firebase_api.dart | 67 +- lib/util/enums.dart | 1 + lib/util/purchases.dart | 4 +- lib/util/track.dart | 3 +- lib/view/account.dart | 21 + lib/view/customer_fitness_page.dart | 344 +++++----- lib/view/customer_goal_page.dart | 186 +++-- lib/view/customer_height_page.dart | 178 +++++ lib/view/customer_sex_page.dart | 185 +++++ lib/view/customer_weight_page.dart | 147 ++++ lib/view/customer_welcome_page.dart | 78 ++- lib/view/evaluation_page.dart | 2 +- lib/view/registration.dart | 125 +++- lib/view/settings.dart | 31 +- lib/view/training_plan_activate_page.dart | 5 +- lib/view/training_plan_execute.dart | 649 ++++++++++++++++++ lib/widgets/dialog_trial.dart | 170 +++++ lib/widgets/exercise_save.dart | 4 +- lib/widgets/home.dart | 15 +- lib/widgets/menu_image.dart | 26 +- lib/widgets/menu_page_widget.dart | 146 ++-- lib/widgets/number_picker.dart | 17 +- pubspec.lock | 59 +- pubspec.yaml | 31 +- 51 files changed, 2605 insertions(+), 663 deletions(-) create mode 100644 asset/image/WT_zold.jpg create mode 100644 asset/menu/smith_machine_squats.jpg create mode 100644 asset/menu/training_start.jpg create mode 100644 lib/view/customer_height_page.dart create mode 100644 lib/view/customer_sex_page.dart create mode 100644 lib/view/customer_weight_page.dart create mode 100644 lib/view/training_plan_execute.dart create mode 100644 lib/widgets/dialog_trial.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 711670d..4e88905 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -78,5 +78,6 @@ dependencies { implementation 'com.google.firebase:firebase-analytics:18.0.0' implementation 'com.facebook.android:facebook-login:5.15.3' implementation 'com.android.support:multidex:1.0.3' + implementation 'com.google.firebase:firebase-messaging:20.1.0' } sourceCompatibility = '1.8' \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 8ef85e5..71e1f63 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,41 +1,23 @@ - + - - + + - + - + @@ -44,27 +26,26 @@ + + + + + + + + - - - + - + - - + + + + diff --git a/asset/image/WT_zold.jpg b/asset/image/WT_zold.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f359eb5a71dc0db972328f561ffd6a63761a1b4f GIT binary patch literal 67504 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 H^n3V!V~sN8 literal 0 HcmV?d00001 diff --git a/asset/menu/training_start.jpg b/asset/menu/training_start.jpg new file mode 100644 index 0000000000000000000000000000000000000000..db77a8742dd35c2c3af2e89f9a4fc291f477460b GIT binary patch literal 117301 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 9.1.0) - - Firebase/Analytics (8.0.0): + - FBAEMKit (11.1.0): + - FBAEMKit/AEM (= 11.1.0) + - FBAEMKit/AEM (11.1.0): + - FBSDKCoreKit_Basics (~> 11.1.0) + - FBSDKCoreKit (11.1.0): + - FBSDKCoreKit/Core (= 11.1.0) + - FBSDKCoreKit/Core (11.1.0): + - FBAEMKit (~> 11.1.0) + - FBSDKCoreKit_Basics (~> 11.1.0) + - FBSDKCoreKit_Basics (11.1.0): + - FBSDKCoreKit_Basics/Basics (= 11.1.0) + - FBSDKCoreKit_Basics/Basics (11.1.0) + - FBSDKLoginKit (11.1.0): + - FBSDKLoginKit/Login (= 11.1.0) + - FBSDKLoginKit/Login (11.1.0): + - FBSDKCoreKit (~> 11.1.0) + - FBSDKCoreKit_Basics (~> 11.1.0) + - Firebase/Analytics (8.5.0): - Firebase/Core - - Firebase/Auth (8.0.0): + - Firebase/Auth (8.5.0): - Firebase/CoreOnly - - FirebaseAuth (~> 8.0.0) - - Firebase/Core (8.0.0): + - FirebaseAuth (~> 8.5.0) + - Firebase/Core (8.5.0): - Firebase/CoreOnly - - FirebaseAnalytics (~> 8.0.0) - - Firebase/CoreOnly (8.0.0): - - FirebaseCore (= 8.0.0) - - Firebase/Messaging (8.0.0): + - FirebaseAnalytics (~> 8.5.0) + - Firebase/CoreOnly (8.5.0): + - FirebaseCore (= 8.5.0) + - Firebase/DynamicLinks (8.5.0): - Firebase/CoreOnly - - FirebaseMessaging (~> 8.0.0) - - Firebase/RemoteConfig (8.0.0): + - FirebaseDynamicLinks (~> 8.5.0) + - Firebase/InAppMessaging (8.5.0): - Firebase/CoreOnly - - FirebaseRemoteConfig (~> 8.0.0) - - firebase_analytics (8.1.0): - - Firebase/Analytics (= 8.0.0) + - FirebaseInAppMessaging (~> 8.5.0-beta) + - Firebase/Messaging (8.5.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 8.5.0) + - Firebase/RemoteConfig (8.5.0): + - Firebase/CoreOnly + - FirebaseRemoteConfig (~> 8.5.0) + - firebase_analytics (8.3.0): + - Firebase/Analytics (= 8.5.0) - firebase_core - Flutter - - firebase_auth (1.2.0): - - Firebase/Auth (= 8.0.0) + - firebase_auth (3.0.2): + - Firebase/Auth (= 8.5.0) - firebase_core - Flutter - - firebase_core (1.2.0): - - Firebase/CoreOnly (= 8.0.0) + - firebase_core (1.5.0): + - Firebase/CoreOnly (= 8.5.0) - Flutter - - firebase_messaging (10.0.0): - - Firebase/Messaging (= 8.0.0) + - firebase_dynamic_links (2.0.8): + - Firebase/DynamicLinks (= 8.5.0) - firebase_core - Flutter - - firebase_remote_config (0.10.0): - - Firebase/RemoteConfig (= 8.0.0) + - firebase_in_app_messaging (0.5.0-8): + - Firebase/InAppMessaging (= 8.5.0) - firebase_core - Flutter - - FirebaseABTesting (8.0.0): + - firebase_messaging (10.0.5): + - Firebase/Messaging (= 8.5.0) + - firebase_core + - Flutter + - firebase_remote_config (0.10.0-4): + - Firebase/RemoteConfig (= 8.5.0) + - firebase_core + - Flutter + - FirebaseABTesting (8.6.0): - FirebaseCore (~> 8.0) - - FirebaseAnalytics (8.0.0): - - FirebaseAnalytics/AdIdSupport (= 8.0.0) + - FirebaseAnalytics (8.5.0): + - FirebaseAnalytics/AdIdSupport (= 8.5.0) - FirebaseCore (~> 8.0) - FirebaseInstallations (~> 8.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.4) @@ -66,51 +85,50 @@ PODS: - GoogleUtilities/Network (~> 7.4) - "GoogleUtilities/NSData+zlib (~> 7.4)" - nanopb (~> 2.30908.0) - - FirebaseAnalytics/AdIdSupport (8.0.0): - - FirebaseAnalytics/Base (= 8.0.0) + - FirebaseAnalytics/AdIdSupport (8.5.0): - FirebaseCore (~> 8.0) - FirebaseInstallations (~> 8.0) - - GoogleAppMeasurement (= 8.0.0) + - GoogleAppMeasurement (= 8.5.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - GoogleUtilities/MethodSwizzler (~> 7.4) - GoogleUtilities/Network (~> 7.4) - "GoogleUtilities/NSData+zlib (~> 7.4)" - nanopb (~> 2.30908.0) - - FirebaseAnalytics/Base (8.0.0): - - FirebaseCore (~> 8.0) - - FirebaseInstallations (~> 8.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - - GoogleUtilities/MethodSwizzler (~> 7.4) - - GoogleUtilities/Network (~> 7.4) - - "GoogleUtilities/NSData+zlib (~> 7.4)" - - nanopb (~> 2.30908.0) - - FirebaseAuth (8.0.0): + - FirebaseAuth (8.5.0): - FirebaseCore (~> 8.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - GoogleUtilities/Environment (~> 7.4) - GTMSessionFetcher/Core (~> 1.5) - - FirebaseCore (8.0.0): + - FirebaseCore (8.5.0): - FirebaseCoreDiagnostics (~> 8.0) - GoogleUtilities/Environment (~> 7.4) - GoogleUtilities/Logger (~> 7.4) - - FirebaseCoreDiagnostics (8.0.0): + - FirebaseCoreDiagnostics (8.6.0): - GoogleDataTransport (~> 9.0) - GoogleUtilities/Environment (~> 7.4) - GoogleUtilities/Logger (~> 7.4) - nanopb (~> 2.30908.0) - - FirebaseInstallations (8.0.0): + - FirebaseDynamicLinks (8.5.0): + - FirebaseCore (~> 8.0) + - FirebaseInAppMessaging (8.5.0-beta): + - FirebaseABTesting (~> 8.0) + - FirebaseCore (~> 8.0) + - FirebaseInstallations (~> 8.0) + - GoogleUtilities/Environment (~> 7.4) + - nanopb (~> 2.30908.0) + - FirebaseInstallations (8.6.0): - FirebaseCore (~> 8.0) - GoogleUtilities/Environment (~> 7.4) - GoogleUtilities/UserDefaults (~> 7.4) - - PromisesObjC (~> 1.2) - - FirebaseMessaging (8.0.0): + - PromisesObjC (< 3.0, >= 1.2) + - FirebaseMessaging (8.5.0): - FirebaseCore (~> 8.0) - FirebaseInstallations (~> 8.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - GoogleUtilities/Environment (~> 7.4) - GoogleUtilities/Reachability (~> 7.4) - GoogleUtilities/UserDefaults (~> 7.4) - - FirebaseRemoteConfig (8.0.0): + - FirebaseRemoteConfig (8.5.0): - FirebaseABTesting (~> 8.0) - FirebaseCore (~> 8.0) - FirebaseInstallations (~> 8.0) @@ -124,12 +142,12 @@ PODS: - flutter_app_badger (0.0.1): - Flutter - flutter_facebook_auth (2.0.0): - - FBSDKCoreKit (~> 9.1.0) - - FBSDKLoginKit (~> 9.1.0) + - FBSDKCoreKit (~> 11.1.0) + - FBSDKLoginKit (~> 11.1.0) - Flutter - flutter_secure_storage (3.3.1): - Flutter - - flutter_uxcam (2.0.0-beta.1): + - flutter_uxcam (2.0.0): - Flutter - UXCam (~> 3.3.4) - FMDB (2.7.5): @@ -138,45 +156,45 @@ PODS: - google_sign_in (0.0.1): - Flutter - GoogleSignIn (~> 5.0) - - GoogleAppMeasurement (8.0.0): - - GoogleAppMeasurement/AdIdSupport (= 8.0.0) + - GoogleAppMeasurement (8.5.0): + - GoogleAppMeasurement/AdIdSupport (= 8.5.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - GoogleUtilities/MethodSwizzler (~> 7.4) - GoogleUtilities/Network (~> 7.4) - "GoogleUtilities/NSData+zlib (~> 7.4)" - nanopb (~> 2.30908.0) - - GoogleAppMeasurement/AdIdSupport (8.0.0): + - GoogleAppMeasurement/AdIdSupport (8.5.0): - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - GoogleUtilities/MethodSwizzler (~> 7.4) - GoogleUtilities/Network (~> 7.4) - "GoogleUtilities/NSData+zlib (~> 7.4)" - nanopb (~> 2.30908.0) - - GoogleDataTransport (9.0.0): + - GoogleDataTransport (9.1.0): - GoogleUtilities/Environment (~> 7.2) - nanopb (~> 2.30908.0) - - PromisesObjC (~> 1.2) + - PromisesObjC (< 3.0, >= 1.2) - GoogleSignIn (5.0.2): - AppAuth (~> 1.2) - GTMAppAuth (~> 1.0) - GTMSessionFetcher/Core (~> 1.1) - - GoogleUtilities/AppDelegateSwizzler (7.4.1): + - GoogleUtilities/AppDelegateSwizzler (7.5.1): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - - GoogleUtilities/Environment (7.4.1): - - PromisesObjC (~> 1.2) - - GoogleUtilities/Logger (7.4.1): + - GoogleUtilities/Environment (7.5.1): + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.5.1): - GoogleUtilities/Environment - - GoogleUtilities/MethodSwizzler (7.4.1): + - GoogleUtilities/MethodSwizzler (7.5.1): - GoogleUtilities/Logger - - GoogleUtilities/Network (7.4.1): + - GoogleUtilities/Network (7.5.1): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.4.1)" - - GoogleUtilities/Reachability (7.4.1): + - "GoogleUtilities/NSData+zlib (7.5.1)" + - GoogleUtilities/Reachability (7.5.1): - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (7.4.1): + - GoogleUtilities/UserDefaults (7.5.1): - GoogleUtilities/Logger - GTMAppAuth (1.2.2): - AppAuth/Core (~> 1.4) @@ -195,7 +213,7 @@ PODS: - Flutter - path_provider (0.0.1): - Flutter - - PromisesObjC (1.2.12) + - PromisesObjC (2.0.0) - Purchases (3.11.1): - PurchasesCoreSwift (= 3.11.1) - purchases_flutter (3.2.2): @@ -231,12 +249,13 @@ PODS: - Flutter DEPENDENCIES: - - awesome_notifications (from `.symlinks/plugins/awesome_notifications/ios`) - device_info (from `.symlinks/plugins/device_info/ios`) - devicelocale (from `.symlinks/plugins/devicelocale/ios`) - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - firebase_dynamic_links (from `.symlinks/plugins/firebase_dynamic_links/ios`) + - firebase_in_app_messaging (from `.symlinks/plugins/firebase_in_app_messaging/ios`) - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - firebase_remote_config (from `.symlinks/plugins/firebase_remote_config/ios`) - flurry_data (from `.symlinks/plugins/flurry_data/ios`) @@ -264,7 +283,9 @@ DEPENDENCIES: SPEC REPOS: trunk: - AppAuth + - FBAEMKit - FBSDKCoreKit + - FBSDKCoreKit_Basics - FBSDKLoginKit - Firebase - FirebaseABTesting @@ -272,6 +293,8 @@ SPEC REPOS: - FirebaseAuth - FirebaseCore - FirebaseCoreDiagnostics + - FirebaseDynamicLinks + - FirebaseInAppMessaging - FirebaseInstallations - FirebaseMessaging - FirebaseRemoteConfig @@ -292,8 +315,6 @@ SPEC REPOS: - UXCam EXTERNAL SOURCES: - awesome_notifications: - :path: ".symlinks/plugins/awesome_notifications/ios" device_info: :path: ".symlinks/plugins/device_info/ios" devicelocale: @@ -304,6 +325,10 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/firebase_auth/ios" firebase_core: :path: ".symlinks/plugins/firebase_core/ios" + firebase_dynamic_links: + :path: ".symlinks/plugins/firebase_dynamic_links/ios" + firebase_in_app_messaging: + :path: ".symlinks/plugins/firebase_in_app_messaging/ios" firebase_messaging: :path: ".symlinks/plugins/firebase_messaging/ios" firebase_remote_config: @@ -353,38 +378,43 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7 - awesome_notifications: 74462bc8e68b11f8235d78422266886759e9da61 device_info: d7d233b645a32c40dfdc212de5cf646ca482f175 devicelocale: b22617f40038496deffba44747101255cee005b0 - FBSDKCoreKit: a00fe2efd780c195a5e09201bf51c56106245b40 - FBSDKLoginKit: d98498c598ec09de657385a9349a1f21119b7f86 - Firebase: 73c3e3b216ec1ecbc54d2ffdd4670c65c749edb1 - firebase_analytics: 221d3bc4e8f1b5144a4bd4cc6b33790ee51bd543 - firebase_auth: f960df4ddd8cb415859dbc01a02d7859925ddef0 - firebase_core: e4d3efb030a2b2021819f8faa538bb23deb46695 - firebase_messaging: 3b6e0657b21261a57a1cd041fafa713f2aa6923f - firebase_remote_config: 3a6e2db440f0e95baba3dfc3d4118b1a4bc792c4 - FirebaseABTesting: daebc95ec8829607d07dfe5e92dc3285aca29bc4 - FirebaseAnalytics: dcb92c7c9ef4fa7ffac276e8f87bd4fc8c97f1b8 - FirebaseAuth: b8cd992fca5b53dc6eec09e873a3f375f000c5a1 - FirebaseCore: 3f09591d51292843e2a46f18358d60bf4e996255 - FirebaseCoreDiagnostics: a31d987ba0fe16d59886a5dbadc2f1de871f88c8 - FirebaseInstallations: c4aab1005d6547b00a7529777fe52f5d4d45165b - FirebaseMessaging: 1a33b4af3c8042ed6ddacb6c031894af2064bfab - FirebaseRemoteConfig: 055f6b5ba1751547596ded5032c4d5c6054ca501 + FBAEMKit: 5c8a8d08e5b2c79628490784883e0fcc75b12615 + FBSDKCoreKit: 7ccb8b4bb2b5ee2ad94327b774dc23f03509675d + FBSDKCoreKit_Basics: 8f978bce195845f609b0ec6b425949d0d24f525b + FBSDKLoginKit: d65eb587a9eaa89295338fb0bb3b358bde0b7ae4 + Firebase: ff8c73105b90e33e1dc6c8e5445d7adc2ccdc7c1 + firebase_analytics: 3b7d92b8d1a3482f557c201e5e46c2f7fa2644ff + firebase_auth: 214ff86facd807bbb0ccff32f4b2d3865e3bc4f3 + firebase_core: 82d486a6231b636aea229bd471bceca82cbe00a6 + firebase_dynamic_links: 0768a32e69be5b6f9af258f8e072537dff6b8969 + firebase_in_app_messaging: 04572963cf1ef212ac23e188cb0324316e948bf9 + firebase_messaging: 0c5342aa6d92d09429ef67c81a1345189fcb76c9 + firebase_remote_config: cd43874ff082605023b5913bb1d3206452f1ad48 + FirebaseABTesting: c3e48ebf5e7e5c674c5a131c68e941d7921d83dc + FirebaseAnalytics: 96325c1e0acbd2bb805c6a613028b1fe599d6a37 + FirebaseAuth: b152ea261b60eeb9419ae7e5bf34761382b33277 + FirebaseCore: 1c1ca72483b59b17050f5b4cec4fb748425a3901 + FirebaseCoreDiagnostics: 3721920bde3a9a6d5aa093c1d25e9d3e47f694af + FirebaseDynamicLinks: 6e406b3bb669f8c8a63e7254bb63251fa3f88a43 + FirebaseInAppMessaging: ee6cd4397d1e81d34b14f90ec38697dc4ef9fe93 + FirebaseInstallations: 0ede6ffcd215b8f93c19d9b06c1c54e2d4107e98 + FirebaseMessaging: 0705ec705c21705efc51c071fba924c8e25c63e7 + FirebaseRemoteConfig: 693c1f150408e9a727daf4d8c55c7f9c29ef9ad5 Flurry-iOS-SDK: 5831da8fc6bedb31fa1f94aac6fd204d36dd351d flurry_data: 49b7066a283aa41f4306974c1f2d74c61231ad74 Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c flutter_app_badger: 65de4d6f0c34a891df49e6cfb8a1c0496426fa68 - flutter_facebook_auth: 4b170c07b7fce791497093fcc3f134fb215f3f07 + flutter_facebook_auth: 528d51ea1324741b366fa87fa5dfd41016422364 flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec - flutter_uxcam: ab8e5d3954eb448febd581375e2622e9eecb1066 + flutter_uxcam: 5b2418884a3bf41284a888c7ecc50317c8a84727 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a google_sign_in: 6bd214b9c154f881422f5fe27b66aaa7bbd580cc - GoogleAppMeasurement: c6bbc9753d046b5456dd4f940057fbad2c28419e - GoogleDataTransport: 11e3a5f2c190327df1a4a5d7e7ae3d4d5b9c9e4c + GoogleAppMeasurement: 8d10c1c470fcb0e5143ed74fddd164f0a0384800 + GoogleDataTransport: 85fd18ff3019bb85d3f2c551d04c481dedf71fc9 GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213 - GoogleUtilities: f8a43108b38a68eebe8b3540e1f4f2d28843ce20 + GoogleUtilities: 3df19e3c24f7bbc291d8b5809aa6b0d41e642437 GTMAppAuth: ad5c2b70b9a8689e1a04033c9369c4915bfcbe89 GTMSessionFetcher: b3503b20a988c4e20cc189aa798fd18220133f52 modal_progress_hud_nsn: f6fb744cd060653d66ed8f325360ef3650eb2fde @@ -392,7 +422,7 @@ SPEC CHECKSUMS: package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c - PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97 + PromisesObjC: 68159ce6952d93e17b2dfe273b8c40907db5ba58 Purchases: 6351f9ff6bd514e5ec5aa0f989ea181effa94bf5 purchases_flutter: 627527b070d80cdaf486fabe8b3d1dbe8d5cad92 PurchasesCoreSwift: ee857e4c21e6254b09d7e303a756fcf2b9164408 @@ -411,4 +441,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: f10c0438b63bc24e6bbc207956dc27d16c4408f2 -COCOAPODS: 1.10.1 +COCOAPODS: 1.11.0.beta.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 69649d2..2c0b680 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -396,7 +396,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -405,12 +405,12 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 1.1.21; + MARKETING_VERSION = 1.1.22; PRODUCT_BUNDLE_IDENTIFIER = com.aitrainer.app; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = 1; VERSIONING_SYSTEM = "apple-generic"; }; name = Profile; @@ -539,7 +539,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -548,13 +548,13 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 1.1.21; + MARKETING_VERSION = 1.1.22; PRODUCT_BUNDLE_IDENTIFIER = com.aitrainer.app; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = 1; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -574,7 +574,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -583,12 +583,12 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 1.1.21; + MARKETING_VERSION = 1.1.22; PRODUCT_BUNDLE_IDENTIFIER = com.aitrainer.app; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = 1; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index b0bb7f3..43c5911 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -10,6 +10,9 @@ import Firebase ) -> Bool { FirebaseApp.configure() GeneratedPluginRegistrant.register(with: self) + if #available(iOS 12.0, *) { + UNUserNotificationCenter.current().delegate = self + } return super.application(application, didFinishLaunchingWithOptions: launchOptions) } } diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 3738f71..811fead 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -1,75 +1,97 @@ - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - WorkoutTest - CFBundlePackageType - APPL - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleURLSchemes - - fb584181112271127 - com.googleusercontent.apps.926782702216-2nsi7d9at3pc5ts8gkobt5697v590kb9 - - - - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - FacebookAppID - 584181112271127 - FacebookDisplayName - Mobile Login - FirebaseAppDelegateProxyEnabled - NO - LSApplicationQueriesSchemes - - https - http - - LSMinimumSystemVersion - 11.0 - LSRequiresIPhoneOS - - NSAppTransportSecurity - NSAllowsArbitraryLoads + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + WorkoutTest + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + aitrainer.page.link + CFBundleURLSchemes + + wt001 + fb584181112271127 + + + + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + FacebookAdvertiserIDCollectionEnabled + TRUE + FacebookAppID + 584181112271127 + FacebookAutoLogAppEventsEnabled + TRUE + FacebookDisplayName + Workout Test + FirebaseAppDelegateProxyEnabled + NO + LSApplicationQueriesSchemes + + https + http + fbapi + fbapi20130214 + fbapi20130410 + fbapi20130702 + fbapi20131010 + fbapi20131219 + fbapi20140410 + fbapi20140116 + fbapi20150313 + fbapi20150629 + fbapi20160328 + fb-messenger-share-api + fbauth2 + fbshareextension + + LSMinimumSystemVersion + 11.0.0 + LSRequiresIPhoneOS + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + UIBackgroundModes + + remote-notification + + UILaunchStoryboardName + Launch Screen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + - UIBackgroundModes - - remote-notification - - UILaunchStoryboardName - Launch Screen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements index 98bdd20..4bd14f7 100644 --- a/ios/Runner/Runner.entitlements +++ b/ios/Runner/Runner.entitlements @@ -8,6 +8,10 @@ Default + com.apple.developer.associated-domains + + applinks:aitrainer.page.link + com.apple.developer.authentication-services.autofill-credential-provider diff --git a/lib/bloc/customer_change/customer_change_bloc.dart b/lib/bloc/customer_change/customer_change_bloc.dart index 4ec65a7..c599e9b 100644 --- a/lib/bloc/customer_change/customer_change_bloc.dart +++ b/lib/bloc/customer_change/customer_change_bloc.dart @@ -29,8 +29,8 @@ class CustomerChangeBloc extends Bloc weight = this.customerRepository.getWeight() == 0 ? 60 : this.customerRepository.getWeight(); height = this.customerRepository.getHeight() == 0 ? 170 : this.customerRepository.getHeight(); - selectedSport = customerRepository.getSport(); - print("selected: $selectedFitnessItem sport: $selectedSport " + customerRepository.customer!.fitnessLevel.toString()); + // selectedSport = customerRepository.getSport(); + //print("selected: $selectedFitnessItem sport: $selectedSport " + customerRepository.customer!.fitnessLevel.toString()); } Sport? selectedSport; @@ -41,6 +41,7 @@ class CustomerChangeBloc extends Bloc CustomerChangeEvent event, ) async* { try { + print("Event: $event"); if (event is CustomerLoad) { yield CustomerChangeLoading(); yield CustomerDataChanged(); @@ -63,7 +64,7 @@ class CustomerChangeBloc extends Bloc year = event.year; yield CustomerDataChanged(); } else if (event is CustomerWeightChange) { - yield CustomerChangeLoading(); + //yield CustomerChangeLoading(); customerRepository.setWeight(event.weight); weight = event.weight.toDouble(); yield CustomerDataChanged(); @@ -88,12 +89,43 @@ class CustomerChangeBloc extends Bloc customerRepository.setName(event.name); yield CustomerDataChanged(); } else if (event is CustomerGenderChange) { + yield CustomerChangeLoading(); customerRepository.setSex(event.gender == 0 ? "m" : "w"); yield CustomerDataChanged(); } else if (event is CustomerSportChange) { yield CustomerChangeLoading(); selectedSport = event.sport; yield CustomerDataChanged(); + } else if (event is CustomerSaveFitness) { + yield CustomerChangeLoading(); + if (customerRepository.customer!.fitnessLevel == null) { + throw Exception("Please select your fitness level"); + } + yield CustomerSaveSuccess(); + } else if (event is CustomerSaveGoal) { + yield CustomerChangeLoading(); + if (customerRepository.customer!.goal == null) { + throw Exception("Please select your goal"); + } + yield CustomerSaveSuccess(); + } else if (event is CustomerSaveSex) { + yield CustomerChangeLoading(); + if (customerRepository.customer!.sex == null) { + throw Exception("Please select your biologial gender"); + } + yield CustomerSaveSuccess(); + } else if (event is CustomerSaveWeight) { + yield CustomerChangeLoading(); + if (customerRepository.customer!.getProperty("Weight") == null) { + throw Exception("Please select your weight"); + } + yield CustomerSaveSuccess(); + } else if (event is CustomerSaveHeight) { + yield CustomerChangeLoading(); + if (customerRepository.customer!.getProperty("Height") == null) { + throw Exception("Please select your height"); + } + yield CustomerSaveSuccess(); } else if (event is CustomerSave) { yield CustomerSaving(); if (validation()) { diff --git a/lib/bloc/customer_change/customer_change_event.dart b/lib/bloc/customer_change/customer_change_event.dart index 26d47c9..0445406 100644 --- a/lib/bloc/customer_change/customer_change_event.dart +++ b/lib/bloc/customer_change/customer_change_event.dart @@ -114,3 +114,23 @@ class CustomerLoad extends CustomerChangeEvent { class CustomerSave extends CustomerChangeEvent { const CustomerSave(); } + +class CustomerSaveGoal extends CustomerChangeEvent { + const CustomerSaveGoal(); +} + +class CustomerSaveFitness extends CustomerChangeEvent { + const CustomerSaveFitness(); +} + +class CustomerSaveSex extends CustomerChangeEvent { + const CustomerSaveSex(); +} + +class CustomerSaveWeight extends CustomerChangeEvent { + const CustomerSaveWeight(); +} + +class CustomerSaveHeight extends CustomerChangeEvent { + const CustomerSaveHeight(); +} diff --git a/lib/bloc/menu/menu_bloc.dart b/lib/bloc/menu/menu_bloc.dart index 1381724..9c8ed10 100644 --- a/lib/bloc/menu/menu_bloc.dart +++ b/lib/bloc/menu/menu_bloc.dart @@ -1,13 +1,17 @@ import 'dart:async'; import 'dart:collection'; +import 'package:intl/intl.dart'; import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/model/exercise_ability.dart'; import 'package:aitrainer_app/model/workout_menu_tree.dart'; +import 'package:aitrainer_app/repository/customer_repository.dart'; import 'package:aitrainer_app/repository/exercise_device_repository.dart'; import 'package:aitrainer_app/repository/exercise_repository.dart'; import 'package:aitrainer_app/repository/workout_tree_repository.dart'; import 'package:aitrainer_app/service/logging.dart'; +import 'package:aitrainer_app/util/enums.dart'; +import 'package:aitrainer_app/util/track.dart'; import 'package:aitrainer_app/util/trans.dart'; import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; @@ -111,6 +115,22 @@ class MenuBloc extends Bloc with Trans, Logging { listFilterDevice.remove(deviceId); } yield MenuReady(); + } else if (event is MenuStartTrial) { + yield MenuLoading(); + final DateTime start = event.start; + CustomerRepository customerRepository = CustomerRepository(); + customerRepository.customer = Cache().userLoggedIn; + customerRepository.customer!.trialDate = start; + Cache().userLoggedIn!.trialDate = start; + + customerRepository.saveCustomer(); + + if (DateTime.now().difference(start).inHours < 1) { + Cache().hasPurchased = true; + log("Trial mode on!"); + Track().track(TrackingEvent.trial, eventValue: DateFormat('yyyy-MM-dd HH:mm:ss').format(start)); + } + yield MenuReady(); } } on Exception catch (ex) { yield MenuError(message: ex.toString()); @@ -134,6 +154,9 @@ class MenuBloc extends Bloc with Trans, Logging { case "my_body": ability = ExerciseAbility.none; break; + case "training_execute": + ability = ExerciseAbility.training_execute; + break; } log("Ability: " + ability.toString() + " name: " + name); } diff --git a/lib/bloc/menu/menu_event.dart b/lib/bloc/menu/menu_event.dart index 56b33a3..9516ba0 100644 --- a/lib/bloc/menu/menu_event.dart +++ b/lib/bloc/menu/menu_event.dart @@ -56,4 +56,15 @@ class MenuRecreateTree extends MenuEvent { class MenuFilterExerciseType extends MenuEvent { final int deviceId; const MenuFilterExerciseType({required this.deviceId}); + + @override + List get props => [deviceId]; +} + +class MenuStartTrial extends MenuEvent { + final DateTime start; + const MenuStartTrial({required this.start}); + + @override + List get props => [start]; } diff --git a/lib/bloc/session/session_bloc.dart b/lib/bloc/session/session_bloc.dart index b2b940c..47a4ce1 100644 --- a/lib/bloc/session/session_bloc.dart +++ b/lib/bloc/session/session_bloc.dart @@ -13,6 +13,7 @@ part 'session_state.dart'; class SessionBloc extends Bloc with Logging { final Session session; + StreamSubscription? _sub; SessionBloc({required this.session}) : super(SessionInitial()); @@ -41,6 +42,7 @@ class SessionBloc extends Bloc with Logging { @override Future close() async { await this.close(); + _sub?.cancel(); super.close(); } } diff --git a/lib/bloc/training_evaluation/training_evaluation_bloc.dart b/lib/bloc/training_evaluation/training_evaluation_bloc.dart index 1dcfb51..e3a14e4 100644 --- a/lib/bloc/training_evaluation/training_evaluation_bloc.dart +++ b/lib/bloc/training_evaluation/training_evaluation_bloc.dart @@ -59,10 +59,12 @@ class TrainingEvaluationBloc extends Bloc { try { if (event is TrainingPlanActivate) { yield TrainingPlanLoading(); - _myPlan = await trainingPlanRepository.activateTrainingPlan(event.trainingPlanId); + _myPlan = trainingPlanRepository.activateTrainingPlan(event.trainingPlanId); _myPlan!.type = CustomerTrainingPlanType.template; menuBloc.menuTreeRepository.sortedTree.forEach((name, list) { @@ -72,7 +72,6 @@ class TrainingPlanBloc extends Bloc { event.detail.repeats = Common.reCalculateRepeatsByChangedWeight(event.detail.weight!, event.detail.repeats!.toDouble(), event.weight); event.detail.weight = event.weight; - print(" weight: ${event.weight} new repeats: ${event.detail.repeats}"); yield TrainingPlanReady(); } else if (event is TrainingPlanRepeatsChange) { @@ -102,13 +101,12 @@ class TrainingPlanBloc extends Bloc { exercise.unitQuantity = event.detail.weight; exercise.dateAdd = DateTime.now(); event.detail.exercises.add(exercise); - if (event.detail.exercises.length >= event.detail.set!) { + if (this.isAllDetailsSameExerciseFinished(event.detail)) { event.detail.state = ExercisePlanDetailState.finished; } else if (event.detail.exercises.length >= 0) { event.detail.state = ExercisePlanDetailState.inProgress; } // recalculate the weight to the original planned repeats for the next details - if (exercise.unitQuantity != null && exercise.unitQuantity! > 0) { for (var nextDetail in _myPlan!.details) { double weightFromPlan = trainingPlanRepository.getOriginalWeight(this.getMyPlan()!.trainingPlanId!, nextDetail); @@ -357,6 +355,23 @@ class TrainingPlanBloc extends Bloc { return workoutTree.imageName; } + int getStep(CustomerTrainingPlanDetails detail) { + List details = getAllDetailsSameExercise(detail); + int step = 0; + int indexElement = 0; + details.forEach((element) { + if (indexElement == 0) { + step = element.exercises.length; + } else { + step += element.exercises.length; + } + indexElement++; + }); + + //print("STEP: $step "); + return step; + } + CustomerTrainingPlanDetails? getNext() { if (_myPlan == null || _myPlan!.details.isEmpty) { return null; @@ -373,12 +388,16 @@ class TrainingPlanBloc extends Bloc { break; } else { final int step = detail.exercises.length; - if (step < minStep && !detail.state.equalsTo(ExercisePlanDetailState.skipped) && day == detail.day) { + if (step < minStep && + step < detail.set! && + !isAllDetailsSameExerciseFinished(detail) && + !detail.state.equalsTo(ExercisePlanDetailState.skipped) && + day == detail.day) { next = detail; minStep = step; - if (detail.parallel != true) { - break; - } + //if (detail.parallel != true) { + break; + //} } } } @@ -423,18 +442,23 @@ class TrainingPlanBloc extends Bloc { int indexInProgress = 0; int indexInStart = 0; final String day = dayNames[this.activeDayIndex]; + CustomerTrainingPlanDetails? prev; for (var detail in _myPlan!.days[day]!) { - if (detail.state == ExercisePlanDetailState.inProgress) { + //print("Offset detail $detail"); + if (detail.state == ExercisePlanDetailState.inProgress || detail.state == ExercisePlanDetailState.start) { + prev = detail; break; } - if (detail.state == ExercisePlanDetailState.start) { - break; + + if (prev != null && prev.exerciseTypeId != detail.exerciseTypeId && detail.state != ExercisePlanDetailState.extra) { + //print(" --- offset + 1"); + indexInStart++; + indexInProgress++; } - indexInStart++; - indexInProgress++; + prev = detail; } int index = indexInStart > indexInProgress ? indexInStart : indexInProgress; - offset = index * 80; + offset = (index) * 270; print("Offset: $offset day: $day ($indexInStart, $indexInProgress)"); return offset; } @@ -573,4 +597,23 @@ class TrainingPlanBloc extends Bloc { } return exists; } + + List getAllDetailsSameExercise(CustomerTrainingPlanDetails detail) { + List list = []; + getMyPlan()!.details.forEach((element) { + if (detail.exerciseTypeId == element.exerciseTypeId) { + list.add(element); + } + }); + return list; + } + + bool isAllDetailsSameExerciseFinished(CustomerTrainingPlanDetails detail) { + bool allFinished = true; + List list = getAllDetailsSameExercise(detail); + for (var listDetail in list) { + allFinished = allFinished && listDetail.exercises.length >= listDetail.set!; + } + return allFinished; + } } diff --git a/lib/main.dart b/lib/main.dart index dd86d8d..c823fb2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -13,7 +13,10 @@ import 'package:aitrainer_app/view/customer_bodytype_animation.dart'; import 'package:aitrainer_app/view/customer_exercise_device.dart'; import 'package:aitrainer_app/view/customer_fitness_page.dart'; import 'package:aitrainer_app/view/customer_goal_page.dart'; +import 'package:aitrainer_app/view/customer_height_page.dart'; import 'package:aitrainer_app/view/customer_modify_page.dart'; +import 'package:aitrainer_app/view/customer_sex_page.dart'; +import 'package:aitrainer_app/view/customer_weight_page.dart'; import 'package:aitrainer_app/view/customer_welcome_page.dart'; import 'package:aitrainer_app/view/evaluation_page.dart'; import 'package:aitrainer_app/view/exercise_control_page.dart'; @@ -23,6 +26,7 @@ import 'package:aitrainer_app/view/login.dart'; import 'package:aitrainer_app/view/exercise_new_page.dart'; import 'package:aitrainer_app/view/training_plan_custom.dart'; import 'package:aitrainer_app/view/training_plan_custom_add.dart'; +import 'package:aitrainer_app/view/training_plan_execute.dart'; import 'package:aitrainer_app/view/training_plans_page.dart'; import 'package:aitrainer_app/view/mydevelopment_body_page.dart'; import 'package:aitrainer_app/view/mydevelopment_muscle_page.dart'; @@ -146,7 +150,6 @@ Future main() async { } print(" -- FireBase init.."); - await FirebaseApi().initializeFlutterFire(); runApp(MultiBlocProvider( providers: [ @@ -177,8 +180,8 @@ Future main() async { BlocProvider( create: (BuildContext context) => TestSetExecuteBloc(), ), - BlocProvider( - create: (BuildContext context) => TutorialBloc(tutorialName: ActivityDone.tutorialExecuteFirstTest.toStr())), + /* BlocProvider( + create: (BuildContext context) => TutorialBloc(tutorialName: ActivityDone.tutorialExecuteFirstTest.toStr())), */ BlocProvider(create: (context) { final MenuBloc menuBloc = BlocProvider.of(context); return TrainingPlanBloc(menuBloc: menuBloc, trainingPlanRepository: TrainingPlanRepository()); @@ -196,6 +199,7 @@ Future initThirdParty() async { await FlurryData.initialize(androidKey: "JNYCTCWBT34FM3J8TV36", iosKey: "3QBG7BSMGPDH24S8TRQP", enableLog: true); FlutterUxcam.optIntoSchematicRecordings(); } + await FirebaseApi().initializeFlutterFire(); } class WorkoutTestApp extends StatelessWidget { @@ -217,6 +221,7 @@ class WorkoutTestApp extends StatelessWidget { //facebookAppEvents.setAdvertiserTracking(enabled: true); initThirdParty(); + return MaterialApp( localizationsDelegates: [ // ... app-specific localization delegate[s] here @@ -249,6 +254,9 @@ class WorkoutTestApp extends StatelessWidget { 'customerModifyPage': (context) => CustomerModifyPage(), 'customerGoalPage': (context) => CustomerGoalPage(), 'customerFitnessPage': (context) => CustomerFitnessPage(), + 'customerSexPage': (context) => CustomerSexPage(), + 'customerWeightPage': (context) => CustomerWeightPage(), + 'customerHeightPage': (context) => CustomerHeightPage(), 'customerBodyTypePage': (context) => CustomerBodyTypeAnimationPage(), 'customerWelcomePage': (context) => CustomerWelcomePage(), 'customerExerciseDevicePage': (context) => CustomerExerciseDevicePage(), @@ -275,7 +283,8 @@ class WorkoutTestApp extends StatelessWidget { 'myTrainingPlanCustom': (context) => TrainingPlanCustomPage(), 'myTrainingPlanCustomAdd': (context) => TrainingPlanCustomAddPage(), 'myTrainingPlanActivate': (context) => TrainingPlanActivatePage(), - 'myTrainingPlanExecute': (context) => TrainingPlanExecutePage(), + 'myTrainingPlanExecute2': (context) => TrainingPlanExecutePage(), + 'myTrainingPlanExecute': (context) => TrainingPlanExecute(), 'myTrainingPlanExercise': (context) => TrainingPlanExercise(), 'myTrainingEvaluation': (context) => TrainingEvaluationPage(), }, diff --git a/lib/model/cache.dart b/lib/model/cache.dart index 75166be..9c68999 100644 --- a/lib/model/cache.dart +++ b/lib/model/cache.dart @@ -186,8 +186,8 @@ class Cache with Logging { Cache._internal() { String testEnv = EnvironmentConfig.test_env; this.testEnvironment = testEnv; + print("testEnv $testEnv"); if (testEnv == "1") { - print("testEnv $testEnv"); baseUrl = baseUrlTest; liveServer = false; } @@ -234,6 +234,17 @@ class Cache with Logging { sharedPreferences.setString(Cache.myTrainingPlanKey, myTrainingPlanJson); } + Future deleteMyTrainingPlan() async { + if (myTrainingPlan == null) { + return; + } + + Future prefs = SharedPreferences.getInstance(); + SharedPreferences sharedPreferences; + sharedPreferences = await prefs; + sharedPreferences.remove(Cache.myTrainingPlanKey); + } + Future getMyTrainingPlan() async { Future prefs = SharedPreferences.getInstance(); SharedPreferences sharedPreferences; @@ -744,4 +755,21 @@ class Cache with Logging { List getTrainingPlanDays() => this._trainingPlanDays; setTrainingPlanDays(value) => this._trainingPlanDays = value; + + bool canTrial() { + if (Cache().userLoggedIn == null) { + return false; + } + for (var element in _purchases) { + if (element.customerId == Cache().userLoggedIn!.customerId) { + return false; + } + } + + if (userLoggedIn!.trialDate != null) { + return false; + } + + return true; + } } diff --git a/lib/model/customer.dart b/lib/model/customer.dart index edd4a33..4aa19d6 100644 --- a/lib/model/customer.dart +++ b/lib/model/customer.dart @@ -24,6 +24,7 @@ class Customer { DateTime? dateChange; int? emailSubscription; int? sportId; + DateTime? trialDate; LinkedHashMap properties = LinkedHashMap(); @@ -70,6 +71,7 @@ class Customer { this.dataPolicyAllowed = json['dataPolicyAllowed']; this.emailSubscription = json['emailSubscription']; this.sportId = json['sportId']; + this.trialDate = json['trialDate'] == null ? null : DateTime.parse(json['trialDate']); this.dateAdd = json['dateAdd'] == null ? DateTime.parse("0000-00-00") : DateTime.parse(json['dateAdd']); this.dateChange = json['dateChange'] == null ? DateTime.parse("0000-00-00") : DateTime.parse(json['dateChange']); @@ -93,7 +95,8 @@ class Customer { "dateAdd": DateFormat('yyyy-MM-dd HH:mm:ss').format(this.dateAdd!), "dateChange": DateFormat('yyyy-MM-dd HH:mm:ss').format(this.dateChange!), "emailSubscription": this.emailSubscription, - "sportId": this.sportId + "sportId": this.sportId, + "trialDate": DateFormat('yyyy-MM-dd HH:mm:ss').format(this.trialDate!), }; double getProperty(String propertyName) { diff --git a/lib/model/exercise_ability.dart b/lib/model/exercise_ability.dart index 215b046..a73d32b 100644 --- a/lib/model/exercise_ability.dart +++ b/lib/model/exercise_ability.dart @@ -1,4 +1,4 @@ -enum ExerciseAbility { oneRepMax, endurance, running, mini_test_set, paralell_test, training, none } +enum ExerciseAbility { oneRepMax, endurance, running, mini_test_set, paralell_test, training, training_execute, none } extension ExerciseAbilityExt on ExerciseAbility { String enumToString() => this.toString().split(".").last; diff --git a/lib/model/workout_menu_tree.dart b/lib/model/workout_menu_tree.dart index 370e072..cd1943c 100644 --- a/lib/model/workout_menu_tree.dart +++ b/lib/model/workout_menu_tree.dart @@ -75,6 +75,7 @@ class WorkoutMenuTree { "is1RM": is1RM.toString(), "isRunning": isRunning.toString(), "sort": sort, + "internalName": internalName, }; } diff --git a/lib/repository/customer_repository.dart b/lib/repository/customer_repository.dart index 0425300..f31024c 100644 --- a/lib/repository/customer_repository.dart +++ b/lib/repository/customer_repository.dart @@ -168,7 +168,7 @@ class CustomerRepository with Logging { if (this.customer!.properties[propertyName] == null) { this.customer!.properties[propertyName] = CustomerProperty( propertyId: propertyRepository.getPropertyByName("Height")!.propertyId, - customerId: this.customer!.customerId!, + customerId: this.customer!.customerId == null ? 0 : this.customer!.customerId!, propertyValue: value, dateAdd: DateTime.now()); } else { diff --git a/lib/repository/training_plan_repository.dart b/lib/repository/training_plan_repository.dart index 975efa9..640e1f6 100644 --- a/lib/repository/training_plan_repository.dart +++ b/lib/repository/training_plan_repository.dart @@ -4,9 +4,10 @@ import 'package:aitrainer_app/model/customer_training_plan_details.dart'; import 'package:aitrainer_app/model/exercise.dart'; import 'package:aitrainer_app/model/exercise_plan_detail.dart'; import 'package:aitrainer_app/model/exercise_tree.dart'; +import 'package:aitrainer_app/model/fitness_state.dart'; import 'package:aitrainer_app/model/training_plan.dart'; import 'package:aitrainer_app/repository/training_plan_day_repository.dart'; -import 'package:aitrainer_app/service/training_plan_service.dart'; +import 'package:aitrainer_app/util/app_language.dart'; import 'package:aitrainer_app/util/common.dart'; class TrainingPlanRepository { @@ -40,14 +41,14 @@ class TrainingPlanRepository { /// 2. calculate customer_training_plan_details weights / repleats /// 3. create new customer_training_plan - Future activateTrainingPlan(int trainingPlanId) async { + CustomerTrainingPlan? activateTrainingPlan(int trainingPlanId) { print(" **** Activate Plan: $trainingPlanId"); // 1. deactivate if (Cache().getCustomerTrainingPlans() != null) { Cache().getCustomerTrainingPlans()!.forEach((plan) { plan.active = false; if (plan.customerTrainingPlanId != null) { - TrainingPlanApi().updateCustomerTrainingPlan(plan, plan.customerTrainingPlanId!); + //TrainingPlanApi().updateCustomerTrainingPlan(plan, plan.customerTrainingPlanId!); } }); } @@ -58,7 +59,7 @@ class TrainingPlanRepository { plan.active = true; plan.status = "open"; plan.dateAdd = DateTime.now(); - plan.name = getTrainingPlanById(trainingPlanId)!.nameTranslations["hu"]; + plan.name = getTrainingPlanById(trainingPlanId)!.nameTranslations[AppLanguage().appLocal.toString()]; TrainingPlan? trainingPlan = this.getTrainingPlanById(trainingPlanId); if (trainingPlan == null || trainingPlan.details == null) { @@ -138,6 +139,23 @@ class TrainingPlanRepository { return plan; } + int? getTrainingPlanByInternalName(String internalName) { + int? id; + if (Cache().getTrainingPlans() == null) { + return id; + } + + for (var trainingPlan in Cache().getTrainingPlans()!) { + print("internal ${trainingPlan.internalName}"); + if (trainingPlan.internalName == internalName) { + id = trainingPlan.trainingPlanId; + break; + } + } + + return id; + } + CustomerTrainingPlanDetails getCalculatedWeightRepeats(int exerciseTypeId, CustomerTrainingPlanDetails detail) { double weight = -1; if (Cache().getExercises() == null) { @@ -247,4 +265,32 @@ class TrainingPlanRepository { return recalculatedDetail; } + + void generateTrainingPlan() { + int? trainingPlanId; + if (Cache().userLoggedIn == null) { + return; + } + + bool isWoman = Cache().userLoggedIn!.sex == "w"; + + if (Cache().userLoggedIn!.fitnessLevel == FitnessState.beginner) { + trainingPlanId = isWoman ? getTrainingPlanByInternalName("woman_beginner") : getTrainingPlanByInternalName("beginner_man"); + } else if (Cache().userLoggedIn!.fitnessLevel == FitnessState.intermediate) { + trainingPlanId = isWoman ? getTrainingPlanByInternalName("woman_beginner_split") : getTrainingPlanByInternalName("beginner_split"); + } else if (Cache().userLoggedIn!.fitnessLevel == FitnessState.advanced) { + trainingPlanId = isWoman ? getTrainingPlanByInternalName("woman_advanced") : getTrainingPlanByInternalName("man_routine4"); + } else { + trainingPlanId = isWoman ? getTrainingPlanByInternalName("5day") : getTrainingPlanByInternalName("5day"); + } + + print("Generated plan $trainingPlanId fitness ${Cache().userLoggedIn!.fitnessLevel} - ${FitnessState.beginner}"); + + if (trainingPlanId != null) { + CustomerTrainingPlan? customerTrainingPlan = activateTrainingPlan(trainingPlanId); + if (customerTrainingPlan != null) { + Cache().myTrainingPlan = customerTrainingPlan; + } + } + } } diff --git a/lib/service/exercise_tree_service.dart b/lib/service/exercise_tree_service.dart index 8a511cc..e828a95 100644 --- a/lib/service/exercise_tree_service.dart +++ b/lib/service/exercise_tree_service.dart @@ -30,6 +30,7 @@ class ExerciseTreeApi with Logging { Future buildImage(String imageUrl, int treeId) async { String assetImage = 'asset/menu/' + imageUrl.substring(7); + print("asset image $assetImage"); return await rootBundle.load(assetImage).then((value) { return assetImage; }).catchError((_) { diff --git a/lib/service/firebase_api.dart b/lib/service/firebase_api.dart index f75ba91..e8cef5e 100644 --- a/lib/service/firebase_api.dart +++ b/lib/service/firebase_api.dart @@ -4,12 +4,10 @@ import 'package:crypto/crypto.dart'; import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/service/logging.dart' as logging; import 'package:sign_in_with_apple/sign_in_with_apple.dart'; -import 'package:awesome_notifications/awesome_notifications.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_remote_config/firebase_remote_config.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_facebook_auth/flutter_facebook_auth.dart'; import 'package:google_sign_in/google_sign_in.dart'; @@ -37,7 +35,8 @@ class FirebaseApi with logging.Logging { await Firebase.initializeApp(); this.appleSignInAvailable = await SignInWithApple.isAvailable(); - AwesomeNotifications().initialize( + + /* AwesomeNotifications().initialize( // set the icon to null if you want to use the default app icon null, [ @@ -55,7 +54,7 @@ class FirebaseApi with logging.Logging { // This is very important to not harm the user experience AwesomeNotifications().requestPermissionToSendNotifications(); } - }); + }); */ await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions( alert: true, // Required to display a heads up notification @@ -71,32 +70,6 @@ class FirebaseApi with logging.Logging { } } - Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { - print('Handling a background message: ${message.messageId}'); - - if (!StringUtils.isNullOrEmpty(message.notification?.title, considerWhiteSpaceAsEmpty: true) || - !StringUtils.isNullOrEmpty(message.notification?.body, considerWhiteSpaceAsEmpty: true)) { - print('message also contained a notification: ${message.notification}'); - - String? imageUrl; - imageUrl ??= message.notification!.android?.imageUrl; - imageUrl ??= message.notification!.apple?.imageUrl; - - Map notificationAdapter = { - NOTIFICATION_CHANNEL_KEY: 'basic_channel', - NOTIFICATION_ID: message.data[NOTIFICATION_CONTENT]?[NOTIFICATION_ID] ?? message.messageId ?? math.Random().nextInt(2147483647), - NOTIFICATION_TITLE: message.data[NOTIFICATION_CONTENT]?[NOTIFICATION_TITLE] ?? message.notification?.title, - NOTIFICATION_BODY: message.data[NOTIFICATION_CONTENT]?[NOTIFICATION_BODY] ?? message.notification?.body, - NOTIFICATION_LAYOUT: StringUtils.isNullOrEmpty(imageUrl) ? 'Default' : 'BigPicture', - NOTIFICATION_BIG_PICTURE: imageUrl - }; - - AwesomeNotifications().createNotificationFromJsonData(notificationAdapter); - } else { - AwesomeNotifications().createNotificationFromJsonData(message.data); - } - } - Future signInEmail(String? email, String? password) async { if (email == null) { throw Exception("Please type an email address"); @@ -395,7 +368,7 @@ class FirebaseApi with logging.Logging { } Future setupRemoteConfig() async { - initializeFlutterFire(); + //initializeFlutterFire(); RemoteConfig? remoteConfig; try { remoteConfig = RemoteConfig.instance; @@ -420,3 +393,35 @@ class FirebaseApi with logging.Logging { } } } + +Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { + // If you're going to use other Firebase services in the background, such as Firestore, + // make sure you call `initializeApp` before using other Firebase services. + print('Handling a background message ${message.messageId}'); +} + +/* Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { + print('Handling a background message: ${message.messageId}'); + + if (!StringUtils.isNullOrEmpty(message.notification?.title, considerWhiteSpaceAsEmpty: true) || + !StringUtils.isNullOrEmpty(message.notification?.body, considerWhiteSpaceAsEmpty: true)) { + print('message also contained a notification: ${message.notification}'); + + String? imageUrl; + imageUrl ??= message.notification!.android?.imageUrl; + imageUrl ??= message.notification!.apple?.imageUrl; + + Map notificationAdapter = { + NOTIFICATION_CHANNEL_KEY: 'basic_channel', + NOTIFICATION_ID: message.data[NOTIFICATION_CONTENT]?[NOTIFICATION_ID] ?? message.messageId ?? math.Random().nextInt(2147483647), + NOTIFICATION_TITLE: message.data[NOTIFICATION_CONTENT]?[NOTIFICATION_TITLE] ?? message.notification?.title, + NOTIFICATION_BODY: message.data[NOTIFICATION_CONTENT]?[NOTIFICATION_BODY] ?? message.notification?.body, + NOTIFICATION_LAYOUT: StringUtils.isNullOrEmpty(imageUrl) ? 'Default' : 'BigPicture', + NOTIFICATION_BIG_PICTURE: imageUrl + }; + + AwesomeNotifications().createNotificationFromJsonData(notificationAdapter); + } else { + AwesomeNotifications().createNotificationFromJsonData(message.data); + } +} */ diff --git a/lib/util/enums.dart b/lib/util/enums.dart index 66e56db..4277ff0 100644 --- a/lib/util/enums.dart +++ b/lib/util/enums.dart @@ -57,6 +57,7 @@ enum TrackingEvent { training_plan_execute, training_plan_finished, training_plan_custom, + trial } T enumFromString(Iterable values, String value) { diff --git a/lib/util/purchases.dart b/lib/util/purchases.dart index aac6fae..0c7f6c2 100644 --- a/lib/util/purchases.dart +++ b/lib/util/purchases.dart @@ -46,7 +46,9 @@ class RevenueCatPurchases with Logging { log("Purchaserinfo not reachable " + e.toString()); } } - if (Cache().userLoggedIn!.admin == 1) { + bool inTrial = Cache().userLoggedIn!.trialDate != null && DateTime.now().difference(Cache().userLoggedIn!.trialDate!).inDays < 10; + log("Trial mode: $inTrial date: ${Cache().userLoggedIn!.trialDate}"); + if (Cache().userLoggedIn!.admin == 1 || inTrial) { Cache().hasPurchased = true; } } diff --git a/lib/util/track.dart b/lib/util/track.dart index 76c5993..5b0dd7a 100644 --- a/lib/util/track.dart +++ b/lib/util/track.dart @@ -19,12 +19,13 @@ class Track with Logging { Track._internal(); void track(TrackingEvent event, {String eventValue = ""}) { + analytics.logEvent(name: event.enumToString(), parameters: {"value": eventValue}); if (!isInDebugMode) { FlurryData.logEvent(event.toString()); // Smartlook.setGlobalEventProperty(event.toString(), eventValue, false); FlutterUxcam.logEventWithProperties(event.enumToString(), {"value": eventValue}); model.Tracking tracking = model.Tracking(); - analytics.logEvent(name: event.enumToString(), parameters: {"value": eventValue}); + //analytics.logEvent(name: event.enumToString(), parameters: {"value": eventValue}); tracking.customerId = Cache().userLoggedIn == null ? 0 : Cache().userLoggedIn!.customerId!; tracking.event = event.enumToString(); if (eventValue.isNotEmpty) { diff --git a/lib/view/account.dart b/lib/view/account.dart index 00976c0..72b46c3 100644 --- a/lib/view/account.dart +++ b/lib/view/account.dart @@ -12,6 +12,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:aitrainer_app/widgets/bottom_nav.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; +import 'package:firebase_in_app_messaging/firebase_in_app_messaging.dart'; // ignore: must_be_immutable class AccountPage extends StatelessWidget with Trans { @@ -151,6 +152,7 @@ class AccountPage extends StatelessWidget with Trans { ), devices(context, accountBloc), loginOut(context, accountBloc), + //messaging(), //getMyTrainees(context, accountBloc), ]); } @@ -180,6 +182,25 @@ class AccountPage extends StatelessWidget with Trans { return element; } + ListTile messaging() { + FirebaseInAppMessaging fiam = FirebaseInAppMessaging(); + ListTile element = ListTile( + leading: Icon(Icons.message), + title: TextButton( + style: TextButton.styleFrom( + backgroundColor: Colors.white38, + onSurface: Colors.grey, + ), + child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Text(t("Trigger message"), style: TextStyle(color: Colors.purple)), + ]), + onPressed: () => fiam.triggerEvent("mydevelopment"), + ), + ); + + return element; + } + ListTile loginOut(BuildContext context, AccountBloc accountBloc) { ListTile element = ListTile(); diff --git a/lib/view/customer_fitness_page.dart b/lib/view/customer_fitness_page.dart index 6c26d57..ced02ff 100644 --- a/lib/view/customer_fitness_page.dart +++ b/lib/view/customer_fitness_page.dart @@ -1,6 +1,7 @@ import 'dart:collection'; import 'package:aitrainer_app/bloc/customer_change/customer_change_bloc.dart'; +import 'package:aitrainer_app/library/custom_icon_icons.dart'; import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/model/sport.dart'; import 'package:aitrainer_app/util/app_localization.dart'; @@ -14,6 +15,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import '../bloc/customer_change/customer_change_bloc.dart'; import '../library/dropdown_search/dropdown_search.dart'; @@ -31,11 +33,13 @@ class CustomerFitnessPage extends StatefulWidget { class _CustomerFitnessPageState extends State with Trans { String? selected; bool fulldata = false; + late CustomerChangeBloc changeBloc; + late double cWidth; @override Widget build(BuildContext context) { setContext(context); - final double cWidth = MediaQuery.of(context).size.width * 0.75; + cWidth = MediaQuery.of(context).size.width * 0.75; CustomerRepository customerRepository; dynamic args = ModalRoute.of(context)!.settings.arguments; if (args is HashMap && args['personal_data'] != null) { @@ -49,186 +53,122 @@ class _CustomerFitnessPageState extends State with Trans { back: true, ); if (!fulldata) { - _bar = AppBarProgress(max: 50, min: 26); + _bar = AppBarProgress(max: 30, min: 15); } + final double h = 27; return Scaffold( - appBar: _bar, - body: BlocProvider( + appBar: _bar, + body: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('asset/image/WT_plainblack_background.jpg'), + fit: BoxFit.cover, + alignment: Alignment.center, + ), + ), + height: double.infinity, + width: double.infinity, + child: BlocProvider( create: (context) => CustomerChangeBloc(customerRepository: customerRepository), - child: Builder(builder: (context) { - // ignore: close_sinks - CustomerChangeBloc changeBloc = BlocProvider.of(context); - selected = changeBloc.selectedFitnessItem; - if (selected == null) { - selected = FitnessState.beginner; - } - return SingleChildScrollView( - scrollDirection: Axis.vertical, - child: Container( - padding: EdgeInsets.only(bottom: 200), - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage('asset/image/WT_light_background.jpg'), - fit: BoxFit.cover, - alignment: Alignment.center, - ), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Divider(), - Wrap( - //runAlignment: WrapAlignment.center, - alignment: WrapAlignment.center, - children: [ - Text( - t("Your Fitness State"), - textAlign: TextAlign.center, - style: GoogleFonts.archivoBlack( - color: Colors.orange, - fontSize: 30, - fontWeight: FontWeight.w900, - ), - ) - ]), - Divider(), - TextButton( - style: TextButton.styleFrom( - padding: EdgeInsets.all(10.0), - shape: getShape(changeBloc, FitnessState.beginner), - ), - child: Container( - width: cWidth, - child: Column( - children: [ - Text(t("Beginner"), - textWidthBasis: TextWidthBasis.longestLine, - style: TextStyle(color: Colors.blue, fontSize: 32, fontFamily: 'Arial', fontWeight: FontWeight.w900)), - Text( - t("I am beginner"), - style: TextStyle(color: Colors.black, fontSize: 20, fontFamily: 'Arial', fontWeight: FontWeight.w100), - ), - ], - )), - onPressed: () => { - setState(() { - selected = FitnessState.beginner; - changeBloc.add(CustomerFitnessChange(fitness: selected!)); - }), - }), - Divider(), - TextButton( - style: TextButton.styleFrom( - padding: EdgeInsets.all(10.0), - shape: getShape(changeBloc, FitnessState.intermediate), - ), - child: Container( - width: cWidth, - child: Column( - children: [ - InkWell( - child: Text( - t("Intermediate"), - style: TextStyle(color: Colors.blue, fontSize: 32, fontFamily: 'Arial', fontWeight: FontWeight.w900), - ), - highlightColor: Colors.white, - ), - InkWell( - child: Text( - t("I am intermediate"), - style: TextStyle(color: Colors.black, fontSize: 20, fontFamily: 'Arial', fontWeight: FontWeight.w100), - ), - highlightColor: Colors.white, - ), - ], - ), - ), - onPressed: () => { - setState(() { - selected = FitnessState.intermediate; - changeBloc.add(CustomerFitnessChange(fitness: selected!)); - print(selected); - }), - }), - Divider(), - TextButton( - style: TextButton.styleFrom( - padding: EdgeInsets.all(10.0), - shape: getShape(changeBloc, FitnessState.advanced), - ), - child: Container( - width: cWidth, - child: Column( - children: [ - InkWell( - child: Text( - t("Advanced"), - style: TextStyle(color: Colors.blue, fontSize: 32, fontFamily: 'Arial', fontWeight: FontWeight.w900), - ), - highlightColor: Colors.white, - ), - InkWell( - child: Text( - t("I am advanced"), - style: TextStyle(color: Colors.black, fontSize: 20, fontFamily: 'Arial', fontWeight: FontWeight.w100), - ), - highlightColor: Colors.white, - ), - ], - ), - ), - onPressed: () => { - setState(() { - selected = FitnessState.advanced; - changeBloc.add(CustomerFitnessChange(fitness: selected!)); - print(selected); - }), - }), - Divider(), - TextButton( - style: TextButton.styleFrom( - padding: EdgeInsets.all(10.0), - shape: getShape(changeBloc, FitnessState.professional), - ), - child: Container( - width: cWidth, - child: Column( - children: [ - InkWell( - child: Text( - AppLocalizations.of(context)!.translate("Professional"), - style: TextStyle(color: Colors.blue, fontSize: 32, fontFamily: 'Arial', fontWeight: FontWeight.w900), - ), - highlightColor: Colors.white, - ), - InkWell( - child: Text( - AppLocalizations.of(context)!.translate("I am professional"), - style: TextStyle(color: Colors.black, fontSize: 20, fontFamily: 'Arial', fontWeight: FontWeight.w100), - ), - highlightColor: Colors.white, - ), - ], - ), - ), - onPressed: () => { - setState(() { - selected = FitnessState.professional; - changeBloc.add(CustomerFitnessChange(fitness: selected!)); - print(selected); - }), - }), - Divider(), - Text( - t("Your Primary Sport") + ":", - textAlign: TextAlign.center, - style: GoogleFonts.archivoBlack( - color: Colors.orange, - fontSize: 20, - ), + child: BlocConsumer( + listener: (context, state) { + if (state is CustomerSaveError) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(backgroundColor: Colors.orange, content: Text(state.message, style: TextStyle(color: Colors.white)))); + } else if (state is CustomerSaveSuccess) { + Navigator.of(context).pop(); + Navigator.of(context).pushNamed("customerSexPage", arguments: changeBloc.customerRepository); + } + }, + builder: (context, state) { + changeBloc = BlocProvider.of(context); + return ModalProgressHUD( + child: getPage(), + inAsyncCall: state is CustomerChangeLoading, + opacity: 0.5, + color: Colors.black54, + progressIndicator: CircularProgressIndicator(), + ); + }, + ), + )), + floatingActionButton: FloatingActionButton.extended( + onPressed: () => { + if (!fulldata) + { + changeBloc.add(CustomerSaveFitness()), + } + else + { + changeBloc.add(CustomerSave()), + } + }, + backgroundColor: Color(0xffb4f500), + icon: Icon( + CustomIcon.save, + color: Colors.black, + size: 26, + ), + label: Text( + fulldata ? t("Save") : t("Next"), + style: GoogleFonts.inter(fontWeight: FontWeight.bold, fontSize: 18, color: Colors.black), + ), + ), + ); + } + + Widget getPage() { + final double h = 27; + return SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: h, + ), + Wrap(alignment: WrapAlignment.center, children: [ + Text( + t("Your Fitness State"), + textAlign: TextAlign.center, + style: GoogleFonts.archivoBlack( + color: Colors.white, + fontSize: 30, + fontWeight: FontWeight.w900, + ), + ) + ]), + SizedBox( + height: h, + ), + + getButton("Beginner", "I am beginner", FitnessState.beginner), + SizedBox( + height: h, + ), + getButton("Intermediate", "I am intermediate", FitnessState.intermediate), + + SizedBox( + height: h, + ), + getButton("Advanced", "I am advanced", FitnessState.advanced), + + SizedBox( + height: h, + ), + getButton("Professional", "I am professional", FitnessState.professional), + + /* Divider(), + Text( + t("Your Primary Sport") + ":", + textAlign: TextAlign.center, + style: GoogleFonts.archivoBlack( + color: Colors.orange, + fontSize: 20, ), - getSport(changeBloc), - Divider(), + ), */ + //getSport(changeBloc), + /* Divider(), ElevatedButton( style: ElevatedButton.styleFrom( onPrimary: Colors.white, @@ -240,22 +180,58 @@ class _CustomerFitnessPageState extends State with Trans { Navigator.of(context).pop(), if (!fulldata) {Navigator.of(context).pushNamed("customerBodyTypePage", arguments: customerRepository)} }, - ) - ], - ), + ) */ + ], + ), + ); + } + + TextButton getButton(String title, String desc, String state) { + return TextButton( + style: TextButton.styleFrom( + padding: EdgeInsets.all(10.0), + shape: getShape(changeBloc, state), + ), + child: Container( + width: cWidth, + child: Column( + children: [ + InkWell( + child: Text( + AppLocalizations.of(context)!.translate(title), + style: TextStyle(color: Colors.white, fontSize: 32, fontFamily: 'Arial', fontWeight: FontWeight.w900), ), - ); - }))); + highlightColor: Colors.white, + ), + InkWell( + child: Text( + AppLocalizations.of(context)!.translate(desc), + style: TextStyle(color: Colors.white, fontSize: 20, fontFamily: 'Arial', fontWeight: FontWeight.w100), + ), + highlightColor: Colors.white, + ), + ], + ), + ), + onPressed: () => { + changeBloc.add(CustomerFitnessChange(fitness: state)), + }); } dynamic getShape(CustomerChangeBloc changeBloc, String fitnessLevel) { String? selected = changeBloc.selectedFitnessItem; + dynamic returnCode = (selected == fitnessLevel) ? RoundedRectangleBorder( - side: BorderSide(width: 4, color: Colors.orange), + side: BorderSide( + width: 4, + color: Color(0xffb4f500), + ), + borderRadius: BorderRadius.circular(12), ) : RoundedRectangleBorder( - side: BorderSide(width: 1, color: Colors.blue), + side: BorderSide(width: 4, color: Colors.white24), + borderRadius: BorderRadius.circular(12), ); //return return returnCode; diff --git a/lib/view/customer_goal_page.dart b/lib/view/customer_goal_page.dart index 483ac3e..2e00963 100644 --- a/lib/view/customer_goal_page.dart +++ b/lib/view/customer_goal_page.dart @@ -10,6 +10,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; enum Goals { gain_muscle, weight_loss, endurance, muscle_endurance, flexibility, gain_strength, explosiveness, shape_forming } @@ -69,18 +70,21 @@ class _CustomerGoalPage extends State with Trans { CustomerRepository customerRepository; dynamic args = ModalRoute.of(context)!.settings.arguments; - if (args is HashMap && args['personal_data'] != null) { - fulldata = args['personal_data']; - customerRepository = args['bloc']; + if (args != null) { + if (args is HashMap && args['personal_data'] != null) { + fulldata = args['personal_data']; + customerRepository = args['bloc']; + } else { + customerRepository = ModalRoute.of(context)!.settings.arguments as CustomerRepository; + } } else { - customerRepository = ModalRoute.of(context)!.settings.arguments as CustomerRepository; + customerRepository = CustomerRepository(); } - PreferredSizeWidget _bar = AppBarMin( - back: true, + back: false, ); if (!fulldata) { - _bar = AppBarProgress(max: 50, min: 26); + _bar = AppBarProgress(max: 14, min: 0); } return Scaffold( @@ -88,7 +92,7 @@ class _CustomerGoalPage extends State with Trans { body: Container( decoration: BoxDecoration( image: DecorationImage( - image: AssetImage('asset/image/WT_light_background.jpg'), + image: AssetImage('asset/image/WT_plainblack_background.jpg'), fit: BoxFit.cover, alignment: Alignment.center, ), @@ -97,75 +101,120 @@ class _CustomerGoalPage extends State with Trans { width: double.infinity, child: BlocProvider( create: (context) => CustomerChangeBloc(customerRepository: customerRepository), - child: Builder(builder: (context) { - changeBloc = BlocProvider.of(context); - - return SingleChildScrollView( - child: Center( - child: Column( - children: [ - Divider(), - Wrap(alignment: WrapAlignment.center, children: [ - Text( - t("Set Your Primary Goal"), - maxLines: 2, - textAlign: TextAlign.center, - style: GoogleFonts.archivoBlack( - color: Colors.orange, - fontSize: 30, - shadows: [ - Shadow( - offset: Offset(2.0, 2.0), - blurRadius: 3.0, - color: Colors.black87, - ), - ], - ), - ), - ]), - Divider(), - getItem(changeBloc, Goals.gain_muscle), - Divider(), - getItem(changeBloc, Goals.weight_loss), - Divider(), - getItem(changeBloc, Goals.shape_forming), - Divider(), - getItem(changeBloc, Goals.endurance), - Divider(), - getItem(changeBloc, Goals.gain_strength), - Divider(), - getItem(changeBloc, Goals.muscle_endurance), - Divider(), - getItem(changeBloc, Goals.flexibility), - Divider(), - getItem(changeBloc, Goals.explosiveness), - Divider(), - ], - ), - )); - }), + child: BlocConsumer( + listener: (context, state) { + if (state is CustomerSaveError) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(backgroundColor: Colors.orange, content: Text(state.message, style: TextStyle(color: Colors.white)))); + } else if (state is CustomerSaveSuccess) { + Navigator.of(context).pushNamed("customerFitnessPage", arguments: changeBloc.customerRepository); + } + }, + builder: (context, state) { + changeBloc = BlocProvider.of(context); + return ModalProgressHUD( + child: getPage(), + inAsyncCall: state is CustomerChangeLoading, + opacity: 0.5, + color: Colors.black54, + progressIndicator: CircularProgressIndicator(), + ); + }, + ), ), ), floatingActionButton: FloatingActionButton.extended( onPressed: () => { - //changingViewModel.saveCustomer(), - changeBloc.add(CustomerSave()), - Navigator.of(context).pop(), - if (!fulldata) {Navigator.of(context).pushNamed("customerFitnessPage", arguments: changeBloc.customerRepository)} + print("Fulldata: $fulldata bloc $changeBloc"), + if (!fulldata) + { + print("Savegoal"), + changeBloc.add(CustomerSaveGoal()), + } + else + { + changeBloc.add(CustomerSave()), + } }, - backgroundColor: Colors.orange[800], + backgroundColor: Color(0xffb4f500), icon: Icon( CustomIcon.save, - size: 20, + color: Colors.black, + size: 26, ), label: Text( fulldata ? t("Save") : t("Next"), - style: GoogleFonts.inter(fontWeight: FontWeight.bold, fontSize: 12), + style: GoogleFonts.inter(fontWeight: FontWeight.bold, fontSize: 18, color: Colors.black), ), ), ); } + Widget getPage() { + final double h = 27; + return SingleChildScrollView( + child: Center( + child: Column( + children: [ + Divider(), + Wrap(alignment: WrapAlignment.center, children: [ + Text( + t("Set Your Primary Goal"), + maxLines: 2, + textAlign: TextAlign.center, + style: GoogleFonts.archivoBlack( + color: Colors.white, + fontSize: 30, + shadows: [ + Shadow( + offset: Offset(2.0, 2.0), + blurRadius: 3.0, + color: Colors.black87, + ), + ], + ), + ), + ]), + SizedBox( + height: h, + ), + getItem(changeBloc, Goals.gain_muscle), + SizedBox( + height: h, + ), + getItem(changeBloc, Goals.weight_loss), + SizedBox( + height: h, + ), + getItem(changeBloc, Goals.shape_forming), + SizedBox( + height: h, + ), + getItem(changeBloc, Goals.endurance), + SizedBox( + height: h, + ), + getItem(changeBloc, Goals.gain_strength), + SizedBox( + height: h, + ), + getItem(changeBloc, Goals.muscle_endurance), + SizedBox( + height: h, + ), + getItem(changeBloc, Goals.flexibility), + SizedBox( + height: h, + ), + getItem(changeBloc, Goals.explosiveness), + SizedBox( + height: h, + ), + ], + ), + )); + } + Widget getItem(CustomerChangeBloc changeBloc, Goals goal) { return Stack(alignment: Alignment.bottomLeft, children: [ TextButton( @@ -188,7 +237,7 @@ class _CustomerGoalPage extends State with Trans { child: Text( t(goal.description(goal)), style: GoogleFonts.archivoBlack( - color: Colors.yellow[300], + color: Colors.white, fontSize: 28, shadows: [ Shadow( @@ -204,13 +253,18 @@ class _CustomerGoalPage extends State with Trans { } dynamic getShape(CustomerChangeBloc customerBloc, String goal) { - if (customerBloc.customerRepository.goal == null) return null; + dynamic baseCode = RoundedRectangleBorder( + side: BorderSide(width: 2, color: Colors.white24), + borderRadius: BorderRadius.circular(12), + ); + if (customerBloc.customerRepository.goal == null) return baseCode; String selectedGoal = customerBloc.customerRepository.goal!; dynamic returnCode = (selectedGoal == goal) ? RoundedRectangleBorder( - side: BorderSide(width: 4, color: Colors.red), + side: BorderSide(width: 6, color: Color(0xffb4f500)), + borderRadius: BorderRadius.circular(12), ) - : null; + : baseCode; //return return returnCode; } diff --git a/lib/view/customer_height_page.dart b/lib/view/customer_height_page.dart new file mode 100644 index 0000000..b8d9410 --- /dev/null +++ b/lib/view/customer_height_page.dart @@ -0,0 +1,178 @@ +import 'package:aitrainer_app/bloc/customer_change/customer_change_bloc.dart'; +import 'package:aitrainer_app/library/custom_icon_icons.dart'; + +import 'package:aitrainer_app/repository/customer_repository.dart'; +import 'package:aitrainer_app/util/trans.dart'; +import 'package:aitrainer_app/widgets/app_bar_min.dart'; +import 'package:aitrainer_app/widgets/app_bar_progress.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:google_fonts/google_fonts.dart'; + +import 'package:syncfusion_flutter_gauges/gauges.dart'; + +import '../bloc/customer_change/customer_change_bloc.dart'; + +// ignore: must_be_immutable +class CustomerHeightPage extends StatefulWidget { + late _CustomerHeightPageState _state; + + _CustomerHeightPageState createState() { + _state = _CustomerHeightPageState(); + return _state; + } +} + +class _CustomerHeightPageState extends State with Trans { + String? selected; + bool fulldata = false; + late CustomerChangeBloc changeBloc; + late double cWidth; + + @override + Widget build(BuildContext context) { + setContext(context); + + final CustomerRepository customerRepository = ModalRoute.of(context)!.settings.arguments as CustomerRepository; + + PreferredSizeWidget _bar = AppBarMin( + back: true, + ); + if (!fulldata) { + _bar = AppBarProgress(max: 75, min: 60); + } + + return Scaffold( + appBar: _bar, + body: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('asset/image/WT_plainblack_background.jpg'), + fit: BoxFit.cover, + alignment: Alignment.center, + ), + ), + height: double.infinity, + width: double.infinity, + child: BlocProvider( + create: (context) => CustomerChangeBloc(customerRepository: customerRepository), + child: BlocConsumer( + listener: (context, state) { + if (state is CustomerSaveError) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(backgroundColor: Colors.orange, content: Text(state.message, style: TextStyle(color: Colors.white)))); + } else if (state is CustomerSaveSuccess) { + Navigator.of(context).pop(); + Navigator.of(context).pushNamed("registration", arguments: changeBloc.customerRepository); + } + }, + builder: (context, state) { + changeBloc = BlocProvider.of(context); + return getPage(); + }, + ), + )), + floatingActionButton: FloatingActionButton.extended( + onPressed: () => changeBloc.add(CustomerSaveHeight()), + backgroundColor: Color(0xffb4f500), + icon: Icon( + CustomIcon.save, + color: Colors.black, + size: 26, + ), + label: Text( + fulldata ? t("Save") : t("Finish"), + style: GoogleFonts.inter(fontWeight: FontWeight.bold, fontSize: 18, color: Colors.black), + ), + ), + ); + } + + Widget getPage() { + final double h = 27; + cWidth = MediaQuery.of(context).size.width * 0.75; + return SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: h, + ), + Wrap(alignment: WrapAlignment.center, children: [ + Text( + t("What is your height?"), + textAlign: TextAlign.center, + maxLines: 2, + style: GoogleFonts.archivoBlack( + color: Colors.white, + fontSize: 30, + fontWeight: FontWeight.w900, + ), + ) + ]), + SizedBox( + height: h, + ), + getButton(), + ], + ), + ); + } + + Widget getButton() { + double mediaWidth = MediaQuery.of(context).size.width * .4; + double mediaHeight = MediaQuery.of(context).size.height * .4; + return Row(children: [ + changeBloc.customerRepository.customer!.sex == "m" + ? Image.asset( + "asset/image/test_picto_m.png", + height: mediaHeight, + width: mediaWidth, + ) + : Image.asset( + "asset/image/test_picto_w.png", + height: mediaHeight, + width: mediaWidth, + ), + SfLinearGauge( + minimum: 140, + maximum: 220, + markerPointers: [ + LinearWidgetPointer( + value: changeBloc.height, + offset: 55, + position: LinearElementPosition.inside, + markerAlignment: LinearMarkerAlignment.center, + child: Container( + height: 25, + width: 55, + color: Colors.transparent, + child: Text(changeBloc.height.toString(), + style: GoogleFonts.inter( + fontSize: 20, + fontWeight: FontWeight.bold, + color: Color(0xffb4f500), + )), + ), + ), + LinearShapePointer( + height: 25, + width: 55, + color: Color(0xffb4f500), + value: changeBloc.height, + onValueChanged: (value) => { + changeBloc.add(CustomerHeightChange(height: value.toInt())), + }, + ), + ], + orientation: LinearGaugeOrientation.vertical, + majorTickStyle: LinearTickStyle(length: 20, color: Colors.white), + axisLabelStyle: TextStyle(fontSize: 12.0, color: Colors.white), + axisTrackStyle: + LinearAxisTrackStyle(color: Colors.cyan, edgeStyle: LinearEdgeStyle.bothFlat, thickness: 1.0, borderColor: Colors.white)) + ]); + } +} diff --git a/lib/view/customer_sex_page.dart b/lib/view/customer_sex_page.dart new file mode 100644 index 0000000..5cef9d8 --- /dev/null +++ b/lib/view/customer_sex_page.dart @@ -0,0 +1,185 @@ +import 'package:aitrainer_app/bloc/customer_change/customer_change_bloc.dart'; +import 'package:aitrainer_app/library/custom_icon_icons.dart'; + +import 'package:aitrainer_app/util/app_localization.dart'; +import 'package:aitrainer_app/repository/customer_repository.dart'; +import 'package:aitrainer_app/util/trans.dart'; +import 'package:aitrainer_app/widgets/app_bar_min.dart'; +import 'package:aitrainer_app/widgets/app_bar_progress.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; + +import '../bloc/customer_change/customer_change_bloc.dart'; + +// ignore: must_be_immutable +class CustomerSexPage extends StatefulWidget { + late _CustomerSexPageState _state; + + _CustomerSexPageState createState() { + _state = _CustomerSexPageState(); + return _state; + } +} + +class _CustomerSexPageState extends State with Trans { + String? selected; + bool fulldata = false; + late CustomerChangeBloc changeBloc; + late double cWidth; + + @override + Widget build(BuildContext context) { + setContext(context); + + final CustomerRepository customerRepository = ModalRoute.of(context)!.settings.arguments as CustomerRepository; + + PreferredSizeWidget _bar = AppBarMin( + back: true, + ); + if (!fulldata) { + _bar = AppBarProgress(max: 45, min: 30); + } + + return Scaffold( + appBar: _bar, + body: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('asset/image/WT_plainblack_background.jpg'), + fit: BoxFit.cover, + alignment: Alignment.center, + ), + ), + height: double.infinity, + width: double.infinity, + child: BlocProvider( + create: (context) => CustomerChangeBloc(customerRepository: customerRepository), + child: BlocConsumer( + listener: (context, state) { + if (state is CustomerSaveError) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(backgroundColor: Colors.orange, content: Text(state.message, style: TextStyle(color: Colors.white)))); + } else if (state is CustomerSaveSuccess) { + Navigator.of(context).pop(); + Navigator.of(context).pushNamed("customerWeightPage", arguments: changeBloc.customerRepository); + } + }, + builder: (context, state) { + changeBloc = BlocProvider.of(context); + return ModalProgressHUD( + child: getPage(), + inAsyncCall: state is CustomerChangeLoading, + opacity: 0.5, + color: Colors.black54, + progressIndicator: CircularProgressIndicator(), + ); + }, + ), + )), + floatingActionButton: FloatingActionButton.extended( + onPressed: () => { + changeBloc.add(CustomerSaveSex()), + }, + backgroundColor: Color(0xffb4f500), + icon: Icon( + CustomIcon.save, + color: Colors.black, + size: 26, + ), + label: Text( + fulldata ? t("Save") : t("Next"), + style: GoogleFonts.inter(fontWeight: FontWeight.bold, fontSize: 18, color: Colors.black), + ), + ), + ); + } + + Widget getPage() { + final double h = 27; + cWidth = MediaQuery.of(context).size.width * 0.75; + return SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: h, + ), + Wrap(alignment: WrapAlignment.center, children: [ + Text( + t("What is your biological sex?"), + textAlign: TextAlign.center, + maxLines: 2, + style: GoogleFonts.archivoBlack( + color: Colors.white, + fontSize: 30, + fontWeight: FontWeight.w900, + ), + ) + ]), + SizedBox( + height: h, + ), + getButton("Man", "", "m"), + SizedBox( + height: h, + ), + getButton("Woman", "", "w"), + ], + ), + ); + } + + TextButton getButton(String title, String desc, String state) { + return TextButton( + style: TextButton.styleFrom( + padding: EdgeInsets.all(10.0), + shape: getShape(changeBloc, state), + ), + child: Container( + width: cWidth, + child: Column( + children: [ + InkWell( + child: ListTile( + leading: Icon( + state == "m" ? Icons.male_outlined : Icons.female, + color: Color(0xffb4f500), + size: 60, + ), + title: Text( + AppLocalizations.of(context)!.translate(title), + style: TextStyle(color: Colors.white, fontSize: 32, fontFamily: 'Arial', fontWeight: FontWeight.w900), + ), + )), + ], + ), + ), + onPressed: () => { + print("Sex $state"), + changeBloc.add(CustomerGenderChange(gender: state == "m" ? 0 : 1)), + }); + } + + dynamic getShape(CustomerChangeBloc changeBloc, String sex) { + String? selected = changeBloc.customerRepository.customer!.sex; + dynamic returnCode = (selected == sex) + ? RoundedRectangleBorder( + side: BorderSide( + width: 4, + color: Color(0xffb4f500), + ), + borderRadius: BorderRadius.circular(12), + ) + : RoundedRectangleBorder( + side: BorderSide(width: 4, color: Colors.white24), + borderRadius: BorderRadius.circular(12), + ); + + return returnCode; + } +} diff --git a/lib/view/customer_weight_page.dart b/lib/view/customer_weight_page.dart new file mode 100644 index 0000000..25ee9cd --- /dev/null +++ b/lib/view/customer_weight_page.dart @@ -0,0 +1,147 @@ +import 'package:aitrainer_app/bloc/customer_change/customer_change_bloc.dart'; +import 'package:aitrainer_app/library/custom_icon_icons.dart'; + +import 'package:aitrainer_app/util/app_localization.dart'; +import 'package:aitrainer_app/repository/customer_repository.dart'; +import 'package:aitrainer_app/util/trans.dart'; +import 'package:aitrainer_app/widgets/app_bar_min.dart'; +import 'package:aitrainer_app/widgets/app_bar_progress.dart'; +import 'package:aitrainer_app/widgets/number_picker.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; + +import '../bloc/customer_change/customer_change_bloc.dart'; + +// ignore: must_be_immutable +class CustomerWeightPage extends StatefulWidget { + late _CustomerWeightPageState _state; + + _CustomerWeightPageState createState() { + _state = _CustomerWeightPageState(); + return _state; + } +} + +class _CustomerWeightPageState extends State with Trans { + String? selected; + bool fulldata = false; + late CustomerChangeBloc changeBloc; + late double cWidth; + + @override + Widget build(BuildContext context) { + setContext(context); + + final CustomerRepository customerRepository = ModalRoute.of(context)!.settings.arguments as CustomerRepository; + + PreferredSizeWidget _bar = AppBarMin( + back: true, + ); + if (!fulldata) { + _bar = AppBarProgress(max: 60, min: 45); + } + + return Scaffold( + appBar: _bar, + body: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('asset/image/WT_plainblack_background.jpg'), + fit: BoxFit.cover, + alignment: Alignment.center, + ), + ), + height: double.infinity, + width: double.infinity, + child: BlocProvider( + create: (context) => CustomerChangeBloc(customerRepository: customerRepository), + child: BlocConsumer( + listener: (context, state) { + if (state is CustomerSaveError) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(backgroundColor: Colors.orange, content: Text(state.message, style: TextStyle(color: Colors.white)))); + } else if (state is CustomerSaveSuccess) { + Navigator.of(context).pop(); + Navigator.of(context).pushNamed("customerHeightPage", arguments: changeBloc.customerRepository); + } + }, + builder: (context, state) { + changeBloc = BlocProvider.of(context); + return ModalProgressHUD( + child: getPage(), + inAsyncCall: state is CustomerChangeLoading, + opacity: 0.5, + color: Colors.black54, + progressIndicator: CircularProgressIndicator(), + ); + }, + ), + )), + floatingActionButton: FloatingActionButton.extended( + onPressed: () => { + changeBloc.add(CustomerSaveWeight()), + }, + backgroundColor: Color(0xffb4f500), + icon: Icon( + CustomIcon.save, + color: Colors.black, + size: 26, + ), + label: Text( + fulldata ? t("Save") : t("Next"), + style: GoogleFonts.inter(fontWeight: FontWeight.bold, fontSize: 18, color: Colors.black), + ), + ), + ); + } + + Widget getPage() { + final double h = 27; + cWidth = MediaQuery.of(context).size.width * 0.75; + return SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: h, + ), + Wrap(alignment: WrapAlignment.center, children: [ + Text( + t("What is your weight?"), + textAlign: TextAlign.center, + maxLines: 2, + style: GoogleFonts.archivoBlack( + color: Colors.white, + fontSize: 30, + fontWeight: FontWeight.w900, + ), + ) + ]), + SizedBox( + height: h, + ), + getButton(), + ], + ), + ); + } + + Widget getButton() { + return NumberPickerWidget( + minValue: 40, + maxValue: 150, + fontSize: 30, + diameterRatio: 1.1, + itemExtent: 40, + fontWeight: FontWeight.w700, + initalValue: changeBloc.weight.toInt(), + unit: t("kg"), + color: Color(0xffb4f500), + onChange: (value) => changeBloc.add(CustomerWeightChange(weight: value))); + } +} diff --git a/lib/view/customer_welcome_page.dart b/lib/view/customer_welcome_page.dart index 09f1364..3f37c60 100644 --- a/lib/view/customer_welcome_page.dart +++ b/lib/view/customer_welcome_page.dart @@ -1,6 +1,10 @@ -import 'package:aitrainer_app/util/app_localization.dart'; +import 'package:aitrainer_app/library/button_animations.dart'; +import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/widgets/app_bar_min.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_fadein/flutter_fadein.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:percent_indicator/circular_percent_indicator.dart'; // ignore: must_be_immutable class CustomerWelcomePage extends StatefulWidget { @@ -12,11 +16,14 @@ class CustomerWelcomePage extends StatefulWidget { } } -class _CustomerWelcomePageState extends State { +class _CustomerWelcomePageState extends State with Trans { @override Widget build(BuildContext context) { + setContext(context); return Scaffold( - appBar: AppBarMin(), + appBar: AppBarMin( + back: true, + ), body: Container( decoration: BoxDecoration( image: DecorationImage( @@ -30,17 +37,64 @@ class _CustomerWelcomePageState extends State { child: Center( child: Column( children: [ - Divider( - color: Colors.transparent, + SizedBox( + height: 200, ), - ElevatedButton( - style: ElevatedButton.styleFrom( - primary: Colors.orange, - onSurface: Colors.white, + CircularPercentIndicator( + radius: 250.0, + animation: true, + animationDuration: 4800, + lineWidth: 20.0, + percent: 0.98, + curve: Curves.bounceInOut, + backgroundWidth: 4, + center: Text( + t("Training Plan Generation"), + textAlign: TextAlign.center, + style: GoogleFonts.archivoBlack( + fontWeight: FontWeight.bold, + fontSize: 28.0, + color: Colors.white, + shadows: [ + Shadow( + offset: Offset(5.0, 5.0), + blurRadius: 12.0, + color: Colors.black54, + ), + Shadow( + offset: Offset(-3.0, 3.0), + blurRadius: 12.0, + color: Colors.black54, + ), + ], + ), ), - child: InkWell(child: Text(AppLocalizations.of(context)!.translate("Next"))), - onPressed: () => {Navigator.of(context).pop(), Navigator.of(context).pushNamed("home")}, - ) + circularStrokeCap: CircularStrokeCap.round, + progressColor: Color(0xffb4f500), + backgroundColor: Colors.black, + ), + SizedBox( + height: 90, + ), + FadeIn( + child: Container( + width: 160, + height: 80, + child: GestureDetector( + onTap: () => Navigator.of(context).popAndPushNamed("home"), + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset('asset/icon/gomb_orange_a.png', width: 140, height: 80), + Text( + t("Next"), + style: GoogleFonts.archivoBlack(fontSize: 20, color: Colors.white), + ), + ], + ), + )), + duration: Duration(seconds: 6), + ), ], ), ))), diff --git a/lib/view/evaluation_page.dart b/lib/view/evaluation_page.dart index c2b6345..e6f4fba 100644 --- a/lib/view/evaluation_page.dart +++ b/lib/view/evaluation_page.dart @@ -502,7 +502,7 @@ class EvaluationPage extends StatelessWidget with Trans { Divider(color: Colors.transparent), getSuggestionWidget(resultBloc, "Gain Strength", "asset/image/pict_weight_volumen_tonna.png", "3x4-8", 0.95, "3-5"), Divider(color: Colors.transparent), - getSuggestionWidget(resultBloc, "Endurance", "asset/image/pict_reps_volumen_db.png", "4x25-35", 0.50, "3"), + getSuggestionWidget(resultBloc, "Muscle Endurance", "asset/image/pict_reps_volumen_db.png", "4x25-35", 0.50, "3"), ], ), ); diff --git a/lib/view/registration.dart b/lib/view/registration.dart index 3c5be48..1f99566 100644 --- a/lib/view/registration.dart +++ b/lib/view/registration.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:aitrainer_app/bloc/account/account_bloc.dart'; import 'package:aitrainer_app/bloc/login/login_bloc.dart'; +import 'package:aitrainer_app/repository/training_plan_repository.dart'; import 'package:aitrainer_app/repository/user_repository.dart'; import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/widgets/app_bar_min.dart'; @@ -33,17 +34,18 @@ class RegistrationPage extends StatelessWidget with Trans { ScaffoldMessenger.of(context).showSnackBar( SnackBar(backgroundColor: Colors.orange, content: Text(t(state.message), style: TextStyle(color: Colors.white)))); } else if (state is LoginSuccess) { + TrainingPlanRepository trainingPlanRepository = TrainingPlanRepository(); showDialog( context: context, builder: (BuildContext context) { return DialogCommon( title: t("Successful Registration"), - descriptions: t("Now we would like to know you better to lift the experience of the app."), - description2: t("Please go through the pages, it will take couple of minutes!"), + descriptions: t("Based on your initial data, we will generate the personalized training plan for you."), text: "OK", - onTap: () => {Navigator.of(context).pushNamed('customerModifyPage')}, + onTap: () => {Navigator.of(context).pushNamed('customerWelcomePage')}, onCancel: () => { - Navigator.of(context).pushNamed("home"), + trainingPlanRepository.generateTrainingPlan(), + Navigator.of(context).pushNamed("customerWelcomePage"), }, ); }); @@ -83,7 +85,7 @@ class RegistrationPage extends StatelessWidget with Trans { child: Container( decoration: BoxDecoration( image: DecorationImage( - image: AssetImage('asset/image/WT_login.jpg'), + image: AssetImage('asset/image/WT_menu_dark.jpg'), fit: BoxFit.cover, alignment: Alignment.center, ), @@ -99,17 +101,32 @@ class RegistrationPage extends StatelessWidget with Trans { child: Container( padding: const EdgeInsets.only(left: 20, right: 20), child: ListView(shrinkWrap: false, padding: EdgeInsets.only(top: 10.0), children: [ - GestureDetector( - onTap: () => loginBloc.add(LoginSkip()), - child: Text( - t("I Execute My First Test Now"), - textAlign: TextAlign.right, - style: GoogleFonts.inter(color: loginBloc.testColor, decoration: TextDecoration.underline, fontWeight: FontWeight.bold), - )), SizedBox( - height: 120, + height: 100, + ), + ListTile( + title: Text( + t("SignUp"), + style: GoogleFonts.inter( + color: Colors.white, + fontWeight: FontWeight.w500, + shadows: [ + Shadow( + offset: Offset(3.0, 3.0), + blurRadius: 6.0, + color: Colors.black54, + ), + Shadow( + offset: Offset(-3.0, 3.0), + blurRadius: 6.0, + color: Colors.black54, + ), + ], + ), + )), + SizedBox( + height: 20, ), - ListTile(title: Text(t("SignUp"), style: GoogleFonts.inter())), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -140,7 +157,6 @@ class RegistrationPage extends StatelessWidget with Trans { : Offstage(), ], ), - //ListTile(title: Text(t("OR"), style: GoogleFonts.inter())), Divider( color: Colors.transparent, ), @@ -149,6 +165,10 @@ class RegistrationPage extends StatelessWidget with Trans { decoration: InputDecoration( contentPadding: EdgeInsets.only(left: 15, top: 15, bottom: 15), labelText: t('Email'), + labelStyle: TextStyle( + fontSize: 14, + color: Color(0xffb4f500), + ), fillColor: Colors.white24, filled: true, border: OutlineInputBorder( @@ -165,7 +185,7 @@ class RegistrationPage extends StatelessWidget with Trans { }, onChanged: (value) => loginBloc.add(LoginEmailChange(email: value)), keyboardType: TextInputType.emailAddress, - style: new TextStyle(fontSize: 16, color: Colors.indigo), + style: new TextStyle(fontSize: 16, color: Colors.white), ), Divider( color: Colors.transparent, @@ -174,7 +194,10 @@ class RegistrationPage extends StatelessWidget with Trans { key: LibraryKeys.loginPasswordField, obscureText: loginBloc.obscure, decoration: InputDecoration( - labelStyle: TextStyle(fontSize: 14), + labelStyle: TextStyle( + fontSize: 14, + color: Color(0xffb4f500), + ), contentPadding: EdgeInsets.only(left: 15, top: 15, bottom: 15), suffixIcon: IconButton( onPressed: () => {loginBloc.add(LoginPasswordChangeObscure())}, @@ -197,7 +220,7 @@ class RegistrationPage extends StatelessWidget with Trans { }, onChanged: (value) => loginBloc.add(LoginPasswordChange(password: value)), keyboardType: TextInputType.visiblePassword, - style: new TextStyle(fontSize: 16, color: Colors.indigo), + style: new TextStyle(fontSize: 16, color: Colors.white), ), Divider( color: Colors.transparent, @@ -214,7 +237,22 @@ class RegistrationPage extends StatelessWidget with Trans { ), title: Text( t("With the registration I accept the data policy and the terms of use."), - style: GoogleFonts.inter(color: Colors.indigo), + style: GoogleFonts.inter( + color: Colors.white, + fontWeight: FontWeight.w500, + shadows: [ + Shadow( + offset: Offset(3.0, 3.0), + blurRadius: 6.0, + color: Colors.black54, + ), + Shadow( + offset: Offset(-3.0, 3.0), + blurRadius: 6.0, + color: Colors.black54, + ), + ], + ), ), ), Row(mainAxisAlignment: MainAxisAlignment.start, children: [ @@ -242,7 +280,23 @@ class RegistrationPage extends StatelessWidget with Trans { InkWell( child: Text( t('Login'), - style: GoogleFonts.inter(decoration: TextDecoration.underline), + style: GoogleFonts.inter( + decoration: TextDecoration.underline, + color: Colors.white, + fontWeight: FontWeight.w500, + shadows: [ + Shadow( + offset: Offset(3.0, 3.0), + blurRadius: 6.0, + color: Colors.black54, + ), + Shadow( + offset: Offset(-3.0, 3.0), + blurRadius: 6.0, + color: Colors.black54, + ), + ], + ), ), onTap: () => Navigator.of(context).pushNamed('login'), ), @@ -250,7 +304,23 @@ class RegistrationPage extends StatelessWidget with Trans { InkWell( child: Text( t('Terms Of Use'), - style: GoogleFonts.inter(decoration: TextDecoration.underline), + style: GoogleFonts.inter( + decoration: TextDecoration.underline, + color: Colors.white, + fontWeight: FontWeight.w500, + shadows: [ + Shadow( + offset: Offset(3.0, 3.0), + blurRadius: 6.0, + color: Colors.black54, + ), + Shadow( + offset: Offset(-3.0, 3.0), + blurRadius: 6.0, + color: Colors.black54, + ), + ], + ), ), onTap: () => { showDialog( @@ -263,7 +333,18 @@ class RegistrationPage extends StatelessWidget with Trans { InkWell( child: Text( t('Privacy'), - style: GoogleFonts.inter(decoration: TextDecoration.underline), + style: GoogleFonts.inter( + decoration: TextDecoration.underline, + color: Colors.white, + fontWeight: FontWeight.w500, + shadows: [ + Shadow( + offset: Offset(2.0, 2.0), + blurRadius: 10.0, + color: Colors.black87, + ), + ], + ), ), onTap: () => { showDialog( diff --git a/lib/view/settings.dart b/lib/view/settings.dart index ed807d5..9ccd6a0 100644 --- a/lib/view/settings.dart +++ b/lib/view/settings.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:aitrainer_app/bloc/menu/menu_bloc.dart'; import 'package:aitrainer_app/bloc/settings/settings_bloc.dart'; import 'package:aitrainer_app/bloc/tutorial/tutorial_bloc.dart'; @@ -17,7 +19,8 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:toggle_switch/toggle_switch.dart'; -import 'package:url_launcher/url_launcher.dart'; +import 'package:flutter/services.dart'; +import 'dart:async'; // ignore: must_be_immutable class SettingsPage extends StatelessWidget with Trans { @@ -81,7 +84,7 @@ class SettingsPage extends StatelessWidget with Trans { Track().track(TrackingEvent.settings_lang, eventValue: lang) })), getServer(settingsBloc), - getTuturialBasic(settingsBloc), + //getTuturialBasic(settingsBloc), getTermsOfUse(), getPrivacy(), getFaq(), @@ -96,7 +99,7 @@ class SettingsPage extends StatelessWidget with Trans { title: Container(), ); } - print("Live: ${Cache().liveServer}"); + return ListTile( leading: Icon(Icons.data_usage_sharp), subtitle: Text("For Test purpuses select Test-Server. After that please restart the the App"), @@ -260,4 +263,26 @@ class SettingsPage extends StatelessWidget with Trans { ), ); } + + Future _printAndCopy(String cmd) async { + print(cmd); + + await Clipboard.setData(ClipboardData(text: cmd)); + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Copied to Clipboard')), + ); + } + + void link1() { + String? cmd; + String cmdSuffix; + if (Platform.isIOS) { + cmd = '/usr/bin/xcrun simctl openurl booted'; + } else if (Platform.isAndroid) { + cmd = '\$ANDROID_HOME/platform-tools/adb shell \'am start' + ' -a android.intent.action.VIEW' + ' -c android.intent.category.BROWSABLE -d'; + cmdSuffix = "'"; + } + } } diff --git a/lib/view/training_plan_activate_page.dart b/lib/view/training_plan_activate_page.dart index be8ee66..5f146b1 100644 --- a/lib/view/training_plan_activate_page.dart +++ b/lib/view/training_plan_activate_page.dart @@ -128,7 +128,10 @@ class TrainingPlanActivatePage extends StatelessWidget with Trans { child: Text( parentTitle, maxLines: 2, - style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), )), ], ), diff --git a/lib/view/training_plan_execute.dart b/lib/view/training_plan_execute.dart new file mode 100644 index 0000000..7ad2875 --- /dev/null +++ b/lib/view/training_plan_execute.dart @@ -0,0 +1,649 @@ +import 'dart:collection'; + +import 'package:aitrainer_app/bloc/training_plan/training_plan_bloc.dart'; +import 'package:aitrainer_app/library/custom_icon_icons.dart'; +import 'package:aitrainer_app/model/customer_training_plan_details.dart'; +import 'package:aitrainer_app/model/exercise_plan_detail.dart'; +import 'package:aitrainer_app/util/app_localization.dart'; +import 'package:aitrainer_app/util/trans.dart'; +import 'package:aitrainer_app/widgets/app_bar.dart'; +import 'package:aitrainer_app/widgets/dialog_common.dart'; +import 'package:aitrainer_app/widgets/dialog_html.dart'; +import 'package:aitrainer_app/widgets/menu_image.dart'; +import 'package:badges/badges.dart'; +import 'package:extended_tabs/extended_tabs.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; + +class TrainingPlanExecute extends StatefulWidget { + const TrainingPlanExecute({Key? key}) : super(key: key); + + @override + _TrainingPlanExecuteState createState() => _TrainingPlanExecuteState(); +} + +class _TrainingPlanExecuteState extends State with Trans { + @override + Widget build(BuildContext context) { + final TrainingPlanBloc bloc = BlocProvider.of(context); + bloc.activateDays(); + + setContext(context); + return Scaffold( + appBar: AppBarNav(depth: 0), + body: Container( + padding: EdgeInsets.all(0), + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('asset/image/WT_black_background.jpg'), + fit: BoxFit.cover, + alignment: Alignment.center, + ), + ), + child: BlocConsumer(listener: (context, state) { + if (state is TrainingPlanError) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(backgroundColor: Colors.orange, content: Text(state.message, style: TextStyle(color: Colors.white)))); + } else if (state is TrainingPlanDayFinished) { + bloc.celebrating = false; + final HashMap args = HashMap(); + args["bloc"] = bloc; + args["day"] = bloc.dayNames[bloc.activeDayIndex]; + Navigator.of(context).pushNamed('myTrainingEvaluation', arguments: args); + } else if (state is TrainingPlanDayReadyToRestart) { + if (!bloc.celebrating) { + showCupertinoDialog( + useRootNavigator: true, + context: context, + builder: (_) => CupertinoAlertDialog( + title: Text(t("The training is finished")), + content: Column(children: [Divider(), Text(t("Do you want to restart, or select a new Training Plan?"))]), + actions: [ + TextButton( + child: Text(t("New Training Plan"), textAlign: TextAlign.center), + onPressed: () => { + Navigator.pop(context), + Navigator.of(context).popAndPushNamed('myTrainingPlans'), + bloc.restarting = false, + }), + TextButton( + child: Text(t("Restart")), + onPressed: () { + bloc.restart(); + Navigator.pop(context); + Navigator.of(context).popAndPushNamed('home'); + }, + ) + ], + )); + } + } + }, builder: (context, state) { + return ModalProgressHUD( + child: ExerciseTabs(bloc: bloc), + inAsyncCall: state is TrainingPlanLoading, + opacity: 0.5, + color: Colors.black54, + progressIndicator: CircularProgressIndicator(), + ); + }), + ), + floatingActionButton: FloatingActionButton.extended( + onPressed: () { + final HashMap args = HashMap(); + args["bloc"] = bloc; + args["day"] = bloc.dayNames[bloc.activeDayIndex]; + bloc.getNext() != null + ? _ExerciseListState.executeExercise(bloc, bloc.getNext()!, context) + : Navigator.of(context).pushNamed('myTrainingEvaluation', arguments: args); + }, + backgroundColor: Colors.orange[600], //Color(0xffb4f500), + icon: Icon( + CustomIcon.weight_hanging, + color: Colors.black, + ), + label: Text( + t("Next Exercise"), + style: GoogleFonts.inter(color: Colors.black, fontWeight: FontWeight.bold, fontSize: 16), + ), + ), + ); + } +} + +class ExerciseTabs extends StatefulWidget { + final TrainingPlanBloc bloc; + ExerciseTabs({required this.bloc}); + @override + _ExerciseTabs createState() => _ExerciseTabs(); +} + +class _ExerciseTabs extends State with TickerProviderStateMixin { + late TabController tabController; + + @override + void initState() { + super.initState(); + tabController = TabController(length: widget.bloc.dayNames.length, vsync: this); + tabController.animateTo(widget.bloc.activeDayIndex, duration: Duration(milliseconds: 300)); + } + + @override + void dispose() { + tabController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return getTabs(widget.bloc); + } + + Widget getTabs(TrainingPlanBloc bloc) { + return Column(children: [ + Text( + bloc.getMyPlan()!.name!, + style: GoogleFonts.archivoBlack( + fontSize: 14, + color: Colors.white, + shadows: [ + Shadow( + offset: Offset(2.0, 2.0), + blurRadius: 6.0, + color: Colors.black87, + ), + Shadow( + offset: Offset(2.0, 2.0), + blurRadius: 6.0, + color: Colors.black87, + ), + ], + ), + ), + ExtendedTabBar( + indicator: BoxDecoration( + color: Colors.black87, + border: Border( + bottom: BorderSide(width: 4.0, color: Color(0xffb4f500)), + // top: BorderSide(width: 4.0, color: Colors.blue), + )), + labelPadding: EdgeInsets.only(left: 0, right: 0), + tabs: getTabNames(), + controller: tabController, + onTap: (index) => bloc.activeDayIndex = index, + ), + Expanded( + child: ExtendedTabBarView( + children: getExerciseLists(), + controller: tabController, + + /// if link is true and current tabbarview over scroll, + /// it will check and scroll ancestor or child tabbarView. + link: true, + + /// cache page count + /// default is 0. + /// if cacheExtent is 1, it has two pages in cache + /// null is infinity, it will cache all pages + cacheExtent: 0, + )), + ]); + } + + List getTabNames() { + List tabs = []; + final int tabCount = widget.bloc.dayNames.length; + double cWidth = MediaQuery.of(context).size.width; + widget.bloc.dayNames.forEach((element) { + final Widget widget = Container( + //height: 40, + padding: EdgeInsets.only(top: 3, left: 10, right: 10, bottom: 3), + width: (cWidth / tabCount), + color: Colors.white10, + child: RichText( + textScaleFactor: 0.8, + text: TextSpan( + style: GoogleFonts.inter( + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + children: [ + TextSpan( + text: AppLocalizations.of(context)!.translate("Training Day") + ": \n", + style: GoogleFonts.inter( + fontSize: 14, + color: Colors.white, + shadows: [ + Shadow( + offset: Offset(5.0, 5.0), + blurRadius: 12.0, + color: Colors.black54, + ), + Shadow( + offset: Offset(-3.0, 3.0), + blurRadius: 12.0, + color: Colors.black54, + ), + ], + )), + TextSpan( + text: element, + style: GoogleFonts.inter( + fontSize: 14, + fontWeight: FontWeight.bold, + color: Color(0xffb4f500), + shadows: [ + Shadow( + offset: Offset(5.0, 5.0), + blurRadius: 12.0, + color: Colors.black54, + ), + Shadow( + offset: Offset(-3.0, 3.0), + blurRadius: 12.0, + color: Colors.black54, + ), + ], + )), + ]))); + + tabs.add(Tab(child: widget)); + }); + return tabs; + } + + List getExerciseLists() { + List list = []; + widget.bloc.dayNames.forEach((element) { + list.add(ExerciseList(bloc: widget.bloc, dayName: element)); + }); + return list; + } +} + +class ExerciseList extends StatefulWidget { + final TrainingPlanBloc bloc; + final String dayName; + ExerciseList({required this.bloc, required this.dayName}); + + @override + _ExerciseListState createState() => _ExerciseListState(); +} + +class _ExerciseListState extends State with Trans { + final scrollController = ScrollController(); + double offset = 5; + + @override + void initState() { + WidgetsBinding.instance!.addPostFrameCallback((_) { + animate(); + }); + super.initState(); + } + + @override + void didUpdateWidget(ExerciseList page) { + super.didUpdateWidget(page); + WidgetsBinding.instance!.addPostFrameCallback((_) { + animate(); + }); + } + + void animate() { + offset = widget.bloc.getOffset(); + if (scrollController.hasClients) { + scrollController.animateTo(offset, duration: Duration(milliseconds: 300), curve: Curves.easeIn); + } + } + + @override + void dispose() { + scrollController.dispose(); + super.dispose(); + } + + static void executeExercise(TrainingPlanBloc bloc, CustomerTrainingPlanDetails detail, BuildContext context) { + CustomerTrainingPlanDetails? next = bloc.getNext(); + + if (next != null) { + String title = ""; + String description = ""; + String description2 = ""; + if (next.exerciseTypeId != detail.exerciseTypeId) { + title = AppLocalizations.of(context)!.translate("Stop!"); + description = AppLocalizations.of(context)!.translate("Please continue with the next exercise in the queue:") + + next.exerciseType!.nameTranslation; + } else { + final HashMap args = HashMap(); + args['exerciseType'] = next.exerciseType; + args['customerTrainingPlanDetails'] = detail; + Navigator.of(context).pushNamed('myTrainingPlanExercise', arguments: args); + return; + } + + showDialog( + context: context, + barrierDismissible: false, + builder: (BuildContext context) { + return DialogCommon( + title: title, + descriptions: description, + description2: description2, + text: "OK", + onTap: () => {Navigator.of(context).pop()}, + onCancel: () => {Navigator.of(context).pop()}, + ); + }); + } else { + Navigator.of(context).pushNamed('home'); + } + } + + @override + Widget build(BuildContext context) { + setContext(context); + return CustomScrollView(controller: scrollController, slivers: [ + SliverList(delegate: SliverChildListDelegate(getTiles(widget.bloc))), + ]); + } + + List getTiles(TrainingPlanBloc bloc) { + List tiles = []; + + tiles.addAll(getExerciseTiles(bloc, context)); + + return tiles; + } + + List getExerciseTiles(TrainingPlanBloc bloc, BuildContext context) { + List tiles = []; + CustomerTrainingPlanDetails? prev; + if (bloc.getMyPlan() != null && + bloc.getMyPlan()!.details.isNotEmpty && + bloc.getMyPlan()!.days[widget.dayName] != null && + bloc.getMyPlan()!.days[widget.dayName]!.isNotEmpty) { + bloc.getMyPlan()!.days[widget.dayName]!.forEach((element) { + if (prev != null && prev!.exerciseTypeId != element.exerciseTypeId) { + tiles.add(GestureDetector( + onTap: () => + bloc.getNext() != null ? executeExercise(bloc, bloc.getNext()!, context) : Navigator.of(context).pushNamed('home'), + child: ExerciseTile(bloc: bloc, detail: element))); + } + prev = element; + }); + } + + return tiles; + } +} + +// ignore: must_be_immutable +class ExerciseTile extends StatelessWidget with Trans { + final TrainingPlanBloc bloc; + final CustomerTrainingPlanDetails detail; + + ExerciseTile({required this.bloc, required this.detail}); + + Widget getExerciseQuantities(CustomerTrainingPlanDetails detail, int step, bool noFilter) { + bool skipped = detail.state == ExercisePlanDetailState.skipped; + String quantities = ""; + String set = ""; + List spans = []; + if (detail.exerciseType!.name == "Warming Up") { + quantities = t("Min. 10 minutes"); + spans.add( + TextSpan(text: quantities), + ); + } else if (detail.exerciseType!.name == "Stretching") { + quantities = t("Recommended"); + spans.add( + TextSpan(text: quantities), + ); + } else { + set = detail.set! > 1 ? "${detail.set} " + t("set") : ""; + List details = bloc.getAllDetailsSameExercise(detail); + int index = 0; + bool isWeight = true; + + if (set.length > 0) { + spans.add( + TextSpan( + text: step.toString() + " ", + style: GoogleFonts.archivoBlack( + color: Colors.orange[600], + )), + ); + spans.add( + TextSpan(text: "/ " + set), + ); + } + + details.forEach((element) { + quantities = ""; + String delimiter = ","; + if (index == 0) { + delimiter = ""; + } + if (element.repeats == -1) { + quantities += delimiter + " MAX "; + } else { + quantities += delimiter + " ${element.repeats}"; + } + if (element.exerciseType!.unitQuantityUnit != null) { + quantities += "x"; + if (element.weight == -1 || element.weight == -2 || element.weight == -3) { + quantities += "? kg"; + } else { + num weight = element.weight! % element.weight!.round() == 0 ? element.weight!.round() : element.weight!; + quantities += "$weight kg"; + } + } else { + isWeight = false; + } + if (step == index && noFilter) { + spans.add( + TextSpan( + text: quantities, + style: GoogleFonts.archivoBlack( + color: Colors.orange[600], + ), + ), + ); + } else { + spans.add( + TextSpan(text: quantities), + ); + } + index++; + }); + if (isWeight) { + quantities += " kg"; + } + } + + return RichText( + text: TextSpan( + style: GoogleFonts.archivoBlack( + fontSize: 20, + color: skipped ? Colors.grey : Colors.white, + shadows: [ + Shadow( + offset: Offset(2.0, 2.0), + blurRadius: 6.0, + color: Colors.black87, + ), + Shadow( + offset: Offset(2.0, 2.0), + blurRadius: 6.0, + color: Colors.black87, + ), + ], + ), + children: spans), + ); + } + + @override + Widget build(BuildContext context) { + setContext(context); + + final CustomerTrainingPlanDetails? next = bloc.getNext(); + final bool noFilter = next != null && next.exerciseTypeId == detail.exerciseTypeId; + final bool done = detail.state == ExercisePlanDetailState.finished; + final int step = bloc.getStep(detail); //detail.exercises.length; + final bool buddyWarning = detail.exerciseType == null ? false : detail.exerciseType!.buddyWarning; + + return Container( + child: Stack(alignment: Alignment.bottomLeft, children: [ + Badge( + elevation: 0, + padding: EdgeInsets.all(0), + position: BadgePosition.topEnd(top: 5, end: 5), + animationDuration: Duration(milliseconds: 1500), + animationType: BadgeAnimationType.fade, + badgeColor: Colors.transparent, + showBadge: noFilter || done, + badgeContent: IconButton( + iconSize: 40, + onPressed: () => !done ? skip() : {}, + icon: Icon( + done ? CustomIcon.ok_circled : Icons.cancel, + color: done ? Colors.green[600] : Colors.red[600], + )), + child: Badge( + elevation: 0, + padding: EdgeInsets.all(0), + position: BadgePosition.topStart(top: 5, start: 5), + animationDuration: Duration(milliseconds: 500), + animationType: BadgeAnimationType.slide, + badgeColor: Colors.transparent, + showBadge: true, + badgeContent: IconButton( + iconSize: 36, + onPressed: () => showDialog( + context: context, + builder: (BuildContext context) { + return DialogHTML( + title: detail.exerciseType!.nameTranslation, + htmlData: '

' + detail.exerciseType!.descriptionTranslation + '

'); + }), + icon: Icon( + Icons.info_outline, + color: Colors.yellow[200], + )), + child: Badge( + elevation: 0, + padding: EdgeInsets.all(0), + position: BadgePosition.topEnd(top: 65, end: 1), + animationDuration: Duration(milliseconds: 500), + animationType: BadgeAnimationType.fade, + badgeColor: Colors.transparent, + showBadge: buddyWarning, + badgeContent: IconButton( + iconSize: 50, + onPressed: () => showDialog( + context: context, + builder: (BuildContext context) { + return DialogCommon( + warning: true, + text: "Warning", + descriptions: t("Attention!"), + description2: t("The safe and exact execution of this exercise you need a training buddy or a trainer"), + description3: t("Execution at your own risk!"), + onTap: () => Navigator.of(context).pop(), + onCancel: () => Navigator.of(context).pop(), + title: t('Training Buddy'), + ); + }), + icon: Icon( + CustomIcon.exclamation_circle, + color: Colors.red[800], + )), + child: Column(children: [ + MenuImage( + imageName: bloc.getActualImageName(detail.exerciseType!.exerciseTypeId), + workoutTreeId: bloc.getActualWorkoutTreeId(detail.exerciseType!.exerciseTypeId)!, + radius: 0, + filter: !noFilter, + ), + Container( + padding: EdgeInsets.only(left: 20, top: 10, bottom: 0), + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('asset/image/WT_zold.jpg'), + fit: BoxFit.cover, + alignment: Alignment.center, + ), + ), + foregroundDecoration: !noFilter + ? BoxDecoration( + color: Colors.black38, + backgroundBlendMode: BlendMode.darken, + ) + : null, + height: 80, + width: double.infinity, + child: getExerciseQuantities(detail, step, noFilter), + ) + ])))), + Container( + padding: EdgeInsets.only(left: 15, bottom: 80, right: 15), + width: double.infinity, + color: Colors.transparent, + child: Text( + detail.exerciseType!.nameTranslation, + maxLines: 3, + style: GoogleFonts.archivoBlack( + color: noFilter ? Colors.white : Colors.grey, + fontSize: 36, + height: 1.1, + shadows: [ + Shadow( + offset: Offset(16.0, 16.0), + blurRadius: 16.0, + color: Colors.black54, + ), + Shadow( + offset: Offset(16.0, 16.0), + blurRadius: 16.0, + color: Colors.black54, + ), + ], + ), + ), + ), + ]), + ); + } + + void skip() { + showCupertinoDialog( + useRootNavigator: true, + context: context, + builder: (_) => CupertinoAlertDialog( + title: Text(t("You want to skip really this exercise?")), + content: Column(children: [ + Divider(), + ]), + actions: [ + TextButton( + child: Text(t("No")), + onPressed: () => { + Navigator.pop(context), + }), + TextButton( + child: Text(t("Yes")), + onPressed: () { + Navigator.pop(context); + bloc.add(TrainingPlanSkipExercise(detail: detail)); + }, + ) + ], + )); + } +} diff --git a/lib/widgets/dialog_trial.dart b/lib/widgets/dialog_trial.dart new file mode 100644 index 0000000..e3a3f8b --- /dev/null +++ b/lib/widgets/dialog_trial.dart @@ -0,0 +1,170 @@ +import 'package:aitrainer_app/util/trans.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +// ignore: must_be_immutable +class DialogTrialWidget extends StatefulWidget { + final String title, description; + final Widget widget; + final VoidCallback onTap; + final VoidCallback? onCancel; + + DialogTrialWidget({Key? key, required this.title, required this.description, required this.widget, required this.onTap, this.onCancel}) + : super(key: key); + + @override + _DialogTrialWidgetState createState() { + return _DialogTrialWidgetState(); + } +} + +class _DialogTrialWidgetState extends State with Trans { + @override + Widget build(BuildContext context) { + setContext(context); + return Dialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(31), + ), + elevation: 0, + backgroundColor: Colors.transparent, + child: contentBox(context), + ); + } + + contentBox(context) { + return Stack(alignment: AlignmentDirectional.topStart, children: [ + Stack( + children: [ + Container( + padding: EdgeInsets.only(left: 20, top: 24, right: 20, bottom: 30), + margin: EdgeInsets.only(top: 30), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(24), + boxShadow: [BoxShadow(color: Colors.black, offset: Offset(0, 10), blurRadius: 10)], + image: DecorationImage( + image: AssetImage('asset/image/WT_black_G_background.jpg'), + fit: BoxFit.cover, + alignment: Alignment.center, + ), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + height: 5, + ), + Stack( + alignment: AlignmentDirectional.topEnd, + children: [ + Text( + widget.title, + textAlign: TextAlign.center, + style: GoogleFonts.archivoBlack( + fontSize: 20, + color: Colors.yellow[400], + shadows: [ + Shadow( + offset: Offset(5.0, 5.0), + blurRadius: 12.0, + color: Colors.black54, + ), + Shadow( + offset: Offset(-3.0, 3.0), + blurRadius: 12.0, + color: Colors.black54, + ), + ], + ), + ), + ], + ), + SizedBox( + height: 35, + ), + Text( + widget.description, + style: GoogleFonts.inter( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.white, + shadows: [ + Shadow( + offset: Offset(5.0, 5.0), + blurRadius: 12.0, + color: Colors.black54, + ), + Shadow( + offset: Offset(-3.0, 3.0), + blurRadius: 12.0, + color: Colors.black54, + ), + ], + ), + textAlign: TextAlign.center, + ), + SizedBox( + height: 15, + ), + widget.widget, + SizedBox( + height: 52, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + GestureDetector( + onTap: widget.onCancel, + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset('asset/icon/gomb_lila_b.png', width: 100, height: 45), + Text( + t("Nem"), + style: TextStyle(fontSize: 16, color: Colors.white), + ), + ], + )), + GestureDetector( + onTap: widget.onTap, + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset('asset/icon/gomb_orange_c.png', width: 100, height: 45), + Text( + t("Igen"), + style: TextStyle(fontSize: 16, color: Colors.white), + ), + ], + )) + ], + ), + ], + ), + ), + ], + ), + GestureDetector( + onTap: () { + if (widget.onCancel == null) { + Navigator.of(context).pop(); + } else { + widget.onCancel!(); + } + }, + child: CircleAvatar( + backgroundColor: Colors.transparent, + radius: 28, + child: Text( + "X", + style: GoogleFonts.archivoBlack(fontSize: 32, color: Colors.white54), + ), + )), + ]); + } + + @override + void dispose() { + super.dispose(); + } +} diff --git a/lib/widgets/exercise_save.dart b/lib/widgets/exercise_save.dart index d0d0be3..f715382 100644 --- a/lib/widgets/exercise_save.dart +++ b/lib/widgets/exercise_save.dart @@ -98,7 +98,7 @@ class _ExerciseSaveState extends State with Trans { } SchedulerBinding.instance!.addPostFrameCallback((_) { - final TutorialBloc bloc = BlocProvider.of(context); + /* //final TutorialBloc bloc = BlocProvider.of(context); if (bloc.actualCheck == "directTest") { Timer( Duration(milliseconds: 2000), @@ -116,7 +116,7 @@ class _ExerciseSaveState extends State with Trans { ); }) }); - } + } */ }); } diff --git a/lib/widgets/home.dart b/lib/widgets/home.dart index d8ed6ec..3a0e4c1 100644 --- a/lib/widgets/home.dart +++ b/lib/widgets/home.dart @@ -4,10 +4,11 @@ import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/service/logging.dart'; import 'package:aitrainer_app/util/app_language.dart'; import 'package:aitrainer_app/util/trans.dart'; +import 'package:aitrainer_app/view/customer_goal_page.dart'; import 'package:aitrainer_app/view/login.dart'; import 'package:aitrainer_app/view/menu_page.dart'; -import 'package:aitrainer_app/view/registration.dart'; import 'package:aitrainer_app/widgets/dialog_common.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; @@ -37,6 +38,15 @@ class _HomePageState extends State with Logging, Trans { SchedulerBinding.instance!.addPostFrameCallback((_) { runDelayedEvent(); }); + + FirebaseMessaging.onMessage.listen((RemoteMessage message) { + print('-- FirebaseMessaging: Got a message whilst in the foreground!'); + print('-- FirebaseMessaging: Message data: ${message.data}'); + + if (message.notification != null) { + print('-- FirebaseMessaging: Message also contained a notification: ${message.notification}'); + } + }); } Future runDelayedEvent() async { @@ -58,6 +68,7 @@ class _HomePageState extends State with Logging, Trans { final appcastURL = "https://raw.githubusercontent.com/bossanyit/appcast/main/android_rss.xml"; final cfg = AppcastConfiguration(url: appcastURL, supportedOS: ['android']); print("Packageinfo ${Cache().packageInfo}"); + return Scaffold( key: _scaffoldKey, body: UpgradeAlert( @@ -101,7 +112,7 @@ class _HomePageState extends State with Logging, Trans { if (Cache().startPage == 'login') { return LoginPage(); } else if (Cache().startPage == 'registration') { - return RegistrationPage(); + return CustomerGoalPage(); } else { return MenuPage(parent: 0); } diff --git a/lib/widgets/menu_image.dart b/lib/widgets/menu_image.dart index 3fc511f..da4d1bd 100644 --- a/lib/widgets/menu_image.dart +++ b/lib/widgets/menu_image.dart @@ -3,16 +3,19 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:aitrainer_app/library/image_cache.dart' as wt; import 'package:aitrainer_app/library/transparent_image.dart'; +import 'package:flutter_html/shims/dart_ui_real.dart'; // ignore: must_be_immutable class MenuImage extends StatelessWidget { final int? workoutTreeId; final String imageName; + bool filter; double radius; MenuImage({ required this.workoutTreeId, required this.imageName, this.radius = 24, + this.filter = false, }); @override @@ -23,10 +26,16 @@ class MenuImage extends StatelessWidget { String? imageString = this.getImage(workoutTreeId!, imageName); Widget? widget; if (imageString != null) { + print("MemoryImage $workoutTreeId - $imageName"); widget = ClipRRect( borderRadius: BorderRadius.circular(24.0), child: Container( - color: Colors.transparent, + padding: EdgeInsets.zero, + color: Colors.black38, + foregroundDecoration: BoxDecoration( + color: Colors.black38, + backgroundBlendMode: BlendMode.darken, + ), child: FadeInImage( fadeInDuration: Duration(milliseconds: 100), image: MemoryImage(base64Decode(imageString)), @@ -35,10 +44,18 @@ class MenuImage extends StatelessWidget { )); } else { if (imageName.contains("https")) { + print("https image $workoutTreeId - $imageName"); if (!wt.ImageCache().existsImageInMap(workoutTreeId!, imageName)) { widget = ClipRRect( borderRadius: BorderRadius.circular(radius), child: Container( + padding: EdgeInsets.zero, + foregroundDecoration: filter + ? BoxDecoration( + color: Colors.black38, + backgroundBlendMode: BlendMode.darken, + ) + : null, color: Colors.transparent, child: FadeInImage( fadeInDuration: Duration(milliseconds: 500), @@ -51,7 +68,14 @@ class MenuImage extends StatelessWidget { widget = ClipRRect( borderRadius: BorderRadius.circular(radius), child: Container( + padding: EdgeInsets.zero, color: Colors.transparent, + foregroundDecoration: filter + ? BoxDecoration( + color: Colors.black38, + backgroundBlendMode: BlendMode.darken, + ) + : null, child: Image.asset(imageName), )); } diff --git a/lib/widgets/menu_page_widget.dart b/lib/widgets/menu_page_widget.dart index 6401e2b..b69cf1b 100644 --- a/lib/widgets/menu_page_widget.dart +++ b/lib/widgets/menu_page_widget.dart @@ -1,11 +1,12 @@ import 'dart:collection'; import 'dart:ui'; import 'package:aitrainer_app/bloc/training_plan/training_plan_bloc.dart'; -import 'package:aitrainer_app/bloc/tutorial/tutorial_bloc.dart'; import 'package:aitrainer_app/model/exercise_ability.dart'; import 'package:aitrainer_app/bloc/menu/menu_bloc.dart'; +import 'package:aitrainer_app/repository/training_plan_repository.dart'; import 'package:aitrainer_app/util/enums.dart'; import 'package:aitrainer_app/util/track.dart'; +import 'package:aitrainer_app/widgets/dialog_trial.dart'; import 'package:aitrainer_app/widgets/menu_image.dart'; import 'package:aitrainer_app/widgets/menu_search_bar.dart'; import 'package:aitrainer_app/util/app_language.dart'; @@ -15,9 +16,9 @@ import 'package:aitrainer_app/model/workout_menu_tree.dart'; import 'package:aitrainer_app/service/logging.dart'; import 'package:aitrainer_app/util/trans.dart'; import 'package:aitrainer_app/widgets/dialog_common.dart'; -import 'package:aitrainer_app/widgets/tutorial_widget.dart'; import 'package:badges/badges.dart'; import 'package:ezanimation/ezanimation.dart'; +import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/painting.dart'; @@ -39,7 +40,7 @@ class _MenuPageWidgetState extends State with Trans, Logging { final double baseWidth = 312; final double baseHeight = 675.2; late MenuBloc menuBloc; - late TutorialBloc tutorialBloc; + //late TutorialBloc tutorialBloc; final scrollController = ScrollController(); final bool activeExercisePlan = Cache().activeExercisePlan != null; final EzAnimation animation = EzAnimation(35.0, 10.0, Duration(seconds: 2), reverseCurve: Curves.linear); @@ -59,41 +60,11 @@ class _MenuPageWidgetState extends State with Trans, Logging { /// We require the initializers to run after the loading screen is rendered SchedulerBinding.instance!.addPostFrameCallback((_) { menuBloc.add(MenuCreate()); - //runDelayedEvent(); }); super.initState(); } - Future runDelayedEvent() async { - bool isFirst = false; - await Future.delayed(Duration(milliseconds: 600), () async { - if (Cache().userLoggedIn != null) { - if (Cache().userLoggedIn!.sex == "m") { - tutorialBloc.tutorialName = ActivityDone.tutorialBasicChestPress.toStr(); - } else { - tutorialBloc.tutorialName = ActivityDone.tutorialBasicLegPress.toStr(); - } - } - if (!tutorialBloc.isTutorialDone()) { - if (tutorialBloc.isActive == false && tutorialBloc.canActivate) { - tutorialBloc.canActivate = true; - tutorialBloc.isActive = true; - tutorialBloc.menuBloc = menuBloc; - tutorialBloc.add(TutorialLoad()); - tutorialBloc.init(); - isFirst = true; - } - } - }); - final bool canActivate = tutorialBloc.activateTutorial(); - if (canActivate) { - if (!isFirst) { - TutorialWidget().tip(context); - } - } - } - @override bool didUpdateWidget(MenuPageWidget oldWidget) { super.didUpdateWidget(oldWidget); @@ -102,10 +73,68 @@ class _MenuPageWidgetState extends State with Trans, Logging { return true; } + Future runDelayedEvent() async { + await Future.delayed(Duration(milliseconds: 3000), () async { + if (Cache().userLoggedIn != null) { + await initDynamicLinks(); + } + if (Cache().canTrial()) { + showDialog( + context: context, + builder: (BuildContext context) { + return DialogTrialWidget( + title: "10 days Premium for free", + description: "Would you like to try all premium functions for 10 days, without any subscription or bank card data?", + widget: Column(children: [ + Text( + "If you click to 'Yes', all premium functions will be available right now.", + style: GoogleFonts.inter(color: Colors.white), + ), + Divider(), + Text( + "If you click to 'No', you can use all basic functions, and you will loose the oppurtunity to try the premium functions for free.", + style: GoogleFonts.inter(color: Colors.white), + ), + ]), + onCancel: () => { + Navigator.of(context).pop(), + menuBloc.add(MenuStartTrial(start: DateTime.parse("1900-01-01 00:00:00"))), + }, + onTap: () => {Navigator.of(context).pop(), menuBloc.add(MenuStartTrial(start: DateTime.now()))}, + ); + }); + } + }); + } + + Future initDynamicLinks() async { + FirebaseDynamicLinks.instance.onLink(onSuccess: (PendingDynamicLinkData? dynamicLink) async { + final Uri? deepLink = dynamicLink?.link; + print("DeepLink: $deepLink"); + if (deepLink != null) { + // ignore: unawaited_futures + final String deepLinkPath = deepLink.path.replaceFirst("/", ""); + Navigator.pushNamed(context, deepLinkPath); + } + }, onError: (OnLinkErrorException e) async { + print('onLinkError'); + print(e.message); + }); + + final PendingDynamicLinkData? data = await FirebaseDynamicLinks.instance.getInitialLink(); + final Uri? deepLink = data?.link; + print("Pending DeepLink: $deepLink"); + if (deepLink != null) { + // ignore: unawaited_futures + final String deepLinkPath = deepLink.path.replaceFirst("/", ""); + Navigator.pushNamed(context, deepLinkPath); + } + } + @override Widget build(BuildContext context) { menuBloc = BlocProvider.of(context); - tutorialBloc = BlocProvider.of(context); + //tutorialBloc = BlocProvider.of(context); setContext(context); double cWidth = MediaQuery.of(context).size.width; double cHeight = MediaQuery.of(context).size.height; @@ -181,6 +210,10 @@ class _MenuPageWidgetState extends State with Trans, Logging { }); } + _columnChildren.add(SizedBox( + height: 50, + )); + SliverList sliverList = SliverList( delegate: SliverChildListDelegate(_columnChildren), ); @@ -292,7 +325,7 @@ class _MenuPageWidgetState extends State with Trans, Logging { } }, ), - Cache().myTrainingPlan != null + /* Cache().myTrainingPlan != null ? GestureDetector( onTap: () => showDialog( context: context, @@ -326,7 +359,7 @@ class _MenuPageWidgetState extends State with Trans, Logging { ), ); })) - : Offstage(), + : Offstage(), */ /* activeExercisePlan ? SizedBox( width: 10, @@ -376,24 +409,59 @@ class _MenuPageWidgetState extends State with Trans, Logging { } void menuClick(WorkoutMenuTree workoutTree, MenuBloc menuBloc) { - if (tutorialBloc.isActive) { + /* if (tutorialBloc.isActive) { final String checkText = workoutTree.nameEnglish; if (!tutorialBloc.checkAction(checkText)) { return; } - } + } */ + print("ability: ${menuBloc.ability} tree: $workoutTree parent: ${workoutTree.parent}"); + if (workoutTree.child == false) { if (menuBloc.ability != null && ExerciseAbility.mini_test_set.equalsTo(menuBloc.ability!) && workoutTree.parent != 0) { HashMap args = HashMap(); args['templateName'] = workoutTree.nameEnglish; args['templateNameTranslation'] = workoutTree.name; Navigator.of(context).pushNamed('testSetEdit', arguments: args); + menuBloc.add(MenuTreeDown(item: workoutTree, parent: workoutTree.id)); } else if (menuBloc.ability != null && ExerciseAbility.training.equalsTo(menuBloc.ability!) && workoutTree.parent != 0) { HashMap args = HashMap(); args['parentName'] = workoutTree.internalName; Navigator.of(context).pushNamed("myTrainingPlanActivate", arguments: args); + menuBloc.add(MenuTreeDown(item: workoutTree, parent: workoutTree.id)); + } else if (workoutTree.internalName == "training_execute") { + /* Cache().myTrainingPlan = null; + Cache().deleteMyTrainingPlan(); */ + if (Cache().myTrainingPlan != null) { + final TrainingPlanBloc bloc = BlocProvider.of(context); + bloc.setMyPlan(Cache().myTrainingPlan); + Navigator.of(context).pushNamed("myTrainingPlanExecute"); + } else { + showDialog( + context: context, + builder: (BuildContext context) { + return DialogCommon( + title: t("No selected Training Plan"), + descriptions: t("Based on your initial data, we will generate the personalized training plan for you."), + text: "OK", + onTap: () { + TrainingPlanRepository trainingPlanRepository = TrainingPlanRepository(); + trainingPlanRepository.generateTrainingPlan(); + final TrainingPlanBloc bloc = BlocProvider.of(context); + bloc.setMyPlan(Cache().myTrainingPlan); + Future.delayed(Duration(milliseconds: 1000), () async { + Navigator.of(context).pushNamed("myTrainingPlanExecute"); + }); + }, + onCancel: () => { + Navigator.of(context).pop(), + }, + ); + }); + } + } else { + menuBloc.add(MenuTreeDown(item: workoutTree, parent: workoutTree.id)); } - menuBloc.add(MenuTreeDown(item: workoutTree, parent: workoutTree.id)); } else { menuBloc.add(MenuClickExercise(exerciseTypeId: workoutTree.id)); diff --git a/lib/widgets/number_picker.dart b/lib/widgets/number_picker.dart index ce0ec8a..3a2b26f 100644 --- a/lib/widgets/number_picker.dart +++ b/lib/widgets/number_picker.dart @@ -11,6 +11,9 @@ class NumberPickerWidget extends StatefulWidget { final String unit; final Color color; double? fontSize; + double? diameterRatio; + double? itemExtent; + FontWeight? fontWeight; NumberPickerWidget( {Key? key, @@ -19,10 +22,16 @@ class NumberPickerWidget extends StatefulWidget { required this.initalValue, required this.unit, this.fontSize, + this.diameterRatio, + this.itemExtent, + this.fontWeight, required this.color, required this.onChange}) : super(key: key) { fontSize = fontSize ?? 20; + diameterRatio = diameterRatio ?? 0.85; + itemExtent = itemExtent ?? 30; + fontWeight = fontWeight ?? FontWeight.normal; } @override _NumberPickerWidgetState createState() => _NumberPickerWidgetState(); @@ -59,7 +68,7 @@ class _NumberPickerWidgetState extends State with Trans { scrollController: _scrollController, useMagnifier: true, magnification: 1.2, - diameterRatio: 0.85, + diameterRatio: widget.diameterRatio!, backgroundColor: Colors.transparent, selectionOverlay: Container(), onSelectedItemChanged: (x) { @@ -72,8 +81,10 @@ class _NumberPickerWidgetState extends State with Trans { widget.onChange(value); }, children: List.generate( - widget.maxValue, (index) => Text('$index ' + widget.unit, style: TextStyle(color: widget.color, fontSize: widget.fontSize))), - itemExtent: 30, + widget.maxValue, + (index) => Text('$index ' + widget.unit, + style: TextStyle(color: widget.color, fontSize: widget.fontSize, fontWeight: widget.fontWeight))), + itemExtent: widget.itemExtent!, ); } diff --git a/pubspec.lock b/pubspec.lock index 401fb23..84233de 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -43,13 +43,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.6.1" - awesome_notifications: - dependency: "direct main" - description: - name: awesome_notifications - url: "https://pub.dartlang.org" - source: hosted - version: "0.0.6+9" badges: dependency: "direct main" description: @@ -70,7 +63,7 @@ packages: name: bloc_test url: "https://pub.dartlang.org" source: hosted - version: "8.0.0" + version: "8.1.0" boolean_selector: dependency: transitive description: @@ -294,7 +287,7 @@ packages: name: equatable url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.3" extended_tabs: dependency: "direct main" description: @@ -343,7 +336,7 @@ packages: name: firebase_analytics url: "https://pub.dartlang.org" source: hosted - version: "8.1.0" + version: "8.3.0" firebase_analytics_platform_interface: dependency: transitive description: @@ -364,28 +357,28 @@ packages: name: firebase_auth url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "3.0.2" firebase_auth_platform_interface: dependency: transitive description: name: firebase_auth_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.2.3" + version: "6.0.1" firebase_auth_web: dependency: transitive description: name: firebase_auth_web url: "https://pub.dartlang.org" source: hosted - version: "1.1.3" + version: "3.0.1" firebase_core: dependency: "direct main" description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.5.0" firebase_core_platform_interface: dependency: transitive description: @@ -400,41 +393,55 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.0" + firebase_dynamic_links: + dependency: "direct main" + description: + name: firebase_dynamic_links + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" + firebase_in_app_messaging: + dependency: "direct main" + description: + name: firebase_in_app_messaging + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.0+8" firebase_messaging: dependency: "direct main" description: name: firebase_messaging url: "https://pub.dartlang.org" source: hosted - version: "10.0.0" + version: "10.0.5" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.4" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.4" firebase_remote_config: dependency: "direct main" description: name: firebase_remote_config url: "https://pub.dartlang.org" source: hosted - version: "0.10.0" + version: "0.10.0+4" firebase_remote_config_platform_interface: dependency: transitive description: name: firebase_remote_config_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "0.3.0" + version: "0.3.0+4" fixnum: dependency: transitive description: @@ -474,28 +481,28 @@ packages: name: flutter_bloc url: "https://pub.dartlang.org" source: hosted - version: "7.0.0" + version: "7.1.0" flutter_facebook_auth: dependency: "direct main" description: name: flutter_facebook_auth url: "https://pub.dartlang.org" source: hosted - version: "3.4.0" + version: "3.5.1" flutter_facebook_auth_platform_interface: dependency: transitive description: name: flutter_facebook_auth_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.6.0" + version: "2.7.0" flutter_facebook_auth_web: dependency: transitive description: name: flutter_facebook_auth_web url: "https://pub.dartlang.org" source: hosted - version: "2.6.0" + version: "2.6.0+2" flutter_fadein: dependency: "direct main" description: @@ -561,7 +568,7 @@ packages: name: flutter_uxcam url: "https://pub.dartlang.org" source: hosted - version: "2.0.0-beta.1" + version: "2.0.0" flutter_web_plugins: dependency: transitive description: flutter @@ -1285,7 +1292,7 @@ packages: name: upgrader url: "https://pub.dartlang.org" source: hosted - version: "3.3.0" + version: "3.5.1" url_launcher: dependency: transitive description: @@ -1477,4 +1484,4 @@ packages: version: "3.1.0" sdks: dart: ">=2.12.0 <3.0.0" - flutter: ">=2.0.4" + flutter: ">=2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 207f768..0594500 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.1.21+92 +version: 1.1.22+93 environment: sdk: ">=2.12.0 <3.0.0" @@ -28,8 +28,8 @@ dependencies: google_fonts: ^2.1.0 devicelocale: ^0.4.1 sentry_flutter: ^5.1.0-beta.1 - flutter_bloc: ^7.0.0 - equatable: ^2.0.2 + flutter_bloc: ^7.1.0 + equatable: ^2.0.3 spider_chart: ^0.1.5 rainbow_color: ^2.0.1 @@ -49,33 +49,34 @@ dependencies: purchases_flutter: ^3.2.2 package_info: ^2.0.0 ezanimation: ^0.5.0 - flutter_fadein: ^2.0.0 confetti: ^0.6.0-nullsafety crypto: ^3.0.0 carousel_slider: ^4.0.0-nullsafety.0 convex_bottom_bar: ^3.0.0 flutter_app_badger: ^1.2.0 extended_tabs: ^2.2.0 - upgrader: ^3.3.0 + upgrader: ^3.5.1 web_browser: ^0.5.0 - - firebase_core: ^1.2.0 + flutter_fadein: ^2.0.0 + + firebase_core: ^1.5.0 firebase_analytics: ^8.1.0 firebase_messaging: ^10.0.0 - firebase_auth: ^1.2.0 - firebase_remote_config: ^0.10.0 - awesome_notifications: ^0.0.6+9 + firebase_auth: ^3.0.2 + firebase_remote_config: ^0.10.0+4 + firebase_dynamic_links: ^2.0.8 + firebase_in_app_messaging: ^0.5.0+8 syncfusion_flutter_gauges: ^19.1.63 syncfusion_flutter_datagrid: ^19.1.63 - flutter_facebook_auth: ^3.4.0 + flutter_facebook_auth: ^3.5.1 google_sign_in: ^5.0.3 sign_in_with_apple: ^3.0.0 #smartlook: ^1.0.7 flurry_data: ^0.0.1 - flutter_uxcam: ^2.0.0-beta.1 + flutter_uxcam: ^2.0.0 animated_widgets: ^1.0.6 @@ -94,7 +95,7 @@ dev_dependencies: test: '>=1.0.0 <2.0.0' flutter_test: sdk: flutter - bloc_test: ^8.0.0 + bloc_test: ^8.1.0 build_runner: @@ -154,6 +155,7 @@ flutter: - asset/image/WT_Results_for_men.jpg - asset/image/WT_results_background.jpg - asset/image/WT_cup_victory400.png + - asset/image/WT_zold.jpg - asset/image/button_fb.png - asset/image/button_apple.png @@ -179,6 +181,7 @@ flutter: - asset/image/gain_strength.jpg - asset/image/muscle_endurance.jpg - asset/image/shape_forming.jpg + - asset/image/woman_sizes.png - asset/image/weight_loss.jpg - asset/image/merleg.png @@ -368,6 +371,7 @@ flutter: - asset/menu/situps.jpg - asset/menu/sizes.jpg - asset/menu/smith_machine_chest_press.jpg + - asset/menu/smith_machine_squats.jpg - asset/menu/squats_with_kettlebell.jpg - asset/menu/squat_jump_weight.jpg - asset/menu/squat_jump.jpg @@ -403,6 +407,7 @@ flutter: - asset/menu/training_plans_q_beginner.jpg - asset/menu/training_plans_q_advanced.jpg - asset/menu/training_plans_q_gain_strength.jpg + - asset/menu/training_start.jpg - asset/menu/triceps_extension_on_cable_with_rope.jpg - asset/menu/triceps_kickback.jpg - asset/menu/triceps_pushdown.jpg