spotny-sdk 0.2.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.
Potentially problematic release.
This version of spotny-sdk might be problematic. Click here for more details.
- package/LICENSE +20 -0
- package/README.md +37 -0
- package/SpotnySdk.podspec +29 -0
- package/android/build.gradle +70 -0
- package/android/src/main/AndroidManifest.xml +33 -0
- package/android/src/main/java/com/spotnysdk/SpotnySdkModule.kt +565 -0
- package/android/src/main/java/com/spotnysdk/SpotnySdkPackage.kt +31 -0
- package/ios/SpotnyBeaconScanner.swift +681 -0
- package/ios/SpotnySdk-Bridging-Header.h +8 -0
- package/ios/SpotnySdk.h +10 -0
- package/ios/SpotnySdk.mm +120 -0
- package/lib/module/NativeSpotnySdk.js +5 -0
- package/lib/module/NativeSpotnySdk.js.map +1 -0
- package/lib/module/index.js +101 -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/NativeSpotnySdk.d.ts +18 -0
- package/lib/typescript/src/NativeSpotnySdk.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +68 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/package.json +169 -0
- package/src/NativeSpotnySdk.ts +29 -0
- package/src/index.tsx +141 -0
package/ios/SpotnySdk.mm
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#import "SpotnySdk.h"
|
|
2
|
+
// Auto-generated Swift header (contains SpotnyBeaconScanner)
|
|
3
|
+
#import "SpotnySdk-Swift.h"
|
|
4
|
+
|
|
5
|
+
@implementation SpotnySdk {
|
|
6
|
+
SpotnyBeaconScanner *_scanner;
|
|
7
|
+
BOOL _hasListeners;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// ── Module registration ─────────────────────────────────────────────────────
|
|
11
|
+
|
|
12
|
+
RCT_EXPORT_MODULE()
|
|
13
|
+
|
|
14
|
+
+ (BOOL)requiresMainQueueSetup {
|
|
15
|
+
return YES;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
- (instancetype)init {
|
|
19
|
+
if (self = [super init]) {
|
|
20
|
+
__weak SpotnySdk *weakSelf = self;
|
|
21
|
+
_scanner = [[SpotnyBeaconScanner alloc] initWithEventCallback:^(NSString *name, NSDictionary *body) {
|
|
22
|
+
SpotnySdk *strongSelf = weakSelf;
|
|
23
|
+
if (strongSelf && strongSelf->_hasListeners) {
|
|
24
|
+
[strongSelf sendEventWithName:name body:body];
|
|
25
|
+
}
|
|
26
|
+
}];
|
|
27
|
+
}
|
|
28
|
+
return self;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ── RCTEventEmitter ─────────────────────────────────────────────────────────
|
|
32
|
+
|
|
33
|
+
- (NSArray<NSString *> *)supportedEvents {
|
|
34
|
+
return @[@"onBeaconsRanged", @"onBeaconRegionEvent"];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
- (void)startObserving {
|
|
38
|
+
_hasListeners = YES;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
- (void)stopObserving {
|
|
42
|
+
_hasListeners = NO;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ── Turbo Module: addListener / removeListeners ─────────────────────────────
|
|
46
|
+
// These are required by the codegen spec when the module emits events.
|
|
47
|
+
|
|
48
|
+
- (void)addListener:(NSString *)eventName {
|
|
49
|
+
[super addListener:eventName];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
- (void)removeListeners:(double)count {
|
|
53
|
+
[super removeListeners:count];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ── Method implementations ───────────────────────────────────────────────────
|
|
57
|
+
|
|
58
|
+
- (void)startScanner:(NSString *)userUUID
|
|
59
|
+
userId:(NSNumber *)userId
|
|
60
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
61
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
62
|
+
[_scanner startScannerWithUserUUID:userUUID userId:userId resolve:resolve reject:reject];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
- (void)stopScanner:(RCTPromiseResolveBlock)resolve
|
|
66
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
67
|
+
[_scanner stopScannerWithResolve:resolve reject:reject];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
- (void)isScanning:(RCTPromiseResolveBlock)resolve
|
|
71
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
72
|
+
[_scanner isScanningWithResolve:resolve reject:reject];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
- (void)configure:(NSDictionary *)config
|
|
76
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
77
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
78
|
+
[_scanner configureWith:config resolve:resolve reject:reject];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
- (void)requestNotificationPermissions:(RCTPromiseResolveBlock)resolve
|
|
82
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
83
|
+
[_scanner requestNotificationPermissionsWithResolve:resolve reject:reject];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
- (void)getDebugLogs:(RCTPromiseResolveBlock)resolve
|
|
87
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
88
|
+
[_scanner getDebugLogsWithResolve:resolve reject:reject];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
- (void)clearDebugLogs:(RCTPromiseResolveBlock)resolve
|
|
92
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
93
|
+
[_scanner clearDebugLogsWithResolve:resolve reject:reject];
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
- (void)setDebounceInterval:(double)interval
|
|
97
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
98
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
99
|
+
[_scanner setDebounceInterval:interval resolve:resolve reject:reject];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
- (void)clearDebounceCache:(RCTPromiseResolveBlock)resolve
|
|
103
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
104
|
+
[_scanner clearDebounceCacheWithResolve:resolve reject:reject];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
- (void)getDebounceStatus:(RCTPromiseResolveBlock)resolve
|
|
108
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
109
|
+
[_scanner getDebounceStatusWithResolve:resolve reject:reject];
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// ── TurboModule JSI bridge ───────────────────────────────────────────────────
|
|
113
|
+
|
|
114
|
+
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
|
|
115
|
+
(const facebook::react::ObjCTurboModule::InitParams &)params
|
|
116
|
+
{
|
|
117
|
+
return std::make_shared<facebook::react::NativeSpotnySdkSpecJSI>(params);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
@end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeSpotnySdk.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;AA4BpE,eAAeA,mBAAmB,CAACC,YAAY,CAAO,WAAW,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { NativeEventEmitter, NativeModules } from 'react-native';
|
|
4
|
+
import NativeSpotnySdk from "./NativeSpotnySdk.js";
|
|
5
|
+
|
|
6
|
+
// ── Event names ──────────────────────────────────────────────────────────────
|
|
7
|
+
export const SpotnyEvents = {
|
|
8
|
+
ON_BEACONS_RANGED: 'onBeaconsRanged',
|
|
9
|
+
ON_BEACON_REGION_EVENT: 'onBeaconRegionEvent'
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
// ── Types ────────────────────────────────────────────────────────────────────
|
|
13
|
+
|
|
14
|
+
// ── Internal event emitter ───────────────────────────────────────────────────
|
|
15
|
+
const eventEmitter = new NativeEventEmitter(NativeModules.SpotnySdk);
|
|
16
|
+
|
|
17
|
+
// ── Core scanning ────────────────────────────────────────────────────────────
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Start beacon scanning.
|
|
21
|
+
* @param userUUID A unique string identifying this installation / user session.
|
|
22
|
+
* @param userId Optional authenticated user ID.
|
|
23
|
+
*/
|
|
24
|
+
export function startScanner(userUUID, userId) {
|
|
25
|
+
return NativeSpotnySdk.startScanner(userUUID, userId ?? null);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Stop beacon scanning and clean up all state. */
|
|
29
|
+
export function stopScanner() {
|
|
30
|
+
return NativeSpotnySdk.stopScanner();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Returns `true` if the SDK is currently scanning. */
|
|
34
|
+
export function isScanning() {
|
|
35
|
+
return NativeSpotnySdk.isScanning();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ── Configuration ────────────────────────────────────────────────────────────
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Override SDK configuration at runtime.
|
|
42
|
+
* Must be called **before** `startScanner`.
|
|
43
|
+
*/
|
|
44
|
+
export function configure(config) {
|
|
45
|
+
return NativeSpotnySdk.configure(config);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// ── Permissions ──────────────────────────────────────────────────────────────
|
|
49
|
+
|
|
50
|
+
/** (iOS) Prompt the user for local-notification permissions. */
|
|
51
|
+
export function requestNotificationPermissions() {
|
|
52
|
+
return NativeSpotnySdk.requestNotificationPermissions();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ── Debug helpers ─────────────────────────────────────────────────────────────
|
|
56
|
+
|
|
57
|
+
/** Read the on-device debug log file. */
|
|
58
|
+
export function getDebugLogs() {
|
|
59
|
+
return NativeSpotnySdk.getDebugLogs();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Delete the on-device debug log file. */
|
|
63
|
+
export function clearDebugLogs() {
|
|
64
|
+
return NativeSpotnySdk.clearDebugLogs();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// ── Debounce helpers ──────────────────────────────────────────────────────────
|
|
68
|
+
|
|
69
|
+
/** Override the proximity-event debounce interval (seconds). */
|
|
70
|
+
export function setDebounceInterval(interval) {
|
|
71
|
+
return NativeSpotnySdk.setDebounceInterval(interval);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Clear the debounce / cooldown cache for all beacons. */
|
|
75
|
+
export function clearDebounceCache() {
|
|
76
|
+
return NativeSpotnySdk.clearDebounceCache();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Return the current debounce status for all tracked beacons. */
|
|
80
|
+
export function getDebounceStatus() {
|
|
81
|
+
return NativeSpotnySdk.getDebounceStatus();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// ── Event subscriptions ───────────────────────────────────────────────────────
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Subscribe to continuous ranging updates.
|
|
88
|
+
* The callback fires roughly every second while beacons are in range.
|
|
89
|
+
*/
|
|
90
|
+
export function addBeaconsRangedListener(callback) {
|
|
91
|
+
return eventEmitter.addListener(SpotnyEvents.ON_BEACONS_RANGED, callback);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Subscribe to region enter/exit events.
|
|
96
|
+
* These fire in all app states (foreground, background, terminated on iOS).
|
|
97
|
+
*/
|
|
98
|
+
export function addBeaconRegionListener(callback) {
|
|
99
|
+
return eventEmitter.addListener(SpotnyEvents.ON_BEACON_REGION_EVENT, callback);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NativeEventEmitter","NativeModules","NativeSpotnySdk","SpotnyEvents","ON_BEACONS_RANGED","ON_BEACON_REGION_EVENT","eventEmitter","SpotnySdk","startScanner","userUUID","userId","stopScanner","isScanning","configure","config","requestNotificationPermissions","getDebugLogs","clearDebugLogs","setDebounceInterval","interval","clearDebounceCache","getDebounceStatus","addBeaconsRangedListener","callback","addListener","addBeaconRegionListener"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,kBAAkB,EAAEC,aAAa,QAAQ,cAAc;AAChE,OAAOC,eAAe,MAAM,sBAAmB;;AAE/C;AACA,OAAO,MAAMC,YAAY,GAAG;EAC1BC,iBAAiB,EAAE,iBAAiB;EACpCC,sBAAsB,EAAE;AAC1B,CAAU;;AAEV;;AAgCA;AACA,MAAMC,YAAY,GAAG,IAAIN,kBAAkB,CAACC,aAAa,CAACM,SAAS,CAAC;;AAEpE;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAC1BC,QAAgB,EAChBC,MAAsB,EACL;EACjB,OAAOR,eAAe,CAACM,YAAY,CAACC,QAAQ,EAAEC,MAAM,IAAI,IAAI,CAAC;AAC/D;;AAEA;AACA,OAAO,SAASC,WAAWA,CAAA,EAAoB;EAC7C,OAAOT,eAAe,CAACS,WAAW,CAAC,CAAC;AACtC;;AAEA;AACA,OAAO,SAASC,UAAUA,CAAA,EAAqB;EAC7C,OAAOV,eAAe,CAACU,UAAU,CAAC,CAAC;AACrC;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,SAASA,CAACC,MAAuB,EAAmB;EAClE,OAAOZ,eAAe,CAACW,SAAS,CAACC,MAAgB,CAAC;AACpD;;AAEA;;AAEA;AACA,OAAO,SAASC,8BAA8BA,CAAA,EAAoB;EAChE,OAAOb,eAAe,CAACa,8BAA8B,CAAC,CAAC;AACzD;;AAEA;;AAEA;AACA,OAAO,SAASC,YAAYA,CAAA,EAAoB;EAC9C,OAAOd,eAAe,CAACc,YAAY,CAAC,CAAC;AACvC;;AAEA;AACA,OAAO,SAASC,cAAcA,CAAA,EAAoB;EAChD,OAAOf,eAAe,CAACe,cAAc,CAAC,CAAC;AACzC;;AAEA;;AAEA;AACA,OAAO,SAASC,mBAAmBA,CAACC,QAAgB,EAAmB;EACrE,OAAOjB,eAAe,CAACgB,mBAAmB,CAACC,QAAQ,CAAC;AACtD;;AAEA;AACA,OAAO,SAASC,kBAAkBA,CAAA,EAAoB;EACpD,OAAOlB,eAAe,CAACkB,kBAAkB,CAAC,CAAC;AAC7C;;AAEA;AACA,OAAO,SAASC,iBAAiBA,CAAA,EAAoB;EACnD,OAAOnB,eAAe,CAACmB,iBAAiB,CAAC,CAAC;AAC5C;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,wBAAwBA,CACtCC,QAA4C,EAC5C;EACA,OAAOjB,YAAY,CAACkB,WAAW,CAC7BrB,YAAY,CAACC,iBAAiB,EAC9BmB,QACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASE,uBAAuBA,CACrCF,QAA4C,EAC5C;EACA,OAAOjB,YAAY,CAACkB,WAAW,CAC7BrB,YAAY,CAACE,sBAAsB,EACnCkB,QACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type TurboModule } from 'react-native';
|
|
2
|
+
export interface Spec extends TurboModule {
|
|
3
|
+
startScanner(userUUID: string, userId: number | null): Promise<string>;
|
|
4
|
+
stopScanner(): Promise<string>;
|
|
5
|
+
isScanning(): Promise<boolean>;
|
|
6
|
+
configure(config: Object): Promise<string>;
|
|
7
|
+
requestNotificationPermissions(): Promise<string>;
|
|
8
|
+
getDebugLogs(): Promise<string>;
|
|
9
|
+
clearDebugLogs(): Promise<string>;
|
|
10
|
+
setDebounceInterval(interval: number): Promise<string>;
|
|
11
|
+
clearDebounceCache(): Promise<string>;
|
|
12
|
+
getDebounceStatus(): Promise<Object>;
|
|
13
|
+
addListener(eventName: string): void;
|
|
14
|
+
removeListeners(count: number): void;
|
|
15
|
+
}
|
|
16
|
+
declare const _default: Spec;
|
|
17
|
+
export default _default;
|
|
18
|
+
//# sourceMappingURL=NativeSpotnySdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativeSpotnySdk.d.ts","sourceRoot":"","sources":["../../../src/NativeSpotnySdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,WAAW,IAAK,SAAQ,WAAW;IAEvC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAG/B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAG3C,8BAA8B,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAGlD,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAGlC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAGrC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;;AAED,wBAAmE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export declare const SpotnyEvents: {
|
|
2
|
+
readonly ON_BEACONS_RANGED: "onBeaconsRanged";
|
|
3
|
+
readonly ON_BEACON_REGION_EVENT: "onBeaconRegionEvent";
|
|
4
|
+
};
|
|
5
|
+
export type BeaconData = {
|
|
6
|
+
uuid: string;
|
|
7
|
+
major: number;
|
|
8
|
+
minor: number;
|
|
9
|
+
/** Estimated distance in metres */
|
|
10
|
+
distance: number;
|
|
11
|
+
rssi: number;
|
|
12
|
+
/** 'immediate' | 'near' | 'far' | 'unknown' */
|
|
13
|
+
proximity: string;
|
|
14
|
+
};
|
|
15
|
+
export type BeaconRangedEvent = {
|
|
16
|
+
beacons: BeaconData[];
|
|
17
|
+
region: string;
|
|
18
|
+
};
|
|
19
|
+
export type BeaconRegionEvent = {
|
|
20
|
+
region: string;
|
|
21
|
+
/** 'enter' | 'exit' | 'determined' */
|
|
22
|
+
event: 'enter' | 'exit' | 'determined';
|
|
23
|
+
state?: 'inside' | 'outside' | 'unknown';
|
|
24
|
+
};
|
|
25
|
+
export type SpotnySdkConfig = {
|
|
26
|
+
/** Base URL for the backend API (default: https://api.spotny.app) */
|
|
27
|
+
backendURL?: string;
|
|
28
|
+
/** Maximum BLE detection distance in metres (default: 8.0) */
|
|
29
|
+
maxDetectionDistance?: number;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Start beacon scanning.
|
|
33
|
+
* @param userUUID A unique string identifying this installation / user session.
|
|
34
|
+
* @param userId Optional authenticated user ID.
|
|
35
|
+
*/
|
|
36
|
+
export declare function startScanner(userUUID: string, userId?: number | null): Promise<string>;
|
|
37
|
+
/** Stop beacon scanning and clean up all state. */
|
|
38
|
+
export declare function stopScanner(): Promise<string>;
|
|
39
|
+
/** Returns `true` if the SDK is currently scanning. */
|
|
40
|
+
export declare function isScanning(): Promise<boolean>;
|
|
41
|
+
/**
|
|
42
|
+
* Override SDK configuration at runtime.
|
|
43
|
+
* Must be called **before** `startScanner`.
|
|
44
|
+
*/
|
|
45
|
+
export declare function configure(config: SpotnySdkConfig): Promise<string>;
|
|
46
|
+
/** (iOS) Prompt the user for local-notification permissions. */
|
|
47
|
+
export declare function requestNotificationPermissions(): Promise<string>;
|
|
48
|
+
/** Read the on-device debug log file. */
|
|
49
|
+
export declare function getDebugLogs(): Promise<string>;
|
|
50
|
+
/** Delete the on-device debug log file. */
|
|
51
|
+
export declare function clearDebugLogs(): Promise<string>;
|
|
52
|
+
/** Override the proximity-event debounce interval (seconds). */
|
|
53
|
+
export declare function setDebounceInterval(interval: number): Promise<string>;
|
|
54
|
+
/** Clear the debounce / cooldown cache for all beacons. */
|
|
55
|
+
export declare function clearDebounceCache(): Promise<string>;
|
|
56
|
+
/** Return the current debounce status for all tracked beacons. */
|
|
57
|
+
export declare function getDebounceStatus(): Promise<Object>;
|
|
58
|
+
/**
|
|
59
|
+
* Subscribe to continuous ranging updates.
|
|
60
|
+
* The callback fires roughly every second while beacons are in range.
|
|
61
|
+
*/
|
|
62
|
+
export declare function addBeaconsRangedListener(callback: (event: BeaconRangedEvent) => void): import("react-native").EventSubscription;
|
|
63
|
+
/**
|
|
64
|
+
* Subscribe to region enter/exit events.
|
|
65
|
+
* These fire in all app states (foreground, background, terminated on iOS).
|
|
66
|
+
*/
|
|
67
|
+
export declare function addBeaconRegionListener(callback: (event: BeaconRegionEvent) => void): import("react-native").EventSubscription;
|
|
68
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAIA,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAIX,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,YAAY,CAAC;IACvC,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAOF;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GACrB,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,mDAAmD;AACnD,wBAAgB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAE7C;AAED,uDAAuD;AACvD,wBAAgB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAE7C;AAID;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAElE;AAID,gEAAgE;AAChE,wBAAgB,8BAA8B,IAAI,OAAO,CAAC,MAAM,CAAC,CAEhE;AAID,yCAAyC;AACzC,wBAAgB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAE9C;AAED,2CAA2C;AAC3C,wBAAgB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAEhD;AAID,gEAAgE;AAChE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAErE;AAED,2DAA2D;AAC3D,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAEpD;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAEnD;AAID;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,4CAM7C;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,4CAM7C"}
|
package/package.json
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "spotny-sdk",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Beacon Scanner",
|
|
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
|
+
"*.podspec",
|
|
22
|
+
"react-native.config.js",
|
|
23
|
+
"!ios/build",
|
|
24
|
+
"!android/build",
|
|
25
|
+
"!android/gradle",
|
|
26
|
+
"!android/gradlew",
|
|
27
|
+
"!android/gradlew.bat",
|
|
28
|
+
"!android/local.properties",
|
|
29
|
+
"!**/__tests__",
|
|
30
|
+
"!**/__fixtures__",
|
|
31
|
+
"!**/__mocks__",
|
|
32
|
+
"!**/.*"
|
|
33
|
+
],
|
|
34
|
+
"scripts": {
|
|
35
|
+
"example": "yarn workspace spotny-sdk-example",
|
|
36
|
+
"clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
|
|
37
|
+
"prepare": "bob build",
|
|
38
|
+
"typecheck": "tsc",
|
|
39
|
+
"lint": "eslint \"**/*.{js,ts,tsx}\"",
|
|
40
|
+
"test": "jest",
|
|
41
|
+
"release": "release-it --only-version"
|
|
42
|
+
},
|
|
43
|
+
"keywords": [
|
|
44
|
+
"react-native",
|
|
45
|
+
"ios",
|
|
46
|
+
"android"
|
|
47
|
+
],
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "git",
|
|
50
|
+
"url": "git+https://github.com/Spotny-SA/spotny-sdk.git"
|
|
51
|
+
},
|
|
52
|
+
"author": "Ahmad Freijeh <ahmadbfreijeh@gmail.com> (https://github.com/ahmadfreijeh)",
|
|
53
|
+
"license": "MIT",
|
|
54
|
+
"bugs": {
|
|
55
|
+
"url": "https://github.com/Spotny-SA/spotny-sdk/issues"
|
|
56
|
+
},
|
|
57
|
+
"homepage": "https://github.com/Spotny-SA/spotny-sdk#readme",
|
|
58
|
+
"publishConfig": {
|
|
59
|
+
"registry": "https://registry.npmjs.org/"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@commitlint/config-conventional": "^19.8.1",
|
|
63
|
+
"@eslint/compat": "^1.3.2",
|
|
64
|
+
"@eslint/eslintrc": "^3.3.1",
|
|
65
|
+
"@eslint/js": "^9.35.0",
|
|
66
|
+
"@react-native/babel-preset": "0.83.0",
|
|
67
|
+
"@react-native/eslint-config": "0.83.0",
|
|
68
|
+
"@release-it/conventional-changelog": "^10.0.1",
|
|
69
|
+
"@types/jest": "^29.5.14",
|
|
70
|
+
"@types/react": "^19.2.0",
|
|
71
|
+
"commitlint": "^19.8.1",
|
|
72
|
+
"del-cli": "^6.0.0",
|
|
73
|
+
"eslint": "^9.35.0",
|
|
74
|
+
"eslint-config-prettier": "^10.1.8",
|
|
75
|
+
"eslint-plugin-prettier": "^5.5.4",
|
|
76
|
+
"jest": "^29.7.0",
|
|
77
|
+
"lefthook": "^2.0.3",
|
|
78
|
+
"prettier": "^2.8.8",
|
|
79
|
+
"react": "19.2.0",
|
|
80
|
+
"react-native": "0.83.0",
|
|
81
|
+
"react-native-builder-bob": "^0.40.18",
|
|
82
|
+
"release-it": "^19.0.4",
|
|
83
|
+
"turbo": "^2.5.6",
|
|
84
|
+
"typescript": "^5.9.2"
|
|
85
|
+
},
|
|
86
|
+
"peerDependencies": {
|
|
87
|
+
"react": "*",
|
|
88
|
+
"react-native": "*"
|
|
89
|
+
},
|
|
90
|
+
"workspaces": [
|
|
91
|
+
"example"
|
|
92
|
+
],
|
|
93
|
+
"packageManager": "yarn@4.11.0",
|
|
94
|
+
"react-native-builder-bob": {
|
|
95
|
+
"source": "src",
|
|
96
|
+
"output": "lib",
|
|
97
|
+
"targets": [
|
|
98
|
+
[
|
|
99
|
+
"module",
|
|
100
|
+
{
|
|
101
|
+
"esm": true
|
|
102
|
+
}
|
|
103
|
+
],
|
|
104
|
+
[
|
|
105
|
+
"typescript",
|
|
106
|
+
{
|
|
107
|
+
"project": "tsconfig.build.json"
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
]
|
|
111
|
+
},
|
|
112
|
+
"codegenConfig": {
|
|
113
|
+
"name": "SpotnySdkSpec",
|
|
114
|
+
"type": "modules",
|
|
115
|
+
"jsSrcsDir": "src",
|
|
116
|
+
"android": {
|
|
117
|
+
"javaPackageName": "com.spotnysdk"
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
"prettier": {
|
|
121
|
+
"quoteProps": "consistent",
|
|
122
|
+
"singleQuote": true,
|
|
123
|
+
"tabWidth": 2,
|
|
124
|
+
"trailingComma": "es5",
|
|
125
|
+
"useTabs": false
|
|
126
|
+
},
|
|
127
|
+
"jest": {
|
|
128
|
+
"preset": "react-native",
|
|
129
|
+
"modulePathIgnorePatterns": [
|
|
130
|
+
"<rootDir>/example/node_modules",
|
|
131
|
+
"<rootDir>/lib/"
|
|
132
|
+
]
|
|
133
|
+
},
|
|
134
|
+
"commitlint": {
|
|
135
|
+
"extends": [
|
|
136
|
+
"@commitlint/config-conventional"
|
|
137
|
+
]
|
|
138
|
+
},
|
|
139
|
+
"release-it": {
|
|
140
|
+
"git": {
|
|
141
|
+
"commitMessage": "chore: release ${version}",
|
|
142
|
+
"tagName": "v${version}"
|
|
143
|
+
},
|
|
144
|
+
"npm": {
|
|
145
|
+
"publish": true
|
|
146
|
+
},
|
|
147
|
+
"github": {
|
|
148
|
+
"release": true
|
|
149
|
+
},
|
|
150
|
+
"plugins": {
|
|
151
|
+
"@release-it/conventional-changelog": {
|
|
152
|
+
"preset": {
|
|
153
|
+
"name": "angular"
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
"create-react-native-library": {
|
|
159
|
+
"type": "turbo-module",
|
|
160
|
+
"languages": "kotlin-objc",
|
|
161
|
+
"tools": [
|
|
162
|
+
"eslint",
|
|
163
|
+
"jest",
|
|
164
|
+
"lefthook",
|
|
165
|
+
"release-it"
|
|
166
|
+
],
|
|
167
|
+
"version": "0.57.2"
|
|
168
|
+
}
|
|
169
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { TurboModuleRegistry, type TurboModule } from 'react-native';
|
|
2
|
+
|
|
3
|
+
export interface Spec extends TurboModule {
|
|
4
|
+
// ── Core scanning ──────────────────────────────────────────────────────────
|
|
5
|
+
startScanner(userUUID: string, userId: number | null): Promise<string>;
|
|
6
|
+
stopScanner(): Promise<string>;
|
|
7
|
+
isScanning(): Promise<boolean>;
|
|
8
|
+
|
|
9
|
+
// ── Configuration ──────────────────────────────────────────────────────────
|
|
10
|
+
configure(config: Object): Promise<string>;
|
|
11
|
+
|
|
12
|
+
// ── Permissions ────────────────────────────────────────────────────────────
|
|
13
|
+
requestNotificationPermissions(): Promise<string>;
|
|
14
|
+
|
|
15
|
+
// ── Debug ──────────────────────────────────────────────────────────────────
|
|
16
|
+
getDebugLogs(): Promise<string>;
|
|
17
|
+
clearDebugLogs(): Promise<string>;
|
|
18
|
+
|
|
19
|
+
// ── Debounce helpers ───────────────────────────────────────────────────────
|
|
20
|
+
setDebounceInterval(interval: number): Promise<string>;
|
|
21
|
+
clearDebounceCache(): Promise<string>;
|
|
22
|
+
getDebounceStatus(): Promise<Object>;
|
|
23
|
+
|
|
24
|
+
// ── Required by NativeEventEmitter ────────────────────────────────────────
|
|
25
|
+
addListener(eventName: string): void;
|
|
26
|
+
removeListeners(count: number): void;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export default TurboModuleRegistry.getEnforcing<Spec>('SpotnySdk');
|