react-native-nitro-pose-exercises 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/NitroPoseExercises.podspec +32 -0
- package/README.md +538 -0
- package/android/CMakeLists.txt +31 -0
- package/android/build.gradle +121 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/cpp/cpp-adapter.cpp +11 -0
- package/android/src/main/java/com/margelo/nitro/nitroposeexercises/NitroPoseExercises.kt +535 -0
- package/android/src/main/java/com/margelo/nitro/nitroposeexercises/NitroPoseExercisesPackage.kt +22 -0
- package/ios/NitroPoseExercises.swift +527 -0
- package/lib/module/NitroPoseExercises.nitro.js +17 -0
- package/lib/module/NitroPoseExercises.nitro.js.map +1 -0
- package/lib/module/config/pushup.js +71 -0
- package/lib/module/config/pushup.js.map +1 -0
- package/lib/module/index.js +7 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/NitroPoseExercises.nitro.d.ts +97 -0
- package/lib/typescript/src/NitroPoseExercises.nitro.d.ts.map +1 -0
- package/lib/typescript/src/config/pushup.d.ts +3 -0
- package/lib/typescript/src/config/pushup.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +6 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/nitro.json +23 -0
- package/nitrogen/generated/android/c++/JAngleDefinition.hpp +69 -0
- package/nitrogen/generated/android/c++/JAngleSnapshot.hpp +61 -0
- package/nitrogen/generated/android/c++/JExerciseConfig.hpp +166 -0
- package/nitrogen/generated/android/c++/JExercisePhase.hpp +67 -0
- package/nitrogen/generated/android/c++/JExerciseType.hpp +61 -0
- package/nitrogen/generated/android/c++/JFormFeedback.hpp +67 -0
- package/nitrogen/generated/android/c++/JFormRule.hpp +79 -0
- package/nitrogen/generated/android/c++/JFormSeverity.hpp +61 -0
- package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_ExercisePhase.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_FormFeedback.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_HoldProgress.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_RepData.hpp +81 -0
- package/nitrogen/generated/android/c++/JFunc_void_SessionResult.hpp +85 -0
- package/nitrogen/generated/android/c++/JHoldProgress.hpp +65 -0
- package/nitrogen/generated/android/c++/JHybridNitroPoseExercisesSpec.cpp +311 -0
- package/nitrogen/generated/android/c++/JHybridNitroPoseExercisesSpec.hpp +87 -0
- package/nitrogen/generated/android/c++/JLandmark.hpp +69 -0
- package/nitrogen/generated/android/c++/JPhaseThreshold.hpp +71 -0
- package/nitrogen/generated/android/c++/JRepData.hpp +90 -0
- package/nitrogen/generated/android/c++/JSessionResult.hpp +120 -0
- package/nitrogen/generated/android/c++/JSessionStatus.hpp +67 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/AngleDefinition.kt +66 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/AngleSnapshot.kt +56 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/ExerciseConfig.kt +81 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/ExercisePhase.kt +26 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/ExerciseType.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/FormFeedback.kt +61 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/FormRule.kt +76 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/FormSeverity.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/Func_void.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/Func_void_ExercisePhase.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/Func_void_FormFeedback.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/Func_void_HoldProgress.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/Func_void_RepData.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/Func_void_SessionResult.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/HoldProgress.kt +61 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/HybridNitroPoseExercisesSpec.kt +196 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/Landmark.kt +66 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/PhaseThreshold.kt +66 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/RepData.kt +66 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/SessionResult.kt +76 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/SessionStatus.kt +26 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/nitroposeexercisesOnLoad.kt +35 -0
- package/nitrogen/generated/android/nitroposeexercises+autolinking.cmake +81 -0
- package/nitrogen/generated/android/nitroposeexercises+autolinking.gradle +27 -0
- package/nitrogen/generated/android/nitroposeexercisesOnLoad.cpp +66 -0
- package/nitrogen/generated/android/nitroposeexercisesOnLoad.hpp +34 -0
- package/nitrogen/generated/ios/NitroPoseExercises+autolinking.rb +62 -0
- package/nitrogen/generated/ios/NitroPoseExercises-Swift-Cxx-Bridge.cpp +100 -0
- package/nitrogen/generated/ios/NitroPoseExercises-Swift-Cxx-Bridge.hpp +449 -0
- package/nitrogen/generated/ios/NitroPoseExercises-Swift-Cxx-Umbrella.hpp +95 -0
- package/nitrogen/generated/ios/NitroPoseExercisesAutolinking.mm +33 -0
- package/nitrogen/generated/ios/NitroPoseExercisesAutolinking.swift +26 -0
- package/nitrogen/generated/ios/c++/HybridNitroPoseExercisesSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridNitroPoseExercisesSpecSwift.hpp +236 -0
- package/nitrogen/generated/ios/swift/AngleDefinition.swift +44 -0
- package/nitrogen/generated/ios/swift/AngleSnapshot.swift +34 -0
- package/nitrogen/generated/ios/swift/ExerciseConfig.swift +83 -0
- package/nitrogen/generated/ios/swift/ExercisePhase.swift +52 -0
- package/nitrogen/generated/ios/swift/ExerciseType.swift +44 -0
- package/nitrogen/generated/ios/swift/FormFeedback.swift +39 -0
- package/nitrogen/generated/ios/swift/FormRule.swift +54 -0
- package/nitrogen/generated/ios/swift/FormSeverity.swift +44 -0
- package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_ExercisePhase.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_FormFeedback.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_HoldProgress.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_RepData.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_SessionResult.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
- package/nitrogen/generated/ios/swift/HoldProgress.swift +39 -0
- package/nitrogen/generated/ios/swift/HybridNitroPoseExercisesSpec.swift +73 -0
- package/nitrogen/generated/ios/swift/HybridNitroPoseExercisesSpec_cxx.swift +483 -0
- package/nitrogen/generated/ios/swift/Landmark.swift +44 -0
- package/nitrogen/generated/ios/swift/PhaseThreshold.swift +44 -0
- package/nitrogen/generated/ios/swift/RepData.swift +50 -0
- package/nitrogen/generated/ios/swift/SessionResult.swift +66 -0
- package/nitrogen/generated/ios/swift/SessionStatus.swift +52 -0
- package/nitrogen/generated/shared/c++/AngleDefinition.hpp +95 -0
- package/nitrogen/generated/shared/c++/AngleSnapshot.hpp +87 -0
- package/nitrogen/generated/shared/c++/ExerciseConfig.hpp +122 -0
- package/nitrogen/generated/shared/c++/ExercisePhase.hpp +88 -0
- package/nitrogen/generated/shared/c++/ExerciseType.hpp +80 -0
- package/nitrogen/generated/shared/c++/FormFeedback.hpp +93 -0
- package/nitrogen/generated/shared/c++/FormRule.hpp +105 -0
- package/nitrogen/generated/shared/c++/FormSeverity.hpp +80 -0
- package/nitrogen/generated/shared/c++/HoldProgress.hpp +91 -0
- package/nitrogen/generated/shared/c++/HybridNitroPoseExercisesSpec.cpp +46 -0
- package/nitrogen/generated/shared/c++/HybridNitroPoseExercisesSpec.hpp +117 -0
- package/nitrogen/generated/shared/c++/Landmark.hpp +95 -0
- package/nitrogen/generated/shared/c++/PhaseThreshold.hpp +97 -0
- package/nitrogen/generated/shared/c++/RepData.hpp +97 -0
- package/nitrogen/generated/shared/c++/SessionResult.hpp +108 -0
- package/nitrogen/generated/shared/c++/SessionStatus.hpp +88 -0
- package/package.json +187 -0
- package/src/NitroPoseExercises.nitro.ts +155 -0
- package/src/config/pushup.ts +62 -0
- package/src/index.tsx +28 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// RepData.hpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#if __has_include(<NitroModules/JSIConverter.hpp>)
|
|
11
|
+
#include <NitroModules/JSIConverter.hpp>
|
|
12
|
+
#else
|
|
13
|
+
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
|
|
14
|
+
#endif
|
|
15
|
+
#if __has_include(<NitroModules/NitroDefines.hpp>)
|
|
16
|
+
#include <NitroModules/NitroDefines.hpp>
|
|
17
|
+
#else
|
|
18
|
+
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
|
|
19
|
+
#endif
|
|
20
|
+
#if __has_include(<NitroModules/JSIHelpers.hpp>)
|
|
21
|
+
#include <NitroModules/JSIHelpers.hpp>
|
|
22
|
+
#else
|
|
23
|
+
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
|
|
24
|
+
#endif
|
|
25
|
+
#if __has_include(<NitroModules/PropNameIDCache.hpp>)
|
|
26
|
+
#include <NitroModules/PropNameIDCache.hpp>
|
|
27
|
+
#else
|
|
28
|
+
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
|
|
29
|
+
#endif
|
|
30
|
+
|
|
31
|
+
// Forward declaration of `AngleSnapshot` to properly resolve imports.
|
|
32
|
+
namespace margelo::nitro::nitroposeexercises { struct AngleSnapshot; }
|
|
33
|
+
|
|
34
|
+
#include "AngleSnapshot.hpp"
|
|
35
|
+
#include <vector>
|
|
36
|
+
|
|
37
|
+
namespace margelo::nitro::nitroposeexercises {
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* A struct which can be represented as a JavaScript object (RepData).
|
|
41
|
+
*/
|
|
42
|
+
struct RepData final {
|
|
43
|
+
public:
|
|
44
|
+
double repNumber SWIFT_PRIVATE;
|
|
45
|
+
double durationMs SWIFT_PRIVATE;
|
|
46
|
+
double formScore SWIFT_PRIVATE;
|
|
47
|
+
std::vector<AngleSnapshot> angles SWIFT_PRIVATE;
|
|
48
|
+
|
|
49
|
+
public:
|
|
50
|
+
RepData() = default;
|
|
51
|
+
explicit RepData(double repNumber, double durationMs, double formScore, std::vector<AngleSnapshot> angles): repNumber(repNumber), durationMs(durationMs), formScore(formScore), angles(angles) {}
|
|
52
|
+
|
|
53
|
+
public:
|
|
54
|
+
friend bool operator==(const RepData& lhs, const RepData& rhs) = default;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
} // namespace margelo::nitro::nitroposeexercises
|
|
58
|
+
|
|
59
|
+
namespace margelo::nitro {
|
|
60
|
+
|
|
61
|
+
// C++ RepData <> JS RepData (object)
|
|
62
|
+
template <>
|
|
63
|
+
struct JSIConverter<margelo::nitro::nitroposeexercises::RepData> final {
|
|
64
|
+
static inline margelo::nitro::nitroposeexercises::RepData fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) {
|
|
65
|
+
jsi::Object obj = arg.asObject(runtime);
|
|
66
|
+
return margelo::nitro::nitroposeexercises::RepData(
|
|
67
|
+
JSIConverter<double>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "repNumber"))),
|
|
68
|
+
JSIConverter<double>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "durationMs"))),
|
|
69
|
+
JSIConverter<double>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "formScore"))),
|
|
70
|
+
JSIConverter<std::vector<margelo::nitro::nitroposeexercises::AngleSnapshot>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "angles")))
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::nitroposeexercises::RepData& arg) {
|
|
74
|
+
jsi::Object obj(runtime);
|
|
75
|
+
obj.setProperty(runtime, PropNameIDCache::get(runtime, "repNumber"), JSIConverter<double>::toJSI(runtime, arg.repNumber));
|
|
76
|
+
obj.setProperty(runtime, PropNameIDCache::get(runtime, "durationMs"), JSIConverter<double>::toJSI(runtime, arg.durationMs));
|
|
77
|
+
obj.setProperty(runtime, PropNameIDCache::get(runtime, "formScore"), JSIConverter<double>::toJSI(runtime, arg.formScore));
|
|
78
|
+
obj.setProperty(runtime, PropNameIDCache::get(runtime, "angles"), JSIConverter<std::vector<margelo::nitro::nitroposeexercises::AngleSnapshot>>::toJSI(runtime, arg.angles));
|
|
79
|
+
return obj;
|
|
80
|
+
}
|
|
81
|
+
static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) {
|
|
82
|
+
if (!value.isObject()) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
jsi::Object obj = value.getObject(runtime);
|
|
86
|
+
if (!nitro::isPlainObject(runtime, obj)) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
if (!JSIConverter<double>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "repNumber")))) return false;
|
|
90
|
+
if (!JSIConverter<double>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "durationMs")))) return false;
|
|
91
|
+
if (!JSIConverter<double>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "formScore")))) return false;
|
|
92
|
+
if (!JSIConverter<std::vector<margelo::nitro::nitroposeexercises::AngleSnapshot>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "angles")))) return false;
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
} // namespace margelo::nitro
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// SessionResult.hpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#if __has_include(<NitroModules/JSIConverter.hpp>)
|
|
11
|
+
#include <NitroModules/JSIConverter.hpp>
|
|
12
|
+
#else
|
|
13
|
+
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
|
|
14
|
+
#endif
|
|
15
|
+
#if __has_include(<NitroModules/NitroDefines.hpp>)
|
|
16
|
+
#include <NitroModules/NitroDefines.hpp>
|
|
17
|
+
#else
|
|
18
|
+
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
|
|
19
|
+
#endif
|
|
20
|
+
#if __has_include(<NitroModules/JSIHelpers.hpp>)
|
|
21
|
+
#include <NitroModules/JSIHelpers.hpp>
|
|
22
|
+
#else
|
|
23
|
+
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
|
|
24
|
+
#endif
|
|
25
|
+
#if __has_include(<NitroModules/PropNameIDCache.hpp>)
|
|
26
|
+
#include <NitroModules/PropNameIDCache.hpp>
|
|
27
|
+
#else
|
|
28
|
+
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
|
|
29
|
+
#endif
|
|
30
|
+
|
|
31
|
+
// Forward declaration of `FormFeedback` to properly resolve imports.
|
|
32
|
+
namespace margelo::nitro::nitroposeexercises { struct FormFeedback; }
|
|
33
|
+
// Forward declaration of `AngleSnapshot` to properly resolve imports.
|
|
34
|
+
namespace margelo::nitro::nitroposeexercises { struct AngleSnapshot; }
|
|
35
|
+
|
|
36
|
+
#include "FormFeedback.hpp"
|
|
37
|
+
#include <vector>
|
|
38
|
+
#include "AngleSnapshot.hpp"
|
|
39
|
+
|
|
40
|
+
namespace margelo::nitro::nitroposeexercises {
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* A struct which can be represented as a JavaScript object (SessionResult).
|
|
44
|
+
*/
|
|
45
|
+
struct SessionResult final {
|
|
46
|
+
public:
|
|
47
|
+
double totalReps SWIFT_PRIVATE;
|
|
48
|
+
double totalDurationMs SWIFT_PRIVATE;
|
|
49
|
+
double averageRepDurationMs SWIFT_PRIVATE;
|
|
50
|
+
double averageFormScore SWIFT_PRIVATE;
|
|
51
|
+
std::vector<FormFeedback> formViolations SWIFT_PRIVATE;
|
|
52
|
+
std::vector<AngleSnapshot> angleHistory SWIFT_PRIVATE;
|
|
53
|
+
|
|
54
|
+
public:
|
|
55
|
+
SessionResult() = default;
|
|
56
|
+
explicit SessionResult(double totalReps, double totalDurationMs, double averageRepDurationMs, double averageFormScore, std::vector<FormFeedback> formViolations, std::vector<AngleSnapshot> angleHistory): totalReps(totalReps), totalDurationMs(totalDurationMs), averageRepDurationMs(averageRepDurationMs), averageFormScore(averageFormScore), formViolations(formViolations), angleHistory(angleHistory) {}
|
|
57
|
+
|
|
58
|
+
public:
|
|
59
|
+
friend bool operator==(const SessionResult& lhs, const SessionResult& rhs) = default;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
} // namespace margelo::nitro::nitroposeexercises
|
|
63
|
+
|
|
64
|
+
namespace margelo::nitro {
|
|
65
|
+
|
|
66
|
+
// C++ SessionResult <> JS SessionResult (object)
|
|
67
|
+
template <>
|
|
68
|
+
struct JSIConverter<margelo::nitro::nitroposeexercises::SessionResult> final {
|
|
69
|
+
static inline margelo::nitro::nitroposeexercises::SessionResult fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) {
|
|
70
|
+
jsi::Object obj = arg.asObject(runtime);
|
|
71
|
+
return margelo::nitro::nitroposeexercises::SessionResult(
|
|
72
|
+
JSIConverter<double>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "totalReps"))),
|
|
73
|
+
JSIConverter<double>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "totalDurationMs"))),
|
|
74
|
+
JSIConverter<double>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "averageRepDurationMs"))),
|
|
75
|
+
JSIConverter<double>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "averageFormScore"))),
|
|
76
|
+
JSIConverter<std::vector<margelo::nitro::nitroposeexercises::FormFeedback>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "formViolations"))),
|
|
77
|
+
JSIConverter<std::vector<margelo::nitro::nitroposeexercises::AngleSnapshot>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "angleHistory")))
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::nitroposeexercises::SessionResult& arg) {
|
|
81
|
+
jsi::Object obj(runtime);
|
|
82
|
+
obj.setProperty(runtime, PropNameIDCache::get(runtime, "totalReps"), JSIConverter<double>::toJSI(runtime, arg.totalReps));
|
|
83
|
+
obj.setProperty(runtime, PropNameIDCache::get(runtime, "totalDurationMs"), JSIConverter<double>::toJSI(runtime, arg.totalDurationMs));
|
|
84
|
+
obj.setProperty(runtime, PropNameIDCache::get(runtime, "averageRepDurationMs"), JSIConverter<double>::toJSI(runtime, arg.averageRepDurationMs));
|
|
85
|
+
obj.setProperty(runtime, PropNameIDCache::get(runtime, "averageFormScore"), JSIConverter<double>::toJSI(runtime, arg.averageFormScore));
|
|
86
|
+
obj.setProperty(runtime, PropNameIDCache::get(runtime, "formViolations"), JSIConverter<std::vector<margelo::nitro::nitroposeexercises::FormFeedback>>::toJSI(runtime, arg.formViolations));
|
|
87
|
+
obj.setProperty(runtime, PropNameIDCache::get(runtime, "angleHistory"), JSIConverter<std::vector<margelo::nitro::nitroposeexercises::AngleSnapshot>>::toJSI(runtime, arg.angleHistory));
|
|
88
|
+
return obj;
|
|
89
|
+
}
|
|
90
|
+
static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) {
|
|
91
|
+
if (!value.isObject()) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
jsi::Object obj = value.getObject(runtime);
|
|
95
|
+
if (!nitro::isPlainObject(runtime, obj)) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
if (!JSIConverter<double>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "totalReps")))) return false;
|
|
99
|
+
if (!JSIConverter<double>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "totalDurationMs")))) return false;
|
|
100
|
+
if (!JSIConverter<double>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "averageRepDurationMs")))) return false;
|
|
101
|
+
if (!JSIConverter<double>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "averageFormScore")))) return false;
|
|
102
|
+
if (!JSIConverter<std::vector<margelo::nitro::nitroposeexercises::FormFeedback>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "formViolations")))) return false;
|
|
103
|
+
if (!JSIConverter<std::vector<margelo::nitro::nitroposeexercises::AngleSnapshot>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "angleHistory")))) return false;
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
} // namespace margelo::nitro
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// SessionStatus.hpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#if __has_include(<NitroModules/NitroHash.hpp>)
|
|
11
|
+
#include <NitroModules/NitroHash.hpp>
|
|
12
|
+
#else
|
|
13
|
+
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
|
|
14
|
+
#endif
|
|
15
|
+
#if __has_include(<NitroModules/JSIConverter.hpp>)
|
|
16
|
+
#include <NitroModules/JSIConverter.hpp>
|
|
17
|
+
#else
|
|
18
|
+
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
|
|
19
|
+
#endif
|
|
20
|
+
#if __has_include(<NitroModules/NitroDefines.hpp>)
|
|
21
|
+
#include <NitroModules/NitroDefines.hpp>
|
|
22
|
+
#else
|
|
23
|
+
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
|
|
24
|
+
#endif
|
|
25
|
+
|
|
26
|
+
namespace margelo::nitro::nitroposeexercises {
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* An enum which can be represented as a JavaScript union (SessionStatus).
|
|
30
|
+
*/
|
|
31
|
+
enum class SessionStatus {
|
|
32
|
+
IDLE SWIFT_NAME(idle) = 0,
|
|
33
|
+
COUNTDOWN SWIFT_NAME(countdown) = 1,
|
|
34
|
+
ACTIVE SWIFT_NAME(active) = 2,
|
|
35
|
+
PAUSED SWIFT_NAME(paused) = 3,
|
|
36
|
+
COMPLETED SWIFT_NAME(completed) = 4,
|
|
37
|
+
} CLOSED_ENUM;
|
|
38
|
+
|
|
39
|
+
} // namespace margelo::nitro::nitroposeexercises
|
|
40
|
+
|
|
41
|
+
namespace margelo::nitro {
|
|
42
|
+
|
|
43
|
+
// C++ SessionStatus <> JS SessionStatus (union)
|
|
44
|
+
template <>
|
|
45
|
+
struct JSIConverter<margelo::nitro::nitroposeexercises::SessionStatus> final {
|
|
46
|
+
static inline margelo::nitro::nitroposeexercises::SessionStatus fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) {
|
|
47
|
+
std::string unionValue = JSIConverter<std::string>::fromJSI(runtime, arg);
|
|
48
|
+
switch (hashString(unionValue.c_str(), unionValue.size())) {
|
|
49
|
+
case hashString("idle"): return margelo::nitro::nitroposeexercises::SessionStatus::IDLE;
|
|
50
|
+
case hashString("countdown"): return margelo::nitro::nitroposeexercises::SessionStatus::COUNTDOWN;
|
|
51
|
+
case hashString("active"): return margelo::nitro::nitroposeexercises::SessionStatus::ACTIVE;
|
|
52
|
+
case hashString("paused"): return margelo::nitro::nitroposeexercises::SessionStatus::PAUSED;
|
|
53
|
+
case hashString("completed"): return margelo::nitro::nitroposeexercises::SessionStatus::COMPLETED;
|
|
54
|
+
default: [[unlikely]]
|
|
55
|
+
throw std::invalid_argument("Cannot convert \"" + unionValue + "\" to enum SessionStatus - invalid value!");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
static inline jsi::Value toJSI(jsi::Runtime& runtime, margelo::nitro::nitroposeexercises::SessionStatus arg) {
|
|
59
|
+
switch (arg) {
|
|
60
|
+
case margelo::nitro::nitroposeexercises::SessionStatus::IDLE: return JSIConverter<std::string>::toJSI(runtime, "idle");
|
|
61
|
+
case margelo::nitro::nitroposeexercises::SessionStatus::COUNTDOWN: return JSIConverter<std::string>::toJSI(runtime, "countdown");
|
|
62
|
+
case margelo::nitro::nitroposeexercises::SessionStatus::ACTIVE: return JSIConverter<std::string>::toJSI(runtime, "active");
|
|
63
|
+
case margelo::nitro::nitroposeexercises::SessionStatus::PAUSED: return JSIConverter<std::string>::toJSI(runtime, "paused");
|
|
64
|
+
case margelo::nitro::nitroposeexercises::SessionStatus::COMPLETED: return JSIConverter<std::string>::toJSI(runtime, "completed");
|
|
65
|
+
default: [[unlikely]]
|
|
66
|
+
throw std::invalid_argument("Cannot convert SessionStatus to JS - invalid value: "
|
|
67
|
+
+ std::to_string(static_cast<int>(arg)) + "!");
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) {
|
|
71
|
+
if (!value.isString()) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
std::string unionValue = JSIConverter<std::string>::fromJSI(runtime, value);
|
|
75
|
+
switch (hashString(unionValue.c_str(), unionValue.size())) {
|
|
76
|
+
case hashString("idle"):
|
|
77
|
+
case hashString("countdown"):
|
|
78
|
+
case hashString("active"):
|
|
79
|
+
case hashString("paused"):
|
|
80
|
+
case hashString("completed"):
|
|
81
|
+
return true;
|
|
82
|
+
default:
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
} // namespace margelo::nitro
|
package/package.json
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "react-native-nitro-pose-exercises",
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"description": "Real-time on-device exercise tracking for React Native. Rep counting, form validation, and skeleton overlay powered by MediaPipe Pose Landmarker and VisionCamera v5 via Nitro Modules.",
|
|
5
|
+
"main": "./lib/module/index.js",
|
|
6
|
+
"types": "./lib/typescript/src/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"source": "./src/index.tsx",
|
|
10
|
+
"types": "./lib/typescript/src/index.d.ts",
|
|
11
|
+
"default": "./lib/module/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./package.json": "./package.json"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"src",
|
|
17
|
+
"lib",
|
|
18
|
+
"android",
|
|
19
|
+
"ios",
|
|
20
|
+
"cpp",
|
|
21
|
+
"nitrogen",
|
|
22
|
+
"nitro.json",
|
|
23
|
+
"*.podspec",
|
|
24
|
+
"react-native.config.js",
|
|
25
|
+
"!ios/build",
|
|
26
|
+
"!android/build",
|
|
27
|
+
"!android/gradle",
|
|
28
|
+
"!android/gradlew",
|
|
29
|
+
"!android/gradlew.bat",
|
|
30
|
+
"!android/local.properties",
|
|
31
|
+
"!**/__tests__",
|
|
32
|
+
"!**/__fixtures__",
|
|
33
|
+
"!**/__mocks__",
|
|
34
|
+
"!**/.*"
|
|
35
|
+
],
|
|
36
|
+
"scripts": {
|
|
37
|
+
"example": "yarn workspace react-native-nitro-pose-exercises-example",
|
|
38
|
+
"clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
|
|
39
|
+
"prepare": "bob build",
|
|
40
|
+
"nitrogen": "nitrogen",
|
|
41
|
+
"typecheck": "tsc",
|
|
42
|
+
"lint": "eslint \"**/*.{js,ts,tsx}\"",
|
|
43
|
+
"test": "jest",
|
|
44
|
+
"release": "release-it --only-version",
|
|
45
|
+
"web": "vite",
|
|
46
|
+
"build:web": "vite build"
|
|
47
|
+
},
|
|
48
|
+
"keywords": [
|
|
49
|
+
"react-native",
|
|
50
|
+
"ios",
|
|
51
|
+
"android"
|
|
52
|
+
],
|
|
53
|
+
"repository": {
|
|
54
|
+
"type": "git",
|
|
55
|
+
"url": "git+https://github.com/Gautham495/react-native-nitro-pose-exercises.git"
|
|
56
|
+
},
|
|
57
|
+
"author": "Gautham495 <kinggautham495@gmail.com> (https://github.com/Gautham495)",
|
|
58
|
+
"license": "MIT",
|
|
59
|
+
"bugs": {
|
|
60
|
+
"url": "https://github.com/Gautham495/react-native-nitro-pose-exercises/issues"
|
|
61
|
+
},
|
|
62
|
+
"homepage": "https://github.com/Gautham495/react-native-nitro-pose-exercises#readme",
|
|
63
|
+
"publishConfig": {
|
|
64
|
+
"registry": "https://registry.npmjs.org/"
|
|
65
|
+
},
|
|
66
|
+
"devDependencies": {
|
|
67
|
+
"@commitlint/config-conventional": "^20.5.0",
|
|
68
|
+
"@eslint/compat": "^1.3.2",
|
|
69
|
+
"@eslint/eslintrc": "^3.3.1",
|
|
70
|
+
"@eslint/js": "^9.35.0",
|
|
71
|
+
"@jest/globals": "^30.0.0",
|
|
72
|
+
"@react-native/babel-preset": "0.85.0",
|
|
73
|
+
"@react-native/eslint-config": "0.85.0",
|
|
74
|
+
"@react-native/jest-preset": "0.85.0",
|
|
75
|
+
"@release-it/conventional-changelog": "^10.0.6",
|
|
76
|
+
"@types/react": "^19.2.0",
|
|
77
|
+
"commitlint": "^20.5.0",
|
|
78
|
+
"del-cli": "^7.0.0",
|
|
79
|
+
"eslint": "^9.35.0",
|
|
80
|
+
"eslint-config-prettier": "^10.1.8",
|
|
81
|
+
"eslint-plugin-ft-flow": "^3.0.11",
|
|
82
|
+
"eslint-plugin-prettier": "^5.5.4",
|
|
83
|
+
"jest": "^30.3.0",
|
|
84
|
+
"lefthook": "^2.1.4",
|
|
85
|
+
"nitrogen": "^0.35.7",
|
|
86
|
+
"prettier": "^3.8.1",
|
|
87
|
+
"react": "19.2.3",
|
|
88
|
+
"react-native": "0.85.0",
|
|
89
|
+
"react-native-builder-bob": "^0.41.0",
|
|
90
|
+
"react-native-nitro-modules": "^0.35.7",
|
|
91
|
+
"react-native-svg": "^15.15.5",
|
|
92
|
+
"react-native-vision-camera": "^5.0.10",
|
|
93
|
+
"react-native-vision-camera-worklets": "^5.0.10",
|
|
94
|
+
"react-native-worklets": "^0.8.3",
|
|
95
|
+
"release-it": "^19.2.4",
|
|
96
|
+
"turbo": "^2.8.21",
|
|
97
|
+
"typescript": "^6.0.2"
|
|
98
|
+
},
|
|
99
|
+
"peerDependencies": {
|
|
100
|
+
"react": "*",
|
|
101
|
+
"react-native": "*",
|
|
102
|
+
"react-native-nitro-modules": "*",
|
|
103
|
+
"react-native-reanimated": "*",
|
|
104
|
+
"react-native-vision-camera": "*",
|
|
105
|
+
"react-native-vision-camera-worklets": "*",
|
|
106
|
+
"react-native-worklets": "*"
|
|
107
|
+
},
|
|
108
|
+
"workspaces": [
|
|
109
|
+
"example"
|
|
110
|
+
],
|
|
111
|
+
"packageManager": "yarn@4.11.0",
|
|
112
|
+
"react-native-builder-bob": {
|
|
113
|
+
"source": "src",
|
|
114
|
+
"output": "lib",
|
|
115
|
+
"targets": [
|
|
116
|
+
[
|
|
117
|
+
"custom",
|
|
118
|
+
{
|
|
119
|
+
"script": "nitrogen",
|
|
120
|
+
"clean": "nitrogen/"
|
|
121
|
+
}
|
|
122
|
+
],
|
|
123
|
+
[
|
|
124
|
+
"module",
|
|
125
|
+
{
|
|
126
|
+
"esm": true
|
|
127
|
+
}
|
|
128
|
+
],
|
|
129
|
+
[
|
|
130
|
+
"typescript",
|
|
131
|
+
{
|
|
132
|
+
"project": "tsconfig.build.json"
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
]
|
|
136
|
+
},
|
|
137
|
+
"prettier": {
|
|
138
|
+
"quoteProps": "consistent",
|
|
139
|
+
"singleQuote": true,
|
|
140
|
+
"tabWidth": 2,
|
|
141
|
+
"trailingComma": "es5",
|
|
142
|
+
"useTabs": false
|
|
143
|
+
},
|
|
144
|
+
"jest": {
|
|
145
|
+
"preset": "@react-native/jest-preset",
|
|
146
|
+
"modulePathIgnorePatterns": [
|
|
147
|
+
"<rootDir>/example/node_modules",
|
|
148
|
+
"<rootDir>/lib/"
|
|
149
|
+
]
|
|
150
|
+
},
|
|
151
|
+
"commitlint": {
|
|
152
|
+
"extends": [
|
|
153
|
+
"@commitlint/config-conventional"
|
|
154
|
+
]
|
|
155
|
+
},
|
|
156
|
+
"release-it": {
|
|
157
|
+
"git": {
|
|
158
|
+
"commitMessage": "chore: release ${version}",
|
|
159
|
+
"tagName": "v${version}"
|
|
160
|
+
},
|
|
161
|
+
"npm": {
|
|
162
|
+
"publish": true
|
|
163
|
+
},
|
|
164
|
+
"github": {
|
|
165
|
+
"release": true
|
|
166
|
+
},
|
|
167
|
+
"plugins": {
|
|
168
|
+
"@release-it/conventional-changelog": {
|
|
169
|
+
"preset": {
|
|
170
|
+
"name": "angular"
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
"create-react-native-library": {
|
|
176
|
+
"type": "nitro-module",
|
|
177
|
+
"languages": "kotlin-swift",
|
|
178
|
+
"tools": [
|
|
179
|
+
"eslint",
|
|
180
|
+
"jest",
|
|
181
|
+
"lefthook",
|
|
182
|
+
"release-it",
|
|
183
|
+
"vite"
|
|
184
|
+
],
|
|
185
|
+
"version": "0.62.0"
|
|
186
|
+
}
|
|
187
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { type HybridObject, NitroModules } from 'react-native-nitro-modules';
|
|
2
|
+
|
|
3
|
+
import { type Frame } from 'react-native-vision-camera';
|
|
4
|
+
|
|
5
|
+
// ─── Enums & Types ───────────────────────────────────────────
|
|
6
|
+
|
|
7
|
+
type ExerciseType = 'rep' | 'hold' | 'flow';
|
|
8
|
+
|
|
9
|
+
type ExercisePhase = 'up' | 'down' | 'hold' | 'transition' | 'unknown';
|
|
10
|
+
|
|
11
|
+
type FormSeverity = 'info' | 'warning' | 'error';
|
|
12
|
+
|
|
13
|
+
type SessionStatus = 'idle' | 'countdown' | 'active' | 'paused' | 'completed';
|
|
14
|
+
|
|
15
|
+
// ─── Landmark ────────────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
interface Landmark {
|
|
18
|
+
x: number;
|
|
19
|
+
y: number;
|
|
20
|
+
z: number;
|
|
21
|
+
visibility: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// ─── Exercise Config (passed from JS) ────────────────────────
|
|
25
|
+
|
|
26
|
+
interface AngleDefinition {
|
|
27
|
+
name: string;
|
|
28
|
+
landmarkA: number; // landmark index (0-32)
|
|
29
|
+
landmarkB: number; // vertex of the angle
|
|
30
|
+
landmarkC: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface PhaseThreshold {
|
|
34
|
+
phase: ExercisePhase;
|
|
35
|
+
angleName: string;
|
|
36
|
+
minAngle: number;
|
|
37
|
+
maxAngle: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface FormRule {
|
|
41
|
+
name: string;
|
|
42
|
+
message: string;
|
|
43
|
+
severity: FormSeverity;
|
|
44
|
+
angleName: string;
|
|
45
|
+
minAngle: number;
|
|
46
|
+
maxAngle: number;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
interface ExerciseConfig {
|
|
50
|
+
name: string;
|
|
51
|
+
type: ExerciseType;
|
|
52
|
+
angles: AngleDefinition[];
|
|
53
|
+
phases: PhaseThreshold[];
|
|
54
|
+
repSequence: ExercisePhase[]; // e.g. ['up', 'down', 'up'] for a push-up rep
|
|
55
|
+
formRules: FormRule[];
|
|
56
|
+
holdDurationMs: number; // for hold-based exercises
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ─── Callback Payloads ───────────────────────────────────────
|
|
60
|
+
|
|
61
|
+
interface RepData {
|
|
62
|
+
repNumber: number;
|
|
63
|
+
durationMs: number;
|
|
64
|
+
formScore: number; // 0-100
|
|
65
|
+
angles: AngleSnapshot[];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
interface AngleSnapshot {
|
|
69
|
+
name: string;
|
|
70
|
+
value: number;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
interface FormFeedback {
|
|
74
|
+
ruleName: string;
|
|
75
|
+
message: string;
|
|
76
|
+
severity: FormSeverity;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
interface HoldProgress {
|
|
80
|
+
elapsedMs: number;
|
|
81
|
+
targetMs: number;
|
|
82
|
+
stability: number; // 0-100, how steady they are
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
interface SessionResult {
|
|
86
|
+
totalReps: number;
|
|
87
|
+
totalDurationMs: number;
|
|
88
|
+
averageRepDurationMs: number;
|
|
89
|
+
averageFormScore: number;
|
|
90
|
+
formViolations: FormFeedback[];
|
|
91
|
+
angleHistory: AngleSnapshot[]; // min/max per angle
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ─── The HybridObject ────────────────────────────────────────
|
|
95
|
+
|
|
96
|
+
interface NitroPoseExercises extends HybridObject<{
|
|
97
|
+
ios: 'swift';
|
|
98
|
+
android: 'kotlin';
|
|
99
|
+
}> {
|
|
100
|
+
// Lifecycle
|
|
101
|
+
initialize(modelPath: string): Promise<void>;
|
|
102
|
+
release(): void;
|
|
103
|
+
|
|
104
|
+
// Exercise setup
|
|
105
|
+
loadExercise(config: ExerciseConfig): void;
|
|
106
|
+
|
|
107
|
+
// Session control
|
|
108
|
+
readonly status: SessionStatus;
|
|
109
|
+
|
|
110
|
+
// Process a VisionCamera frame — called from frame processor worklet
|
|
111
|
+
processFrame(frame: Frame): void;
|
|
112
|
+
|
|
113
|
+
// Callbacks (set from JS side)
|
|
114
|
+
onRepComplete: ((data: RepData) => void) | undefined;
|
|
115
|
+
onPhaseChange: ((phase: ExercisePhase) => void) | undefined;
|
|
116
|
+
onFormFeedback: ((feedback: FormFeedback) => void) | undefined;
|
|
117
|
+
onHoldProgress: ((progress: HoldProgress) => void) | undefined;
|
|
118
|
+
onPoseLost: (() => void) | undefined;
|
|
119
|
+
onPoseRegained: (() => void) | undefined;
|
|
120
|
+
onSessionComplete: ((result: SessionResult) => void) | undefined;
|
|
121
|
+
|
|
122
|
+
// State (readable from JS for UI)
|
|
123
|
+
readonly currentPhase: ExercisePhase;
|
|
124
|
+
readonly repCount: number;
|
|
125
|
+
readonly landmarks: Landmark[];
|
|
126
|
+
|
|
127
|
+
// Session control
|
|
128
|
+
startSession(targetReps: number, countdownSeconds: number): void;
|
|
129
|
+
pauseSession(): void;
|
|
130
|
+
resumeSession(): void;
|
|
131
|
+
stopSession(): void;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const nitroPoseExercises =
|
|
135
|
+
NitroModules.createHybridObject<NitroPoseExercises>('PoseExercise');
|
|
136
|
+
|
|
137
|
+
export { nitroPoseExercises };
|
|
138
|
+
|
|
139
|
+
export type {
|
|
140
|
+
NitroPoseExercises,
|
|
141
|
+
ExerciseConfig,
|
|
142
|
+
ExerciseType,
|
|
143
|
+
ExercisePhase,
|
|
144
|
+
FormSeverity,
|
|
145
|
+
SessionStatus,
|
|
146
|
+
Landmark,
|
|
147
|
+
AngleDefinition,
|
|
148
|
+
PhaseThreshold,
|
|
149
|
+
FormRule,
|
|
150
|
+
RepData,
|
|
151
|
+
AngleSnapshot,
|
|
152
|
+
FormFeedback,
|
|
153
|
+
HoldProgress,
|
|
154
|
+
SessionResult,
|
|
155
|
+
};
|