@adtogether/react-native-sdk 0.1.22 → 0.1.24

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
- ## 0.1.22
1
+ ## 0.1.24
2
+ * **Docs**: Standardized SDK documentation across all platforms.
3
+
4
+ ## 0.1.23
2
5
 
6
+ * **Sync**: Version parity across all AdTogether SDKs.
7
+
8
+ ## 0.1.22
3
9
  * **Brand**: Added "Powered by AdTogether" attribution to all Interstitial ad formats.
4
10
  * **Sync**: Unified versioning (0.1.20) across all AdTogether SDKs.
5
11
 
package/README.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # AdTogether React Native SDK
2
2
 
3
+
4
+ <p align="center">
5
+ <img src="../../public/dashboard.png" width="800" alt="Developer Dashboard">
6
+ </p>
7
+
3
8
  [![npm version](https://img.shields.io/npm/v/@adtogether/react-native-sdk)](https://www.npmjs.com/package/@adtogether/react-native-sdk)
4
9
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
10
 
@@ -10,10 +15,14 @@
10
15
 
11
16
  ---
12
17
 
18
+
13
19
  **AdTogether** is an ad exchange platform designed to empower developers and creators. By participating in our network, you can engage in reciprocal marketing for your own applications while simultaneously driving traffic to your products and helping you **increase conversions**. Our core philosophy is simple: **"Show an ad, get an ad shown"**.
14
20
 
15
21
  This SDK allows React Native developers to easily integrate AdTogether ads into their applications. By displaying ads from other community members, you earn **Ad Credits** that allow your own app's ads to be shown across the AdTogether network.
16
22
 
23
+ > [!IMPORTANT]
24
+ > **Developer Account Required**: Before integrating the SDK, you must create a developer account at [https://adtogether.relaxsoftwareapps.com](https://adtogether.relaxsoftwareapps.com) to generate your `appId` and configure your ad units. Integration will not work without a valid `appId`.
25
+
17
26
  ### 🖼️ Visualizing the Experience
18
27
 
19
28
  | **Native Banner Ad** | **Interstitial Full-Screen** |
@@ -124,6 +124,66 @@ class AdTogether {
124
124
  static trackClick(adId, token) {
125
125
  this.trackEvent('/api/ads/click', adId, token);
126
126
  }
127
+
128
+ /**
129
+ * Detect country code from the device locale.
130
+ * Tries expo-localization first, then NativeModules, then Intl API.
131
+ */
132
+ static detectCountry() {
133
+ // 1. Try expo-localization
134
+ try {
135
+ const ExpoLocalization = require('expo-localization');
136
+ if (ExpoLocalization?.region) {
137
+ return ExpoLocalization.region; // e.g. "US"
138
+ }
139
+ // expo-localization v3+ uses getLocales()
140
+ if (ExpoLocalization?.getLocales) {
141
+ const locales = ExpoLocalization.getLocales();
142
+ if (locales?.[0]?.regionCode) {
143
+ return locales[0].regionCode;
144
+ }
145
+ }
146
+ } catch (_) {}
147
+
148
+ // 2. Try RN NativeModules (I18nManager or SettingsManager)
149
+ try {
150
+ if (_reactNative.Platform.OS === 'ios') {
151
+ const settings = _reactNative.NativeModules.SettingsManager?.settings;
152
+ const locale = settings?.AppleLocale || settings?.AppleLanguages?.[0];
153
+ if (locale) {
154
+ const parts = locale.replace('_', '-').split('-');
155
+ if (parts.length >= 2) {
156
+ const region = parts[parts.length - 1].toUpperCase();
157
+ if (region.length === 2) return region;
158
+ }
159
+ }
160
+ } else if (_reactNative.Platform.OS === 'android') {
161
+ const locale = _reactNative.NativeModules.I18nManager?.localeIdentifier;
162
+ if (locale) {
163
+ const parts = locale.replace('_', '-').split('-');
164
+ if (parts.length >= 2) {
165
+ const region = parts[parts.length - 1].toUpperCase();
166
+ if (region.length === 2) return region;
167
+ }
168
+ }
169
+ }
170
+ } catch (_) {}
171
+
172
+ // 3. Fallback: Intl API (available in Hermes & JSC)
173
+ try {
174
+ if (typeof Intl !== 'undefined' && Intl.DateTimeFormat) {
175
+ const resolved = Intl.DateTimeFormat().resolvedOptions();
176
+ if (resolved.locale) {
177
+ const parts = resolved.locale.split('-');
178
+ if (parts.length >= 2) {
179
+ const region = parts[parts.length - 1].toUpperCase();
180
+ if (region.length === 2) return region;
181
+ }
182
+ }
183
+ }
184
+ } catch (_) {}
185
+ return null;
186
+ }
127
187
  static trackEvent(endpoint, adId, token) {
128
188
  if (!AdTogether.shared.assertInitialized()) return;
129
189
  fetch(`${AdTogether.shared.baseUrl}${endpoint}`, {
@@ -140,7 +200,8 @@ class AdTogether {
140
200
  } : {}),
141
201
  // Send platform and environment to match Flutter SDK
142
202
  platform: _reactNative.Platform.OS,
143
- environment: __DEV__ ? 'development' : 'production'
203
+ environment: __DEV__ ? 'development' : 'production',
204
+ country: AdTogether.detectCountry()
144
205
  })
145
206
  }).catch(console.error);
146
207
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","AdTogether","allowSelfAds","baseUrl","constructor","shared","instance","tryAutoDetectBundleId","ExpoApplication","applicationId","_","DeviceInfo","getBundleId","Platform","OS","constants","NativeModules","PlatformConstants","reactNativeVersion","appModule","RNDeviceInfo","AppInfo","bundleId","undefined","initialize","options","sdk","appId","apiKey","console","warn","log","assertInitialized","error","fetchAd","adUnitId","adType","Error","url","lastAdId","response","fetch","ok","ad","json","id","status","err","trackImpression","adId","token","trackEvent","trackClick","endpoint","method","headers","body","JSON","stringify","platform","environment","__DEV__","catch","exports"],"sourceRoot":"../../src","sources":["AdTogether.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","AdTogether","allowSelfAds","baseUrl","constructor","shared","instance","tryAutoDetectBundleId","ExpoApplication","applicationId","_","DeviceInfo","getBundleId","Platform","OS","constants","NativeModules","PlatformConstants","reactNativeVersion","appModule","RNDeviceInfo","AppInfo","bundleId","undefined","initialize","options","sdk","appId","apiKey","console","warn","log","assertInitialized","error","fetchAd","adUnitId","adType","Error","url","lastAdId","response","fetch","ok","ad","json","id","status","err","trackImpression","adId","token","trackEvent","trackClick","detectCountry","ExpoLocalization","region","getLocales","locales","regionCode","settings","SettingsManager","locale","AppleLocale","AppleLanguages","parts","replace","split","length","toUpperCase","I18nManager","localeIdentifier","Intl","DateTimeFormat","resolved","resolvedOptions","endpoint","method","headers","body","JSON","stringify","platform","environment","__DEV__","country","catch","exports"],"sourceRoot":"../../src","sources":["AdTogether.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAEO,MAAMC,UAAU,CAAC;EAIdC,YAAY,GAAY,IAAI;EAC7BC,OAAO,GAAW,0CAA0C;EAE3DC,WAAWA,CAAA,EAAG,CAAC;EAEvB,WAAWC,MAAMA,CAAA,EAAe;IAC9B,IAAI,CAACJ,UAAU,CAACK,QAAQ,EAAE;MACxBL,UAAU,CAACK,QAAQ,GAAG,IAAIL,UAAU,CAAC,CAAC;IACxC;IACA,OAAOA,UAAU,CAACK,QAAQ;EAC5B;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,OAAeC,qBAAqBA,CAAA,EAAuB;IACzD;IACA,IAAI;MACF,MAAMC,eAAe,GAAGR,OAAO,CAAC,kBAAkB,CAAC;MACnD,IAAIQ,eAAe,EAAEC,aAAa,EAAE;QAClC,OAAOD,eAAe,CAACC,aAAa;MACtC;IACF,CAAC,CAAC,OAAOC,CAAC,EAAE;MACV;IAAA;;IAGF;IACA,IAAI;MACF,MAAMC,UAAU,GAAGX,OAAO,CAAC,0BAA0B,CAAC;MACtD,IAAIW,UAAU,EAAEC,WAAW,EAAE;QAC3B,OAAOD,UAAU,CAACC,WAAW,CAAC,CAAC;MACjC;IACF,CAAC,CAAC,OAAOF,CAAC,EAAE;MACV;IAAA;;IAGF;IACA,IAAI;MACF,IAAIG,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;QAC7B,MAAMC,SAAS,GAAGC,0BAAa,CAACC,iBAAiB;QACjD,IAAIF,SAAS,EAAEG,kBAAkB,EAAE;UACjC;UACA,MAAMC,SAAS,GAAGH,0BAAa,CAACI,YAAY,IAAIJ,0BAAa,CAACK,OAAO;UACrE,IAAIF,SAAS,EAAEG,QAAQ,EAAE;YACvB,OAAOH,SAAS,CAACG,QAAQ;UAC3B;QACF;MACF;IACF,CAAC,CAAC,OAAOZ,CAAC,EAAE;MACV;IAAA;IAGF,OAAOa,SAAS;EAClB;EAEA,OAAOC,UAAUA,CAACC,OAA0B,EAAE;IAC5C,MAAMC,GAAG,GAAGzB,UAAU,CAACI,MAAM;IAC7BqB,GAAG,CAACC,KAAK,GAAGF,OAAO,CAACG,MAAM,IAAIH,OAAO,CAACE,KAAK;IAE3C,IAAIF,OAAO,CAACH,QAAQ,EAAE;MACpBI,GAAG,CAACJ,QAAQ,GAAGG,OAAO,CAACH,QAAQ;IACjC,CAAC,MAAM;MACL;MACAI,GAAG,CAACJ,QAAQ,GAAGrB,UAAU,CAACM,qBAAqB,CAAC,CAAC;MACjD,IAAI,CAACmB,GAAG,CAACJ,QAAQ,EAAE;QACjBO,OAAO,CAACC,IAAI,CACV,8CAA8C,GAC9C,8DAA8D,GAC9D,0DACF,CAAC;MACH;IACF;IAEA,IAAIL,OAAO,CAACvB,YAAY,KAAKqB,SAAS,EAAE;MACtCG,GAAG,CAACxB,YAAY,GAAGuB,OAAO,CAACvB,YAAY;IACzC;IAEA,IAAIuB,OAAO,CAACtB,OAAO,EAAE;MACnBuB,GAAG,CAACvB,OAAO,GAAGsB,OAAO,CAACtB,OAAO;IAC/B;IAEA0B,OAAO,CAACE,GAAG,CAAC,2CAA2CL,GAAG,CAACC,KAAK,GAAGD,GAAG,CAACJ,QAAQ,GAAG,gBAAgBI,GAAG,CAACJ,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC;EAC1H;EAEAU,iBAAiBA,CAAA,EAAG;IAClB,IAAI,CAAC,IAAI,CAACL,KAAK,EAAE;MACfE,OAAO,CAACI,KAAK,CAAC,4GAA4G,CAAC;MAC3H,OAAO,KAAK;IACd;IACA,OAAO,IAAI;EACb;EAIA,aAAaC,OAAOA,CAACC,QAAgB,EAAEC,MAAe,EAAoB;IACxE,IAAI,CAACnC,UAAU,CAACI,MAAM,CAAC2B,iBAAiB,CAAC,CAAC,EAAE;MAC1C,MAAM,IAAIK,KAAK,CAAC,4BAA4B,CAAC;IAC/C;IAEA,IAAI;MACF,MAAMX,GAAG,GAAGzB,UAAU,CAACI,MAAM;MAC7B,IAAIiC,GAAG,GAAG,GAAGZ,GAAG,CAACvB,OAAO,0CAA0CgC,QAAQ,WAAWT,GAAG,CAACC,KAAK,EAAE;MAChG,IAAIS,MAAM,EAAE;QACVE,GAAG,IAAI,WAAWF,MAAM,EAAE;MAC5B;MACA,IAAIV,GAAG,CAACa,QAAQ,EAAE;QAChBD,GAAG,IAAI,YAAYZ,GAAG,CAACa,QAAQ,EAAE;MACnC;MACA,IAAIb,GAAG,CAACJ,QAAQ,EAAE;QAChBgB,GAAG,IAAI,aAAaZ,GAAG,CAACJ,QAAQ,EAAE;MACpC;;MAEA;MACAgB,GAAG,IAAI,iBAAiBZ,GAAG,CAACxB,YAAY,EAAE;MAE1C,MAAMsC,QAAQ,GAAG,MAAMC,KAAK,CAACH,GAAG,CAAC;MACjC,IAAIE,QAAQ,CAACE,EAAE,EAAE;QACf,MAAMC,EAAE,GAAG,MAAMH,QAAQ,CAACI,IAAI,CAAC,CAAC;QAChClB,GAAG,CAACa,QAAQ,GAAGI,EAAE,CAACE,EAAE;QACpB,OAAOF,EAAE;MACX;MAEA,MAAM,IAAIN,KAAK,CAAC,+BAA+BG,QAAQ,CAACM,MAAM,EAAE,CAAC;IACnE,CAAC,CAAC,OAAOC,GAAG,EAAE;MACZ,MAAMA,GAAG;IACX;EACF;EAEA,OAAOC,eAAeA,CAACC,IAAY,EAAEC,KAAc,EAAE;IACnD,IAAI,CAACC,UAAU,CAAC,qBAAqB,EAAEF,IAAI,EAAEC,KAAK,CAAC;EACrD;EAEA,OAAOE,UAAUA,CAACH,IAAY,EAAEC,KAAc,EAAE;IAC9C,IAAI,CAACC,UAAU,CAAC,gBAAgB,EAAEF,IAAI,EAAEC,KAAK,CAAC;EAChD;;EAEA;AACF;AACA;AACA;EACE,OAAeG,aAAaA,CAAA,EAAkB;IAC5C;IACA,IAAI;MACF,MAAMC,gBAAgB,GAAGtD,OAAO,CAAC,mBAAmB,CAAC;MACrD,IAAIsD,gBAAgB,EAAEC,MAAM,EAAE;QAC5B,OAAOD,gBAAgB,CAACC,MAAM,CAAC,CAAC;MAClC;MACA;MACA,IAAID,gBAAgB,EAAEE,UAAU,EAAE;QAChC,MAAMC,OAAO,GAAGH,gBAAgB,CAACE,UAAU,CAAC,CAAC;QAC7C,IAAIC,OAAO,GAAG,CAAC,CAAC,EAAEC,UAAU,EAAE;UAC5B,OAAOD,OAAO,CAAC,CAAC,CAAC,CAACC,UAAU;QAC9B;MACF;IACF,CAAC,CAAC,OAAOhD,CAAC,EAAE,CAAC;;IAEb;IACA,IAAI;MACF,IAAIG,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;QACzB,MAAM6C,QAAQ,GAAG3C,0BAAa,CAAC4C,eAAe,EAAED,QAAQ;QACxD,MAAME,MAAM,GAAGF,QAAQ,EAAEG,WAAW,IAAIH,QAAQ,EAAEI,cAAc,GAAG,CAAC,CAAC;QACrE,IAAIF,MAAM,EAAE;UACV,MAAMG,KAAK,GAAGH,MAAM,CAACI,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAACC,KAAK,CAAC,GAAG,CAAC;UACjD,IAAIF,KAAK,CAACG,MAAM,IAAI,CAAC,EAAE;YACrB,MAAMZ,MAAM,GAAGS,KAAK,CAACA,KAAK,CAACG,MAAM,GAAG,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;YACpD,IAAIb,MAAM,CAACY,MAAM,KAAK,CAAC,EAAE,OAAOZ,MAAM;UACxC;QACF;MACF,CAAC,MAAM,IAAI1C,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;QACpC,MAAM+C,MAAM,GAAG7C,0BAAa,CAACqD,WAAW,EAAEC,gBAAgB;QAC1D,IAAIT,MAAM,EAAE;UACV,MAAMG,KAAK,GAAGH,MAAM,CAACI,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAACC,KAAK,CAAC,GAAG,CAAC;UACjD,IAAIF,KAAK,CAACG,MAAM,IAAI,CAAC,EAAE;YACrB,MAAMZ,MAAM,GAAGS,KAAK,CAACA,KAAK,CAACG,MAAM,GAAG,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;YACpD,IAAIb,MAAM,CAACY,MAAM,KAAK,CAAC,EAAE,OAAOZ,MAAM;UACxC;QACF;MACF;IACF,CAAC,CAAC,OAAO7C,CAAC,EAAE,CAAC;;IAEb;IACA,IAAI;MACF,IAAI,OAAO6D,IAAI,KAAK,WAAW,IAAIA,IAAI,CAACC,cAAc,EAAE;QACtD,MAAMC,QAAQ,GAAGF,IAAI,CAACC,cAAc,CAAC,CAAC,CAACE,eAAe,CAAC,CAAC;QACxD,IAAID,QAAQ,CAACZ,MAAM,EAAE;UACnB,MAAMG,KAAK,GAAGS,QAAQ,CAACZ,MAAM,CAACK,KAAK,CAAC,GAAG,CAAC;UACxC,IAAIF,KAAK,CAACG,MAAM,IAAI,CAAC,EAAE;YACrB,MAAMZ,MAAM,GAAGS,KAAK,CAACA,KAAK,CAACG,MAAM,GAAG,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;YACpD,IAAIb,MAAM,CAACY,MAAM,KAAK,CAAC,EAAE,OAAOZ,MAAM;UACxC;QACF;MACF;IACF,CAAC,CAAC,OAAO7C,CAAC,EAAE,CAAC;IAEb,OAAO,IAAI;EACb;EAEA,OAAeyC,UAAUA,CAACwB,QAAgB,EAAE1B,IAAY,EAAEC,KAAc,EAAE;IACxE,IAAI,CAACjD,UAAU,CAACI,MAAM,CAAC2B,iBAAiB,CAAC,CAAC,EAAE;IAE5CS,KAAK,CAAC,GAAGxC,UAAU,CAACI,MAAM,CAACF,OAAO,GAAGwE,QAAQ,EAAE,EAAE;MAC/CC,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE;QACP,cAAc,EAAE;MAClB,CAAC;MACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;QACnB/B,IAAI;QACJC,KAAK;QACLtB,MAAM,EAAE3B,UAAU,CAACI,MAAM,CAACsB,KAAK;QAC/B,IAAI1B,UAAU,CAACI,MAAM,CAACiB,QAAQ,GAAG;UAAEA,QAAQ,EAAErB,UAAU,CAACI,MAAM,CAACiB;QAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/E;QACA2D,QAAQ,EAAEpE,qBAAQ,CAACC,EAAE;QACrBoE,WAAW,EAAEC,OAAO,GAAG,aAAa,GAAG,YAAY;QACnDC,OAAO,EAAEnF,UAAU,CAACoD,aAAa,CAAC;MACpC,CAAC;IACH,CAAC,CAAC,CAACgC,KAAK,CAACxD,OAAO,CAACI,KAAK,CAAC;EACzB;AACF;AAACqD,OAAA,CAAArF,UAAA,GAAAA,UAAA","ignoreList":[]}
@@ -120,6 +120,66 @@ export class AdTogether {
120
120
  static trackClick(adId, token) {
121
121
  this.trackEvent('/api/ads/click', adId, token);
122
122
  }
123
+
124
+ /**
125
+ * Detect country code from the device locale.
126
+ * Tries expo-localization first, then NativeModules, then Intl API.
127
+ */
128
+ static detectCountry() {
129
+ // 1. Try expo-localization
130
+ try {
131
+ const ExpoLocalization = require('expo-localization');
132
+ if (ExpoLocalization?.region) {
133
+ return ExpoLocalization.region; // e.g. "US"
134
+ }
135
+ // expo-localization v3+ uses getLocales()
136
+ if (ExpoLocalization?.getLocales) {
137
+ const locales = ExpoLocalization.getLocales();
138
+ if (locales?.[0]?.regionCode) {
139
+ return locales[0].regionCode;
140
+ }
141
+ }
142
+ } catch (_) {}
143
+
144
+ // 2. Try RN NativeModules (I18nManager or SettingsManager)
145
+ try {
146
+ if (Platform.OS === 'ios') {
147
+ const settings = NativeModules.SettingsManager?.settings;
148
+ const locale = settings?.AppleLocale || settings?.AppleLanguages?.[0];
149
+ if (locale) {
150
+ const parts = locale.replace('_', '-').split('-');
151
+ if (parts.length >= 2) {
152
+ const region = parts[parts.length - 1].toUpperCase();
153
+ if (region.length === 2) return region;
154
+ }
155
+ }
156
+ } else if (Platform.OS === 'android') {
157
+ const locale = NativeModules.I18nManager?.localeIdentifier;
158
+ if (locale) {
159
+ const parts = locale.replace('_', '-').split('-');
160
+ if (parts.length >= 2) {
161
+ const region = parts[parts.length - 1].toUpperCase();
162
+ if (region.length === 2) return region;
163
+ }
164
+ }
165
+ }
166
+ } catch (_) {}
167
+
168
+ // 3. Fallback: Intl API (available in Hermes & JSC)
169
+ try {
170
+ if (typeof Intl !== 'undefined' && Intl.DateTimeFormat) {
171
+ const resolved = Intl.DateTimeFormat().resolvedOptions();
172
+ if (resolved.locale) {
173
+ const parts = resolved.locale.split('-');
174
+ if (parts.length >= 2) {
175
+ const region = parts[parts.length - 1].toUpperCase();
176
+ if (region.length === 2) return region;
177
+ }
178
+ }
179
+ }
180
+ } catch (_) {}
181
+ return null;
182
+ }
123
183
  static trackEvent(endpoint, adId, token) {
124
184
  if (!AdTogether.shared.assertInitialized()) return;
125
185
  fetch(`${AdTogether.shared.baseUrl}${endpoint}`, {
@@ -136,7 +196,8 @@ export class AdTogether {
136
196
  } : {}),
137
197
  // Send platform and environment to match Flutter SDK
138
198
  platform: Platform.OS,
139
- environment: __DEV__ ? 'development' : 'production'
199
+ environment: __DEV__ ? 'development' : 'production',
200
+ country: AdTogether.detectCountry()
140
201
  })
141
202
  }).catch(console.error);
142
203
  }
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","Platform","AdTogether","allowSelfAds","baseUrl","constructor","shared","instance","tryAutoDetectBundleId","ExpoApplication","require","applicationId","_","DeviceInfo","getBundleId","OS","constants","PlatformConstants","reactNativeVersion","appModule","RNDeviceInfo","AppInfo","bundleId","undefined","initialize","options","sdk","appId","apiKey","console","warn","log","assertInitialized","error","fetchAd","adUnitId","adType","Error","url","lastAdId","response","fetch","ok","ad","json","id","status","err","trackImpression","adId","token","trackEvent","trackClick","endpoint","method","headers","body","JSON","stringify","platform","environment","__DEV__","catch"],"sourceRoot":"../../src","sources":["AdTogether.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["NativeModules","Platform","AdTogether","allowSelfAds","baseUrl","constructor","shared","instance","tryAutoDetectBundleId","ExpoApplication","require","applicationId","_","DeviceInfo","getBundleId","OS","constants","PlatformConstants","reactNativeVersion","appModule","RNDeviceInfo","AppInfo","bundleId","undefined","initialize","options","sdk","appId","apiKey","console","warn","log","assertInitialized","error","fetchAd","adUnitId","adType","Error","url","lastAdId","response","fetch","ok","ad","json","id","status","err","trackImpression","adId","token","trackEvent","trackClick","detectCountry","ExpoLocalization","region","getLocales","locales","regionCode","settings","SettingsManager","locale","AppleLocale","AppleLanguages","parts","replace","split","length","toUpperCase","I18nManager","localeIdentifier","Intl","DateTimeFormat","resolved","resolvedOptions","endpoint","method","headers","body","JSON","stringify","platform","environment","__DEV__","country","catch"],"sourceRoot":"../../src","sources":["AdTogether.ts"],"mappings":"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","ignoreList":[]}
@@ -21,6 +21,11 @@ export declare class AdTogether {
21
21
  static fetchAd(adUnitId: string, adType?: AdType): Promise<AdModel>;
22
22
  static trackImpression(adId: string, token?: string): void;
23
23
  static trackClick(adId: string, token?: string): void;
24
+ /**
25
+ * Detect country code from the device locale.
26
+ * Tries expo-localization first, then NativeModules, then Intl API.
27
+ */
28
+ private static detectCountry;
24
29
  private static trackEvent;
25
30
  }
26
31
  //# sourceMappingURL=AdTogether.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdTogether.d.ts","sourceRoot":"","sources":["../../src/AdTogether.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAG7D,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAa;IACpC,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAiB;IAC9B,OAAO,EAAE,MAAM,CAA8C;IAEpE,OAAO;IAEP,MAAM,KAAK,MAAM,IAAI,UAAU,CAK9B;IAED;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAwCpC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,iBAAiB;IA6B5C,iBAAiB;IAQjB,OAAO,CAAC,QAAQ,CAAC,CAAS;WAEb,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkCzE,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAInD,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAI9C,OAAO,CAAC,MAAM,CAAC,UAAU;CAmB1B"}
1
+ {"version":3,"file":"AdTogether.d.ts","sourceRoot":"","sources":["../../src/AdTogether.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAG7D,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAa;IACpC,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAiB;IAC9B,OAAO,EAAE,MAAM,CAA8C;IAEpE,OAAO;IAEP,MAAM,KAAK,MAAM,IAAI,UAAU,CAK9B;IAED;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAwCpC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,iBAAiB;IA6B5C,iBAAiB;IAQjB,OAAO,CAAC,QAAQ,CAAC,CAAS;WAEb,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkCzE,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAInD,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAI9C;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAyD5B,OAAO,CAAC,MAAM,CAAC,UAAU;CAoB1B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adtogether/react-native-sdk",
3
- "version": "0.1.22",
3
+ "version": "0.1.24",
4
4
  "description": "The official AdTogether React Native SDK — reciprocal ad exchange to increase conversions and grow your audience.",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
package/src/AdTogether.ts CHANGED
@@ -145,6 +145,67 @@ export class AdTogether {
145
145
  this.trackEvent('/api/ads/click', adId, token);
146
146
  }
147
147
 
148
+ /**
149
+ * Detect country code from the device locale.
150
+ * Tries expo-localization first, then NativeModules, then Intl API.
151
+ */
152
+ private static detectCountry(): string | null {
153
+ // 1. Try expo-localization
154
+ try {
155
+ const ExpoLocalization = require('expo-localization');
156
+ if (ExpoLocalization?.region) {
157
+ return ExpoLocalization.region; // e.g. "US"
158
+ }
159
+ // expo-localization v3+ uses getLocales()
160
+ if (ExpoLocalization?.getLocales) {
161
+ const locales = ExpoLocalization.getLocales();
162
+ if (locales?.[0]?.regionCode) {
163
+ return locales[0].regionCode;
164
+ }
165
+ }
166
+ } catch (_) {}
167
+
168
+ // 2. Try RN NativeModules (I18nManager or SettingsManager)
169
+ try {
170
+ if (Platform.OS === 'ios') {
171
+ const settings = NativeModules.SettingsManager?.settings;
172
+ const locale = settings?.AppleLocale || settings?.AppleLanguages?.[0];
173
+ if (locale) {
174
+ const parts = locale.replace('_', '-').split('-');
175
+ if (parts.length >= 2) {
176
+ const region = parts[parts.length - 1].toUpperCase();
177
+ if (region.length === 2) return region;
178
+ }
179
+ }
180
+ } else if (Platform.OS === 'android') {
181
+ const locale = NativeModules.I18nManager?.localeIdentifier;
182
+ if (locale) {
183
+ const parts = locale.replace('_', '-').split('-');
184
+ if (parts.length >= 2) {
185
+ const region = parts[parts.length - 1].toUpperCase();
186
+ if (region.length === 2) return region;
187
+ }
188
+ }
189
+ }
190
+ } catch (_) {}
191
+
192
+ // 3. Fallback: Intl API (available in Hermes & JSC)
193
+ try {
194
+ if (typeof Intl !== 'undefined' && Intl.DateTimeFormat) {
195
+ const resolved = Intl.DateTimeFormat().resolvedOptions();
196
+ if (resolved.locale) {
197
+ const parts = resolved.locale.split('-');
198
+ if (parts.length >= 2) {
199
+ const region = parts[parts.length - 1].toUpperCase();
200
+ if (region.length === 2) return region;
201
+ }
202
+ }
203
+ }
204
+ } catch (_) {}
205
+
206
+ return null;
207
+ }
208
+
148
209
  private static trackEvent(endpoint: string, adId: string, token?: string) {
149
210
  if (!AdTogether.shared.assertInitialized()) return;
150
211
 
@@ -161,6 +222,7 @@ export class AdTogether {
161
222
  // Send platform and environment to match Flutter SDK
162
223
  platform: Platform.OS,
163
224
  environment: __DEV__ ? 'development' : 'production',
225
+ country: AdTogether.detectCountry(),
164
226
  }),
165
227
  }).catch(console.error);
166
228
  }