@adtogether/react-native-sdk 0.1.12 → 0.1.14
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 +13 -0
- package/README.md +8 -1
- package/lib/commonjs/AdTogether.js +68 -4
- package/lib/commonjs/AdTogether.js.map +1 -1
- package/lib/commonjs/AdTogetherBanner.js +38 -0
- package/lib/commonjs/AdTogetherBanner.js.map +1 -1
- package/lib/module/AdTogether.js +69 -5
- package/lib/module/AdTogether.js.map +1 -1
- package/lib/module/AdTogetherBanner.js +39 -1
- package/lib/module/AdTogetherBanner.js.map +1 -1
- package/lib/typescript/AdTogether.d.ts +9 -0
- package/lib/typescript/AdTogether.d.ts.map +1 -1
- package/lib/typescript/AdTogetherBanner.d.ts +4 -0
- package/lib/typescript/AdTogetherBanner.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +1 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/AdTogether.ts +74 -5
- package/src/AdTogetherBanner.tsx +46 -1
- package/src/types.ts +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
## 0.1.14
|
|
2
|
+
|
|
3
|
+
* **Feature**: Added `onAdClosed` callback support to banner components.
|
|
4
|
+
* **Feature**: Improved automatic `bundleId` detection across all platforms.
|
|
5
|
+
* **Security**: Hardened ad-serving logic to prevent payout fraud.
|
|
6
|
+
* **Sync**: Version parity across all AdTogether SDKs.
|
|
7
|
+
|
|
8
|
+
## 0.1.12
|
|
9
|
+
|
|
10
|
+
* **Feature**: Added `showCloseButton` to `AdTogetherBanner`.
|
|
11
|
+
* **Standardization**: Support for `onAdLoaded` and `onAdFailedToLoad` with unified naming conventions.
|
|
12
|
+
* **Layout**: Enhanced responsiveness and safe area handling.
|
|
13
|
+
|
|
1
14
|
## 0.1.9
|
|
2
15
|
|
|
3
16
|
* **Feature**: Added `onAdLoaded` and `onAdFailedToLoad` callback support to both `AdTogetherBanner` and `AdTogetherInterstitial`.
|
package/README.md
CHANGED
|
@@ -46,7 +46,10 @@ Call `AdTogether.initialize()` before rendering any ad components. You can obtai
|
|
|
46
46
|
```typescript
|
|
47
47
|
import { AdTogether } from '@adtogether/react-native-sdk';
|
|
48
48
|
|
|
49
|
-
AdTogether.initialize({
|
|
49
|
+
AdTogether.initialize({
|
|
50
|
+
appId: 'YOUR_APP_ID',
|
|
51
|
+
// bundleId: 'com.example.app' // optional: auto-detected when possible
|
|
52
|
+
});
|
|
50
53
|
```
|
|
51
54
|
|
|
52
55
|
## Usage
|
|
@@ -66,8 +69,10 @@ function MyApp() {
|
|
|
66
69
|
|
|
67
70
|
<AdTogetherBanner
|
|
68
71
|
adUnitId="home_bottom_banner"
|
|
72
|
+
showCloseButton={true}
|
|
69
73
|
onAdLoaded={() => console.log('Banner loaded!')}
|
|
70
74
|
onAdFailedToLoad={(error) => console.error('Banner error:', error)}
|
|
75
|
+
onAdClosed={() => console.log('Banner closed!')}
|
|
71
76
|
/>
|
|
72
77
|
</View>
|
|
73
78
|
);
|
|
@@ -79,6 +84,8 @@ function MyApp() {
|
|
|
79
84
|
| Prop | Type | Default | Description |
|
|
80
85
|
|--------------------|-------------------------|-----------|-------------|
|
|
81
86
|
| `adUnitId` | `string` | **required** | Unique identifier for this ad placement. |
|
|
87
|
+
| `showCloseButton` | `boolean` | `false` | Show a dismissable close button overlay. |
|
|
88
|
+
| `onAdClosed` | `() => void` | — | Called when the user closes the ad. |
|
|
82
89
|
| `theme` | `'dark' \| 'light' \| 'auto'` | `'auto'` | Color scheme. `'auto'` follows system preference. |
|
|
83
90
|
| `onAdLoaded` | `() => void` | — | Called when the ad has been successfully fetched and rendered. |
|
|
84
91
|
| `onAdFailedToLoad` | `(error: Error) => void`| — | Called if the ad fails to load. |
|
|
@@ -15,16 +15,71 @@ class AdTogether {
|
|
|
15
15
|
}
|
|
16
16
|
return AdTogether.instance;
|
|
17
17
|
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Attempts to auto-detect the app's bundle/package identifier.
|
|
21
|
+
* Tries multiple sources in order:
|
|
22
|
+
* 1. expo-application (if Expo is available)
|
|
23
|
+
* 2. react-native-device-info (if installed)
|
|
24
|
+
* 3. RN's built-in PlatformConstants (Android only)
|
|
25
|
+
*/
|
|
26
|
+
static tryAutoDetectBundleId() {
|
|
27
|
+
// 1. Try expo-application (works in Expo and bare RN with expo modules)
|
|
28
|
+
try {
|
|
29
|
+
const ExpoApplication = require('expo-application');
|
|
30
|
+
if (ExpoApplication?.applicationId) {
|
|
31
|
+
return ExpoApplication.applicationId;
|
|
32
|
+
}
|
|
33
|
+
} catch (_) {
|
|
34
|
+
// expo-application not available
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// 2. Try react-native-device-info (popular community module)
|
|
38
|
+
try {
|
|
39
|
+
const DeviceInfo = require('react-native-device-info');
|
|
40
|
+
if (DeviceInfo?.getBundleId) {
|
|
41
|
+
return DeviceInfo.getBundleId();
|
|
42
|
+
}
|
|
43
|
+
} catch (_) {
|
|
44
|
+
// react-native-device-info not available
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 3. Try RN's built-in PlatformConstants (Android exposes package name)
|
|
48
|
+
try {
|
|
49
|
+
if (_reactNative.Platform.OS === 'android') {
|
|
50
|
+
const constants = _reactNative.NativeModules.PlatformConstants;
|
|
51
|
+
if (constants?.reactNativeVersion) {
|
|
52
|
+
// On Android, the ServerHost module sometimes exposes the package name
|
|
53
|
+
const appModule = _reactNative.NativeModules.RNDeviceInfo || _reactNative.NativeModules.AppInfo;
|
|
54
|
+
if (appModule?.bundleId) {
|
|
55
|
+
return appModule.bundleId;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
} catch (_) {
|
|
60
|
+
// PlatformConstants not available
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
18
64
|
static initialize(options) {
|
|
19
65
|
const sdk = AdTogether.shared;
|
|
20
66
|
sdk.appId = options.apiKey || options.appId;
|
|
67
|
+
if (options.bundleId) {
|
|
68
|
+
sdk.bundleId = options.bundleId;
|
|
69
|
+
} else {
|
|
70
|
+
// Auto-detect bundleId from available native modules
|
|
71
|
+
sdk.bundleId = AdTogether.tryAutoDetectBundleId();
|
|
72
|
+
if (!sdk.bundleId) {
|
|
73
|
+
console.warn('AdTogether: Could not auto-detect bundleId. ' + 'For best results, provide bundleId in initialize() options, ' + 'or install expo-application or react-native-device-info.');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
21
76
|
if (options.allowSelfAds !== undefined) {
|
|
22
77
|
sdk.allowSelfAds = options.allowSelfAds;
|
|
23
78
|
}
|
|
24
79
|
if (options.baseUrl) {
|
|
25
80
|
sdk.baseUrl = options.baseUrl;
|
|
26
81
|
}
|
|
27
|
-
console.log(`AdTogether SDK Initialized with App ID: ${sdk.appId}`);
|
|
82
|
+
console.log(`AdTogether SDK Initialized with App ID: ${sdk.appId}${sdk.bundleId ? `, Bundle ID: ${sdk.bundleId}` : ''}`);
|
|
28
83
|
}
|
|
29
84
|
assertInitialized() {
|
|
30
85
|
if (!this.appId) {
|
|
@@ -46,9 +101,12 @@ class AdTogether {
|
|
|
46
101
|
if (sdk.lastAdId) {
|
|
47
102
|
url += `&exclude=${sdk.lastAdId}`;
|
|
48
103
|
}
|
|
104
|
+
if (sdk.bundleId) {
|
|
105
|
+
url += `&bundleId=${sdk.bundleId}`;
|
|
106
|
+
}
|
|
49
107
|
|
|
50
|
-
// Pass allowSelfAds
|
|
51
|
-
url += `&allowSelfAds=${sdk.allowSelfAds}
|
|
108
|
+
// Pass allowSelfAds (removed platform from fetch URL to match other SDKs)
|
|
109
|
+
url += `&allowSelfAds=${sdk.allowSelfAds}`;
|
|
52
110
|
const response = await fetch(url);
|
|
53
111
|
if (response.ok) {
|
|
54
112
|
const ad = await response.json();
|
|
@@ -76,7 +134,13 @@ class AdTogether {
|
|
|
76
134
|
body: JSON.stringify({
|
|
77
135
|
adId,
|
|
78
136
|
token,
|
|
79
|
-
apiKey: AdTogether.shared.appId
|
|
137
|
+
apiKey: AdTogether.shared.appId,
|
|
138
|
+
...(AdTogether.shared.bundleId ? {
|
|
139
|
+
bundleId: AdTogether.shared.bundleId
|
|
140
|
+
} : {}),
|
|
141
|
+
// Send platform and environment to match Flutter SDK
|
|
142
|
+
platform: _reactNative.Platform.OS,
|
|
143
|
+
environment: __DEV__ ? 'development' : 'production'
|
|
80
144
|
})
|
|
81
145
|
}).catch(console.error);
|
|
82
146
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","AdTogether","allowSelfAds","baseUrl","constructor","shared","instance","initialize","options","sdk","appId","apiKey","
|
|
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":[]}
|
|
@@ -13,12 +13,15 @@ const AdTogetherBanner = ({
|
|
|
13
13
|
adUnitId,
|
|
14
14
|
onAdLoaded,
|
|
15
15
|
onAdFailedToLoad,
|
|
16
|
+
showCloseButton = false,
|
|
17
|
+
onAdClosed,
|
|
16
18
|
theme = 'auto',
|
|
17
19
|
style
|
|
18
20
|
}) => {
|
|
19
21
|
const [adData, setAdData] = (0, _react.useState)(null);
|
|
20
22
|
const [isLoading, setIsLoading] = (0, _react.useState)(true);
|
|
21
23
|
const [hasError, setHasError] = (0, _react.useState)(false);
|
|
24
|
+
const [isVisible, setIsVisible] = (0, _react.useState)(true);
|
|
22
25
|
const systemColorScheme = (0, _reactNative.useColorScheme)();
|
|
23
26
|
const impressionTrackedRef = (0, _react.useRef)(false);
|
|
24
27
|
(0, _react.useEffect)(() => {
|
|
@@ -56,6 +59,13 @@ const AdTogetherBanner = ({
|
|
|
56
59
|
_reactNative.Linking.openURL(adData.clickUrl).catch(console.error);
|
|
57
60
|
}
|
|
58
61
|
};
|
|
62
|
+
const handleClose = () => {
|
|
63
|
+
setIsVisible(false);
|
|
64
|
+
onAdClosed?.();
|
|
65
|
+
};
|
|
66
|
+
if (!isVisible) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
59
69
|
if (isLoading) {
|
|
60
70
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
61
71
|
style: [styles.container, style]
|
|
@@ -109,6 +119,16 @@ const AdTogetherBanner = ({
|
|
|
109
119
|
numberOfLines: 2,
|
|
110
120
|
children: adData.description
|
|
111
121
|
})]
|
|
122
|
+
}), showCloseButton && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
|
|
123
|
+
onPress: handleClose,
|
|
124
|
+
style: styles.closeButton,
|
|
125
|
+
hitSlop: 8,
|
|
126
|
+
accessibilityLabel: "Close ad",
|
|
127
|
+
accessibilityRole: "button",
|
|
128
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
129
|
+
style: styles.closeButtonText,
|
|
130
|
+
children: "\xD7"
|
|
131
|
+
})
|
|
112
132
|
})]
|
|
113
133
|
});
|
|
114
134
|
};
|
|
@@ -169,6 +189,24 @@ const styles = _reactNative.StyleSheet.create({
|
|
|
169
189
|
},
|
|
170
190
|
description: {
|
|
171
191
|
fontSize: 12
|
|
192
|
+
},
|
|
193
|
+
closeButton: {
|
|
194
|
+
position: 'absolute',
|
|
195
|
+
top: 8,
|
|
196
|
+
right: 8,
|
|
197
|
+
width: 24,
|
|
198
|
+
height: 24,
|
|
199
|
+
borderRadius: 12,
|
|
200
|
+
backgroundColor: 'rgba(0, 0, 0, 0.4)',
|
|
201
|
+
alignItems: 'center',
|
|
202
|
+
justifyContent: 'center',
|
|
203
|
+
zIndex: 1
|
|
204
|
+
},
|
|
205
|
+
closeButtonText: {
|
|
206
|
+
color: '#fff',
|
|
207
|
+
fontSize: 16,
|
|
208
|
+
fontWeight: 'bold',
|
|
209
|
+
lineHeight: 18
|
|
172
210
|
}
|
|
173
211
|
});
|
|
174
212
|
//# sourceMappingURL=AdTogetherBanner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_AdTogether","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","AdTogetherBanner","adUnitId","onAdLoaded","onAdFailedToLoad","theme","style","adData","setAdData","useState","isLoading","setIsLoading","hasError","setHasError","systemColorScheme","useColorScheme","impressionTrackedRef","useRef","useEffect","isMounted","AdTogether","fetchAd","then","ad","catch","err","console","error","current","trackImpression","id","token","handlePress","trackClick","clickUrl","Linking","openURL","jsx","View","styles","container","isDarkMode","bgColor","borderColor","textColor","descColor","jsxs","TouchableOpacity","activeOpacity","onPress","backgroundColor","children","imageUrl","imageContainer","Image","source","uri","image","resizeMode","textContainer","headerRow","Text","title","color","numberOfLines","adBadge","adBadgeText","description","exports","StyleSheet","create","flexDirection","width","minHeight","borderRadius","borderWidth","overflow","shadowColor","shadowOffset","height","shadowOpacity","shadowRadius","elevation","padding","flex","justifyContent","alignItems","marginBottom","fontWeight","fontSize","paddingHorizontal","paddingVertical","marginLeft"],"sourceRoot":"../../src","sources":["AdTogetherBanner.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,WAAA,GAAAF,OAAA;AAA0C,IAAAG,WAAA,GAAAH,OAAA;AAAA,SAAAD,wBAAAK,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAP,uBAAA,YAAAA,CAAAK,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_AdTogether","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","AdTogetherBanner","adUnitId","onAdLoaded","onAdFailedToLoad","showCloseButton","onAdClosed","theme","style","adData","setAdData","useState","isLoading","setIsLoading","hasError","setHasError","isVisible","setIsVisible","systemColorScheme","useColorScheme","impressionTrackedRef","useRef","useEffect","isMounted","AdTogether","fetchAd","then","ad","catch","err","console","error","current","trackImpression","id","token","handlePress","trackClick","clickUrl","Linking","openURL","handleClose","jsx","View","styles","container","isDarkMode","bgColor","borderColor","textColor","descColor","jsxs","TouchableOpacity","activeOpacity","onPress","backgroundColor","children","imageUrl","imageContainer","Image","source","uri","image","resizeMode","textContainer","headerRow","Text","title","color","numberOfLines","adBadge","adBadgeText","description","Pressable","closeButton","hitSlop","accessibilityLabel","accessibilityRole","closeButtonText","exports","StyleSheet","create","flexDirection","width","minHeight","borderRadius","borderWidth","overflow","shadowColor","shadowOffset","height","shadowOpacity","shadowRadius","elevation","padding","flex","justifyContent","alignItems","marginBottom","fontWeight","fontSize","paddingHorizontal","paddingVertical","marginLeft","position","top","right","zIndex","lineHeight"],"sourceRoot":"../../src","sources":["AdTogetherBanner.tsx"],"mappings":"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","ignoreList":[]}
|
package/lib/module/AdTogether.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { Platform } from 'react-native';
|
|
3
|
+
import { NativeModules, Platform } from 'react-native';
|
|
4
4
|
export class AdTogether {
|
|
5
5
|
allowSelfAds = true;
|
|
6
6
|
baseUrl = 'https://adtogether.relaxsoftwareapps.com';
|
|
@@ -11,16 +11,71 @@ export class AdTogether {
|
|
|
11
11
|
}
|
|
12
12
|
return AdTogether.instance;
|
|
13
13
|
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Attempts to auto-detect the app's bundle/package identifier.
|
|
17
|
+
* Tries multiple sources in order:
|
|
18
|
+
* 1. expo-application (if Expo is available)
|
|
19
|
+
* 2. react-native-device-info (if installed)
|
|
20
|
+
* 3. RN's built-in PlatformConstants (Android only)
|
|
21
|
+
*/
|
|
22
|
+
static tryAutoDetectBundleId() {
|
|
23
|
+
// 1. Try expo-application (works in Expo and bare RN with expo modules)
|
|
24
|
+
try {
|
|
25
|
+
const ExpoApplication = require('expo-application');
|
|
26
|
+
if (ExpoApplication?.applicationId) {
|
|
27
|
+
return ExpoApplication.applicationId;
|
|
28
|
+
}
|
|
29
|
+
} catch (_) {
|
|
30
|
+
// expo-application not available
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// 2. Try react-native-device-info (popular community module)
|
|
34
|
+
try {
|
|
35
|
+
const DeviceInfo = require('react-native-device-info');
|
|
36
|
+
if (DeviceInfo?.getBundleId) {
|
|
37
|
+
return DeviceInfo.getBundleId();
|
|
38
|
+
}
|
|
39
|
+
} catch (_) {
|
|
40
|
+
// react-native-device-info not available
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 3. Try RN's built-in PlatformConstants (Android exposes package name)
|
|
44
|
+
try {
|
|
45
|
+
if (Platform.OS === 'android') {
|
|
46
|
+
const constants = NativeModules.PlatformConstants;
|
|
47
|
+
if (constants?.reactNativeVersion) {
|
|
48
|
+
// On Android, the ServerHost module sometimes exposes the package name
|
|
49
|
+
const appModule = NativeModules.RNDeviceInfo || NativeModules.AppInfo;
|
|
50
|
+
if (appModule?.bundleId) {
|
|
51
|
+
return appModule.bundleId;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
} catch (_) {
|
|
56
|
+
// PlatformConstants not available
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
14
60
|
static initialize(options) {
|
|
15
61
|
const sdk = AdTogether.shared;
|
|
16
62
|
sdk.appId = options.apiKey || options.appId;
|
|
63
|
+
if (options.bundleId) {
|
|
64
|
+
sdk.bundleId = options.bundleId;
|
|
65
|
+
} else {
|
|
66
|
+
// Auto-detect bundleId from available native modules
|
|
67
|
+
sdk.bundleId = AdTogether.tryAutoDetectBundleId();
|
|
68
|
+
if (!sdk.bundleId) {
|
|
69
|
+
console.warn('AdTogether: Could not auto-detect bundleId. ' + 'For best results, provide bundleId in initialize() options, ' + 'or install expo-application or react-native-device-info.');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
17
72
|
if (options.allowSelfAds !== undefined) {
|
|
18
73
|
sdk.allowSelfAds = options.allowSelfAds;
|
|
19
74
|
}
|
|
20
75
|
if (options.baseUrl) {
|
|
21
76
|
sdk.baseUrl = options.baseUrl;
|
|
22
77
|
}
|
|
23
|
-
console.log(`AdTogether SDK Initialized with App ID: ${sdk.appId}`);
|
|
78
|
+
console.log(`AdTogether SDK Initialized with App ID: ${sdk.appId}${sdk.bundleId ? `, Bundle ID: ${sdk.bundleId}` : ''}`);
|
|
24
79
|
}
|
|
25
80
|
assertInitialized() {
|
|
26
81
|
if (!this.appId) {
|
|
@@ -42,9 +97,12 @@ export class AdTogether {
|
|
|
42
97
|
if (sdk.lastAdId) {
|
|
43
98
|
url += `&exclude=${sdk.lastAdId}`;
|
|
44
99
|
}
|
|
100
|
+
if (sdk.bundleId) {
|
|
101
|
+
url += `&bundleId=${sdk.bundleId}`;
|
|
102
|
+
}
|
|
45
103
|
|
|
46
|
-
// Pass allowSelfAds
|
|
47
|
-
url += `&allowSelfAds=${sdk.allowSelfAds}
|
|
104
|
+
// Pass allowSelfAds (removed platform from fetch URL to match other SDKs)
|
|
105
|
+
url += `&allowSelfAds=${sdk.allowSelfAds}`;
|
|
48
106
|
const response = await fetch(url);
|
|
49
107
|
if (response.ok) {
|
|
50
108
|
const ad = await response.json();
|
|
@@ -72,7 +130,13 @@ export class AdTogether {
|
|
|
72
130
|
body: JSON.stringify({
|
|
73
131
|
adId,
|
|
74
132
|
token,
|
|
75
|
-
apiKey: AdTogether.shared.appId
|
|
133
|
+
apiKey: AdTogether.shared.appId,
|
|
134
|
+
...(AdTogether.shared.bundleId ? {
|
|
135
|
+
bundleId: AdTogether.shared.bundleId
|
|
136
|
+
} : {}),
|
|
137
|
+
// Send platform and environment to match Flutter SDK
|
|
138
|
+
platform: Platform.OS,
|
|
139
|
+
environment: __DEV__ ? 'development' : 'production'
|
|
76
140
|
})
|
|
77
141
|
}).catch(console.error);
|
|
78
142
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","AdTogether","allowSelfAds","baseUrl","constructor","shared","instance","initialize","options","sdk","appId","apiKey","
|
|
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,19 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import React, { useEffect, useState, useRef } from 'react';
|
|
4
|
-
import { View, Text, Image, TouchableOpacity, StyleSheet, useColorScheme, Linking } from 'react-native';
|
|
4
|
+
import { View, Text, Image, TouchableOpacity, StyleSheet, useColorScheme, Linking, Pressable } from 'react-native';
|
|
5
5
|
import { AdTogether } from './AdTogether';
|
|
6
6
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
7
7
|
export const AdTogetherBanner = ({
|
|
8
8
|
adUnitId,
|
|
9
9
|
onAdLoaded,
|
|
10
10
|
onAdFailedToLoad,
|
|
11
|
+
showCloseButton = false,
|
|
12
|
+
onAdClosed,
|
|
11
13
|
theme = 'auto',
|
|
12
14
|
style
|
|
13
15
|
}) => {
|
|
14
16
|
const [adData, setAdData] = useState(null);
|
|
15
17
|
const [isLoading, setIsLoading] = useState(true);
|
|
16
18
|
const [hasError, setHasError] = useState(false);
|
|
19
|
+
const [isVisible, setIsVisible] = useState(true);
|
|
17
20
|
const systemColorScheme = useColorScheme();
|
|
18
21
|
const impressionTrackedRef = useRef(false);
|
|
19
22
|
useEffect(() => {
|
|
@@ -51,6 +54,13 @@ export const AdTogetherBanner = ({
|
|
|
51
54
|
Linking.openURL(adData.clickUrl).catch(console.error);
|
|
52
55
|
}
|
|
53
56
|
};
|
|
57
|
+
const handleClose = () => {
|
|
58
|
+
setIsVisible(false);
|
|
59
|
+
onAdClosed?.();
|
|
60
|
+
};
|
|
61
|
+
if (!isVisible) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
54
64
|
if (isLoading) {
|
|
55
65
|
return /*#__PURE__*/_jsx(View, {
|
|
56
66
|
style: [styles.container, style]
|
|
@@ -104,6 +114,16 @@ export const AdTogetherBanner = ({
|
|
|
104
114
|
numberOfLines: 2,
|
|
105
115
|
children: adData.description
|
|
106
116
|
})]
|
|
117
|
+
}), showCloseButton && /*#__PURE__*/_jsx(Pressable, {
|
|
118
|
+
onPress: handleClose,
|
|
119
|
+
style: styles.closeButton,
|
|
120
|
+
hitSlop: 8,
|
|
121
|
+
accessibilityLabel: "Close ad",
|
|
122
|
+
accessibilityRole: "button",
|
|
123
|
+
children: /*#__PURE__*/_jsx(Text, {
|
|
124
|
+
style: styles.closeButtonText,
|
|
125
|
+
children: "\xD7"
|
|
126
|
+
})
|
|
107
127
|
})]
|
|
108
128
|
});
|
|
109
129
|
};
|
|
@@ -163,6 +183,24 @@ const styles = StyleSheet.create({
|
|
|
163
183
|
},
|
|
164
184
|
description: {
|
|
165
185
|
fontSize: 12
|
|
186
|
+
},
|
|
187
|
+
closeButton: {
|
|
188
|
+
position: 'absolute',
|
|
189
|
+
top: 8,
|
|
190
|
+
right: 8,
|
|
191
|
+
width: 24,
|
|
192
|
+
height: 24,
|
|
193
|
+
borderRadius: 12,
|
|
194
|
+
backgroundColor: 'rgba(0, 0, 0, 0.4)',
|
|
195
|
+
alignItems: 'center',
|
|
196
|
+
justifyContent: 'center',
|
|
197
|
+
zIndex: 1
|
|
198
|
+
},
|
|
199
|
+
closeButtonText: {
|
|
200
|
+
color: '#fff',
|
|
201
|
+
fontSize: 16,
|
|
202
|
+
fontWeight: 'bold',
|
|
203
|
+
lineHeight: 18
|
|
166
204
|
}
|
|
167
205
|
});
|
|
168
206
|
//# sourceMappingURL=AdTogetherBanner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useEffect","useState","useRef","View","Text","Image","TouchableOpacity","StyleSheet","useColorScheme","Linking","AdTogether","jsx","_jsx","jsxs","_jsxs","AdTogetherBanner","adUnitId","onAdLoaded","onAdFailedToLoad","theme","style","adData","setAdData","isLoading","setIsLoading","hasError","setHasError","systemColorScheme","impressionTrackedRef","isMounted","fetchAd","then","ad","catch","err","console","error","current","trackImpression","id","token","handlePress","trackClick","clickUrl","openURL","styles","container","isDarkMode","bgColor","borderColor","textColor","descColor","activeOpacity","onPress","backgroundColor","children","imageUrl","imageContainer","source","uri","image","resizeMode","textContainer","headerRow","title","color","numberOfLines","adBadge","adBadgeText","description","create","flexDirection","width","minHeight","borderRadius","borderWidth","overflow","shadowColor","shadowOffset","height","shadowOpacity","shadowRadius","elevation","padding","flex","justifyContent","alignItems","marginBottom","fontWeight","fontSize","paddingHorizontal","paddingVertical","marginLeft"],"sourceRoot":"../../src","sources":["AdTogetherBanner.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,QAAQ,OAAO;AAC1D,SAASC,IAAI,EAAEC,IAAI,EAAEC,KAAK,EAAEC,gBAAgB,EAAEC,UAAU,EAAEC,cAAc,EAAEC,OAAO,QAAQ,cAAc;
|
|
1
|
+
{"version":3,"names":["React","useEffect","useState","useRef","View","Text","Image","TouchableOpacity","StyleSheet","useColorScheme","Linking","Pressable","AdTogether","jsx","_jsx","jsxs","_jsxs","AdTogetherBanner","adUnitId","onAdLoaded","onAdFailedToLoad","showCloseButton","onAdClosed","theme","style","adData","setAdData","isLoading","setIsLoading","hasError","setHasError","isVisible","setIsVisible","systemColorScheme","impressionTrackedRef","isMounted","fetchAd","then","ad","catch","err","console","error","current","trackImpression","id","token","handlePress","trackClick","clickUrl","openURL","handleClose","styles","container","isDarkMode","bgColor","borderColor","textColor","descColor","activeOpacity","onPress","backgroundColor","children","imageUrl","imageContainer","source","uri","image","resizeMode","textContainer","headerRow","title","color","numberOfLines","adBadge","adBadgeText","description","closeButton","hitSlop","accessibilityLabel","accessibilityRole","closeButtonText","create","flexDirection","width","minHeight","borderRadius","borderWidth","overflow","shadowColor","shadowOffset","height","shadowOpacity","shadowRadius","elevation","padding","flex","justifyContent","alignItems","marginBottom","fontWeight","fontSize","paddingHorizontal","paddingVertical","marginLeft","position","top","right","zIndex","lineHeight"],"sourceRoot":"../../src","sources":["AdTogetherBanner.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,10 +2,19 @@ import { AdModel, AdType, AdTogetherOptions } from './types';
|
|
|
2
2
|
export declare class AdTogether {
|
|
3
3
|
private static instance;
|
|
4
4
|
private appId?;
|
|
5
|
+
private bundleId?;
|
|
5
6
|
private allowSelfAds;
|
|
6
7
|
baseUrl: string;
|
|
7
8
|
private constructor();
|
|
8
9
|
static get shared(): AdTogether;
|
|
10
|
+
/**
|
|
11
|
+
* Attempts to auto-detect the app's bundle/package identifier.
|
|
12
|
+
* Tries multiple sources in order:
|
|
13
|
+
* 1. expo-application (if Expo is available)
|
|
14
|
+
* 2. react-native-device-info (if installed)
|
|
15
|
+
* 3. RN's built-in PlatformConstants (Android only)
|
|
16
|
+
*/
|
|
17
|
+
private static tryAutoDetectBundleId;
|
|
9
18
|
static initialize(options: AdTogetherOptions): void;
|
|
10
19
|
assertInitialized(): boolean;
|
|
11
20
|
private lastAdId?;
|
|
@@ -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,YAAY,CAAiB;IAC9B,OAAO,EAAE,MAAM,CAA8C;IAEpE,OAAO;IAEP,MAAM,KAAK,MAAM,IAAI,UAAU,CAK9B;IAED,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,iBAAiB;
|
|
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"}
|
|
@@ -3,6 +3,10 @@ export interface AdTogetherBannerProps {
|
|
|
3
3
|
adUnitId: string;
|
|
4
4
|
onAdLoaded?: () => void;
|
|
5
5
|
onAdFailedToLoad?: (error: Error) => void;
|
|
6
|
+
/** Whether to show a close button on the banner */
|
|
7
|
+
showCloseButton?: boolean;
|
|
8
|
+
/** Callback when the user closes the ad */
|
|
9
|
+
onAdClosed?: () => void;
|
|
6
10
|
/** Pass 'dark' to use dark mode, 'light' for light mode, or 'auto' (default) to respect system preference */
|
|
7
11
|
theme?: 'dark' | 'light' | 'auto';
|
|
8
12
|
style?: any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdTogetherBanner.d.ts","sourceRoot":"","sources":["../../src/AdTogetherBanner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAK3D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1C,6GAA6G;IAC7G,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAClC,KAAK,CAAC,EAAE,GAAG,CAAC;CACb;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,
|
|
1
|
+
{"version":3,"file":"AdTogetherBanner.d.ts","sourceRoot":"","sources":["../../src/AdTogetherBanner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAK3D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1C,mDAAmD;IACnD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,6GAA6G;IAC7G,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAClC,KAAK,CAAC,EAAE,GAAG,CAAC;CACb;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA+H5D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,cAAc,CAAC;AAE/C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mGAAmG;IACnG,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,cAAc,CAAC;AAE/C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mGAAmG;IACnG,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adtogether/react-native-sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.14",
|
|
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
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { AdModel, AdType, AdTogetherOptions } from './types';
|
|
2
|
-
import { Platform } from 'react-native';
|
|
2
|
+
import { NativeModules, Platform } from 'react-native';
|
|
3
3
|
|
|
4
4
|
export class AdTogether {
|
|
5
5
|
private static instance: AdTogether;
|
|
6
6
|
private appId?: string;
|
|
7
|
+
private bundleId?: string;
|
|
7
8
|
private allowSelfAds: boolean = true;
|
|
8
9
|
public baseUrl: string = 'https://adtogether.relaxsoftwareapps.com';
|
|
9
10
|
|
|
@@ -16,10 +17,71 @@ export class AdTogether {
|
|
|
16
17
|
return AdTogether.instance;
|
|
17
18
|
}
|
|
18
19
|
|
|
20
|
+
/**
|
|
21
|
+
* Attempts to auto-detect the app's bundle/package identifier.
|
|
22
|
+
* Tries multiple sources in order:
|
|
23
|
+
* 1. expo-application (if Expo is available)
|
|
24
|
+
* 2. react-native-device-info (if installed)
|
|
25
|
+
* 3. RN's built-in PlatformConstants (Android only)
|
|
26
|
+
*/
|
|
27
|
+
private static tryAutoDetectBundleId(): string | undefined {
|
|
28
|
+
// 1. Try expo-application (works in Expo and bare RN with expo modules)
|
|
29
|
+
try {
|
|
30
|
+
const ExpoApplication = require('expo-application');
|
|
31
|
+
if (ExpoApplication?.applicationId) {
|
|
32
|
+
return ExpoApplication.applicationId;
|
|
33
|
+
}
|
|
34
|
+
} catch (_) {
|
|
35
|
+
// expo-application not available
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// 2. Try react-native-device-info (popular community module)
|
|
39
|
+
try {
|
|
40
|
+
const DeviceInfo = require('react-native-device-info');
|
|
41
|
+
if (DeviceInfo?.getBundleId) {
|
|
42
|
+
return DeviceInfo.getBundleId();
|
|
43
|
+
}
|
|
44
|
+
} catch (_) {
|
|
45
|
+
// react-native-device-info not available
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// 3. Try RN's built-in PlatformConstants (Android exposes package name)
|
|
49
|
+
try {
|
|
50
|
+
if (Platform.OS === 'android') {
|
|
51
|
+
const constants = NativeModules.PlatformConstants;
|
|
52
|
+
if (constants?.reactNativeVersion) {
|
|
53
|
+
// On Android, the ServerHost module sometimes exposes the package name
|
|
54
|
+
const appModule = NativeModules.RNDeviceInfo || NativeModules.AppInfo;
|
|
55
|
+
if (appModule?.bundleId) {
|
|
56
|
+
return appModule.bundleId;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
} catch (_) {
|
|
61
|
+
// PlatformConstants not available
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
|
|
19
67
|
static initialize(options: AdTogetherOptions) {
|
|
20
68
|
const sdk = AdTogether.shared;
|
|
21
69
|
sdk.appId = options.apiKey || options.appId;
|
|
22
70
|
|
|
71
|
+
if (options.bundleId) {
|
|
72
|
+
sdk.bundleId = options.bundleId;
|
|
73
|
+
} else {
|
|
74
|
+
// Auto-detect bundleId from available native modules
|
|
75
|
+
sdk.bundleId = AdTogether.tryAutoDetectBundleId();
|
|
76
|
+
if (!sdk.bundleId) {
|
|
77
|
+
console.warn(
|
|
78
|
+
'AdTogether: Could not auto-detect bundleId. ' +
|
|
79
|
+
'For best results, provide bundleId in initialize() options, ' +
|
|
80
|
+
'or install expo-application or react-native-device-info.'
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
23
85
|
if (options.allowSelfAds !== undefined) {
|
|
24
86
|
sdk.allowSelfAds = options.allowSelfAds;
|
|
25
87
|
}
|
|
@@ -28,7 +90,7 @@ export class AdTogether {
|
|
|
28
90
|
sdk.baseUrl = options.baseUrl;
|
|
29
91
|
}
|
|
30
92
|
|
|
31
|
-
console.log(`AdTogether SDK Initialized with App ID: ${sdk.appId}`);
|
|
93
|
+
console.log(`AdTogether SDK Initialized with App ID: ${sdk.appId}${sdk.bundleId ? `, Bundle ID: ${sdk.bundleId}` : ''}`);
|
|
32
94
|
}
|
|
33
95
|
|
|
34
96
|
assertInitialized() {
|
|
@@ -55,9 +117,12 @@ export class AdTogether {
|
|
|
55
117
|
if (sdk.lastAdId) {
|
|
56
118
|
url += `&exclude=${sdk.lastAdId}`;
|
|
57
119
|
}
|
|
120
|
+
if (sdk.bundleId) {
|
|
121
|
+
url += `&bundleId=${sdk.bundleId}`;
|
|
122
|
+
}
|
|
58
123
|
|
|
59
|
-
// Pass allowSelfAds
|
|
60
|
-
url += `&allowSelfAds=${sdk.allowSelfAds}
|
|
124
|
+
// Pass allowSelfAds (removed platform from fetch URL to match other SDKs)
|
|
125
|
+
url += `&allowSelfAds=${sdk.allowSelfAds}`;
|
|
61
126
|
|
|
62
127
|
const response = await fetch(url);
|
|
63
128
|
if (response.ok) {
|
|
@@ -91,7 +156,11 @@ export class AdTogether {
|
|
|
91
156
|
body: JSON.stringify({
|
|
92
157
|
adId,
|
|
93
158
|
token,
|
|
94
|
-
apiKey: AdTogether.shared.appId
|
|
159
|
+
apiKey: AdTogether.shared.appId,
|
|
160
|
+
...(AdTogether.shared.bundleId ? { bundleId: AdTogether.shared.bundleId } : {}),
|
|
161
|
+
// Send platform and environment to match Flutter SDK
|
|
162
|
+
platform: Platform.OS,
|
|
163
|
+
environment: __DEV__ ? 'development' : 'production',
|
|
95
164
|
}),
|
|
96
165
|
}).catch(console.error);
|
|
97
166
|
}
|
package/src/AdTogetherBanner.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { useEffect, useState, useRef } from 'react';
|
|
2
|
-
import { View, Text, Image, TouchableOpacity, StyleSheet, useColorScheme, Linking } from 'react-native';
|
|
2
|
+
import { View, Text, Image, TouchableOpacity, StyleSheet, useColorScheme, Linking, Pressable } from 'react-native';
|
|
3
3
|
import { AdTogether } from './AdTogether';
|
|
4
4
|
import { AdModel } from './types';
|
|
5
5
|
|
|
@@ -7,6 +7,10 @@ export interface AdTogetherBannerProps {
|
|
|
7
7
|
adUnitId: string;
|
|
8
8
|
onAdLoaded?: () => void;
|
|
9
9
|
onAdFailedToLoad?: (error: Error) => void;
|
|
10
|
+
/** Whether to show a close button on the banner */
|
|
11
|
+
showCloseButton?: boolean;
|
|
12
|
+
/** Callback when the user closes the ad */
|
|
13
|
+
onAdClosed?: () => void;
|
|
10
14
|
/** Pass 'dark' to use dark mode, 'light' for light mode, or 'auto' (default) to respect system preference */
|
|
11
15
|
theme?: 'dark' | 'light' | 'auto';
|
|
12
16
|
style?: any;
|
|
@@ -16,12 +20,15 @@ export const AdTogetherBanner: React.FC<AdTogetherBannerProps> = ({
|
|
|
16
20
|
adUnitId,
|
|
17
21
|
onAdLoaded,
|
|
18
22
|
onAdFailedToLoad,
|
|
23
|
+
showCloseButton = false,
|
|
24
|
+
onAdClosed,
|
|
19
25
|
theme = 'auto',
|
|
20
26
|
style,
|
|
21
27
|
}) => {
|
|
22
28
|
const [adData, setAdData] = useState<AdModel | null>(null);
|
|
23
29
|
const [isLoading, setIsLoading] = useState(true);
|
|
24
30
|
const [hasError, setHasError] = useState(false);
|
|
31
|
+
const [isVisible, setIsVisible] = useState(true);
|
|
25
32
|
const systemColorScheme = useColorScheme();
|
|
26
33
|
|
|
27
34
|
const impressionTrackedRef = useRef(false);
|
|
@@ -67,6 +74,15 @@ export const AdTogetherBanner: React.FC<AdTogetherBannerProps> = ({
|
|
|
67
74
|
}
|
|
68
75
|
};
|
|
69
76
|
|
|
77
|
+
const handleClose = () => {
|
|
78
|
+
setIsVisible(false);
|
|
79
|
+
onAdClosed?.();
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
if (!isVisible) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
|
|
70
86
|
if (isLoading) {
|
|
71
87
|
return <View style={[styles.container, style]} />;
|
|
72
88
|
}
|
|
@@ -114,6 +130,17 @@ export const AdTogetherBanner: React.FC<AdTogetherBannerProps> = ({
|
|
|
114
130
|
{adData.description}
|
|
115
131
|
</Text>
|
|
116
132
|
</View>
|
|
133
|
+
{showCloseButton && (
|
|
134
|
+
<Pressable
|
|
135
|
+
onPress={handleClose}
|
|
136
|
+
style={styles.closeButton}
|
|
137
|
+
hitSlop={8}
|
|
138
|
+
accessibilityLabel="Close ad"
|
|
139
|
+
accessibilityRole="button"
|
|
140
|
+
>
|
|
141
|
+
<Text style={styles.closeButtonText}>×</Text>
|
|
142
|
+
</Pressable>
|
|
143
|
+
)}
|
|
117
144
|
</TouchableOpacity>
|
|
118
145
|
);
|
|
119
146
|
};
|
|
@@ -172,4 +199,22 @@ const styles = StyleSheet.create({
|
|
|
172
199
|
description: {
|
|
173
200
|
fontSize: 12,
|
|
174
201
|
},
|
|
202
|
+
closeButton: {
|
|
203
|
+
position: 'absolute',
|
|
204
|
+
top: 8,
|
|
205
|
+
right: 8,
|
|
206
|
+
width: 24,
|
|
207
|
+
height: 24,
|
|
208
|
+
borderRadius: 12,
|
|
209
|
+
backgroundColor: 'rgba(0, 0, 0, 0.4)',
|
|
210
|
+
alignItems: 'center',
|
|
211
|
+
justifyContent: 'center',
|
|
212
|
+
zIndex: 1,
|
|
213
|
+
},
|
|
214
|
+
closeButtonText: {
|
|
215
|
+
color: '#fff',
|
|
216
|
+
fontSize: 16,
|
|
217
|
+
fontWeight: 'bold',
|
|
218
|
+
lineHeight: 18,
|
|
219
|
+
},
|
|
175
220
|
});
|
package/src/types.ts
CHANGED