vdb-ai-chat 1.0.77 → 1.0.78
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/chat-widget.js +461 -1
- package/lib/commonjs/api.js +27 -55
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/components/ChatHeader.js +0 -2
- package/lib/commonjs/components/ChatHeader.js.map +1 -1
- package/lib/commonjs/components/ChatWidget.js +21 -55
- package/lib/commonjs/components/ChatWidget.js.map +1 -1
- package/lib/commonjs/components/LazyProductsFetcher.js +3 -5
- package/lib/commonjs/components/LazyProductsFetcher.js.map +1 -1
- package/lib/commonjs/components/utils.js +34 -42
- package/lib/commonjs/components/utils.js.map +1 -1
- package/lib/commonjs/contexts/ThemeProvider.js +21 -44
- package/lib/commonjs/contexts/ThemeProvider.js.map +1 -1
- package/lib/commonjs/index.web.js +6 -17
- package/lib/commonjs/index.web.js.map +1 -1
- package/lib/commonjs/storage.js +4 -14
- package/lib/commonjs/storage.js.map +1 -1
- package/lib/commonjs/theme.js +1 -229
- package/lib/commonjs/theme.js.map +1 -1
- package/lib/module/api.js +27 -53
- package/lib/module/api.js.map +1 -1
- package/lib/module/components/ChatHeader.js +0 -2
- package/lib/module/components/ChatHeader.js.map +1 -1
- package/lib/module/components/ChatWidget.js +22 -56
- package/lib/module/components/ChatWidget.js.map +1 -1
- package/lib/module/components/LazyProductsFetcher.js +3 -5
- package/lib/module/components/LazyProductsFetcher.js.map +1 -1
- package/lib/module/components/utils.js +34 -42
- package/lib/module/components/utils.js.map +1 -1
- package/lib/module/contexts/ThemeProvider.js +16 -39
- package/lib/module/contexts/ThemeProvider.js.map +1 -1
- package/lib/module/index.web.js +6 -17
- package/lib/module/index.web.js.map +1 -1
- package/lib/module/storage.js +4 -14
- package/lib/module/storage.js.map +1 -1
- package/lib/module/theme.js +0 -228
- package/lib/module/theme.js.map +1 -1
- package/lib/typescript/api.d.ts +2 -12
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/components/ChatHeader.d.ts.map +1 -1
- package/lib/typescript/components/ChatWidget.d.ts.map +1 -1
- package/lib/typescript/components/LazyProductsFetcher.d.ts +0 -3
- package/lib/typescript/components/LazyProductsFetcher.d.ts.map +1 -1
- package/lib/typescript/components/utils.d.ts +1 -0
- package/lib/typescript/components/utils.d.ts.map +1 -1
- package/lib/typescript/contexts/ThemeProvider.d.ts.map +1 -1
- package/lib/typescript/index.web.d.ts +1 -23
- package/lib/typescript/index.web.d.ts.map +1 -1
- package/lib/typescript/storage.d.ts.map +1 -1
- package/lib/typescript/theme.d.ts +0 -228
- package/lib/typescript/theme.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +0 -4
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +1 -2
- package/src/api.ts +24 -60
- package/src/components/ChatHeader.tsx +0 -2
- package/src/components/ChatWidget.tsx +86 -137
- package/src/components/LazyProductsFetcher.tsx +2 -7
- package/src/components/utils.ts +34 -42
- package/src/contexts/ThemeProvider.tsx +10 -32
- package/src/index.web.tsx +13 -59
- package/src/storage.ts +4 -14
- package/src/theme.ts +0 -230
- package/src/types.ts +0 -4
- package/lib/commonjs/components/ButtonContent.js +0 -54
- package/lib/commonjs/components/ButtonContent.js.map +0 -1
- package/lib/commonjs/components/FloatingChatButton.js +0 -197
- package/lib/commonjs/components/FloatingChatButton.js.map +0 -1
- package/lib/commonjs/config/storeConfigLoader.js +0 -161
- package/lib/commonjs/config/storeConfigLoader.js.map +0 -1
- package/lib/commonjs/config/types.js +0 -2
- package/lib/commonjs/config/types.js.map +0 -1
- package/lib/commonjs/utils/pluginUrlBuilder.js +0 -288
- package/lib/commonjs/utils/pluginUrlBuilder.js.map +0 -1
- package/lib/module/components/ButtonContent.js +0 -48
- package/lib/module/components/ButtonContent.js.map +0 -1
- package/lib/module/components/FloatingChatButton.js +0 -190
- package/lib/module/components/FloatingChatButton.js.map +0 -1
- package/lib/module/config/storeConfigLoader.js +0 -153
- package/lib/module/config/storeConfigLoader.js.map +0 -1
- package/lib/module/config/types.js +0 -2
- package/lib/module/config/types.js.map +0 -1
- package/lib/module/utils/pluginUrlBuilder.js +0 -279
- package/lib/module/utils/pluginUrlBuilder.js.map +0 -1
- package/lib/typescript/components/ButtonContent.d.ts +0 -5
- package/lib/typescript/components/ButtonContent.d.ts.map +0 -1
- package/lib/typescript/components/FloatingChatButton.d.ts +0 -8
- package/lib/typescript/components/FloatingChatButton.d.ts.map +0 -1
- package/lib/typescript/config/storeConfigLoader.d.ts +0 -25
- package/lib/typescript/config/storeConfigLoader.d.ts.map +0 -1
- package/lib/typescript/config/types.d.ts +0 -49
- package/lib/typescript/config/types.d.ts.map +0 -1
- package/lib/typescript/utils/pluginUrlBuilder.d.ts +0 -43
- package/lib/typescript/utils/pluginUrlBuilder.d.ts.map +0 -1
- package/src/components/ButtonContent.tsx +0 -54
- package/src/components/FloatingChatButton.tsx +0 -204
- package/src/config/storeConfigLoader.ts +0 -175
- package/src/config/types.ts +0 -51
- package/src/utils/pluginUrlBuilder.ts +0 -528
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,WAAW,CAAC;AAExC,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE;QACvB,SAAS,CAAC,EAAE,GAAG,CAAC;QAChB,SAAS,CAAC,EAAE,GAAG,CAAC;QAChB,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAAC;QACzB,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC;KAC7B,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3B,eAAe,CAAC,EAAE,WAAW,EAAE,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,iFAAiF;IACjF,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IAC7D,uFAAuF;IACvF,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IACvD,mDAAmD;IACnD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vdb-ai-chat",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.78",
|
|
4
4
|
"description": "Cross-platform AI chat widget for React Native and Web",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -85,7 +85,6 @@
|
|
|
85
85
|
"react-dom": "^18.3.1",
|
|
86
86
|
"react-native": "0.76.0",
|
|
87
87
|
"react-native-builder-bob": "^0.23.2",
|
|
88
|
-
"react-native-svg": "15.12.1",
|
|
89
88
|
"typescript": "^5.6.3",
|
|
90
89
|
"webpack": "^5.96.1",
|
|
91
90
|
"webpack-cli": "^5.1.4",
|
package/src/api.ts
CHANGED
|
@@ -7,35 +7,11 @@ import {
|
|
|
7
7
|
import Routes from "./routes";
|
|
8
8
|
import { Storage } from "./storage";
|
|
9
9
|
import type { ChatMessage } from "./types";
|
|
10
|
-
import type { SearchApiDefaults } from "./config/types";
|
|
11
|
-
import { buildPluginApiPayload } from "./utils/pluginUrlBuilder";
|
|
12
10
|
|
|
13
11
|
// Generic params type reused for downstream APIs (e.g. product search payload)
|
|
14
12
|
export type ChatApiParams = Record<string, any>;
|
|
15
13
|
|
|
16
|
-
// Module-level token override - when set, this takes precedence over storage
|
|
17
|
-
let tokenOverride: string | null = null;
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Set a token override that will be used instead of reading from storage.
|
|
21
|
-
* Pass null to clear the override and revert to storage-based token.
|
|
22
|
-
*/
|
|
23
|
-
export function setTokenOverride(token: string | null): void {
|
|
24
|
-
tokenOverride = token;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Get the current token override (if any).
|
|
29
|
-
*/
|
|
30
|
-
export function getTokenOverride(): string | null {
|
|
31
|
-
return tokenOverride;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
14
|
async function getUserToken(): Promise<string> {
|
|
35
|
-
// If a token override is set, use it instead of storage
|
|
36
|
-
if (tokenOverride) {
|
|
37
|
-
return tokenOverride;
|
|
38
|
-
}
|
|
39
15
|
const userInfo = await Storage.getJSON<UserDetails>("persist:userInfo", {});
|
|
40
16
|
const userData = JSON.parse(userInfo?.user || "{}");
|
|
41
17
|
return userData?.token || "";
|
|
@@ -44,14 +20,14 @@ async function getUserToken(): Promise<string> {
|
|
|
44
20
|
async function buildHeaders() {
|
|
45
21
|
const token = await getUserToken();
|
|
46
22
|
const iid = (await Storage.getItem("persist:appState")) || "{}";
|
|
47
|
-
let installationId = "
|
|
23
|
+
let installationId = "";
|
|
48
24
|
try {
|
|
49
25
|
const parsed = JSON.parse(iid);
|
|
50
26
|
installationId = parsed?.installationIdentifier
|
|
51
27
|
? JSON.parse(parsed.installationIdentifier)
|
|
52
|
-
: "
|
|
28
|
+
: "";
|
|
53
29
|
} catch {
|
|
54
|
-
installationId = "
|
|
30
|
+
installationId = "";
|
|
55
31
|
}
|
|
56
32
|
const session = (await Storage.getItem("session_cookie")) || "";
|
|
57
33
|
|
|
@@ -414,28 +390,28 @@ export async function clearChatHistory(
|
|
|
414
390
|
export async function getProducts(
|
|
415
391
|
apiUrl: string,
|
|
416
392
|
params: ChatApiParams,
|
|
417
|
-
useAsPlugin?: boolean,
|
|
418
|
-
apiDefaults?: SearchApiDefaults,
|
|
419
393
|
): Promise<any> {
|
|
420
|
-
let
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
};
|
|
432
|
-
}
|
|
394
|
+
// let depth_percent_from: number | undefined;
|
|
395
|
+
// let depth_percent_to: number | undefined;
|
|
396
|
+
// let table_percent_from: number | undefined;
|
|
397
|
+
// let table_percent_to: number | undefined;
|
|
398
|
+
|
|
399
|
+
// if (userInfo?.user?.max_search_key_values) {
|
|
400
|
+
// depth_percent_from = userInfo.user.max_search_key_values.min_depth;
|
|
401
|
+
// depth_percent_to = userInfo.user.max_search_key_values.max_depth;
|
|
402
|
+
// table_percent_from = userInfo.user.max_search_key_values.min_table;
|
|
403
|
+
// table_percent_to = userInfo.user.max_search_key_values.max_table;
|
|
404
|
+
// }
|
|
433
405
|
|
|
434
406
|
const res = await fetch(Routes.SEARCH_DIAMONDS(apiUrl), {
|
|
435
407
|
method: "POST",
|
|
436
408
|
headers: await buildHeaders(),
|
|
437
409
|
body: JSON.stringify({
|
|
438
|
-
vdb:
|
|
410
|
+
vdb: {
|
|
411
|
+
...params,
|
|
412
|
+
page_size: 50,
|
|
413
|
+
page_number: 1,
|
|
414
|
+
},
|
|
439
415
|
}),
|
|
440
416
|
});
|
|
441
417
|
|
|
@@ -451,28 +427,16 @@ export async function getProductsPaginated(
|
|
|
451
427
|
apiUrl: string,
|
|
452
428
|
params: ChatApiParams,
|
|
453
429
|
pageNumber: number = 1,
|
|
454
|
-
useAsPlugin?: boolean,
|
|
455
|
-
apiDefaults?: SearchApiDefaults,
|
|
456
430
|
): Promise<any> {
|
|
457
|
-
let payload: Record<string, any>;
|
|
458
|
-
|
|
459
|
-
if (useAsPlugin) {
|
|
460
|
-
payload = buildPluginApiPayload(params, apiDefaults);
|
|
461
|
-
payload.page_size = 5;
|
|
462
|
-
payload.page_number = pageNumber;
|
|
463
|
-
} else {
|
|
464
|
-
payload = {
|
|
465
|
-
...params,
|
|
466
|
-
page_size: 5,
|
|
467
|
-
page_number: pageNumber,
|
|
468
|
-
};
|
|
469
|
-
}
|
|
470
|
-
|
|
471
431
|
const res = await fetch(Routes.SEARCH_DIAMONDS(apiUrl), {
|
|
472
432
|
method: "POST",
|
|
473
433
|
headers: await buildHeaders(),
|
|
474
434
|
body: JSON.stringify({
|
|
475
|
-
vdb:
|
|
435
|
+
vdb: {
|
|
436
|
+
...params,
|
|
437
|
+
page_size: 5,
|
|
438
|
+
page_number: pageNumber,
|
|
439
|
+
},
|
|
476
440
|
}),
|
|
477
441
|
});
|
|
478
442
|
|
|
@@ -74,7 +74,6 @@ const ChatHeader: React.FC<ChatHeaderProps> = ({
|
|
|
74
74
|
<TouchableOpacity
|
|
75
75
|
onPress={() => {
|
|
76
76
|
trackEvent?.(AnalyticsEventNames.CHAT_CLEARED, {});
|
|
77
|
-
console.log("Segment: Clear Chat tracked");
|
|
78
77
|
onClearChat?.();
|
|
79
78
|
}}
|
|
80
79
|
>
|
|
@@ -86,7 +85,6 @@ const ChatHeader: React.FC<ChatHeaderProps> = ({
|
|
|
86
85
|
style={styles.closeButton}
|
|
87
86
|
onPress={() => {
|
|
88
87
|
trackEvent?.(AnalyticsEventNames.WIDGET_CLOSED, {});
|
|
89
|
-
console.log("Segment: Widget Close tracked");
|
|
90
88
|
onClose?.();
|
|
91
89
|
}}
|
|
92
90
|
>
|
|
@@ -39,7 +39,6 @@ import {
|
|
|
39
39
|
mapDiamondToRecommendationItem,
|
|
40
40
|
normaliseMessages,
|
|
41
41
|
sendUserMessage,
|
|
42
|
-
setTokenOverride,
|
|
43
42
|
} from "../api";
|
|
44
43
|
import BetaNotice from "./BetaNotice";
|
|
45
44
|
import ProductsList from "./ProductsList";
|
|
@@ -71,12 +70,6 @@ import {
|
|
|
71
70
|
} from "../i18n";
|
|
72
71
|
import { useGlobalData } from "../hooks/useGlobalData";
|
|
73
72
|
import WelcomeScreen from "./WelcomeScreen";
|
|
74
|
-
import {
|
|
75
|
-
buildPluginItemUrl,
|
|
76
|
-
buildPluginViewAllUrl,
|
|
77
|
-
} from "../utils/pluginUrlBuilder";
|
|
78
|
-
import type { StoreConfig } from "../config/types";
|
|
79
|
-
import { loadStoreConfig } from "../config/storeConfigLoader";
|
|
80
73
|
|
|
81
74
|
export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
82
75
|
(
|
|
@@ -94,7 +87,6 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
94
87
|
onViewAllPress,
|
|
95
88
|
onItemPress: onItemPressProp,
|
|
96
89
|
isBetaMode: isBetaModeProp,
|
|
97
|
-
useAsPlugin,
|
|
98
90
|
activeProductType,
|
|
99
91
|
trackAnalyticsEvent,
|
|
100
92
|
fromFilterScreen,
|
|
@@ -108,7 +100,6 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
108
100
|
ref,
|
|
109
101
|
) => {
|
|
110
102
|
const { t } = useTranslation();
|
|
111
|
-
const [storeConfig, setStoreConfig] = useState<StoreConfig | null>(null);
|
|
112
103
|
const [messages, setMessages] = useState<ChatMessage[]>(initialMessages);
|
|
113
104
|
const [input, setInput] = useState("");
|
|
114
105
|
const [loading, setLoading] = useState(false);
|
|
@@ -181,17 +172,6 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
181
172
|
initI18n({ locale, translations });
|
|
182
173
|
}, []);
|
|
183
174
|
|
|
184
|
-
// Load store config when in plugin mode
|
|
185
|
-
useEffect(() => {
|
|
186
|
-
if (useAsPlugin) {
|
|
187
|
-
loadStoreConfig().then((config) => {
|
|
188
|
-
if (config) {
|
|
189
|
-
setStoreConfig(config);
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
}, [useAsPlugin]);
|
|
194
|
-
|
|
195
175
|
useEffect(() => {
|
|
196
176
|
getChatHasInitialized().then(setChatHasInitializedState);
|
|
197
177
|
}, []);
|
|
@@ -203,13 +183,7 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
203
183
|
useEffect(() => {
|
|
204
184
|
const loadAuthData = async () => {
|
|
205
185
|
try {
|
|
206
|
-
if (userTokenProp) {
|
|
207
|
-
// If token is provided via props, set the override so API calls use it
|
|
208
|
-
setTokenOverride(userTokenProp);
|
|
209
|
-
setUserToken(userTokenProp);
|
|
210
|
-
} else {
|
|
211
|
-
// Clear any token override so API calls use storage
|
|
212
|
-
setTokenOverride(null);
|
|
186
|
+
if (!userTokenProp) {
|
|
213
187
|
const userInfo = await Storage.getJSON<UserDetails>(
|
|
214
188
|
"persist:userInfo",
|
|
215
189
|
{},
|
|
@@ -225,11 +199,6 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
225
199
|
}
|
|
226
200
|
};
|
|
227
201
|
loadAuthData();
|
|
228
|
-
|
|
229
|
-
// Cleanup: clear token override when component unmounts
|
|
230
|
-
return () => {
|
|
231
|
-
setTokenOverride(null);
|
|
232
|
-
};
|
|
233
202
|
}, [userTokenProp]);
|
|
234
203
|
|
|
235
204
|
const setActiveProduct = async () => {
|
|
@@ -252,29 +221,21 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
252
221
|
const stringifiedSearchPayload = JSON.stringify(searchPayload);
|
|
253
222
|
const payload = item?.search_payload;
|
|
254
223
|
if (!payload) return;
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
}/search?priceMode=${priceMode}&productType=${
|
|
271
|
-
isLabgrown
|
|
272
|
-
? ProductCategory.LAB_GROWN_DIAMOND
|
|
273
|
-
: ProductCategory.DIAMOND
|
|
274
|
-
}&fromNewFilterScreen=false&filterSplitStep=1§ionName=${
|
|
275
|
-
searchPayload.pair === "pair" ? "Pairs" : "Single Stones"
|
|
276
|
-
}&breadCrumbLabel=Stone%20Search&enterSecondFlow=false&saved_search=${encodeURIComponent(stringifiedSearchPayload)}`;
|
|
277
|
-
}
|
|
224
|
+
const isLabgrown =
|
|
225
|
+
typeof payload.lab_grown === "string"
|
|
226
|
+
? payload.lab_grown === "true"
|
|
227
|
+
: typeof payload.lab_grown === "boolean"
|
|
228
|
+
? payload.lab_grown
|
|
229
|
+
: false;
|
|
230
|
+
const deepLinkUrl = `${apiUrl}webapp/${
|
|
231
|
+
isLabgrown ? "lab-grown-diamonds" : "natural-diamonds"
|
|
232
|
+
}/search?priceMode=${priceMode}&productType=${
|
|
233
|
+
isLabgrown
|
|
234
|
+
? ProductCategory.LAB_GROWN_DIAMOND
|
|
235
|
+
: ProductCategory.DIAMOND
|
|
236
|
+
}&fromNewFilterScreen=false&filterSplitStep=1§ionName=${
|
|
237
|
+
searchPayload.pair === "pair" ? "Pairs" : "Single Stones"
|
|
238
|
+
}&breadCrumbLabel=Stone%20Search&enterSecondFlow=false&saved_search=${encodeURIComponent(stringifiedSearchPayload)}`;
|
|
278
239
|
|
|
279
240
|
if (onViewAllPress) {
|
|
280
241
|
onViewAllPress(deepLinkUrl, payload);
|
|
@@ -282,25 +243,18 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
282
243
|
window.open(deepLinkUrl, "_parent");
|
|
283
244
|
}
|
|
284
245
|
},
|
|
285
|
-
[apiUrl, priceMode, onViewAllPress
|
|
246
|
+
[apiUrl, priceMode, onViewAllPress],
|
|
286
247
|
);
|
|
287
248
|
|
|
288
249
|
const onItemPress = useCallback(
|
|
289
250
|
(item: any) => {
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
item.type === ProductCategory.LAB_GROWN_DIAMOND
|
|
298
|
-
? "lab-grown-diamonds"
|
|
299
|
-
: "natural-diamonds"
|
|
300
|
-
}/item-detail/${item.id}?productType=${
|
|
301
|
-
item.type
|
|
302
|
-
}&priceMode=${priceMode}&breadCrumbLabel=Stone%20Details`;
|
|
303
|
-
}
|
|
251
|
+
const deepLinkUrl = `${apiUrl}webapp/${
|
|
252
|
+
item.type === ProductCategory.LAB_GROWN_DIAMOND
|
|
253
|
+
? "lab-grown-diamonds"
|
|
254
|
+
: "natural-diamonds"
|
|
255
|
+
}/item-detail/${item.id}?productType=${
|
|
256
|
+
item.type
|
|
257
|
+
}&priceMode=${priceMode}&breadCrumbLabel=Stone%20Details`;
|
|
304
258
|
|
|
305
259
|
if (onItemPressProp) {
|
|
306
260
|
onItemPressProp(deepLinkUrl, item);
|
|
@@ -308,7 +262,7 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
308
262
|
window.open(deepLinkUrl, "_parent");
|
|
309
263
|
}
|
|
310
264
|
},
|
|
311
|
-
[apiUrl, priceMode, onItemPressProp
|
|
265
|
+
[apiUrl, priceMode, onItemPressProp],
|
|
312
266
|
);
|
|
313
267
|
|
|
314
268
|
const hasAuth = useMemo(() => Boolean(userToken), [userToken]);
|
|
@@ -672,13 +626,17 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
672
626
|
const productsResult = await getProducts(
|
|
673
627
|
apiUrl,
|
|
674
628
|
latestAssistant.search_payload,
|
|
675
|
-
useAsPlugin,
|
|
676
|
-
storeConfig?.searchApiDefaults,
|
|
677
629
|
);
|
|
678
630
|
trackAnalyticsEvent?.(AIEventNames.AI_CHAT_WIDGET, {
|
|
679
631
|
action: AIEventTypes.SEARCH_INITIATED,
|
|
680
632
|
search_payload: latestAssistant.search_payload,
|
|
681
633
|
});
|
|
634
|
+
if (classic_search_filters) {
|
|
635
|
+
trackAnalyticsEvent?.(AIEventNames.AI_CHAT_WIDGET, {
|
|
636
|
+
action: AIEventTypes.CLASSIC_SEARCH_FILTERS,
|
|
637
|
+
classic_search_filters: classic_search_filters,
|
|
638
|
+
});
|
|
639
|
+
}
|
|
682
640
|
const hasDiamonds =
|
|
683
641
|
productsResult &&
|
|
684
642
|
productsResult.response &&
|
|
@@ -807,7 +765,6 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
807
765
|
sendMessage(trimmed);
|
|
808
766
|
if (
|
|
809
767
|
fromFilterScreen &&
|
|
810
|
-
!fromFilterSplitScreen &&
|
|
811
768
|
showWelcomeScreen &&
|
|
812
769
|
chatHasInitialized === false
|
|
813
770
|
) {
|
|
@@ -838,12 +795,7 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
838
795
|
setReloadLoadingIds((prev) => new Set(prev).add(id));
|
|
839
796
|
const payload = msg?.search_payload;
|
|
840
797
|
if (!payload || Object.keys(payload).length === 0) return;
|
|
841
|
-
const productsResult = await getProducts(
|
|
842
|
-
apiUrl,
|
|
843
|
-
payload,
|
|
844
|
-
useAsPlugin,
|
|
845
|
-
storeConfig?.searchApiDefaults,
|
|
846
|
-
);
|
|
798
|
+
const productsResult = await getProducts(apiUrl, payload);
|
|
847
799
|
setProductsByMsg((prev) => ({ ...prev, [id]: productsResult }));
|
|
848
800
|
} catch (e) {
|
|
849
801
|
console.error("Reload results failed", e);
|
|
@@ -854,7 +806,7 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
854
806
|
return next;
|
|
855
807
|
});
|
|
856
808
|
}
|
|
857
|
-
}, [
|
|
809
|
+
}, []);
|
|
858
810
|
|
|
859
811
|
const handleShowMoreResults = useCallback(
|
|
860
812
|
async (messageId: string, searchPayload: any) => {
|
|
@@ -872,8 +824,6 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
872
824
|
apiUrl,
|
|
873
825
|
searchPayload,
|
|
874
826
|
nextPage,
|
|
875
|
-
useAsPlugin,
|
|
876
|
-
storeConfig?.searchApiDefaults,
|
|
877
827
|
);
|
|
878
828
|
|
|
879
829
|
if (newResults?.response?.body?.diamonds) {
|
|
@@ -915,18 +865,13 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
915
865
|
});
|
|
916
866
|
}
|
|
917
867
|
},
|
|
918
|
-
[apiUrl, loadingMoreResults, searchResultsPages
|
|
868
|
+
[apiUrl, loadingMoreResults, searchResultsPages],
|
|
919
869
|
);
|
|
920
870
|
|
|
921
871
|
const handleShowLessResults = useCallback(
|
|
922
872
|
async (messageId: string, searchPayload: any) => {
|
|
923
873
|
try {
|
|
924
|
-
const initialResults = await getProducts(
|
|
925
|
-
apiUrl,
|
|
926
|
-
searchPayload,
|
|
927
|
-
useAsPlugin,
|
|
928
|
-
storeConfig?.searchApiDefaults,
|
|
929
|
-
);
|
|
874
|
+
const initialResults = await getProducts(apiUrl, searchPayload);
|
|
930
875
|
|
|
931
876
|
if (initialResults?.response?.body?.diamonds) {
|
|
932
877
|
setProductsByMsg((prev) => ({
|
|
@@ -943,7 +888,7 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
943
888
|
console.error("Failed to show less results:", error);
|
|
944
889
|
}
|
|
945
890
|
},
|
|
946
|
-
[apiUrl
|
|
891
|
+
[apiUrl],
|
|
947
892
|
);
|
|
948
893
|
|
|
949
894
|
const handleRecommendationRequest = useCallback(
|
|
@@ -1588,27 +1533,28 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
1588
1533
|
)}
|
|
1589
1534
|
{(() => {
|
|
1590
1535
|
const ordered = [...messages];
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1536
|
+
// Find the latest result message (last assistant with search_payload that has diamonds)
|
|
1537
|
+
let latestResultMsgId: string | null = null;
|
|
1538
|
+
for (let i = ordered.length - 1; i >= 0; i--) {
|
|
1539
|
+
const msg = ordered[i];
|
|
1540
|
+
const msgHasDiamonds = Boolean(
|
|
1541
|
+
productsByMsg[msg.id]?.response?.body?.diamonds
|
|
1542
|
+
?.length > 0,
|
|
1543
|
+
);
|
|
1544
|
+
if (
|
|
1545
|
+
msg.role === "assistant" &&
|
|
1546
|
+
msg.search_payload &&
|
|
1547
|
+
Object.keys(msg.search_payload).length > 0 &&
|
|
1548
|
+
msgHasDiamonds
|
|
1549
|
+
) {
|
|
1550
|
+
latestResultMsgId = msg.id;
|
|
1551
|
+
break;
|
|
1552
|
+
}
|
|
1553
|
+
}
|
|
1608
1554
|
|
|
1609
1555
|
return ordered.map((item, index) => {
|
|
1610
1556
|
const isLatest = index === ordered.length - 1;
|
|
1611
|
-
|
|
1557
|
+
const isLatestResultMsg = item.id === latestResultMsgId;
|
|
1612
1558
|
const hasDiamonds = Boolean(
|
|
1613
1559
|
productsByMsg[item.id]?.response?.body?.diamonds &&
|
|
1614
1560
|
productsByMsg[item.id]?.response?.body?.diamonds
|
|
@@ -1648,8 +1594,6 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
1648
1594
|
priceMode={priceMode as string}
|
|
1649
1595
|
messageId={item.id}
|
|
1650
1596
|
payload={item.search_payload}
|
|
1651
|
-
useAsPlugin={useAsPlugin}
|
|
1652
|
-
searchApiDefaults={storeConfig?.searchApiDefaults}
|
|
1653
1597
|
onFetched={(id, result) => {
|
|
1654
1598
|
setProductsByMsg((prev) => ({
|
|
1655
1599
|
...prev,
|
|
@@ -1683,7 +1627,10 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
1683
1627
|
data={(
|
|
1684
1628
|
productsByMsg[item.id]?.response?.body
|
|
1685
1629
|
?.diamonds || []
|
|
1686
|
-
).slice(
|
|
1630
|
+
).slice(
|
|
1631
|
+
0,
|
|
1632
|
+
(searchResultsPages[item.id] || 1) * 5,
|
|
1633
|
+
)}
|
|
1687
1634
|
totalResults={
|
|
1688
1635
|
productsByMsg[item.id]?.response?.header
|
|
1689
1636
|
?.total_diamonds_found || 0
|
|
@@ -1708,31 +1655,33 @@ export const ChatWidget = forwardRef<ChatWidgetRef, ChatWidgetProps>(
|
|
|
1708
1655
|
isLoadingMore={loadingMoreResults.has(item.id)}
|
|
1709
1656
|
/>
|
|
1710
1657
|
)}
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1658
|
+
{/* Recommendation CTA - only show for latest result message and if not already requested */}
|
|
1659
|
+
{item.role === "assistant" &&
|
|
1660
|
+
hasDiamonds &&
|
|
1661
|
+
isLatestResultMsg &&
|
|
1662
|
+
globalData?.ai_chat_bot?.show_recommendation &&
|
|
1663
|
+
!recommendationRequestedFor.has(item.id) && (
|
|
1664
|
+
<RecommendationCTA
|
|
1665
|
+
onPress={() =>
|
|
1666
|
+
handleRecommendationRequest(item.id)
|
|
1667
|
+
}
|
|
1668
|
+
loading={recommendationLoading.has(item.id)}
|
|
1669
|
+
/>
|
|
1670
|
+
)}
|
|
1671
|
+
{/* Display recommendation results - only for latest result message */}
|
|
1672
|
+
{item.isRecommendation &&
|
|
1673
|
+
item.sourceMessageId &&
|
|
1674
|
+
item.sourceMessageId === latestResultMsgId &&
|
|
1675
|
+
recommendationsByMsg[item.sourceMessageId] &&
|
|
1676
|
+
recommendationsByMsg[item.sourceMessageId].length >
|
|
1677
|
+
0 && (
|
|
1678
|
+
<RecommendationResults
|
|
1679
|
+
recommendations={
|
|
1680
|
+
recommendationsByMsg[item.sourceMessageId]
|
|
1681
|
+
}
|
|
1682
|
+
onItemPress={onItemPress}
|
|
1683
|
+
/>
|
|
1684
|
+
)}
|
|
1736
1685
|
{/* Suggestions are now rendered inside MessageBubble */}
|
|
1737
1686
|
<MessageMetaRow
|
|
1738
1687
|
message={item}
|
|
@@ -2,7 +2,6 @@ import React, { useEffect, useRef } from "react";
|
|
|
2
2
|
import { View } from "react-native";
|
|
3
3
|
import { getProducts } from "../api";
|
|
4
4
|
import { useInViewport } from "../hooks/useInViewport";
|
|
5
|
-
import type { SearchApiDefaults } from "../config/types";
|
|
6
5
|
|
|
7
6
|
interface LazyProductsFetcherProps {
|
|
8
7
|
messageId: string;
|
|
@@ -10,8 +9,6 @@ interface LazyProductsFetcherProps {
|
|
|
10
9
|
onFetched: (messageId: string, data: any) => void;
|
|
11
10
|
priceMode: string | null;
|
|
12
11
|
apiUrl: string;
|
|
13
|
-
useAsPlugin?: boolean;
|
|
14
|
-
searchApiDefaults?: SearchApiDefaults;
|
|
15
12
|
}
|
|
16
13
|
|
|
17
14
|
const LazyProductsFetcher: React.FC<LazyProductsFetcherProps> = ({
|
|
@@ -20,8 +17,6 @@ const LazyProductsFetcher: React.FC<LazyProductsFetcherProps> = ({
|
|
|
20
17
|
onFetched,
|
|
21
18
|
priceMode,
|
|
22
19
|
apiUrl,
|
|
23
|
-
useAsPlugin,
|
|
24
|
-
searchApiDefaults,
|
|
25
20
|
}) => {
|
|
26
21
|
const { ref, inView } = useInViewport<HTMLDivElement>();
|
|
27
22
|
const fetchedRef = useRef(false);
|
|
@@ -34,14 +29,14 @@ const LazyProductsFetcher: React.FC<LazyProductsFetcherProps> = ({
|
|
|
34
29
|
fetchedRef.current = true;
|
|
35
30
|
(async () => {
|
|
36
31
|
try {
|
|
37
|
-
const result = await getProducts(apiUrl, payload
|
|
32
|
+
const result = await getProducts(apiUrl, payload);
|
|
38
33
|
onFetched(messageId, result);
|
|
39
34
|
} catch (e) {
|
|
40
35
|
// eslint-disable-next-line no-console
|
|
41
36
|
console.error("Lazy fetch products failed", e);
|
|
42
37
|
}
|
|
43
38
|
})();
|
|
44
|
-
}, [inView, messageId, onFetched, payload, priceMode
|
|
39
|
+
}, [inView, messageId, onFetched, payload, priceMode]);
|
|
45
40
|
|
|
46
41
|
// Sentinel element; no visible UI needed
|
|
47
42
|
return <View ref={ref as any} style={{ height: 1 }} />;
|