@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 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 import_react_native = require("react-native");
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, import_react_native.useWindowDimensions)();
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
- import_react_native.Linking.openURL(`${context?.adServerUrl}${message.data.url}`).catch(
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
- import_react_native.Linking.openURL(`${context?.adServerUrl}${message.data.url}`).catch(
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 = import_react_native.Keyboard.addListener("keyboardDidShow", (e) => {
415
+ const showSubscription = import_react_native2.Keyboard.addListener("keyboardDidShow", (e) => {
384
416
  keyboardHeightRef.current = e?.endCoordinates?.height ?? 0;
385
417
  });
386
- const hideSubscription = import_react_native.Keyboard.addListener("keyboardDidHide", () => {
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
- import_react_native.Modal,
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
- import_react_native.View,
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
- import_react_native.View,
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.0";
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.0";
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.0",
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.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",
@@ -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?: SKOverlayPosition;
9
- dismissible?: boolean;
16
+ position: SKOverlayPosition;
17
+ dismissible: boolean;
10
18
  }) {
11
19
  if (Platform.OS !== 'ios') {
12
20
  return false
13
21
  }
14
- const { appStoreId, position = 'bottom', dismissible = true } = params
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