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.
Files changed (124) hide show
  1. package/LICENSE +20 -0
  2. package/NitroPoseExercises.podspec +32 -0
  3. package/README.md +538 -0
  4. package/android/CMakeLists.txt +31 -0
  5. package/android/build.gradle +121 -0
  6. package/android/src/main/AndroidManifest.xml +2 -0
  7. package/android/src/main/cpp/cpp-adapter.cpp +11 -0
  8. package/android/src/main/java/com/margelo/nitro/nitroposeexercises/NitroPoseExercises.kt +535 -0
  9. package/android/src/main/java/com/margelo/nitro/nitroposeexercises/NitroPoseExercisesPackage.kt +22 -0
  10. package/ios/NitroPoseExercises.swift +527 -0
  11. package/lib/module/NitroPoseExercises.nitro.js +17 -0
  12. package/lib/module/NitroPoseExercises.nitro.js.map +1 -0
  13. package/lib/module/config/pushup.js +71 -0
  14. package/lib/module/config/pushup.js.map +1 -0
  15. package/lib/module/index.js +7 -0
  16. package/lib/module/index.js.map +1 -0
  17. package/lib/module/package.json +1 -0
  18. package/lib/typescript/package.json +1 -0
  19. package/lib/typescript/src/NitroPoseExercises.nitro.d.ts +97 -0
  20. package/lib/typescript/src/NitroPoseExercises.nitro.d.ts.map +1 -0
  21. package/lib/typescript/src/config/pushup.d.ts +3 -0
  22. package/lib/typescript/src/config/pushup.d.ts.map +1 -0
  23. package/lib/typescript/src/index.d.ts +6 -0
  24. package/lib/typescript/src/index.d.ts.map +1 -0
  25. package/nitro.json +23 -0
  26. package/nitrogen/generated/android/c++/JAngleDefinition.hpp +69 -0
  27. package/nitrogen/generated/android/c++/JAngleSnapshot.hpp +61 -0
  28. package/nitrogen/generated/android/c++/JExerciseConfig.hpp +166 -0
  29. package/nitrogen/generated/android/c++/JExercisePhase.hpp +67 -0
  30. package/nitrogen/generated/android/c++/JExerciseType.hpp +61 -0
  31. package/nitrogen/generated/android/c++/JFormFeedback.hpp +67 -0
  32. package/nitrogen/generated/android/c++/JFormRule.hpp +79 -0
  33. package/nitrogen/generated/android/c++/JFormSeverity.hpp +61 -0
  34. package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
  35. package/nitrogen/generated/android/c++/JFunc_void_ExercisePhase.hpp +77 -0
  36. package/nitrogen/generated/android/c++/JFunc_void_FormFeedback.hpp +80 -0
  37. package/nitrogen/generated/android/c++/JFunc_void_HoldProgress.hpp +77 -0
  38. package/nitrogen/generated/android/c++/JFunc_void_RepData.hpp +81 -0
  39. package/nitrogen/generated/android/c++/JFunc_void_SessionResult.hpp +85 -0
  40. package/nitrogen/generated/android/c++/JHoldProgress.hpp +65 -0
  41. package/nitrogen/generated/android/c++/JHybridNitroPoseExercisesSpec.cpp +311 -0
  42. package/nitrogen/generated/android/c++/JHybridNitroPoseExercisesSpec.hpp +87 -0
  43. package/nitrogen/generated/android/c++/JLandmark.hpp +69 -0
  44. package/nitrogen/generated/android/c++/JPhaseThreshold.hpp +71 -0
  45. package/nitrogen/generated/android/c++/JRepData.hpp +90 -0
  46. package/nitrogen/generated/android/c++/JSessionResult.hpp +120 -0
  47. package/nitrogen/generated/android/c++/JSessionStatus.hpp +67 -0
  48. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/AngleDefinition.kt +66 -0
  49. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/AngleSnapshot.kt +56 -0
  50. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/ExerciseConfig.kt +81 -0
  51. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/ExercisePhase.kt +26 -0
  52. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/ExerciseType.kt +24 -0
  53. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/FormFeedback.kt +61 -0
  54. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/FormRule.kt +76 -0
  55. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/FormSeverity.kt +24 -0
  56. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/Func_void.kt +80 -0
  57. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/Func_void_ExercisePhase.kt +80 -0
  58. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/Func_void_FormFeedback.kt +80 -0
  59. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/Func_void_HoldProgress.kt +80 -0
  60. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/Func_void_RepData.kt +80 -0
  61. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/Func_void_SessionResult.kt +80 -0
  62. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/HoldProgress.kt +61 -0
  63. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/HybridNitroPoseExercisesSpec.kt +196 -0
  64. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/Landmark.kt +66 -0
  65. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/PhaseThreshold.kt +66 -0
  66. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/RepData.kt +66 -0
  67. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/SessionResult.kt +76 -0
  68. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/SessionStatus.kt +26 -0
  69. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitroposeexercises/nitroposeexercisesOnLoad.kt +35 -0
  70. package/nitrogen/generated/android/nitroposeexercises+autolinking.cmake +81 -0
  71. package/nitrogen/generated/android/nitroposeexercises+autolinking.gradle +27 -0
  72. package/nitrogen/generated/android/nitroposeexercisesOnLoad.cpp +66 -0
  73. package/nitrogen/generated/android/nitroposeexercisesOnLoad.hpp +34 -0
  74. package/nitrogen/generated/ios/NitroPoseExercises+autolinking.rb +62 -0
  75. package/nitrogen/generated/ios/NitroPoseExercises-Swift-Cxx-Bridge.cpp +100 -0
  76. package/nitrogen/generated/ios/NitroPoseExercises-Swift-Cxx-Bridge.hpp +449 -0
  77. package/nitrogen/generated/ios/NitroPoseExercises-Swift-Cxx-Umbrella.hpp +95 -0
  78. package/nitrogen/generated/ios/NitroPoseExercisesAutolinking.mm +33 -0
  79. package/nitrogen/generated/ios/NitroPoseExercisesAutolinking.swift +26 -0
  80. package/nitrogen/generated/ios/c++/HybridNitroPoseExercisesSpecSwift.cpp +11 -0
  81. package/nitrogen/generated/ios/c++/HybridNitroPoseExercisesSpecSwift.hpp +236 -0
  82. package/nitrogen/generated/ios/swift/AngleDefinition.swift +44 -0
  83. package/nitrogen/generated/ios/swift/AngleSnapshot.swift +34 -0
  84. package/nitrogen/generated/ios/swift/ExerciseConfig.swift +83 -0
  85. package/nitrogen/generated/ios/swift/ExercisePhase.swift +52 -0
  86. package/nitrogen/generated/ios/swift/ExerciseType.swift +44 -0
  87. package/nitrogen/generated/ios/swift/FormFeedback.swift +39 -0
  88. package/nitrogen/generated/ios/swift/FormRule.swift +54 -0
  89. package/nitrogen/generated/ios/swift/FormSeverity.swift +44 -0
  90. package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
  91. package/nitrogen/generated/ios/swift/Func_void_ExercisePhase.swift +46 -0
  92. package/nitrogen/generated/ios/swift/Func_void_FormFeedback.swift +46 -0
  93. package/nitrogen/generated/ios/swift/Func_void_HoldProgress.swift +46 -0
  94. package/nitrogen/generated/ios/swift/Func_void_RepData.swift +46 -0
  95. package/nitrogen/generated/ios/swift/Func_void_SessionResult.swift +46 -0
  96. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  97. package/nitrogen/generated/ios/swift/HoldProgress.swift +39 -0
  98. package/nitrogen/generated/ios/swift/HybridNitroPoseExercisesSpec.swift +73 -0
  99. package/nitrogen/generated/ios/swift/HybridNitroPoseExercisesSpec_cxx.swift +483 -0
  100. package/nitrogen/generated/ios/swift/Landmark.swift +44 -0
  101. package/nitrogen/generated/ios/swift/PhaseThreshold.swift +44 -0
  102. package/nitrogen/generated/ios/swift/RepData.swift +50 -0
  103. package/nitrogen/generated/ios/swift/SessionResult.swift +66 -0
  104. package/nitrogen/generated/ios/swift/SessionStatus.swift +52 -0
  105. package/nitrogen/generated/shared/c++/AngleDefinition.hpp +95 -0
  106. package/nitrogen/generated/shared/c++/AngleSnapshot.hpp +87 -0
  107. package/nitrogen/generated/shared/c++/ExerciseConfig.hpp +122 -0
  108. package/nitrogen/generated/shared/c++/ExercisePhase.hpp +88 -0
  109. package/nitrogen/generated/shared/c++/ExerciseType.hpp +80 -0
  110. package/nitrogen/generated/shared/c++/FormFeedback.hpp +93 -0
  111. package/nitrogen/generated/shared/c++/FormRule.hpp +105 -0
  112. package/nitrogen/generated/shared/c++/FormSeverity.hpp +80 -0
  113. package/nitrogen/generated/shared/c++/HoldProgress.hpp +91 -0
  114. package/nitrogen/generated/shared/c++/HybridNitroPoseExercisesSpec.cpp +46 -0
  115. package/nitrogen/generated/shared/c++/HybridNitroPoseExercisesSpec.hpp +117 -0
  116. package/nitrogen/generated/shared/c++/Landmark.hpp +95 -0
  117. package/nitrogen/generated/shared/c++/PhaseThreshold.hpp +97 -0
  118. package/nitrogen/generated/shared/c++/RepData.hpp +97 -0
  119. package/nitrogen/generated/shared/c++/SessionResult.hpp +108 -0
  120. package/nitrogen/generated/shared/c++/SessionStatus.hpp +88 -0
  121. package/package.json +187 -0
  122. package/src/NitroPoseExercises.nitro.ts +155 -0
  123. package/src/config/pushup.ts +62 -0
  124. 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
+ };