@kontextso/sdk-react-native 3.1.0-rc.0 → 3.1.0-rc.2
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.js +42 -14
- package/dist/index.mjs +33 -5
- package/package.json +2 -2
- package/src/formats/Format.tsx +34 -1
- package/src/services/SkOverlay.ts +22 -3
package/dist/index.js
CHANGED
|
@@ -57,7 +57,7 @@ function handleIframeMessage(handler, opts) {
|
|
|
57
57
|
// src/formats/Format.tsx
|
|
58
58
|
var import_sdk_react = require("@kontextso/sdk-react");
|
|
59
59
|
var import_react2 = require("react");
|
|
60
|
-
var
|
|
60
|
+
var import_react_native2 = require("react-native");
|
|
61
61
|
|
|
62
62
|
// src/frame-webview.tsx
|
|
63
63
|
var import_react = require("react");
|
|
@@ -98,6 +98,10 @@ var FrameWebView = (0, import_react.forwardRef)(
|
|
|
98
98
|
);
|
|
99
99
|
var frame_webview_default = FrameWebView;
|
|
100
100
|
|
|
101
|
+
// src/NativeRNKontext.ts
|
|
102
|
+
var import_react_native = require("react-native");
|
|
103
|
+
var NativeRNKontext_default = import_react_native.TurboModuleRegistry.getEnforcing("RNKontext");
|
|
104
|
+
|
|
101
105
|
// src/formats/Format.tsx
|
|
102
106
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
103
107
|
var sendMessage = (webViewRef, type, code, data) => {
|
|
@@ -137,7 +141,7 @@ var Format = ({ code, messageId, wrapper, onEvent, ...otherParams }) => {
|
|
|
137
141
|
const messageStatusRef = (0, import_react2.useRef)("none" /* None */);
|
|
138
142
|
const modalInitTimeoutRef = (0, import_react2.useRef)(null);
|
|
139
143
|
const isModalInitRef = (0, import_react2.useRef)(false);
|
|
140
|
-
const { height: windowHeight, width: windowWidth } = (0,
|
|
144
|
+
const { height: windowHeight, width: windowWidth } = (0, import_react_native2.useWindowDimensions)();
|
|
141
145
|
const keyboardHeightRef = (0, import_react2.useRef)(0);
|
|
142
146
|
const isAdViewVisible = showIframe && iframeLoaded;
|
|
143
147
|
const reset = () => {
|
|
@@ -146,6 +150,7 @@ var Format = ({ code, messageId, wrapper, onEvent, ...otherParams }) => {
|
|
|
146
150
|
setContainerStyles({});
|
|
147
151
|
setIframeStyles({});
|
|
148
152
|
setIframeLoaded(false);
|
|
153
|
+
closeSkOverlay();
|
|
149
154
|
resetModal();
|
|
150
155
|
context?.resetAll();
|
|
151
156
|
context?.captureError(new Error("Processing iframe error"));
|
|
@@ -188,6 +193,27 @@ var Format = ({ code, messageId, wrapper, onEvent, ...otherParams }) => {
|
|
|
188
193
|
...data
|
|
189
194
|
});
|
|
190
195
|
};
|
|
196
|
+
const openSkOverlay = async (appStoreId, position, dismissible) => {
|
|
197
|
+
try {
|
|
198
|
+
await NativeRNKontext_default.presentSKOverlay(appStoreId, position, dismissible);
|
|
199
|
+
sendMessage(webViewRef, "update-skoverlay-iframe", code, {
|
|
200
|
+
open: true
|
|
201
|
+
});
|
|
202
|
+
} catch (e) {
|
|
203
|
+
console.error("error opening sk overlay", e);
|
|
204
|
+
reset();
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
const closeSkOverlay = async () => {
|
|
208
|
+
try {
|
|
209
|
+
await NativeRNKontext_default.dismissSKOverlay();
|
|
210
|
+
sendMessage(webViewRef, "update-skoverlay-iframe", code, {
|
|
211
|
+
open: false
|
|
212
|
+
});
|
|
213
|
+
} catch (e) {
|
|
214
|
+
console.error("error dismissing sk overlay", e);
|
|
215
|
+
}
|
|
216
|
+
};
|
|
191
217
|
debug("format-update-state");
|
|
192
218
|
const onMessage = (event) => {
|
|
193
219
|
try {
|
|
@@ -217,7 +243,7 @@ var Format = ({ code, messageId, wrapper, onEvent, ...otherParams }) => {
|
|
|
217
243
|
break;
|
|
218
244
|
case "click-iframe":
|
|
219
245
|
if (message.data.url) {
|
|
220
|
-
|
|
246
|
+
import_react_native2.Linking.openURL(`${context?.adServerUrl}${message.data.url}`).catch(
|
|
221
247
|
(err) => console.error("error opening url", err)
|
|
222
248
|
);
|
|
223
249
|
}
|
|
@@ -254,6 +280,12 @@ var Format = ({ code, messageId, wrapper, onEvent, ...otherParams }) => {
|
|
|
254
280
|
context?.onAdEventInternal(message.data);
|
|
255
281
|
messageStatusRef.current = "message-received" /* MessageReceived */;
|
|
256
282
|
break;
|
|
283
|
+
case "open-skoverlay-iframe":
|
|
284
|
+
openSkOverlay(message.data.appStoreId, message.data.position, message.data.dismissible);
|
|
285
|
+
break;
|
|
286
|
+
case "close-skoverlay-iframe":
|
|
287
|
+
closeSkOverlay();
|
|
288
|
+
break;
|
|
257
289
|
}
|
|
258
290
|
},
|
|
259
291
|
{
|
|
@@ -296,7 +328,7 @@ var Format = ({ code, messageId, wrapper, onEvent, ...otherParams }) => {
|
|
|
296
328
|
break;
|
|
297
329
|
case "click-iframe":
|
|
298
330
|
if (message.data.url) {
|
|
299
|
-
|
|
331
|
+
import_react_native2.Linking.openURL(`${context?.adServerUrl}${message.data.url}`).catch(
|
|
300
332
|
(err) => console.error("error opening url", err)
|
|
301
333
|
);
|
|
302
334
|
}
|
|
@@ -380,10 +412,10 @@ var Format = ({ code, messageId, wrapper, onEvent, ...otherParams }) => {
|
|
|
380
412
|
return () => clearInterval(interval);
|
|
381
413
|
}, [isAdViewVisible]);
|
|
382
414
|
(0, import_react2.useEffect)(() => {
|
|
383
|
-
const showSubscription =
|
|
415
|
+
const showSubscription = import_react_native2.Keyboard.addListener("keyboardDidShow", (e) => {
|
|
384
416
|
keyboardHeightRef.current = e?.endCoordinates?.height ?? 0;
|
|
385
417
|
});
|
|
386
|
-
const hideSubscription =
|
|
418
|
+
const hideSubscription = import_react_native2.Keyboard.addListener("keyboardDidHide", () => {
|
|
387
419
|
keyboardHeightRef.current = 0;
|
|
388
420
|
});
|
|
389
421
|
return () => {
|
|
@@ -419,7 +451,7 @@ var Format = ({ code, messageId, wrapper, onEvent, ...otherParams }) => {
|
|
|
419
451
|
}
|
|
420
452
|
);
|
|
421
453
|
const interstitialContent = /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
422
|
-
|
|
454
|
+
import_react_native2.Modal,
|
|
423
455
|
{
|
|
424
456
|
visible: modalOpen,
|
|
425
457
|
transparent: true,
|
|
@@ -427,7 +459,7 @@ var Format = ({ code, messageId, wrapper, onEvent, ...otherParams }) => {
|
|
|
427
459
|
animationType: "slide",
|
|
428
460
|
statusBarTranslucent: true,
|
|
429
461
|
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
430
|
-
|
|
462
|
+
import_react_native2.View,
|
|
431
463
|
{
|
|
432
464
|
style: {
|
|
433
465
|
flex: 1,
|
|
@@ -462,7 +494,7 @@ var Format = ({ code, messageId, wrapper, onEvent, ...otherParams }) => {
|
|
|
462
494
|
);
|
|
463
495
|
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
|
|
464
496
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
465
|
-
|
|
497
|
+
import_react_native2.View,
|
|
466
498
|
{
|
|
467
499
|
style: isAdViewVisible ? containerStyles : {
|
|
468
500
|
height: 0,
|
|
@@ -492,11 +524,7 @@ var import_react_native3 = require("react-native");
|
|
|
492
524
|
var import_react_native_device_info = __toESM(require("react-native-device-info"));
|
|
493
525
|
|
|
494
526
|
// package.json
|
|
495
|
-
var version = "3.1.0-rc.
|
|
496
|
-
|
|
497
|
-
// src/NativeRNKontext.ts
|
|
498
|
-
var import_react_native2 = require("react-native");
|
|
499
|
-
var NativeRNKontext_default = import_react_native2.TurboModuleRegistry.getEnforcing("RNKontext");
|
|
527
|
+
var version = "3.1.0-rc.2";
|
|
500
528
|
|
|
501
529
|
// src/context/AdsProvider.tsx
|
|
502
530
|
var import_jsx_runtime4 = require("react/jsx-runtime");
|
package/dist/index.mjs
CHANGED
|
@@ -67,6 +67,10 @@ var FrameWebView = forwardRef(
|
|
|
67
67
|
);
|
|
68
68
|
var frame_webview_default = FrameWebView;
|
|
69
69
|
|
|
70
|
+
// src/NativeRNKontext.ts
|
|
71
|
+
import { TurboModuleRegistry } from "react-native";
|
|
72
|
+
var NativeRNKontext_default = TurboModuleRegistry.getEnforcing("RNKontext");
|
|
73
|
+
|
|
70
74
|
// src/formats/Format.tsx
|
|
71
75
|
import { Fragment, jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
72
76
|
var sendMessage = (webViewRef, type, code, data) => {
|
|
@@ -115,6 +119,7 @@ var Format = ({ code, messageId, wrapper, onEvent, ...otherParams }) => {
|
|
|
115
119
|
setContainerStyles({});
|
|
116
120
|
setIframeStyles({});
|
|
117
121
|
setIframeLoaded(false);
|
|
122
|
+
closeSkOverlay();
|
|
118
123
|
resetModal();
|
|
119
124
|
context?.resetAll();
|
|
120
125
|
context?.captureError(new Error("Processing iframe error"));
|
|
@@ -157,6 +162,27 @@ var Format = ({ code, messageId, wrapper, onEvent, ...otherParams }) => {
|
|
|
157
162
|
...data
|
|
158
163
|
});
|
|
159
164
|
};
|
|
165
|
+
const openSkOverlay = async (appStoreId, position, dismissible) => {
|
|
166
|
+
try {
|
|
167
|
+
await NativeRNKontext_default.presentSKOverlay(appStoreId, position, dismissible);
|
|
168
|
+
sendMessage(webViewRef, "update-skoverlay-iframe", code, {
|
|
169
|
+
open: true
|
|
170
|
+
});
|
|
171
|
+
} catch (e) {
|
|
172
|
+
console.error("error opening sk overlay", e);
|
|
173
|
+
reset();
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
const closeSkOverlay = async () => {
|
|
177
|
+
try {
|
|
178
|
+
await NativeRNKontext_default.dismissSKOverlay();
|
|
179
|
+
sendMessage(webViewRef, "update-skoverlay-iframe", code, {
|
|
180
|
+
open: false
|
|
181
|
+
});
|
|
182
|
+
} catch (e) {
|
|
183
|
+
console.error("error dismissing sk overlay", e);
|
|
184
|
+
}
|
|
185
|
+
};
|
|
160
186
|
debug("format-update-state");
|
|
161
187
|
const onMessage = (event) => {
|
|
162
188
|
try {
|
|
@@ -223,6 +249,12 @@ var Format = ({ code, messageId, wrapper, onEvent, ...otherParams }) => {
|
|
|
223
249
|
context?.onAdEventInternal(message.data);
|
|
224
250
|
messageStatusRef.current = "message-received" /* MessageReceived */;
|
|
225
251
|
break;
|
|
252
|
+
case "open-skoverlay-iframe":
|
|
253
|
+
openSkOverlay(message.data.appStoreId, message.data.position, message.data.dismissible);
|
|
254
|
+
break;
|
|
255
|
+
case "close-skoverlay-iframe":
|
|
256
|
+
closeSkOverlay();
|
|
257
|
+
break;
|
|
226
258
|
}
|
|
227
259
|
},
|
|
228
260
|
{
|
|
@@ -464,11 +496,7 @@ import { Appearance, Dimensions, PixelRatio, Platform } from "react-native";
|
|
|
464
496
|
import DeviceInfo from "react-native-device-info";
|
|
465
497
|
|
|
466
498
|
// package.json
|
|
467
|
-
var version = "3.1.0-rc.
|
|
468
|
-
|
|
469
|
-
// src/NativeRNKontext.ts
|
|
470
|
-
import { TurboModuleRegistry } from "react-native";
|
|
471
|
-
var NativeRNKontext_default = TurboModuleRegistry.getEnforcing("RNKontext");
|
|
499
|
+
var version = "3.1.0-rc.2";
|
|
472
500
|
|
|
473
501
|
// src/context/AdsProvider.tsx
|
|
474
502
|
import { jsx as jsx4 } from "react/jsx-runtime";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kontextso/sdk-react-native",
|
|
3
|
-
"version": "3.1.0-rc.
|
|
3
|
+
"version": "3.1.0-rc.2",
|
|
4
4
|
"description": "Kontext SDK for React Native",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"format": "biome format --write ."
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@kontextso/sdk-common": "^1.0.
|
|
23
|
+
"@kontextso/sdk-common": "^1.0.2",
|
|
24
24
|
"@kontextso/typescript-config": "*",
|
|
25
25
|
"@react-native-community/netinfo": "11.3.1",
|
|
26
26
|
"@testing-library/dom": "^10.4.0",
|
package/src/formats/Format.tsx
CHANGED
|
@@ -18,10 +18,11 @@ import { useContext, useEffect, useRef, useState } from 'react'
|
|
|
18
18
|
import { Keyboard, Linking, Modal, useWindowDimensions, View } from 'react-native'
|
|
19
19
|
import type { WebView, WebViewMessageEvent } from 'react-native-webview'
|
|
20
20
|
import FrameWebView from '../frame-webview'
|
|
21
|
+
import NativeRNKontext from '../NativeRNKontext'
|
|
21
22
|
|
|
22
23
|
const sendMessage = (
|
|
23
24
|
webViewRef: React.RefObject<WebView>,
|
|
24
|
-
type: Extract<IframeMessageType, 'update-iframe' | 'update-dimensions-iframe'>,
|
|
25
|
+
type: Extract<IframeMessageType, 'update-iframe' | 'update-dimensions-iframe' | 'update-skoverlay-iframe'>,
|
|
25
26
|
code: string,
|
|
26
27
|
data: any
|
|
27
28
|
) => {
|
|
@@ -90,6 +91,7 @@ const Format = ({ code, messageId, wrapper, onEvent, ...otherParams }: FormatPro
|
|
|
90
91
|
setContainerStyles({})
|
|
91
92
|
setIframeStyles({})
|
|
92
93
|
setIframeLoaded(false)
|
|
94
|
+
closeSkOverlay()
|
|
93
95
|
resetModal()
|
|
94
96
|
context?.resetAll()
|
|
95
97
|
context?.captureError(new Error('Processing iframe error'))
|
|
@@ -137,6 +139,29 @@ const Format = ({ code, messageId, wrapper, onEvent, ...otherParams }: FormatPro
|
|
|
137
139
|
})
|
|
138
140
|
}
|
|
139
141
|
|
|
142
|
+
const openSkOverlay = async (appStoreId: string, position: string, dismissible: boolean) => {
|
|
143
|
+
try {
|
|
144
|
+
await NativeRNKontext.presentSKOverlay(appStoreId, position, dismissible)
|
|
145
|
+
sendMessage(webViewRef, 'update-skoverlay-iframe', code, {
|
|
146
|
+
open: true
|
|
147
|
+
})
|
|
148
|
+
} catch (e) {
|
|
149
|
+
console.error('error opening sk overlay', e)
|
|
150
|
+
reset()
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const closeSkOverlay = async () => {
|
|
155
|
+
try {
|
|
156
|
+
await NativeRNKontext.dismissSKOverlay()
|
|
157
|
+
sendMessage(webViewRef, 'update-skoverlay-iframe', code, {
|
|
158
|
+
open: false
|
|
159
|
+
})
|
|
160
|
+
} catch (e) {
|
|
161
|
+
console.error('error dismissing sk overlay', e)
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
140
165
|
debug('format-update-state')
|
|
141
166
|
|
|
142
167
|
const onMessage = (event: WebViewMessageEvent) => {
|
|
@@ -217,6 +242,14 @@ const Format = ({ code, messageId, wrapper, onEvent, ...otherParams }: FormatPro
|
|
|
217
242
|
context?.onAdEventInternal(message.data)
|
|
218
243
|
messageStatusRef.current = MessageStatus.MessageReceived
|
|
219
244
|
break
|
|
245
|
+
|
|
246
|
+
case 'open-skoverlay-iframe':
|
|
247
|
+
openSkOverlay(message.data.appStoreId, message.data.position, message.data.dismissible)
|
|
248
|
+
break
|
|
249
|
+
|
|
250
|
+
case 'close-skoverlay-iframe':
|
|
251
|
+
closeSkOverlay()
|
|
252
|
+
break
|
|
220
253
|
}
|
|
221
254
|
},
|
|
222
255
|
{
|
|
@@ -3,15 +3,34 @@ import NativeRNKontext from '../NativeRNKontext';
|
|
|
3
3
|
|
|
4
4
|
export type SKOverlayPosition = 'bottom' | 'bottomRaised';
|
|
5
5
|
|
|
6
|
+
const isValidAppStoreId = (id: unknown): id is string => {
|
|
7
|
+
return typeof id === "string" && /^\d+$/.test(id);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const isValidPosition = (p: unknown): p is SKOverlayPosition => {
|
|
11
|
+
return p === "bottom" || p === "bottomRaised";
|
|
12
|
+
}
|
|
13
|
+
|
|
6
14
|
export async function presentSKOverlay(params: {
|
|
7
15
|
appStoreId: string;
|
|
8
|
-
position
|
|
9
|
-
dismissible
|
|
16
|
+
position: SKOverlayPosition;
|
|
17
|
+
dismissible: boolean;
|
|
10
18
|
}) {
|
|
11
19
|
if (Platform.OS !== 'ios') {
|
|
12
20
|
return false
|
|
13
21
|
}
|
|
14
|
-
|
|
22
|
+
let { appStoreId, position, dismissible } = params
|
|
23
|
+
|
|
24
|
+
if (!isValidAppStoreId(appStoreId)) {
|
|
25
|
+
return false
|
|
26
|
+
}
|
|
27
|
+
if (!isValidPosition(position)) {
|
|
28
|
+
position = 'bottom'
|
|
29
|
+
}
|
|
30
|
+
if (typeof dismissible !== 'boolean') {
|
|
31
|
+
dismissible = Boolean(dismissible)
|
|
32
|
+
}
|
|
33
|
+
|
|
15
34
|
return NativeRNKontext.presentSKOverlay(appStoreId, position, dismissible)
|
|
16
35
|
}
|
|
17
36
|
|