react-native-step-tracker-pro 1.0.0

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 (110) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +148 -0
  3. package/android/build.gradle +119 -0
  4. package/android/consumer-rules.pro +13 -0
  5. package/android/gradle.properties +3 -0
  6. package/android/src/main/AndroidManifest.xml +78 -0
  7. package/android/src/main/java/com/steptrackerpro/StepTrackerProModule.kt +598 -0
  8. package/android/src/main/java/com/steptrackerpro/StepTrackerProPackage.kt +26 -0
  9. package/android/src/main/java/com/steptrackerpro/core/DateKeys.kt +90 -0
  10. package/android/src/main/java/com/steptrackerpro/core/GoalTracker.kt +66 -0
  11. package/android/src/main/java/com/steptrackerpro/core/MetricsCalculator.kt +48 -0
  12. package/android/src/main/java/com/steptrackerpro/core/Models.kt +73 -0
  13. package/android/src/main/java/com/steptrackerpro/core/StepCounterEngine.kt +338 -0
  14. package/android/src/main/java/com/steptrackerpro/core/StepStateStore.kt +137 -0
  15. package/android/src/main/java/com/steptrackerpro/core/StepTrackerConfig.kt +184 -0
  16. package/android/src/main/java/com/steptrackerpro/core/StepTrackerCore.kt +280 -0
  17. package/android/src/main/java/com/steptrackerpro/db/Entities.kt +67 -0
  18. package/android/src/main/java/com/steptrackerpro/db/StepDao.kt +118 -0
  19. package/android/src/main/java/com/steptrackerpro/db/StepDatabase.kt +60 -0
  20. package/android/src/main/java/com/steptrackerpro/db/StepRepository.kt +146 -0
  21. package/android/src/main/java/com/steptrackerpro/health/HealthConnectManager.kt +198 -0
  22. package/android/src/main/java/com/steptrackerpro/health/HealthPermissionActivity.kt +99 -0
  23. package/android/src/main/java/com/steptrackerpro/service/BootReceiver.kt +54 -0
  24. package/android/src/main/java/com/steptrackerpro/service/NotificationActionReceiver.kt +17 -0
  25. package/android/src/main/java/com/steptrackerpro/service/NotificationFactory.kt +170 -0
  26. package/android/src/main/java/com/steptrackerpro/service/ServiceCommands.kt +42 -0
  27. package/android/src/main/java/com/steptrackerpro/service/StepTrackerService.kt +409 -0
  28. package/android/src/main/java/com/steptrackerpro/sync/SyncScheduler.kt +102 -0
  29. package/android/src/main/java/com/steptrackerpro/sync/SyncWorkers.kt +175 -0
  30. package/android/src/main/java/com/steptrackerpro/util/BatteryOptimizationHelper.kt +94 -0
  31. package/android/src/main/java/com/steptrackerpro/util/Bridge.kt +149 -0
  32. package/android/src/main/java/com/steptrackerpro/util/PermissionHelper.kt +92 -0
  33. package/android/src/main/java/com/steptrackerpro/util/StepEventBus.kt +53 -0
  34. package/android/src/main/res/drawable/stp_ic_steps.xml +9 -0
  35. package/android/src/main/res/values/strings.xml +9 -0
  36. package/android/src/main/res/values/styles.xml +8 -0
  37. package/android/src/newarch/java/com/steptrackerpro/StepTrackerProSpec.kt +10 -0
  38. package/android/src/oldarch/java/com/steptrackerpro/StepTrackerProSpec.kt +60 -0
  39. package/docs/API.md +329 -0
  40. package/docs/ARCHITECTURE.md +203 -0
  41. package/docs/INSTALLATION.md +175 -0
  42. package/docs/PLAY_STORE_COMPLIANCE.md +122 -0
  43. package/docs/TESTING.md +312 -0
  44. package/docs/TROUBLESHOOTING.md +96 -0
  45. package/lib/commonjs/NativeStepTrackerPro.js +14 -0
  46. package/lib/commonjs/NativeStepTrackerPro.js.map +1 -0
  47. package/lib/commonjs/StepTracker.js +290 -0
  48. package/lib/commonjs/StepTracker.js.map +1 -0
  49. package/lib/commonjs/constants.js +30 -0
  50. package/lib/commonjs/constants.js.map +1 -0
  51. package/lib/commonjs/errors.js +24 -0
  52. package/lib/commonjs/errors.js.map +1 -0
  53. package/lib/commonjs/hooks/index.js +20 -0
  54. package/lib/commonjs/hooks/index.js.map +1 -0
  55. package/lib/commonjs/hooks/useStepStats.js +51 -0
  56. package/lib/commonjs/hooks/useStepStats.js.map +1 -0
  57. package/lib/commonjs/hooks/useStepTracker.js +134 -0
  58. package/lib/commonjs/hooks/useStepTracker.js.map +1 -0
  59. package/lib/commonjs/index.js +64 -0
  60. package/lib/commonjs/index.js.map +1 -0
  61. package/lib/commonjs/package.json +1 -0
  62. package/lib/commonjs/types.js +2 -0
  63. package/lib/commonjs/types.js.map +1 -0
  64. package/lib/module/NativeStepTrackerPro.js +12 -0
  65. package/lib/module/NativeStepTrackerPro.js.map +1 -0
  66. package/lib/module/StepTracker.js +284 -0
  67. package/lib/module/StepTracker.js.map +1 -0
  68. package/lib/module/constants.js +26 -0
  69. package/lib/module/constants.js.map +1 -0
  70. package/lib/module/errors.js +18 -0
  71. package/lib/module/errors.js.map +1 -0
  72. package/lib/module/hooks/index.js +5 -0
  73. package/lib/module/hooks/index.js.map +1 -0
  74. package/lib/module/hooks/useStepStats.js +46 -0
  75. package/lib/module/hooks/useStepStats.js.map +1 -0
  76. package/lib/module/hooks/useStepTracker.js +129 -0
  77. package/lib/module/hooks/useStepTracker.js.map +1 -0
  78. package/lib/module/index.js +7 -0
  79. package/lib/module/index.js.map +1 -0
  80. package/lib/module/package.json +1 -0
  81. package/lib/module/types.js +2 -0
  82. package/lib/module/types.js.map +1 -0
  83. package/lib/typescript/NativeStepTrackerPro.d.ts +50 -0
  84. package/lib/typescript/NativeStepTrackerPro.d.ts.map +1 -0
  85. package/lib/typescript/StepTracker.d.ts +76 -0
  86. package/lib/typescript/StepTracker.d.ts.map +1 -0
  87. package/lib/typescript/constants.d.ts +10 -0
  88. package/lib/typescript/constants.d.ts.map +1 -0
  89. package/lib/typescript/errors.d.ts +8 -0
  90. package/lib/typescript/errors.d.ts.map +1 -0
  91. package/lib/typescript/hooks/index.d.ts +5 -0
  92. package/lib/typescript/hooks/index.d.ts.map +1 -0
  93. package/lib/typescript/hooks/useStepStats.d.ts +11 -0
  94. package/lib/typescript/hooks/useStepStats.d.ts.map +1 -0
  95. package/lib/typescript/hooks/useStepTracker.d.ts +26 -0
  96. package/lib/typescript/hooks/useStepTracker.d.ts.map +1 -0
  97. package/lib/typescript/index.d.ts +7 -0
  98. package/lib/typescript/index.d.ts.map +1 -0
  99. package/lib/typescript/types.d.ts +183 -0
  100. package/lib/typescript/types.d.ts.map +1 -0
  101. package/package.json +79 -0
  102. package/src/NativeStepTrackerPro.ts +66 -0
  103. package/src/StepTracker.ts +410 -0
  104. package/src/constants.ts +43 -0
  105. package/src/errors.ts +31 -0
  106. package/src/hooks/index.ts +4 -0
  107. package/src/hooks/useStepStats.ts +55 -0
  108. package/src/hooks/useStepTracker.ts +167 -0
  109. package/src/index.ts +27 -0
  110. package/src/types.ts +203 -0
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _exportNames = {
7
+ StepTracker: true,
8
+ isSupported: true,
9
+ StepTrackerError: true,
10
+ DEFAULT_CONFIG: true,
11
+ STRIDE_COEFFICIENT: true
12
+ };
13
+ Object.defineProperty(exports, "DEFAULT_CONFIG", {
14
+ enumerable: true,
15
+ get: function () {
16
+ return _constants.DEFAULT_CONFIG;
17
+ }
18
+ });
19
+ Object.defineProperty(exports, "STRIDE_COEFFICIENT", {
20
+ enumerable: true,
21
+ get: function () {
22
+ return _constants.STRIDE_COEFFICIENT;
23
+ }
24
+ });
25
+ Object.defineProperty(exports, "StepTracker", {
26
+ enumerable: true,
27
+ get: function () {
28
+ return _StepTracker.StepTracker;
29
+ }
30
+ });
31
+ Object.defineProperty(exports, "StepTrackerError", {
32
+ enumerable: true,
33
+ get: function () {
34
+ return _errors.StepTrackerError;
35
+ }
36
+ });
37
+ Object.defineProperty(exports, "default", {
38
+ enumerable: true,
39
+ get: function () {
40
+ return _StepTracker.StepTracker;
41
+ }
42
+ });
43
+ Object.defineProperty(exports, "isSupported", {
44
+ enumerable: true,
45
+ get: function () {
46
+ return _StepTracker.isSupported;
47
+ }
48
+ });
49
+ var _StepTracker = require("./StepTracker");
50
+ var _errors = require("./errors");
51
+ var _constants = require("./constants");
52
+ var _hooks = require("./hooks");
53
+ Object.keys(_hooks).forEach(function (key) {
54
+ if (key === "default" || key === "__esModule") return;
55
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
56
+ if (key in exports && exports[key] === _hooks[key]) return;
57
+ Object.defineProperty(exports, key, {
58
+ enumerable: true,
59
+ get: function () {
60
+ return _hooks[key];
61
+ }
62
+ });
63
+ });
64
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_StepTracker","require","_errors","_constants","_hooks","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAAE,UAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAAAI,MAAA,CAAAC,IAAA,CAAAF,MAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,MAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,MAAA,CAAAI,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ import { TurboModuleRegistry } from 'react-native';
4
+
5
+ /**
6
+ * Codegen spec. Everything crossing the bridge is an UnsafeObject so that a
7
+ * single native method can evolve without a codegen break; the strongly typed
8
+ * surface lives in `StepTracker.ts`, which is what consumers import.
9
+ */
10
+
11
+ export default TurboModuleRegistry.get('StepTrackerPro');
12
+ //# sourceMappingURL=NativeStepTrackerPro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["TurboModuleRegistry","get"],"sourceRoot":"../../src","sources":["NativeStepTrackerPro.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;;AAGlD;AACA;AACA;AACA;AACA;;AAyDA,eAAeA,mBAAmB,CAACC,GAAG,CAAO,gBAAgB,CAAC","ignoreList":[]}
@@ -0,0 +1,284 @@
1
+ "use strict";
2
+
3
+ import { NativeEventEmitter, NativeModules, Platform } from 'react-native';
4
+ import NativeStepTrackerPro from './NativeStepTrackerPro';
5
+ import { DEFAULT_CONFIG, MODULE_NAME, STRIDE_COEFFICIENT } from './constants';
6
+ import { StepTrackerError, toStepTrackerError } from './errors';
7
+ const LINKING_ERROR = `The native module '${MODULE_NAME}' could not be found.\n` + '- Rebuild the app after installing (npx react-native run-android)\n' + '- Make sure autolinking picked up the package\n' + '- This package is Android only.';
8
+ function getNativeModule() {
9
+ if (Platform.OS !== 'android') {
10
+ throw new StepTrackerError('E_UNSUPPORTED_PLATFORM', 'react-native-step-tracker-pro only supports Android.');
11
+ }
12
+ const mod = NativeStepTrackerPro ?? NativeModules[MODULE_NAME];
13
+ if (!mod) throw new StepTrackerError('E_UNKNOWN', LINKING_ERROR);
14
+ return mod;
15
+ }
16
+
17
+ /** Android is the only supported platform; call this before anything else. */
18
+ export function isSupported() {
19
+ if (Platform.OS !== 'android') return false;
20
+ return Boolean(NativeStepTrackerPro ?? NativeModules[MODULE_NAME]);
21
+ }
22
+ let emitter = null;
23
+ function getEmitter() {
24
+ if (!emitter) {
25
+ emitter = new NativeEventEmitter(NativeModules[MODULE_NAME] ?? undefined);
26
+ }
27
+ return emitter;
28
+ }
29
+ const EVENT_PREFIX = 'StepTrackerPro:';
30
+ async function call(fn) {
31
+ try {
32
+ return await fn();
33
+ } catch (error) {
34
+ throw toStepTrackerError(error);
35
+ }
36
+ }
37
+ function resolveStride(config) {
38
+ if (config.strideLength && config.strideLength > 0) return config.strideLength;
39
+ const height = config.height ?? DEFAULT_CONFIG.height;
40
+ const sex = config.sex ?? DEFAULT_CONFIG.sex;
41
+ return height * STRIDE_COEFFICIENT[sex] / 100;
42
+ }
43
+ const DATE_KEY = /^\d{4}-\d{2}-\d{2}$/;
44
+ function assertRange(startDate, endDate) {
45
+ if (!DATE_KEY.test(startDate) || !DATE_KEY.test(endDate)) {
46
+ throw new StepTrackerError('E_INVALID_CONFIG', 'Dates must be yyyy-MM-dd');
47
+ }
48
+ if (startDate > endDate) {
49
+ throw new StepTrackerError('E_INVALID_CONFIG', `startDate (${startDate}) must be on or before endDate (${endDate})`);
50
+ }
51
+ }
52
+ function normaliseConfig(config) {
53
+ const daily = config.dailyGoal ?? DEFAULT_CONFIG.dailyGoal;
54
+ if (daily <= 0) {
55
+ throw new StepTrackerError('E_INVALID_CONFIG', 'dailyGoal must be > 0');
56
+ }
57
+ if (config.height != null && (config.height < 50 || config.height > 260)) {
58
+ throw new StepTrackerError('E_INVALID_CONFIG', 'height must be 50–260 cm');
59
+ }
60
+ if (config.weight != null && (config.weight < 10 || config.weight > 400)) {
61
+ throw new StepTrackerError('E_INVALID_CONFIG', 'weight must be 10–400 kg');
62
+ }
63
+ if (config.persistEveryNSteps != null && config.persistEveryNSteps < 1) {
64
+ // 0 makes the native `pendingCommit >= threshold` check true with nothing
65
+ // pending, which turns every step into a database write.
66
+ throw new StepTrackerError('E_INVALID_CONFIG', 'persistEveryNSteps must be >= 1');
67
+ }
68
+ if (config.calorieCoefficient != null && config.calorieCoefficient < 0) {
69
+ throw new StepTrackerError('E_INVALID_CONFIG', 'calorieCoefficient must be >= 0');
70
+ }
71
+ if (config.historyRetentionDays != null && config.historyRetentionDays < 1) {
72
+ throw new StepTrackerError('E_INVALID_CONFIG', 'historyRetentionDays must be >= 1');
73
+ }
74
+ const normalised = {
75
+ ...DEFAULT_CONFIG,
76
+ ...config,
77
+ weeklyGoal: config.weeklyGoal ?? daily * 7,
78
+ monthlyGoal: config.monthlyGoal ?? daily * 30
79
+ };
80
+
81
+ // Only derive a stride when the caller actually supplied something it is
82
+ // derived from. Deriving unconditionally meant that initialize({dailyGoal})
83
+ // on a returning user recomputed their stride from the default 170 cm and
84
+ // silently discarded the height they had configured; omitting the key leaves
85
+ // whatever the native side already has.
86
+ if (config.strideLength != null || config.height != null || config.sex != null) {
87
+ normalised.strideLength = resolveStride(config);
88
+ } else {
89
+ delete normalised.strideLength;
90
+ }
91
+ return normalised;
92
+ }
93
+
94
+ /**
95
+ * The public API. All methods reject with a `StepTrackerError` carrying a
96
+ * stable `code`, so callers can branch without string matching.
97
+ */
98
+ export const StepTracker = {
99
+ /**
100
+ * Loads config into the native layer and restores any persisted state.
101
+ * Safe to call on every app launch — it is idempotent.
102
+ */
103
+ async initialize(config = {}) {
104
+ const merged = normaliseConfig(config);
105
+ return call(() => getNativeModule().initialize(merged));
106
+ },
107
+ /** Patches config at runtime. Notification and goals update immediately. */
108
+ async updateConfig(config) {
109
+ const patch = {
110
+ ...config
111
+ };
112
+ if (config.height != null || config.sex != null || config.strideLength != null) {
113
+ // Stride depends on height *and* sex, so a patch carrying only one of
114
+ // them has to be combined with the stored value of the other. Passing the
115
+ // bare patch fell back to the package defaults instead, which silently
116
+ // reset a 190 cm user to 170 cm on updateConfig({ sex }).
117
+ const current = await StepTracker.getConfig();
118
+ patch.strideLength = resolveStride({
119
+ height: config.height ?? current.height,
120
+ sex: config.sex ?? current.sex,
121
+ strideLength: config.strideLength
122
+ });
123
+ }
124
+ return call(() => getNativeModule().updateConfig(patch));
125
+ },
126
+ async getConfig() {
127
+ return call(() => getNativeModule().getConfig());
128
+ },
129
+ /** Starts the foreground service. Requires permissions to be granted first. */
130
+ async startTracking() {
131
+ return call(() => getNativeModule().startTracking());
132
+ },
133
+ /** Keeps the service and notification alive but ignores sensor deltas. */
134
+ async pauseTracking() {
135
+ return call(() => getNativeModule().pauseTracking());
136
+ },
137
+ async resumeTracking() {
138
+ return call(() => getNativeModule().resumeTracking());
139
+ },
140
+ /** Flushes to the database, unregisters sensors and kills the service. */
141
+ async stopTracking() {
142
+ return call(() => getNativeModule().stopTracking());
143
+ },
144
+ async getTrackingState() {
145
+ const result = await call(() => getNativeModule().getTrackingState());
146
+ return result.state;
147
+ },
148
+ async isTracking() {
149
+ return call(() => getNativeModule().isTracking());
150
+ },
151
+ // ---- reads -----------------------------------------------------------
152
+
153
+ async getTodaySteps() {
154
+ return call(() => getNativeModule().getTodaySteps());
155
+ },
156
+ async getYesterdaySteps() {
157
+ return call(() => getNativeModule().getYesterdaySteps());
158
+ },
159
+ /** @param date yyyy-MM-dd */
160
+ async getStepsForDate(date) {
161
+ return call(() => getNativeModule().getStepsForDate(date));
162
+ },
163
+ async getWeeklyStats(options = {}) {
164
+ return call(() => getNativeModule().getWeeklyStats(options));
165
+ },
166
+ async getMonthlyStats(options = {}) {
167
+ return call(() => getNativeModule().getMonthlyStats(options));
168
+ },
169
+ async getYearlyStats(options = {}) {
170
+ return call(() => getNativeModule().getYearlyStats(options));
171
+ },
172
+ /** Inclusive on both ends. Dates are yyyy-MM-dd, and start must precede end. */
173
+ async getStatsForRange(startDate, endDate) {
174
+ assertRange(startDate, endDate);
175
+ return call(() => getNativeModule().getStatsForRange(startDate, endDate));
176
+ },
177
+ async getHistory(startDate, endDate) {
178
+ assertRange(startDate, endDate);
179
+ const result = await call(() => getNativeModule().getHistory(startDate, endDate));
180
+ return result.records;
181
+ },
182
+ // ---- writes ----------------------------------------------------------
183
+
184
+ /** Zeroes today's counter without touching history. Useful in QA builds. */
185
+ async resetToday() {
186
+ return call(() => getNativeModule().resetToday());
187
+ },
188
+ async clearHistory() {
189
+ return call(() => getNativeModule().clearHistory());
190
+ },
191
+ /** Deletes rows older than `retentionDays`; returns rows removed. */
192
+ async pruneHistory(retentionDays) {
193
+ return call(() => getNativeModule().pruneHistory(retentionDays ?? DEFAULT_CONFIG.historyRetentionDays));
194
+ },
195
+ // ---- permissions -----------------------------------------------------
196
+
197
+ async checkPermissions() {
198
+ return call(() => getNativeModule().checkPermissions());
199
+ },
200
+ /** Shows the Android runtime dialogs. Must be called with an Activity attached. */
201
+ async requestPermissions() {
202
+ return call(() => getNativeModule().requestPermissions());
203
+ },
204
+ async getDeviceCapabilities() {
205
+ return call(() => getNativeModule().getDeviceCapabilities());
206
+ },
207
+ async openAppSettings() {
208
+ return call(() => getNativeModule().openAppSettings());
209
+ },
210
+ // ---- battery ---------------------------------------------------------
211
+
212
+ /** True when the OS is still applying doze restrictions to this app. */
213
+ async isBatteryOptimizationEnabled() {
214
+ return call(() => getNativeModule().isBatteryOptimizationEnabled());
215
+ },
216
+ /**
217
+ * Shows the system exemption dialog. Play policy requires an eligible use
218
+ * case — see docs/PLAY_STORE_COMPLIANCE.md before shipping this.
219
+ */
220
+ async requestDisableBatteryOptimization() {
221
+ return call(() => getNativeModule().requestDisableBatteryOptimization());
222
+ },
223
+ /** Policy-safe alternative: opens the settings list, no direct prompt. */
224
+ async openBatteryOptimizationSettings() {
225
+ return call(() => getNativeModule().openBatteryOptimizationSettings());
226
+ },
227
+ /** Best-effort deep link into Xiaomi/Oppo/Vivo/Huawei autostart screens. */
228
+ async openManufacturerAutoStartSettings() {
229
+ return call(() => getNativeModule().openManufacturerAutoStartSettings());
230
+ },
231
+ // ---- health connect --------------------------------------------------
232
+
233
+ async getHealthConnectStatus() {
234
+ return call(() => getNativeModule().getHealthConnectStatus());
235
+ },
236
+ async requestHealthConnectPermissions() {
237
+ return call(() => getNativeModule().requestHealthConnectPermissions());
238
+ },
239
+ async openHealthConnectSettings() {
240
+ return call(() => getNativeModule().openHealthConnectSettings());
241
+ },
242
+ /** ISO-8601 instants, e.g. '2026-09-01T00:00:00Z'. */
243
+ async readHealthConnectSteps(startIso, endIso) {
244
+ return call(() => getNativeModule().readHealthConnectSteps(startIso, endIso));
245
+ },
246
+ /** Upserts one day's steps/distance/calories into Health Connect. */
247
+ async writeHealthConnectSteps(date) {
248
+ return call(() => getNativeModule().writeHealthConnectSteps(date));
249
+ },
250
+ async syncWithHealthConnect() {
251
+ return call(() => getNativeModule().syncWithHealthConnect());
252
+ },
253
+ // ---- sync ------------------------------------------------------------
254
+
255
+ async getPendingSyncCount() {
256
+ return call(() => getNativeModule().getPendingSyncCount());
257
+ },
258
+ /** Runs Health Connect + remote sync immediately instead of waiting for WorkManager. */
259
+ async syncNow() {
260
+ const result = await call(() => getNativeModule().syncNow());
261
+ return result.results;
262
+ },
263
+ // ---- events ----------------------------------------------------------
264
+
265
+ addListener(event, listener) {
266
+ if (Platform.OS !== 'android') return {
267
+ remove: () => {}
268
+ };
269
+ const sub = getEmitter().addListener(`${EVENT_PREFIX}${event}`, listener);
270
+ return {
271
+ remove: () => sub.remove()
272
+ };
273
+ },
274
+ /** Removes every listener for one event, or all events when omitted. */
275
+ removeListener(event) {
276
+ if (Platform.OS !== 'android') return;
277
+ const em = getEmitter();
278
+ if (event) em.removeAllListeners(`${EVENT_PREFIX}${event}`);else {
279
+ ['stepsChanged', 'goalReached', 'goalProgressChanged', 'trackingStateChanged', 'dayChanged', 'syncCompleted', 'error'].forEach(name => em.removeAllListeners(`${EVENT_PREFIX}${name}`));
280
+ }
281
+ }
282
+ };
283
+ export default StepTracker;
284
+ //# sourceMappingURL=StepTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NativeEventEmitter","NativeModules","Platform","NativeStepTrackerPro","DEFAULT_CONFIG","MODULE_NAME","STRIDE_COEFFICIENT","StepTrackerError","toStepTrackerError","LINKING_ERROR","getNativeModule","OS","mod","isSupported","Boolean","emitter","getEmitter","undefined","EVENT_PREFIX","call","fn","error","resolveStride","config","strideLength","height","sex","DATE_KEY","assertRange","startDate","endDate","test","normaliseConfig","daily","dailyGoal","weight","persistEveryNSteps","calorieCoefficient","historyRetentionDays","normalised","weeklyGoal","monthlyGoal","StepTracker","initialize","merged","updateConfig","patch","current","getConfig","startTracking","pauseTracking","resumeTracking","stopTracking","getTrackingState","result","state","isTracking","getTodaySteps","getYesterdaySteps","getStepsForDate","date","getWeeklyStats","options","getMonthlyStats","getYearlyStats","getStatsForRange","getHistory","records","resetToday","clearHistory","pruneHistory","retentionDays","checkPermissions","requestPermissions","getDeviceCapabilities","openAppSettings","isBatteryOptimizationEnabled","requestDisableBatteryOptimization","openBatteryOptimizationSettings","openManufacturerAutoStartSettings","getHealthConnectStatus","requestHealthConnectPermissions","openHealthConnectSettings","readHealthConnectSteps","startIso","endIso","writeHealthConnectSteps","syncWithHealthConnect","getPendingSyncCount","syncNow","results","addListener","event","listener","remove","sub","removeListener","em","removeAllListeners","forEach","name"],"sourceRoot":"../../src","sources":["StepTracker.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ export const MODULE_NAME = 'StepTrackerPro';
4
+ export const DEFAULT_CONFIG = {
5
+ height: 170,
6
+ weight: 70,
7
+ sex: 'unspecified',
8
+ dailyGoal: 10000,
9
+ calorieCoefficient: 0.57,
10
+ historyRetentionDays: 35,
11
+ notificationActions: true,
12
+ notificationThrottleMs: 1000,
13
+ eventThrottleMs: 500,
14
+ persistEveryNSteps: 10,
15
+ healthConnectEnabled: true,
16
+ healthConnectSyncIntervalMinutes: 30,
17
+ autoStartOnBoot: true
18
+ };
19
+
20
+ /** Stride length = height(cm) * coefficient / 100. */
21
+ export const STRIDE_COEFFICIENT = {
22
+ male: 0.415,
23
+ female: 0.413,
24
+ unspecified: 0.414
25
+ };
26
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MODULE_NAME","DEFAULT_CONFIG","height","weight","sex","dailyGoal","calorieCoefficient","historyRetentionDays","notificationActions","notificationThrottleMs","eventThrottleMs","persistEveryNSteps","healthConnectEnabled","healthConnectSyncIntervalMinutes","autoStartOnBoot","STRIDE_COEFFICIENT","male","female","unspecified"],"sourceRoot":"../../src","sources":["constants.ts"],"mappings":";;AAEA,OAAO,MAAMA,WAAW,GAAG,gBAAgB;AAE3C,OAAO,MAAMC,cAiBZ,GAAG;EACFC,MAAM,EAAE,GAAG;EACXC,MAAM,EAAE,EAAE;EACVC,GAAG,EAAE,aAAa;EAClBC,SAAS,EAAE,KAAK;EAChBC,kBAAkB,EAAE,IAAI;EACxBC,oBAAoB,EAAE,EAAE;EACxBC,mBAAmB,EAAE,IAAI;EACzBC,sBAAsB,EAAE,IAAI;EAC5BC,eAAe,EAAE,GAAG;EACpBC,kBAAkB,EAAE,EAAE;EACtBC,oBAAoB,EAAE,IAAI;EAC1BC,gCAAgC,EAAE,EAAE;EACpCC,eAAe,EAAE;AACnB,CAAC;;AAED;AACA,OAAO,MAAMC,kBAAkB,GAAG;EAChCC,IAAI,EAAE,KAAK;EACXC,MAAM,EAAE,KAAK;EACbC,WAAW,EAAE;AACf,CAAU","ignoreList":[]}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ export class StepTrackerError extends Error {
4
+ constructor(code, message) {
5
+ super(message);
6
+ this.name = 'StepTrackerError';
7
+ this.code = code;
8
+ }
9
+ }
10
+
11
+ /** Normalises rejections coming off the native bridge. */
12
+ export function toStepTrackerError(error) {
13
+ if (error instanceof StepTrackerError) return error;
14
+ const anyError = error;
15
+ const code = anyError?.code ?? 'E_UNKNOWN';
16
+ return new StepTrackerError(code, anyError?.message ?? 'Unknown native error');
17
+ }
18
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["StepTrackerError","Error","constructor","code","message","name","toStepTrackerError","error","anyError"],"sourceRoot":"../../src","sources":["errors.ts"],"mappings":";;AAcA,OAAO,MAAMA,gBAAgB,SAASC,KAAK,CAAC;EAG1CC,WAAWA,CAACC,IAA0B,EAAEC,OAAe,EAAE;IACvD,KAAK,CAACA,OAAO,CAAC;IACd,IAAI,CAACC,IAAI,GAAG,kBAAkB;IAC9B,IAAI,CAACF,IAAI,GAAGA,IAAI;EAClB;AACF;;AAEA;AACA,OAAO,SAASG,kBAAkBA,CAACC,KAAc,EAAoB;EACnE,IAAIA,KAAK,YAAYP,gBAAgB,EAAE,OAAOO,KAAK;EACnD,MAAMC,QAAQ,GAAGD,KAAmD;EACpE,MAAMJ,IAAI,GAAIK,QAAQ,EAAEL,IAAI,IAAI,WAAoC;EACpE,OAAO,IAAIH,gBAAgB,CAACG,IAAI,EAAEK,QAAQ,EAAEJ,OAAO,IAAI,sBAAsB,CAAC;AAChF","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ export { useStepTracker } from './useStepTracker';
4
+ export { useStepStats } from './useStepStats';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useStepTracker","useStepStats"],"sourceRoot":"../../../src","sources":["hooks/index.ts"],"mappings":";;AAAA,SAASA,cAAc,QAAQ,kBAAkB;AAEjD,SAASC,YAAY,QAAQ,gBAAgB","ignoreList":[]}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ import { useCallback, useEffect, useState } from 'react';
4
+ import StepTracker, { isSupported } from '../StepTracker';
5
+ /** Fetches a windowed summary and refreshes it when the day rolls over. */
6
+ export function useStepStats(period, options = {}) {
7
+ const [stats, setStats] = useState(null);
8
+ const [loading, setLoading] = useState(true);
9
+ const [error, setError] = useState(null);
10
+ const {
11
+ mode,
12
+ offset
13
+ } = options;
14
+ const reload = useCallback(async () => {
15
+ if (!isSupported()) {
16
+ setLoading(false);
17
+ return;
18
+ }
19
+ setLoading(true);
20
+ try {
21
+ const opts = {
22
+ mode,
23
+ offset
24
+ };
25
+ const next = period === 'week' ? await StepTracker.getWeeklyStats(opts) : period === 'month' ? await StepTracker.getMonthlyStats(opts) : await StepTracker.getYearlyStats(opts);
26
+ setStats(next);
27
+ setError(null);
28
+ } catch (e) {
29
+ setError(e);
30
+ } finally {
31
+ setLoading(false);
32
+ }
33
+ }, [period, mode, offset]);
34
+ useEffect(() => {
35
+ void reload();
36
+ const sub = StepTracker.addListener('dayChanged', () => void reload());
37
+ return () => sub.remove();
38
+ }, [reload]);
39
+ return {
40
+ stats,
41
+ loading,
42
+ error,
43
+ reload
44
+ };
45
+ }
46
+ //# sourceMappingURL=useStepStats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useEffect","useState","StepTracker","isSupported","useStepStats","period","options","stats","setStats","loading","setLoading","error","setError","mode","offset","reload","opts","next","getWeeklyStats","getMonthlyStats","getYearlyStats","e","sub","addListener","remove"],"sourceRoot":"../../../src","sources":["hooks/useStepStats.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AACxD,OAAOC,WAAW,IAAIC,WAAW,QAAQ,gBAAgB;AAYzD;AACA,OAAO,SAASC,YAAYA,CAC1BC,MAAmB,EACnBC,OAAqB,GAAG,CAAC,CAAC,EACN;EACpB,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,GAAGP,QAAQ,CAAoB,IAAI,CAAC;EAC3D,MAAM,CAACQ,OAAO,EAAEC,UAAU,CAAC,GAAGT,QAAQ,CAAC,IAAI,CAAC;EAC5C,MAAM,CAACU,KAAK,EAAEC,QAAQ,CAAC,GAAGX,QAAQ,CAAe,IAAI,CAAC;EAEtD,MAAM;IAAEY,IAAI;IAAEC;EAAO,CAAC,GAAGR,OAAO;EAEhC,MAAMS,MAAM,GAAGhB,WAAW,CAAC,YAAY;IACrC,IAAI,CAACI,WAAW,CAAC,CAAC,EAAE;MAClBO,UAAU,CAAC,KAAK,CAAC;MACjB;IACF;IACAA,UAAU,CAAC,IAAI,CAAC;IAChB,IAAI;MACF,MAAMM,IAAkB,GAAG;QAAEH,IAAI;QAAEC;MAAO,CAAC;MAC3C,MAAMG,IAAI,GACRZ,MAAM,KAAK,MAAM,GACb,MAAMH,WAAW,CAACgB,cAAc,CAACF,IAAI,CAAC,GACtCX,MAAM,KAAK,OAAO,GAChB,MAAMH,WAAW,CAACiB,eAAe,CAACH,IAAI,CAAC,GACvC,MAAMd,WAAW,CAACkB,cAAc,CAACJ,IAAI,CAAC;MAC9CR,QAAQ,CAACS,IAAI,CAAC;MACdL,QAAQ,CAAC,IAAI,CAAC;IAChB,CAAC,CAAC,OAAOS,CAAC,EAAE;MACVT,QAAQ,CAACS,CAAU,CAAC;IACtB,CAAC,SAAS;MACRX,UAAU,CAAC,KAAK,CAAC;IACnB;EACF,CAAC,EAAE,CAACL,MAAM,EAAEQ,IAAI,EAAEC,MAAM,CAAC,CAAC;EAE1Bd,SAAS,CAAC,MAAM;IACd,KAAKe,MAAM,CAAC,CAAC;IACb,MAAMO,GAAG,GAAGpB,WAAW,CAACqB,WAAW,CAAC,YAAY,EAAE,MAAM,KAAKR,MAAM,CAAC,CAAC,CAAC;IACtE,OAAO,MAAMO,GAAG,CAACE,MAAM,CAAC,CAAC;EAC3B,CAAC,EAAE,CAACT,MAAM,CAAC,CAAC;EAEZ,OAAO;IAAER,KAAK;IAAEE,OAAO;IAAEE,KAAK;IAAEI;EAAO,CAAC;AAC1C","ignoreList":[]}
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+
3
+ import { useCallback, useEffect, useRef, useState } from 'react';
4
+ import { AppState } from 'react-native';
5
+ import StepTracker, { isSupported } from '../StepTracker';
6
+ /**
7
+ * Wires the tracker into a component: initialises once, subscribes to
8
+ * `stepsChanged`, and re-reads the snapshot when the app is foregrounded.
9
+ */
10
+ export function useStepTracker(options = {}) {
11
+ const {
12
+ autoStart = false,
13
+ refreshOnForeground = true,
14
+ onGoalReached,
15
+ ...config
16
+ } = options;
17
+ const [snapshot, setSnapshot] = useState(null);
18
+ const [state, setState] = useState('idle');
19
+ const [ready, setReady] = useState(false);
20
+ const [error, setError] = useState(null);
21
+ const configRef = useRef(config);
22
+ configRef.current = config;
23
+ const goalRef = useRef(onGoalReached);
24
+ goalRef.current = onGoalReached;
25
+ const refresh = useCallback(async () => {
26
+ if (!isSupported()) return;
27
+ try {
28
+ setSnapshot(await StepTracker.getTodaySteps());
29
+ setState(await StepTracker.getTrackingState());
30
+ } catch (e) {
31
+ setError(e);
32
+ }
33
+ }, []);
34
+ useEffect(() => {
35
+ let cancelled = false;
36
+ if (!isSupported()) {
37
+ setState('unsupported');
38
+ setReady(true);
39
+ return;
40
+ }
41
+ (async () => {
42
+ try {
43
+ const initial = await StepTracker.initialize(configRef.current);
44
+ if (cancelled) return;
45
+ setSnapshot(initial);
46
+ setState(initial.state);
47
+ if (autoStart) {
48
+ const perms = await StepTracker.checkPermissions();
49
+ if (perms.allGranted) {
50
+ const started = await StepTracker.startTracking();
51
+ if (!cancelled) {
52
+ setSnapshot(started);
53
+ setState(started.state);
54
+ }
55
+ }
56
+ }
57
+ } catch (e) {
58
+ if (!cancelled) setError(e);
59
+ } finally {
60
+ if (!cancelled) setReady(true);
61
+ }
62
+ })();
63
+ const stepsSub = StepTracker.addListener('stepsChanged', payload => {
64
+ setSnapshot(payload);
65
+ });
66
+ const stateSub = StepTracker.addListener('trackingStateChanged', payload => {
67
+ setState(payload.state);
68
+ });
69
+ const goalSub = StepTracker.addListener('goalReached', payload => {
70
+ goalRef.current?.(payload);
71
+ });
72
+ const daySub = StepTracker.addListener('dayChanged', () => {
73
+ void refresh();
74
+ });
75
+ return () => {
76
+ cancelled = true;
77
+ stepsSub.remove();
78
+ stateSub.remove();
79
+ goalSub.remove();
80
+ daySub.remove();
81
+ };
82
+ }, [autoStart, refresh]);
83
+ useEffect(() => {
84
+ if (!refreshOnForeground) return;
85
+ const sub = AppState.addEventListener('change', next => {
86
+ if (next === 'active') void refresh();
87
+ });
88
+ return () => sub.remove();
89
+ }, [refresh, refreshOnForeground]);
90
+
91
+ // Each action is memoised separately. Building them inline in the returned
92
+ // object handed callers a new function identity on every render, which loops
93
+ // any `useEffect` that lists one in its dependency array.
94
+ const run = useCallback(async fn => {
95
+ try {
96
+ const result = await fn();
97
+ setSnapshot(result);
98
+ setState(result.state);
99
+ } catch (e) {
100
+ setError(e);
101
+ }
102
+ }, []);
103
+ const start = useCallback(() => run(() => StepTracker.startTracking()), [run]);
104
+ const pause = useCallback(() => run(() => StepTracker.pauseTracking()), [run]);
105
+ const resume = useCallback(() => run(() => StepTracker.resumeTracking()), [run]);
106
+ const stop = useCallback(() => run(() => StepTracker.stopTracking()), [run]);
107
+ const requestPermissions = useCallback(async () => {
108
+ try {
109
+ const result = await StepTracker.requestPermissions();
110
+ return result.allGranted;
111
+ } catch (e) {
112
+ setError(e);
113
+ return false;
114
+ }
115
+ }, []);
116
+ return {
117
+ snapshot,
118
+ state,
119
+ ready,
120
+ error,
121
+ refresh,
122
+ start,
123
+ pause,
124
+ resume,
125
+ stop,
126
+ requestPermissions
127
+ };
128
+ }
129
+ //# sourceMappingURL=useStepTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useEffect","useRef","useState","AppState","StepTracker","isSupported","useStepTracker","options","autoStart","refreshOnForeground","onGoalReached","config","snapshot","setSnapshot","state","setState","ready","setReady","error","setError","configRef","current","goalRef","refresh","getTodaySteps","getTrackingState","e","cancelled","initial","initialize","perms","checkPermissions","allGranted","started","startTracking","stepsSub","addListener","payload","stateSub","goalSub","daySub","remove","sub","addEventListener","next","run","fn","result","start","pause","pauseTracking","resume","resumeTracking","stop","stopTracking","requestPermissions"],"sourceRoot":"../../../src","sources":["hooks/useStepTracker.ts"],"mappings":"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","ignoreList":[]}