diff --git a/ios/Podfile.lock b/ios/Podfile.lock index d0c6822..5395b86 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -136,10 +136,6 @@ PODS: - FirebaseInstallations (~> 8.0) - GoogleUtilities/Environment (~> 7.4) - "GoogleUtilities/NSData+zlib (~> 7.4)" - - Flurry-iOS-SDK/FlurrySDK (11.3.0) - - flurry_data (0.0.1): - - Flurry-iOS-SDK/FlurrySDK - - Flutter - Flutter (1.0.0) - flutter_app_badger (0.0.1): - Flutter @@ -262,7 +258,6 @@ DEPENDENCIES: - 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`) - Flutter (from `Flutter`) - flutter_app_badger (from `.symlinks/plugins/flutter_app_badger/ios`) - flutter_facebook_auth (from `.symlinks/plugins/flutter_facebook_auth/ios`) @@ -303,7 +298,6 @@ SPEC REPOS: - FirebaseInstallations - FirebaseMessaging - FirebaseRemoteConfig - - Flurry-iOS-SDK - FMDB - GoogleAppMeasurement - GoogleDataTransport @@ -338,8 +332,6 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/firebase_messaging/ios" firebase_remote_config: :path: ".symlinks/plugins/firebase_remote_config/ios" - flurry_data: - :path: ".symlinks/plugins/flurry_data/ios" Flutter: :path: Flutter flutter_app_badger: @@ -409,9 +401,7 @@ SPEC CHECKSUMS: FirebaseInstallations: 2563cb18a723ef9c6ef18318a49519b75dce613c FirebaseMessaging: 93227dd71d7888e200baef65043f81acb2b6596e FirebaseRemoteConfig: 34300dd83055c06e2768d0932dd8fb2c1575745f - Flurry-iOS-SDK: 494e340b623f1413711603dc0184f1fd4183e0d3 - flurry_data: 49b7066a283aa41f4306974c1f2d74c61231ad74 - Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c + Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a flutter_app_badger: 65de4d6f0c34a891df49e6cfb8a1c0496426fa68 flutter_facebook_auth: 870a465b1afff3ace7a592bd44665d921991726c flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 2bc8233..3142358 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -22,13 +22,13 @@ /* Begin PBXCopyFilesBuildPhase section */ 9705A1C41CF9048500538489 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; + buildActionMask = 8; dstPath = ""; dstSubfolderSpec = 10; files = ( ); name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; + runOnlyForDeploymentPostprocessing = 1; }; /* End PBXCopyFilesBuildPhase section */ @@ -388,7 +388,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 5; DEVELOPMENT_TEAM = SFJJBDCU6Z; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -531,7 +531,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 5; DEVELOPMENT_TEAM = SFJJBDCU6Z; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -566,7 +566,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 5; DEVELOPMENT_TEAM = SFJJBDCU6Z; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 7d0290a..fdd86ea 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -74,7 +74,6 @@ UIBackgroundModes - audio fetch remote-notification diff --git a/lib/bloc/training_evaluation/training_evaluation_bloc.dart b/lib/bloc/training_evaluation/training_evaluation_bloc.dart index e3a14e4..d5fe225 100644 --- a/lib/bloc/training_evaluation/training_evaluation_bloc.dart +++ b/lib/bloc/training_evaluation/training_evaluation_bloc.dart @@ -1,5 +1,5 @@ import 'dart:async'; - +import 'package:intl/intl.dart'; import 'package:aitrainer_app/bloc/training_plan/training_plan_bloc.dart'; import 'package:aitrainer_app/model/cache.dart'; import 'package:aitrainer_app/model/customer_training_plan_details.dart'; @@ -22,6 +22,7 @@ class TrainingEvaluationBloc extends Bloc evaluationList = []; @@ -32,13 +33,14 @@ class TrainingEvaluationBloc extends Bloc 5) { yield TrainingEvaluationReady(); } else { @@ -58,15 +60,11 @@ class TrainingEvaluationBloc extends Bloc { CustomerTrainingPlan? _myPlan; CustomerTrainingPlanDetails? _myDetail; + CustomerTrainingPlanDetails? _backupDetail; TrainingPlan? _myTrainingPlan; final List trainingPlanDayNames = []; @@ -75,6 +76,7 @@ class TrainingPlanBloc extends Bloc { yield TrainingPlanFinished(); } else if (event is TrainingPlanWeightChange) { yield TrainingPlanExerciseLoading(); + print("New weight: ${event.weight}"); event.detail.weight = event.weight; yield TrainingPlanExerciseReady(); @@ -108,10 +110,19 @@ class TrainingPlanBloc extends Bloc { } else if (event is TrainingPlanWeightChangeRecalculate) { yield TrainingPlanExerciseLoading(); - print("Base1RM ${event.detail.base1RM}"); - if (event.detail.base1RM > 0) { + if (event.detail.baseOneRepMax > 0) { + if (_myTrainingPlan == null) { + setTrainingPlanFromCache(); + } + final int originalRepeats = trainingPlanRepository.getOriginalRepeats(_myTrainingPlan!.trainingPlanId, event.detail); event.detail.repeats = - Common.calculateQuantityByChangedWeight(event.detail.base1RM, event.weight, event.detail.repeats!.toDouble()); + Common.calculateQuantityByChangedWeight(event.detail.baseOneRepMax, event.weight, originalRepeats.toDouble()); + + print("Base1RM ${event.detail.baseOneRepMax} repeats: ${event.detail.repeats}"); + if (event.detail.repeats! < 1) { + event.detail.repeats = 1; + event.detail.weight = trainingPlanRepository.getOriginalWeight(_myTrainingPlan!.trainingPlanId, event.detail); + } ExerciseSaveStream().repeats = event.detail.repeats!; ExerciseSaveStream().getStreamController().add(true); } @@ -136,7 +147,7 @@ class TrainingPlanBloc extends Bloc { yield TrainingPlanReady(); throw Exception("Please type your repeats!"); } - print("ExerciseTypeUID: ${event.detail.exerciseTypeId}"); + print("SAVE for ExerciseTypeID: ${event.detail.exerciseTypeId} weight: ${event.detail.weight}"); if (event.detail.weight == -3) { print("DropSet"); event.detail.state = ExercisePlanDetailState.finished; @@ -152,8 +163,6 @@ class TrainingPlanBloc extends Bloc { event.detail.exercises.add(exercise); 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) { @@ -165,23 +174,23 @@ class TrainingPlanBloc extends Bloc { nextDetail.customerTrainingPlanDetailsId != event.detail.customerTrainingPlanDetailsId) { print("recalculating -2 ${event.detail.customerTrainingPlanDetailsId}"); trainingPlanRepository.recalculateDetail(_myPlan!.trainingPlanId!, event.detail, nextDetail); - nextDetail.base1RM = Common.calculate1RM(nextDetail.weight!, nextDetail.repeats!.toDouble()); + nextDetail.baseOneRepMax = Common.calculate1RM(nextDetail.weight!, nextDetail.repeats!.toDouble()); } else if (nextDetail.exerciseTypeId == event.detail.exerciseTypeId && weightFromPlan == -1 && nextDetail.set! > 1) { print("recalculating -1 ${event.detail.customerTrainingPlanDetailsId}"); nextDetail = trainingPlanRepository.recalculateDetailFixRepeats(_myPlan!.trainingPlanId!, nextDetail); - nextDetail.base1RM = Common.calculate1RM(nextDetail.weight!, nextDetail.repeats!.toDouble()); + nextDetail.baseOneRepMax = Common.calculate1RM(nextDetail.weight!, nextDetail.repeats!.toDouble()); } else if (nextDetail.exerciseTypeId == event.detail.exerciseTypeId && nextDetail.weight == -1 && nextDetail.set! == 1) { print("recalculating -1, set 1 ${event.detail.customerTrainingPlanDetailsId}"); nextDetail = trainingPlanRepository.recalculateDetailFixRepeatsSet1(_myPlan!.trainingPlanId!, nextDetail, event.detail); - nextDetail.base1RM = Common.calculate1RM(nextDetail.weight!, nextDetail.repeats!.toDouble()); - } else if (nextDetail.exerciseTypeId == event.detail.exerciseTypeId && + nextDetail.baseOneRepMax = Common.calculate1RM(nextDetail.weight!, nextDetail.repeats!.toDouble()); + } /* else if (nextDetail.exerciseTypeId == event.detail.exerciseTypeId && weightFromPlan == -2 && nextDetail.set! == 1 && nextDetail.exercises.length == 0) { print("recalculating -1/ no exercise, set 1 ${event.detail.customerTrainingPlanDetailsId}"); nextDetail = trainingPlanRepository.recalculateDetailFixRepeatsSet1(_myPlan!.trainingPlanId!, nextDetail, event.detail); - nextDetail.base1RM = Common.calculate1RM(nextDetail.weight!, nextDetail.repeats!.toDouble()); - } + nextDetail.baseOneRepMax = Common.calculate1RM(nextDetail.weight!, nextDetail.repeats!.toDouble()); + }*/ } } @@ -288,12 +297,42 @@ class TrainingPlanBloc extends Bloc { } Track().track(TrackingEvent.training_plan_custom, eventValue: event.exerciseType.name); yield TrainingPlanReady(); + } else if (event is TrainingPlanChangeCancel) { + yield TrainingPlanLoading(); + print("Backup $_backupDetail"); + if (_backupDetail != null) { + event.detail.repeats = _backupDetail!.repeats; + event.detail.weight = _backupDetail!.weight; + } + yield TrainingPlanReady(); + } else if (event is TrainingPlanFinishDropset) { + yield TrainingPlanLoading(); + event.detail.state = ExercisePlanDetailState.finished; + yield TrainingPlanReady(); } } on Exception catch (e) { yield TrainingPlanError(message: e.toString()); } } + void backupDetail(CustomerTrainingPlanDetails detail) { + if (_backupDetail == null) { + _backupDetail = CustomerTrainingPlanDetails(); + } + _backupDetail!.copy(detail); + } + + void setTrainingPlanFromCache() { + if (_myPlan == null) { + setMyPlan(Cache().myTrainingPlan); + } + Cache().getTrainingPlans()!.forEach((element) { + if (_myPlan!.trainingPlanId == element.trainingPlanId) { + _myTrainingPlan = element; + } + }); + } + void addNewPlan() { if (Cache().userLoggedIn == null) { throw Exception("Please log in"); @@ -603,7 +642,7 @@ class TrainingPlanBloc extends Bloc { final String day = dayNames[this.activeDayIndex]; CustomerTrainingPlanDetails? prev; for (var detail in _myPlan!.days[day]!) { - //print("Offset detail $detail"); + print("Offset detail $detail"); if (detail.state == ExercisePlanDetailState.inProgress || detail.state == ExercisePlanDetailState.start) { prev = detail; break; @@ -618,7 +657,7 @@ class TrainingPlanBloc extends Bloc { } int index = indexInStart > indexInProgress ? indexInStart : indexInProgress; offset = (index) * 300; - //print("Offset: $offset day: $day ($indexInStart, $indexInProgress)"); + print("Offset: $offset day: $day ($indexInStart, $indexInProgress)"); return offset; } @@ -770,10 +809,16 @@ class TrainingPlanBloc extends Bloc { bool isAllDetailsSameExerciseFinished(CustomerTrainingPlanDetails detail) { bool allFinished = true; List list = getAllDetailsSameExercise(detail); + //print("SAME count: ${list.length}"); for (var listDetail in list) { + //print("SAME $listDetail"); + if (listDetail.exercises.length >= listDetail.set!) { + listDetail.state = ExercisePlanDetailState.finished; + } allFinished = allFinished && (listDetail.exercises.length >= listDetail.set! || listDetail.state.equalsTo(ExercisePlanDetailState.skipped)); } + print("All finished: $allFinished for ${detail.exerciseTypeId}"); return allFinished; } } diff --git a/lib/bloc/training_plan/training_plan_event.dart b/lib/bloc/training_plan/training_plan_event.dart index f91b357..6971190 100644 --- a/lib/bloc/training_plan/training_plan_event.dart +++ b/lib/bloc/training_plan/training_plan_event.dart @@ -111,6 +111,14 @@ class TrainingPlanAddExerciseType extends TrainingPlanEvent { const TrainingPlanAddExerciseType(); } +class TrainingPlanChangeCancel extends TrainingPlanEvent { + final CustomerTrainingPlanDetails detail; + const TrainingPlanChangeCancel({required this.detail}); + + @override + List get props => [detail]; +} + class TrainingPlanDeleteExerciseType extends TrainingPlanEvent { final ExerciseType exerciseType; const TrainingPlanDeleteExerciseType({required this.exerciseType}); @@ -126,3 +134,11 @@ class TrainingPlanCustomAddLoad extends TrainingPlanEvent { @override List get props => [exerciseType]; } + +class TrainingPlanFinishDropset extends TrainingPlanEvent { + final CustomerTrainingPlanDetails detail; + const TrainingPlanFinishDropset({required this.detail}); + + @override + List get props => [detail]; +} diff --git a/lib/main.dart b/lib/main.dart index bac80f7..0343f2f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -46,7 +46,7 @@ import 'package:aitrainer_app/widgets/home.dart'; import 'package:aitrainer_app/library/facebook_app_events/facebook_app_events.dart'; import 'package:firebase_analytics/firebase_analytics.dart'; import 'package:firebase_analytics/observer.dart'; -import 'package:flurry_data/flurry_data.dart'; +//import 'package:flurry_data/flurry_data.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; @@ -148,14 +148,10 @@ Future main() async { if (!isInDebugMode) { FlutterUxcam.startWithKey("wvdstyoml4tiwfd"); - SetupOptions options = ( - new SetupOptionsBuilder('682883e5cd71a46160c4f6ed070530ee593f49c6') - ).build(); + SetupOptions options = (new SetupOptionsBuilder('682883e5cd71a46160c4f6ed070530ee593f49c6')).build(); Smartlook.setupAndStartRecording(options); } - - print(" -- FireBase init.."); runApp(MultiBlocProvider( @@ -203,7 +199,7 @@ Future main() async { Future initThirdParty() async { if (!isInDebugMode) { - await FlurryData.initialize(androidKey: "JNYCTCWBT34FM3J8TV36", iosKey: "3QBG7BSMGPDH24S8TRQP", enableLog: true); + //await FlurryData.initialize(androidKey: "JNYCTCWBT34FM3J8TV36", iosKey: "3QBG7BSMGPDH24S8TRQP", enableLog: true); FlutterUxcam.optIntoSchematicRecordings(); } await FirebaseApi().initializeFlutterFire(); diff --git a/lib/model/cache.dart b/lib/model/cache.dart index 66e8dff..b3aab14 100644 --- a/lib/model/cache.dart +++ b/lib/model/cache.dart @@ -31,7 +31,7 @@ import 'package:aitrainer_app/util/enums.dart'; import 'package:aitrainer_app/util/env.dart'; import 'package:aitrainer_app/util/track.dart'; import 'package:firebase_remote_config/firebase_remote_config.dart'; -import 'package:flurry_data/flurry_data.dart'; +//import 'package:flurry_data/flurry_data.dart'; import 'package:flutter_facebook_auth/flutter_facebook_auth.dart'; import 'package:flutter_uxcam/flutter_uxcam.dart'; import 'package:package_info/package_info.dart'; @@ -689,7 +689,7 @@ class Cache with Logging { await PackageApi().getCustomerPackage(customerId); if (!isInDebugMode) { - FlurryData.setUserId(customerId.toString()); + //FlurryData.setUserId(customerId.toString()); FlutterUxcam.setUserProperty("username", customerId.toString()); FlutterUxcam.setUserIdentity(customerId.toString()); Smartlook.setUserIdentifier(customerId.toString()); diff --git a/lib/model/customer_training_plan.dart b/lib/model/customer_training_plan.dart index 835a071..c433921 100644 --- a/lib/model/customer_training_plan.dart +++ b/lib/model/customer_training_plan.dart @@ -1,5 +1,6 @@ import 'dart:collection'; import 'dart:convert'; +import 'package:aitrainer_app/util/common.dart'; import 'package:intl/intl.dart'; import 'package:aitrainer_app/model/customer_training_plan_details.dart'; @@ -61,6 +62,9 @@ class CustomerTrainingPlan { Iterable iterable = jsonDecode(jsonDetails); this.details = iterable.map((detail) => CustomerTrainingPlanDetails.fromJsonWithExerciseList(detail)).toList(); + this.details.forEach((detail) { + detail.alternatives = Common.getExerciseTypeAlternatives(detail.exerciseTypeId); + }); } on Exception catch (e) { print("JsonDecode error " + e.toString()); } diff --git a/lib/model/customer_training_plan_details.dart b/lib/model/customer_training_plan_details.dart index f73e64b..0e75e9c 100644 --- a/lib/model/customer_training_plan_details.dart +++ b/lib/model/customer_training_plan_details.dart @@ -38,7 +38,9 @@ class CustomerTrainingPlanDetails { bool isTest = false; - double base1RM = -1; + double baseOneRepMax = -1; + + List alternatives = []; CustomerTrainingPlanDetails(); @@ -92,7 +94,7 @@ class CustomerTrainingPlanDetails { this.exerciseType = Cache().getExerciseTypeById(exerciseTypeId!); - this.base1RM = json['base1RM']; + this.baseOneRepMax = json['baseOneRepMax']; } ExerciseType? getExerciseType() => exerciseType; @@ -122,7 +124,7 @@ class CustomerTrainingPlanDetails { 'state': this.state.toStr(), "isTest": this.isTest, "dayId": this.dayId, - "base1RM": this.base1RM, + "baseOneRepMax": this.baseOneRepMax, }; //print("Detail toJson $jsonMap"); @@ -147,5 +149,6 @@ class CustomerTrainingPlanDetails { this.isTest = from.isTest; this.day = from.day; this.dayId = from.dayId; + this.baseOneRepMax = from.baseOneRepMax; } } diff --git a/lib/model/training_evaluation_exercise.dart b/lib/model/training_evaluation_exercise.dart index b09eae6..daf51c4 100644 --- a/lib/model/training_evaluation_exercise.dart +++ b/lib/model/training_evaluation_exercise.dart @@ -19,8 +19,8 @@ class TrainingEvaluationExercise { int? repeats; int? maxRepeats; - int? totalLift; - int? maxTotalLift; + double? totalLift; + double? maxTotalLift; double? oneRepMax; double? max1RM; diff --git a/lib/repository/training_plan_repository.dart b/lib/repository/training_plan_repository.dart index a6aa7cf..5da6138 100644 --- a/lib/repository/training_plan_repository.dart +++ b/lib/repository/training_plan_repository.dart @@ -99,12 +99,13 @@ class TrainingPlanRepository { } else { detail.weight = elem.weight; } - //print("Detail $detail exerciseType: ${detail.exerciseType}"); + print("Detail $detail exerciseType: ${detail.exerciseType!.exerciseTypeId}"); detail.state = ExercisePlanDetailState.start; if (detail.weight != null && detail.weight! > 0) { - detail.base1RM = Common.calculate1RM(detail.weight!, detail.repeats!.toDouble()); + detail.baseOneRepMax = Common.calculate1RM(detail.weight!, detail.repeats!.toDouble()); } + detail.alternatives = Common.getExerciseTypeAlternatives(detail.exerciseTypeId); plan.details.add(detail); }); diff --git a/lib/repository/workout_tree_repository.dart b/lib/repository/workout_tree_repository.dart index d7e43b7..365f9c6 100644 --- a/lib/repository/workout_tree_repository.dart +++ b/lib/repository/workout_tree_repository.dart @@ -7,6 +7,7 @@ import 'package:aitrainer_app/model/exercise_type.dart'; import 'package:aitrainer_app/model/workout_menu_tree.dart'; import 'package:aitrainer_app/repository/exercise_repository.dart'; import 'package:aitrainer_app/service/logging.dart'; +import 'package:aitrainer_app/util/common.dart'; import 'package:flutter/material.dart'; enum Antagonist { chest, biceps, triceps, back, shoulders, core, thigh, calf } @@ -265,24 +266,7 @@ class WorkoutTreeRepository with Logging { } List getExerciseTypeAlternatives(int? exerciseTypeId) { - if (exerciseTypeId == null || exerciseTypeId <= 0) { - return []; - } - List list = []; - List? exerciseTypes = Cache().getExerciseTypes(); - if (exerciseTypes != null) { - exerciseTypes.forEach((exerciseType) { - if (exerciseType.alternatives.isNotEmpty) { - exerciseType.alternatives.forEach((childId) { - if (childId == exerciseTypeId) { - list.add(exerciseType); - } - }); - } - }); - } - - return list; + return Common.getExerciseTypeAlternatives(exerciseTypeId); } String getAntagonistSort(String type) { diff --git a/lib/util/common.dart b/lib/util/common.dart index 459729b..24022e0 100644 --- a/lib/util/common.dart +++ b/lib/util/common.dart @@ -225,4 +225,25 @@ mixin Common { "Initial 1RM: $initialRM repeat: $repeat changedRepeat: $changedRepeats Weight: $weight weightWendler: $weightWendler weight Oconner: $weightOconner. NEW WEIGHT: $newWeight"); return newWeight; } + + static List getExerciseTypeAlternatives(int? exerciseTypeId) { + if (exerciseTypeId == null || exerciseTypeId <= 0) { + return []; + } + List list = []; + List? exerciseTypes = Cache().getExerciseTypes(); + if (exerciseTypes != null) { + exerciseTypes.forEach((exerciseType) { + if (exerciseType.alternatives.isNotEmpty) { + exerciseType.alternatives.forEach((childId) { + if (childId == exerciseTypeId) { + list.add(exerciseType); + } + }); + } + }); + } + + return list; + } } diff --git a/lib/util/track.dart b/lib/util/track.dart index 7a7d449..1174638 100644 --- a/lib/util/track.dart +++ b/lib/util/track.dart @@ -6,7 +6,7 @@ import 'package:aitrainer_app/util/enums.dart'; import 'package:aitrainer_app/model/tracking.dart' as model; import 'package:firebase_analytics/firebase_analytics.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:flurry_data/flurry_data.dart'; +//import 'package:flurry_data/flurry_data.dart'; import 'package:flutter_uxcam/flutter_uxcam.dart'; import 'package:smartlook/smartlook.dart'; @@ -22,7 +22,7 @@ class Track with Logging { void track(TrackingEvent event, {String eventValue = ""}) { if (!isInDebugMode) { - FlurryData.logEvent(event.enumToString()); + //FlurryData.logEvent(event.enumToString()); Smartlook.setGlobalEventProperty(event.toString(), eventValue, false); FlutterUxcam.logEventWithProperties(event.enumToString(), {"value": eventValue}); model.Tracking tracking = model.Tracking(); diff --git a/lib/view/customer_height_page.dart b/lib/view/customer_height_page.dart index afba844..4de4076 100644 --- a/lib/view/customer_height_page.dart +++ b/lib/view/customer_height_page.dart @@ -166,7 +166,7 @@ class _CustomerHeightPageState extends State with Trans { width: 55, color: Color(0xffb4f500), value: changeBloc.height, - onValueChanged: (value) => { + onChanged: (value) => { changeBloc.add(CustomerHeightChange(height: value.toInt())), }, ), diff --git a/lib/view/customer_modify_page.dart b/lib/view/customer_modify_page.dart index 5ce0475..1414958 100644 --- a/lib/view/customer_modify_page.dart +++ b/lib/view/customer_modify_page.dart @@ -251,7 +251,7 @@ class CustomerModifyPage extends StatelessWidget with Trans { color: Colors.blue, height: 55, width: 25, - onValueChanged: (value) => { + onChanged: (value) => { customerBloc.add(CustomerBirthYearChange(year: value.toInt())), }, ), @@ -353,7 +353,7 @@ class CustomerModifyPage extends StatelessWidget with Trans { width: 55, color: Colors.blue, value: customerBloc.height, - onValueChanged: (value) => { + onChanged: (value) => { customerBloc.add(CustomerHeightChange(height: value.toInt())), }, ), diff --git a/lib/view/training_evaluation_page.dart b/lib/view/training_evaluation_page.dart index 322ffda..b5d6f97 100644 --- a/lib/view/training_evaluation_page.dart +++ b/lib/view/training_evaluation_page.dart @@ -145,6 +145,10 @@ class TrainingEvaluationPage extends StatelessWidget with Trans { Divider(color: Colors.transparent), summaryRow("asset/image/pict_hypertrophy.png", "Maximum Repeats", "${bloc.maxRepeats}" + " " + t("reps")), Divider(color: Colors.transparent), + summaryRow("asset/image/pict_1rm.png", "Maximum Lift", "${bloc.maxTotalLift}" + " " + t("kg")), + Divider(color: Colors.transparent), + summaryRow("asset/image/pict_reps_volumen_db.png", "Total Repeats", "${bloc.totalRepeats}" + " " + t("reps")), + Divider(color: Colors.transparent), //summaryRow("asset/image/pict_reps_volumen_db.png", "Total Lift Ever", "100 kg"), //Divider(color: Colors.transparent), Text(t("Details"), diff --git a/lib/view/training_plan_execute.dart b/lib/view/training_plan_execute.dart index fb09cac..6714064 100644 --- a/lib/view/training_plan_execute.dart +++ b/lib/view/training_plan_execute.dart @@ -33,7 +33,9 @@ class _TrainingPlanExecuteState extends State with Trans { setContext(context); return Scaffold( - appBar: AppBarNav(depth: 0), + appBar: AppBarNav( + depth: 0, + ), body: Container( padding: EdgeInsets.all(0), decoration: BoxDecoration( @@ -335,6 +337,7 @@ class _ExerciseListState extends State with Trans { final HashMap args = HashMap(); args['exerciseType'] = next.exerciseType; args['customerTrainingPlanDetails'] = detail; + bloc.backupDetail(detail); Navigator.of(context).pushNamed('myTrainingPlanExercise', arguments: args); return; } diff --git a/lib/view/training_plan_exercise.dart b/lib/view/training_plan_exercise.dart index b9ea9fa..c9ba51b 100644 --- a/lib/view/training_plan_exercise.dart +++ b/lib/view/training_plan_exercise.dart @@ -24,7 +24,14 @@ class TrainingPlanExercise extends StatelessWidget with Trans { setContext(context); return Scaffold( - appBar: AppBarNav(depth: 1), + appBar: AppBarNav( + depth: 1, + onTap: () => { + print("back"), + bloc.add( + TrainingPlanChangeCancel(detail: detail), + ) + }), body: Container( height: double.infinity, width: double.infinity, @@ -72,7 +79,14 @@ class TrainingPlanExercise extends StatelessWidget with Trans { heroTag: "saveButton", onPressed: () => { Navigator.of(context).pop(), - bloc.add(TrainingPlanSaveExercise(detail: detail)), + if (detail.weight != -3) + { + bloc.add(TrainingPlanSaveExercise(detail: detail)), + } + else + { + bloc.add(TrainingPlanFinishDropset(detail: detail)), + } }, backgroundColor: Colors.orange[800], icon: Icon(CustomIcon.save), diff --git a/lib/widgets/app_bar.dart b/lib/widgets/app_bar.dart index b7b8f2d..d5073e3 100644 --- a/lib/widgets/app_bar.dart +++ b/lib/widgets/app_bar.dart @@ -19,7 +19,8 @@ class AppBarNav extends StatefulWidget implements PreferredSizeWidget { final MenuBloc? menuBloc; final bool? isMenu; final int? depth; - AppBarNav({this.menuBloc, this.isMenu, this.depth}); + final VoidCallback? onTap; + AppBarNav({this.menuBloc, this.isMenu, this.depth, this.onTap}); @override _AppBarNav createState() => _AppBarNav(); @@ -92,19 +93,24 @@ class _AppBarNav extends State with SingleTickerProviderStateMixin, C ), leading: IconButton( icon: Icon(Icons.arrow_back, color: Colors.white), - onPressed: () => { - timerBloc.add(TimerEnd(duration: 0)), - if (widget.isMenu != null) - { - if (menuBloc.workoutItem != null) - { - menuBloc.add(MenuTreeUp(parent: menuBloc.workoutItem!.parent)), - } + onPressed: () { + timerBloc.add(TimerEnd(duration: 0)); + print("tapping ${widget.onTap}"); + if (widget.onTap != null) { + print("tap"); + widget.onTap!(); + } + if (widget.isMenu != null) { + if (menuBloc.workoutItem != null) { + menuBloc.add(MenuTreeUp(parent: menuBloc.workoutItem!.parent)); } - else if (widget.depth != null) - { - if (widget.depth == 0) {Navigator.of(context).popAndPushNamed('home')} else {Navigator.of(context).pop()} + } else if (widget.depth != null) { + if (widget.depth == 0) { + Navigator.of(context).popAndPushNamed('home'); + } else { + Navigator.of(context).pop(); } + } }, )); } diff --git a/pubspec.lock b/pubspec.lock index 62b1cb4..ad89253 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,14 +7,14 @@ packages: name: _fe_analyzer_shared url: "https://pub.dartlang.org" source: hosted - version: "22.0.0" + version: "30.0.0" analyzer: dependency: transitive description: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "1.7.1" + version: "2.7.0" animated_widgets: dependency: "direct main" description: @@ -42,7 +42,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.6.1" + version: "2.8.1" badges: dependency: "direct main" description: @@ -147,7 +147,7 @@ packages: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.1" checked_yaml: dependency: transitive description: @@ -456,13 +456,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.36.1" - flurry_data: - dependency: "direct main" - description: - name: flurry_data - url: "https://pub.dartlang.org" - source: hosted - version: "0.0.2" flutter: dependency: "direct main" description: flutter @@ -734,7 +727,7 @@ packages: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.7.0" mime: dependency: transitive description: @@ -1222,7 +1215,7 @@ packages: name: syncfusion_flutter_core url: "https://pub.dartlang.org" source: hosted - version: "19.2.60" + version: "19.3.48" syncfusion_flutter_datagrid: dependency: "direct main" description: @@ -1243,7 +1236,7 @@ packages: name: syncfusion_flutter_gauges url: "https://pub.dartlang.org" source: hosted - version: "19.2.60" + version: "19.3.48" synchronized: dependency: transitive description: @@ -1264,21 +1257,21 @@ packages: name: test url: "https://pub.dartlang.org" source: hosted - version: "1.16.8" + version: "1.17.10" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.3.0" + version: "0.4.2" test_core: dependency: transitive description: name: test_core url: "https://pub.dartlang.org" source: hosted - version: "0.3.19" + version: "0.4.0" timeline_tile: dependency: "direct main" description: @@ -1532,5 +1525,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.12.0 <3.0.0" + dart: ">=2.14.0 <3.0.0" flutter: ">=2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 47623b3..761c53e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -28,7 +28,7 @@ dependencies: google_fonts: ^2.1.0 devicelocale: ^0.4.1 sentry_flutter: ^5.1.0-beta.1 - flutter_bloc: ^7.1.0 + flutter_bloc: ^7.3.0 equatable: ^2.0.3 spider_chart: ^0.1.5 @@ -69,7 +69,7 @@ dependencies: firebase_dynamic_links: ^2.0.8 firebase_in_app_messaging: ^0.5.0+8 - syncfusion_flutter_gauges: ^19.2.60 + syncfusion_flutter_gauges: ^19.3.48 syncfusion_flutter_datagrid: ^19.1.63 syncfusion_flutter_charts: ^19.2.60 syncfusion_flutter_calendar: ^19.2.60 @@ -79,7 +79,7 @@ dependencies: sign_in_with_apple: ^3.0.0 smartlook: ^2.0.1 - flurry_data: ^0.0.1 + #flurry_data: ^0.0.1 flutter_uxcam: ^2.0.1 animated_widgets: ^1.0.6