@kontextso/sdk-react-native 0.0.5-rc.8 → 0.0.6

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.d.mts CHANGED
@@ -33,7 +33,9 @@ interface Ad {
33
33
  isStreaming?: boolean;
34
34
  isError?: boolean;
35
35
  viewed?: boolean;
36
+ clicked?: boolean;
36
37
  messageId?: string;
38
+ rewardContent?: string;
37
39
  product?: {
38
40
  id: string;
39
41
  title: string;
@@ -140,7 +142,6 @@ interface AdsProviderProps {
140
142
  logLevel?: any;
141
143
  conversationId?: string;
142
144
  styles?: AdStyles;
143
- throwError?: boolean;
144
145
  }
145
146
  declare const VISITOR_ID_KEY = "brain-visitor-id";
146
147
  declare const AdsProvider: ({ children, messages, publisherToken, isLoading, adserverUrl, isDisabled, character, conversationId, userId, logLevel, onAdView, onAdClick, ...props }: AdsProviderProps) => react_jsx_runtime.JSX.Element;
package/dist/index.d.ts CHANGED
@@ -33,7 +33,9 @@ interface Ad {
33
33
  isStreaming?: boolean;
34
34
  isError?: boolean;
35
35
  viewed?: boolean;
36
+ clicked?: boolean;
36
37
  messageId?: string;
38
+ rewardContent?: string;
37
39
  product?: {
38
40
  id: string;
39
41
  title: string;
@@ -140,7 +142,6 @@ interface AdsProviderProps {
140
142
  logLevel?: any;
141
143
  conversationId?: string;
142
144
  styles?: AdStyles;
143
- throwError?: boolean;
144
145
  }
145
146
  declare const VISITOR_ID_KEY = "brain-visitor-id";
146
147
  declare const AdsProvider: ({ children, messages, publisherToken, isLoading, adserverUrl, isDisabled, character, conversationId, userId, logLevel, onAdView, onAdClick, ...props }: AdsProviderProps) => react_jsx_runtime.JSX.Element;
package/dist/index.js CHANGED
@@ -97,7 +97,7 @@ var fetchRetry = async (input, init, maxRetries = 3, retryPeriod = 500) => {
97
97
  };
98
98
  var fixUrl = (adserverUrl, ad) => {
99
99
  if (ad.content) {
100
- ad.content = ad.content.replace("/ad/", `${adserverUrl}/ad/`);
100
+ ad.content = ad.content.replace("/impression/", `${adserverUrl}/impression/`);
101
101
  }
102
102
  return { ...ad, url: `${adserverUrl}${ad.url}` };
103
103
  };
@@ -105,7 +105,8 @@ var mergeAds = ({
105
105
  initAds,
106
106
  preloadAds,
107
107
  streamAds,
108
- viewedAds
108
+ viewedAds,
109
+ clickedAds
109
110
  }) => {
110
111
  const ads = [...initAds];
111
112
  if (Array.isArray(preloadAds)) {
@@ -132,6 +133,7 @@ var mergeAds = ({
132
133
  }
133
134
  for (const ad of ads) {
134
135
  ad.viewed = viewedAds.includes(ad?.id || "placeholder");
136
+ ad.clicked = clickedAds.includes(ad?.id || "placeholder");
135
137
  }
136
138
  return ads;
137
139
  };
@@ -201,9 +203,11 @@ var parseMessageText = (text) => {
201
203
  var import_loglevel = __toESM(require("loglevel"));
202
204
 
203
205
  // package.json
204
- var version = "0.0.5-rc.7";
206
+ var version = "0.0.5-rc.8";
205
207
 
206
208
  // src/hooks/useInitializeAds.tsx
209
+ var SINGLE_INIT_TIMEOUT_BUDGET_MS = 3e3;
210
+ var SINGLE_INIT_RETRIES = 3;
207
211
  async function initialize(adServerUrl, publisherToken, userId, conversationId, legacyVisitorId, character) {
208
212
  import_loglevel.default.log("[BRAIN] init ads started");
209
213
  const response = await fetchRetry(
@@ -221,8 +225,8 @@ async function initialize(adServerUrl, publisherToken, userId, conversationId, l
221
225
  character
222
226
  })
223
227
  },
224
- 3,
225
- 1e3
228
+ SINGLE_INIT_TIMEOUT_BUDGET_MS,
229
+ SINGLE_INIT_RETRIES
226
230
  );
227
231
  const {
228
232
  sessionId,
@@ -715,8 +719,8 @@ function useStreamAds({
715
719
  isLoading: false,
716
720
  isStreaming: true,
717
721
  content: content.replace(
718
- new RegExp(`/ad/${adData.product.id}/redirect`, "g"),
719
- `/ad/${adData.id}/redirect`
722
+ new RegExp(`/impression/${adData.product.id}/redirect`, "g"),
723
+ `/impression/${adData.id}/redirect`
720
724
  )
721
725
  });
722
726
  return newAd;
@@ -813,6 +817,7 @@ var AdsProviderWithoutBoundary = ({
813
817
  ...props
814
818
  }) => {
815
819
  const [viewedAds, setViewedAds] = (0, import_react5.useState)([]);
820
+ const [clickedAds, setClickedAds] = (0, import_react5.useState)([]);
816
821
  const adServerUrlOrDefault = adserverUrl || "https://server.megabrain.co";
817
822
  import_loglevel5.default.setLevel(logLevel || "ERROR");
818
823
  const {
@@ -857,13 +862,7 @@ var AdsProviderWithoutBoundary = ({
857
862
  enabledPlacements,
858
863
  publisherToken
859
864
  });
860
- const ads = mergeAds({ initAds, preloadAds, streamAds, viewedAds });
861
- if (props.throwError && Math.random() < 0.1) {
862
- throw new Error("Test error");
863
- }
864
- if (props.throwError && Math.random() < 0.1) {
865
- Promise.reject(new Error("Test async error"));
866
- }
865
+ const ads = mergeAds({ initAds, preloadAds, streamAds, viewedAds, clickedAds });
867
866
  const markAdAsViewed = (ad) => {
868
867
  import_loglevel5.default.debug("[Brain] Calling onAdView");
869
868
  onAdView && onAdView({
@@ -884,6 +883,13 @@ var AdsProviderWithoutBoundary = ({
884
883
  messageId: ad.messageId,
885
884
  content: ad.content
886
885
  });
886
+ if (!ad.id) {
887
+ return;
888
+ }
889
+ if (clickedAds.includes(ad.id)) {
890
+ return;
891
+ }
892
+ setClickedAds((old) => [...old, ad.id]);
887
893
  };
888
894
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
889
895
  AdsContext.Provider,
@@ -954,8 +960,7 @@ var AdsProvider = ({
954
960
  userId,
955
961
  logLevel,
956
962
  onAdView,
957
- onAdClick,
958
- throwError: props.throwError
963
+ onAdClick
959
964
  }
960
965
  )
961
966
  }
@@ -978,7 +983,7 @@ function useAdViewed(ad) {
978
983
  serverUrl = context.streamAdServerUrl;
979
984
  }
980
985
  try {
981
- const response = await fetch(`${serverUrl}/ad/${ad.id}/view`, {
986
+ const response = await fetch(`${serverUrl}/impression/${ad.id}/view`, {
982
987
  method: "POST"
983
988
  });
984
989
  if (!response.ok) {
@@ -1263,6 +1268,10 @@ var InlineAd = ({ code, messageId, wrapper }) => {
1263
1268
  }
1264
1269
  }
1265
1270
  };
1271
+ let adContent = ad.content;
1272
+ if (ad.clicked && ad.rewardContent) {
1273
+ adContent = ad.rewardContent;
1274
+ }
1266
1275
  const content = /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_react_native5.View, { style: styles?.container, children: [
1267
1276
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native5.View, { style: styles?.adBadgeContainer, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native5.Text, { style: styles?.adBadgeText, children: "Ad" }) }),
1268
1277
  ad.imageUrl && ad.mediaPlacement === "top" && !ad.isStreaming && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
@@ -1292,7 +1301,7 @@ var InlineAd = ({ code, messageId, wrapper }) => {
1292
1301
  MarkdownText,
1293
1302
  {
1294
1303
  onLinkClick: () => context?.onAdClickInternal(ad),
1295
- content: ad.content
1304
+ content: adContent
1296
1305
  }
1297
1306
  ) }),
1298
1307
  ad.imageUrl && ad.mediaPlacement === "bottom" && !ad.isStreaming && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
package/dist/index.mjs CHANGED
@@ -71,7 +71,7 @@ var fetchRetry = async (input, init, maxRetries = 3, retryPeriod = 500) => {
71
71
  };
72
72
  var fixUrl = (adserverUrl, ad) => {
73
73
  if (ad.content) {
74
- ad.content = ad.content.replace("/ad/", `${adserverUrl}/ad/`);
74
+ ad.content = ad.content.replace("/impression/", `${adserverUrl}/impression/`);
75
75
  }
76
76
  return { ...ad, url: `${adserverUrl}${ad.url}` };
77
77
  };
@@ -79,7 +79,8 @@ var mergeAds = ({
79
79
  initAds,
80
80
  preloadAds,
81
81
  streamAds,
82
- viewedAds
82
+ viewedAds,
83
+ clickedAds
83
84
  }) => {
84
85
  const ads = [...initAds];
85
86
  if (Array.isArray(preloadAds)) {
@@ -106,6 +107,7 @@ var mergeAds = ({
106
107
  }
107
108
  for (const ad of ads) {
108
109
  ad.viewed = viewedAds.includes(ad?.id || "placeholder");
110
+ ad.clicked = clickedAds.includes(ad?.id || "placeholder");
109
111
  }
110
112
  return ads;
111
113
  };
@@ -175,9 +177,11 @@ var parseMessageText = (text) => {
175
177
  import log from "loglevel";
176
178
 
177
179
  // package.json
178
- var version = "0.0.5-rc.7";
180
+ var version = "0.0.5-rc.8";
179
181
 
180
182
  // src/hooks/useInitializeAds.tsx
183
+ var SINGLE_INIT_TIMEOUT_BUDGET_MS = 3e3;
184
+ var SINGLE_INIT_RETRIES = 3;
181
185
  async function initialize(adServerUrl, publisherToken, userId, conversationId, legacyVisitorId, character) {
182
186
  log.log("[BRAIN] init ads started");
183
187
  const response = await fetchRetry(
@@ -195,8 +199,8 @@ async function initialize(adServerUrl, publisherToken, userId, conversationId, l
195
199
  character
196
200
  })
197
201
  },
198
- 3,
199
- 1e3
202
+ SINGLE_INIT_TIMEOUT_BUDGET_MS,
203
+ SINGLE_INIT_RETRIES
200
204
  );
201
205
  const {
202
206
  sessionId,
@@ -689,8 +693,8 @@ function useStreamAds({
689
693
  isLoading: false,
690
694
  isStreaming: true,
691
695
  content: content.replace(
692
- new RegExp(`/ad/${adData.product.id}/redirect`, "g"),
693
- `/ad/${adData.id}/redirect`
696
+ new RegExp(`/impression/${adData.product.id}/redirect`, "g"),
697
+ `/impression/${adData.id}/redirect`
694
698
  )
695
699
  });
696
700
  return newAd;
@@ -787,6 +791,7 @@ var AdsProviderWithoutBoundary = ({
787
791
  ...props
788
792
  }) => {
789
793
  const [viewedAds, setViewedAds] = useState4([]);
794
+ const [clickedAds, setClickedAds] = useState4([]);
790
795
  const adServerUrlOrDefault = adserverUrl || "https://server.megabrain.co";
791
796
  log5.setLevel(logLevel || "ERROR");
792
797
  const {
@@ -831,13 +836,7 @@ var AdsProviderWithoutBoundary = ({
831
836
  enabledPlacements,
832
837
  publisherToken
833
838
  });
834
- const ads = mergeAds({ initAds, preloadAds, streamAds, viewedAds });
835
- if (props.throwError && Math.random() < 0.1) {
836
- throw new Error("Test error");
837
- }
838
- if (props.throwError && Math.random() < 0.1) {
839
- Promise.reject(new Error("Test async error"));
840
- }
839
+ const ads = mergeAds({ initAds, preloadAds, streamAds, viewedAds, clickedAds });
841
840
  const markAdAsViewed = (ad) => {
842
841
  log5.debug("[Brain] Calling onAdView");
843
842
  onAdView && onAdView({
@@ -858,6 +857,13 @@ var AdsProviderWithoutBoundary = ({
858
857
  messageId: ad.messageId,
859
858
  content: ad.content
860
859
  });
860
+ if (!ad.id) {
861
+ return;
862
+ }
863
+ if (clickedAds.includes(ad.id)) {
864
+ return;
865
+ }
866
+ setClickedAds((old) => [...old, ad.id]);
861
867
  };
862
868
  return /* @__PURE__ */ jsx(
863
869
  AdsContext.Provider,
@@ -928,8 +934,7 @@ var AdsProvider = ({
928
934
  userId,
929
935
  logLevel,
930
936
  onAdView,
931
- onAdClick,
932
- throwError: props.throwError
937
+ onAdClick
933
938
  }
934
939
  )
935
940
  }
@@ -952,7 +957,7 @@ function useAdViewed(ad) {
952
957
  serverUrl = context.streamAdServerUrl;
953
958
  }
954
959
  try {
955
- const response = await fetch(`${serverUrl}/ad/${ad.id}/view`, {
960
+ const response = await fetch(`${serverUrl}/impression/${ad.id}/view`, {
956
961
  method: "POST"
957
962
  });
958
963
  if (!response.ok) {
@@ -1240,6 +1245,10 @@ var InlineAd = ({ code, messageId, wrapper }) => {
1240
1245
  }
1241
1246
  }
1242
1247
  };
1248
+ let adContent = ad.content;
1249
+ if (ad.clicked && ad.rewardContent) {
1250
+ adContent = ad.rewardContent;
1251
+ }
1243
1252
  const content = /* @__PURE__ */ jsxs2(View3, { style: styles?.container, children: [
1244
1253
  /* @__PURE__ */ jsx5(View3, { style: styles?.adBadgeContainer, children: /* @__PURE__ */ jsx5(Text3, { style: styles?.adBadgeText, children: "Ad" }) }),
1245
1254
  ad.imageUrl && ad.mediaPlacement === "top" && !ad.isStreaming && /* @__PURE__ */ jsx5(
@@ -1269,7 +1278,7 @@ var InlineAd = ({ code, messageId, wrapper }) => {
1269
1278
  MarkdownText,
1270
1279
  {
1271
1280
  onLinkClick: () => context?.onAdClickInternal(ad),
1272
- content: ad.content
1281
+ content: adContent
1273
1282
  }
1274
1283
  ) }),
1275
1284
  ad.imageUrl && ad.mediaPlacement === "bottom" && !ad.isStreaming && /* @__PURE__ */ jsx5(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kontextso/sdk-react-native",
3
- "version": "0.0.5-rc.8",
3
+ "version": "0.0.6",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",
@@ -10,8 +10,8 @@
10
10
  "dev": "npm-run-all dev:js",
11
11
  "build:js": "tsup",
12
12
  "build": "npm run build:js && cross-env NODE_ENV=development npm run test:run",
13
- "test": "",
14
- "test:run": "",
13
+ "test": "vitest --run",
14
+ "test:run": "vitest --run",
15
15
  "_test": "vitest",
16
16
  "_test:run": "vitest --run",
17
17
  "_test:watch": "vitest --watch",