@sendoracloud/sdk-react-native 0.18.9 → 0.19.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.
package/dist/index.cjs CHANGED
@@ -1858,6 +1858,14 @@ var SendoraSDK = class {
1858
1858
  * `sendora.push.registerToken(...)` works consistently across all 5 SDKs.
1859
1859
  * Backed by the same registerPushToken() implementation; kept top-level
1860
1860
  * too for backwards compatibility with the s47 release.
1861
+ *
1862
+ * Tier 3 (s58.70): added `liveActivities.startToken()` and
1863
+ * `geofences.{list,recordEvent}()`. These are JS-side shims around
1864
+ * the backend wire calls — the native bridge work (ActivityKit on
1865
+ * iOS, CoreLocation geofencing, Android NotificationCompat + Geo
1866
+ * APIs) still lives in your app code. Once your native side has
1867
+ * the activity push token / geofence trigger in hand, hand it to
1868
+ * the SDK and we'll persist + dispatch server-side.
1861
1869
  */
1862
1870
  get push() {
1863
1871
  const self = this;
@@ -1872,6 +1880,88 @@ var SendoraSDK = class {
1872
1880
  "/push/track-open",
1873
1881
  body
1874
1882
  );
1883
+ },
1884
+ liveActivities: {
1885
+ /**
1886
+ * Report a freshly-started iOS Live Activity (or Android Live
1887
+ * Update on Android 14+) push token to Sendora so server-side
1888
+ * `PATCH /push/live-activities/:id/update` calls can dispatch
1889
+ * via APNs (iOS) or FCM data-only (Android).
1890
+ *
1891
+ * Host app calls this once per Activity lifecycle, right
1892
+ * after `Activity.pushTokenUpdates` (iOS) or your Android
1893
+ * NotificationCompat setup hands you the push token.
1894
+ */
1895
+ startToken: async (input) => {
1896
+ if (!self.config) throw new Error("[sendoracloud] init() must complete before push.liveActivities.startToken().");
1897
+ const res = await post(
1898
+ { apiUrl: self.config.apiUrl, publicKey: self.config.publicKey, debug: self.debug },
1899
+ "/push/live-activities/start-token",
1900
+ {
1901
+ pushToken: input.pushToken,
1902
+ activityType: input.activityType,
1903
+ platform: input.platform ?? "ios",
1904
+ externalId: input.externalId,
1905
+ userId: input.userId,
1906
+ attributes: input.attributes ?? {},
1907
+ contentState: input.contentState ?? {},
1908
+ bundleId: input.bundleId
1909
+ }
1910
+ );
1911
+ if (!res || !res.ok) {
1912
+ throw new Error(`[sendoracloud] live-activity start-token failed (HTTP ${res?.status ?? "network"}).`);
1913
+ }
1914
+ const parsed = await res.json();
1915
+ const data = parsed?.data;
1916
+ if (!data?.id) throw new Error("[sendoracloud] live-activity start-token: server returned no id.");
1917
+ return { id: data.id, status: data.status ?? "active" };
1918
+ }
1919
+ },
1920
+ geofences: {
1921
+ /**
1922
+ * Fetch the enabled geofences for this device. The SDK doesn't
1923
+ * register them with the OS — that's app-side native work
1924
+ * (CLLocationManager.startMonitoring on iOS, GeofencingClient
1925
+ * on Android). Sort order is server-controlled by priority
1926
+ * asc so the caller can clamp to the OS cap (iOS 20, Android
1927
+ * 100) by truncating the list.
1928
+ */
1929
+ list: async () => {
1930
+ if (!self.config) throw new Error("[sendoracloud] init() must complete before push.geofences.list().");
1931
+ const res = await getJson(
1932
+ { apiUrl: self.config.apiUrl, publicKey: self.config.publicKey, debug: self.debug },
1933
+ "/push/geofences/list-for-device"
1934
+ );
1935
+ if (!res || !res.ok) {
1936
+ throw new Error(`[sendoracloud] geofences list failed (HTTP ${res?.status ?? "network"}).`);
1937
+ }
1938
+ const parsed = await res.json();
1939
+ return parsed?.data ?? [];
1940
+ },
1941
+ /**
1942
+ * Report a geofence enter / exit / dwell event. Backend writes
1943
+ * a `geofence.<kind>` event row + fires any workflows triggered
1944
+ * on that geofence id. Call from the native handler that
1945
+ * receives the OS region notification.
1946
+ */
1947
+ recordEvent: async (input) => {
1948
+ if (!self.config) throw new Error("[sendoracloud] init() must complete before push.geofences.recordEvent().");
1949
+ const res = await post(
1950
+ { apiUrl: self.config.apiUrl, publicKey: self.config.publicKey, debug: self.debug },
1951
+ "/push/geofences/event",
1952
+ {
1953
+ geofenceId: input.geofenceId,
1954
+ kind: input.kind,
1955
+ lat: input.lat,
1956
+ lng: input.lng,
1957
+ accuracyMeters: input.accuracyMeters,
1958
+ dwellSeconds: input.dwellSeconds
1959
+ }
1960
+ );
1961
+ if (!res || !res.ok) {
1962
+ throw new Error(`[sendoracloud] geofence event failed (HTTP ${res?.status ?? "network"}).`);
1963
+ }
1964
+ }
1875
1965
  }
1876
1966
  };
1877
1967
  }
package/dist/index.d.cts CHANGED
@@ -759,10 +759,54 @@ declare class SendoraSDK {
759
759
  * `sendora.push.registerToken(...)` works consistently across all 5 SDKs.
760
760
  * Backed by the same registerPushToken() implementation; kept top-level
761
761
  * too for backwards compatibility with the s47 release.
762
+ *
763
+ * Tier 3 (s58.70): added `liveActivities.startToken()` and
764
+ * `geofences.{list,recordEvent}()`. These are JS-side shims around
765
+ * the backend wire calls — the native bridge work (ActivityKit on
766
+ * iOS, CoreLocation geofencing, Android NotificationCompat + Geo
767
+ * APIs) still lives in your app code. Once your native side has
768
+ * the activity push token / geofence trigger in hand, hand it to
769
+ * the SDK and we'll persist + dispatch server-side.
762
770
  */
763
771
  get push(): {
764
772
  registerToken: (reg: PushTokenRegistration) => Promise<PushTokenReceipt>;
765
773
  trackOpen: (sendId: string, clickAction?: string) => Promise<void>;
774
+ liveActivities: {
775
+ startToken: (input: {
776
+ pushToken: string;
777
+ activityType: string;
778
+ platform?: "ios" | "android";
779
+ externalId?: string;
780
+ userId?: string;
781
+ attributes?: Record<string, unknown>;
782
+ contentState?: Record<string, unknown>;
783
+ bundleId?: string;
784
+ }) => Promise<{
785
+ id: string;
786
+ status: string;
787
+ }>;
788
+ };
789
+ geofences: {
790
+ list: () => Promise<Array<{
791
+ id: string;
792
+ name: string;
793
+ lat: number;
794
+ lng: number;
795
+ radiusMeters: number;
796
+ priority: number;
797
+ enabled: boolean;
798
+ triggerOn: string[];
799
+ properties?: Record<string, unknown>;
800
+ }>>;
801
+ recordEvent: (input: {
802
+ geofenceId: string;
803
+ kind: "enter" | "exit" | "dwell";
804
+ lat?: number;
805
+ lng?: number;
806
+ accuracyMeters?: number;
807
+ dwellSeconds?: number;
808
+ }) => Promise<void>;
809
+ };
766
810
  };
767
811
  /**
768
812
  * Attribution namespace — mobile install + deferred deep-link reporting.
package/dist/index.d.ts CHANGED
@@ -759,10 +759,54 @@ declare class SendoraSDK {
759
759
  * `sendora.push.registerToken(...)` works consistently across all 5 SDKs.
760
760
  * Backed by the same registerPushToken() implementation; kept top-level
761
761
  * too for backwards compatibility with the s47 release.
762
+ *
763
+ * Tier 3 (s58.70): added `liveActivities.startToken()` and
764
+ * `geofences.{list,recordEvent}()`. These are JS-side shims around
765
+ * the backend wire calls — the native bridge work (ActivityKit on
766
+ * iOS, CoreLocation geofencing, Android NotificationCompat + Geo
767
+ * APIs) still lives in your app code. Once your native side has
768
+ * the activity push token / geofence trigger in hand, hand it to
769
+ * the SDK and we'll persist + dispatch server-side.
762
770
  */
763
771
  get push(): {
764
772
  registerToken: (reg: PushTokenRegistration) => Promise<PushTokenReceipt>;
765
773
  trackOpen: (sendId: string, clickAction?: string) => Promise<void>;
774
+ liveActivities: {
775
+ startToken: (input: {
776
+ pushToken: string;
777
+ activityType: string;
778
+ platform?: "ios" | "android";
779
+ externalId?: string;
780
+ userId?: string;
781
+ attributes?: Record<string, unknown>;
782
+ contentState?: Record<string, unknown>;
783
+ bundleId?: string;
784
+ }) => Promise<{
785
+ id: string;
786
+ status: string;
787
+ }>;
788
+ };
789
+ geofences: {
790
+ list: () => Promise<Array<{
791
+ id: string;
792
+ name: string;
793
+ lat: number;
794
+ lng: number;
795
+ radiusMeters: number;
796
+ priority: number;
797
+ enabled: boolean;
798
+ triggerOn: string[];
799
+ properties?: Record<string, unknown>;
800
+ }>>;
801
+ recordEvent: (input: {
802
+ geofenceId: string;
803
+ kind: "enter" | "exit" | "dwell";
804
+ lat?: number;
805
+ lng?: number;
806
+ accuracyMeters?: number;
807
+ dwellSeconds?: number;
808
+ }) => Promise<void>;
809
+ };
766
810
  };
767
811
  /**
768
812
  * Attribution namespace — mobile install + deferred deep-link reporting.
package/dist/index.js CHANGED
@@ -1820,6 +1820,14 @@ var SendoraSDK = class {
1820
1820
  * `sendora.push.registerToken(...)` works consistently across all 5 SDKs.
1821
1821
  * Backed by the same registerPushToken() implementation; kept top-level
1822
1822
  * too for backwards compatibility with the s47 release.
1823
+ *
1824
+ * Tier 3 (s58.70): added `liveActivities.startToken()` and
1825
+ * `geofences.{list,recordEvent}()`. These are JS-side shims around
1826
+ * the backend wire calls — the native bridge work (ActivityKit on
1827
+ * iOS, CoreLocation geofencing, Android NotificationCompat + Geo
1828
+ * APIs) still lives in your app code. Once your native side has
1829
+ * the activity push token / geofence trigger in hand, hand it to
1830
+ * the SDK and we'll persist + dispatch server-side.
1823
1831
  */
1824
1832
  get push() {
1825
1833
  const self = this;
@@ -1834,6 +1842,88 @@ var SendoraSDK = class {
1834
1842
  "/push/track-open",
1835
1843
  body
1836
1844
  );
1845
+ },
1846
+ liveActivities: {
1847
+ /**
1848
+ * Report a freshly-started iOS Live Activity (or Android Live
1849
+ * Update on Android 14+) push token to Sendora so server-side
1850
+ * `PATCH /push/live-activities/:id/update` calls can dispatch
1851
+ * via APNs (iOS) or FCM data-only (Android).
1852
+ *
1853
+ * Host app calls this once per Activity lifecycle, right
1854
+ * after `Activity.pushTokenUpdates` (iOS) or your Android
1855
+ * NotificationCompat setup hands you the push token.
1856
+ */
1857
+ startToken: async (input) => {
1858
+ if (!self.config) throw new Error("[sendoracloud] init() must complete before push.liveActivities.startToken().");
1859
+ const res = await post(
1860
+ { apiUrl: self.config.apiUrl, publicKey: self.config.publicKey, debug: self.debug },
1861
+ "/push/live-activities/start-token",
1862
+ {
1863
+ pushToken: input.pushToken,
1864
+ activityType: input.activityType,
1865
+ platform: input.platform ?? "ios",
1866
+ externalId: input.externalId,
1867
+ userId: input.userId,
1868
+ attributes: input.attributes ?? {},
1869
+ contentState: input.contentState ?? {},
1870
+ bundleId: input.bundleId
1871
+ }
1872
+ );
1873
+ if (!res || !res.ok) {
1874
+ throw new Error(`[sendoracloud] live-activity start-token failed (HTTP ${res?.status ?? "network"}).`);
1875
+ }
1876
+ const parsed = await res.json();
1877
+ const data = parsed?.data;
1878
+ if (!data?.id) throw new Error("[sendoracloud] live-activity start-token: server returned no id.");
1879
+ return { id: data.id, status: data.status ?? "active" };
1880
+ }
1881
+ },
1882
+ geofences: {
1883
+ /**
1884
+ * Fetch the enabled geofences for this device. The SDK doesn't
1885
+ * register them with the OS — that's app-side native work
1886
+ * (CLLocationManager.startMonitoring on iOS, GeofencingClient
1887
+ * on Android). Sort order is server-controlled by priority
1888
+ * asc so the caller can clamp to the OS cap (iOS 20, Android
1889
+ * 100) by truncating the list.
1890
+ */
1891
+ list: async () => {
1892
+ if (!self.config) throw new Error("[sendoracloud] init() must complete before push.geofences.list().");
1893
+ const res = await getJson(
1894
+ { apiUrl: self.config.apiUrl, publicKey: self.config.publicKey, debug: self.debug },
1895
+ "/push/geofences/list-for-device"
1896
+ );
1897
+ if (!res || !res.ok) {
1898
+ throw new Error(`[sendoracloud] geofences list failed (HTTP ${res?.status ?? "network"}).`);
1899
+ }
1900
+ const parsed = await res.json();
1901
+ return parsed?.data ?? [];
1902
+ },
1903
+ /**
1904
+ * Report a geofence enter / exit / dwell event. Backend writes
1905
+ * a `geofence.<kind>` event row + fires any workflows triggered
1906
+ * on that geofence id. Call from the native handler that
1907
+ * receives the OS region notification.
1908
+ */
1909
+ recordEvent: async (input) => {
1910
+ if (!self.config) throw new Error("[sendoracloud] init() must complete before push.geofences.recordEvent().");
1911
+ const res = await post(
1912
+ { apiUrl: self.config.apiUrl, publicKey: self.config.publicKey, debug: self.debug },
1913
+ "/push/geofences/event",
1914
+ {
1915
+ geofenceId: input.geofenceId,
1916
+ kind: input.kind,
1917
+ lat: input.lat,
1918
+ lng: input.lng,
1919
+ accuracyMeters: input.accuracyMeters,
1920
+ dwellSeconds: input.dwellSeconds
1921
+ }
1922
+ );
1923
+ if (!res || !res.ok) {
1924
+ throw new Error(`[sendoracloud] geofence event failed (HTTP ${res?.status ?? "network"}).`);
1925
+ }
1926
+ }
1837
1927
  }
1838
1928
  };
1839
1929
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sendoracloud/sdk-react-native",
3
- "version": "0.18.9",
3
+ "version": "0.19.0",
4
4
  "description": "Sendora Cloud React Native + Expo SDK — analytics, identity, push-token registration, auth, deep links (Branch / Firebase Dynamic Links parity). Auth + analytics + deep links work in Expo Go; push token registration requires a Dev Client (EAS Build or `npx expo prebuild`).",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",