react-native-srschat 0.1.81 → 0.1.85

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.
Files changed (59) hide show
  1. package/lib/commonjs/components/email.js +4 -8
  2. package/lib/commonjs/components/email.js.map +1 -1
  3. package/lib/commonjs/components/productCard.js +91 -86
  4. package/lib/commonjs/components/productCard.js.map +1 -1
  5. package/lib/commonjs/components/welcomeButton.js +4 -4
  6. package/lib/commonjs/components/welcomeButton.js.map +1 -1
  7. package/lib/commonjs/contexts/AppContext.js +46 -45
  8. package/lib/commonjs/contexts/AppContext.js.map +1 -1
  9. package/lib/commonjs/hooks/Stream.js +399 -74
  10. package/lib/commonjs/hooks/Stream.js.map +1 -1
  11. package/lib/commonjs/layout/disclaimer.js +36 -32
  12. package/lib/commonjs/layout/disclaimer.js.map +1 -1
  13. package/lib/commonjs/layout/welcome.js +8 -7
  14. package/lib/commonjs/layout/welcome.js.map +1 -1
  15. package/lib/commonjs/layout/window.js +152 -131
  16. package/lib/commonjs/layout/window.js.map +1 -1
  17. package/lib/commonjs/utils/audioRecorder.js.map +1 -1
  18. package/lib/commonjs/utils/storage.js +1 -1
  19. package/lib/module/components/email.js +4 -8
  20. package/lib/module/components/email.js.map +1 -1
  21. package/lib/module/components/productCard.js +94 -89
  22. package/lib/module/components/productCard.js.map +1 -1
  23. package/lib/module/components/welcomeButton.js +4 -4
  24. package/lib/module/components/welcomeButton.js.map +1 -1
  25. package/lib/module/contexts/AppContext.js +47 -46
  26. package/lib/module/contexts/AppContext.js.map +1 -1
  27. package/lib/module/hooks/Stream.js +400 -75
  28. package/lib/module/hooks/Stream.js.map +1 -1
  29. package/lib/module/layout/disclaimer.js +41 -37
  30. package/lib/module/layout/disclaimer.js.map +1 -1
  31. package/lib/module/layout/welcome.js +8 -7
  32. package/lib/module/layout/welcome.js.map +1 -1
  33. package/lib/module/layout/window.js +152 -131
  34. package/lib/module/layout/window.js.map +1 -1
  35. package/lib/module/utils/audioRecorder.js.map +1 -1
  36. package/lib/module/utils/storage.js +1 -1
  37. package/lib/typescript/components/email.d.ts.map +1 -1
  38. package/lib/typescript/components/productCard.d.ts +1 -1
  39. package/lib/typescript/components/productCard.d.ts.map +1 -1
  40. package/lib/typescript/components/welcomeButton.d.ts.map +1 -1
  41. package/lib/typescript/contexts/AppContext.d.ts +2 -2
  42. package/lib/typescript/contexts/AppContext.d.ts.map +1 -1
  43. package/lib/typescript/hooks/Stream.d.ts.map +1 -1
  44. package/lib/typescript/layout/disclaimer.d.ts +1 -1
  45. package/lib/typescript/layout/disclaimer.d.ts.map +1 -1
  46. package/lib/typescript/layout/welcome.d.ts.map +1 -1
  47. package/lib/typescript/layout/window.d.ts.map +1 -1
  48. package/lib/typescript/utils/audioRecorder.d.ts.map +1 -1
  49. package/package.json +2 -1
  50. package/src/components/email.js +3 -15
  51. package/src/components/productCard.js +279 -203
  52. package/src/components/welcomeButton.js +10 -10
  53. package/src/contexts/AppContext.js +185 -106
  54. package/src/hooks/Stream.js +607 -237
  55. package/src/layout/disclaimer.js +125 -78
  56. package/src/layout/welcome.js +58 -20
  57. package/src/layout/window.js +279 -140
  58. package/src/utils/audioRecorder.js +40 -34
  59. package/src/utils/storage.ts +2 -2
@@ -1,23 +1,38 @@
1
1
  import React, { useState, useEffect, useRef, useContext } from 'react';
2
- import { AppContext } from "../contexts/AppContext";
2
+ import { AppContext } from '../contexts/AppContext';
3
3
 
4
4
  export function useWebSocketMessage() {
5
- const { setIsComplete, startStreaming, setMessages, messages, setGhostMessage,data,
6
- setTypingIndicator, setStartStreaming, lastUserMessage, stopActivated,sessionId,
7
- setGhostCard, BASE_URL, setStopActivated, setLastMessageId, conversationStartTime } = useContext(AppContext);
8
-
9
- const wsProtocol = 'wss://'
10
- const wsUrl = BASE_URL.replace(/^http(s)?:\/\//, '');
11
- const ENDPOINT = '/send/event';
5
+ const {
6
+ setIsComplete,
7
+ startStreaming,
8
+ setMessages,
9
+ messages,
10
+ setGhostMessage,
11
+ data,
12
+ setTypingIndicator,
13
+ setStartStreaming,
14
+ lastUserMessage,
15
+ stopActivated,
16
+ sessionId,
17
+ setGhostCard,
18
+ BASE_URL,
19
+ setStopActivated,
20
+ setLastMessageId,
21
+ conversationStartTime,
22
+ } = useContext(AppContext);
12
23
 
13
- const payload = {
14
- "customer_code": data.customer_code,
15
- "branch_code": data.branch_code, // "NBPISLA"
16
- "branch_full_name": data.branch_full_name,
17
- "customer_token": data.customer_token,
18
- active_ship_to_information: {
19
- shipToId: data.active_ship_to,
20
- /* "customerId": 0,
24
+ const wsProtocol = 'wss://';
25
+ const wsUrl = BASE_URL.replace(/^http(s)?:\/\//, '');
26
+ const ENDPOINT = '/send/event';
27
+
28
+ const payload = {
29
+ customer_code: data.customer_code,
30
+ branch_code: data.branch_code, // "NBPISLA"
31
+ branch_full_name: data.branch_full_name,
32
+ customer_token: data.customer_token,
33
+ active_ship_to_information: {
34
+ shipToId: data.active_ship_to,
35
+ /* "customerId": 0,
21
36
  "customerCode": "HPTA",
22
37
  "shipToSequenceId": 1,
23
38
  "customerShipToName": "HERITAGE PLUS TEST ACCOUNT",
@@ -40,9 +55,9 @@ export function useWebSocketMessage() {
40
55
  "insideSalesPerson": "",
41
56
  "secondarySalesPersonName": "",
42
57
  "secondarySalesPersonEmail": null */
43
- },
44
- branch_details: data.branch_details,
45
- /* branch_details: {
58
+ },
59
+ branch_details: data.branch_details,
60
+ /* branch_details: {
46
61
  "active_branch_business_hours": "8:00 AM - 4:30 PM",
47
62
  "active_branch_email": "OrdersHarrisburg@bel-aqua.com",
48
63
  "active_branch_location": "Elizabethtown,PA",
@@ -50,235 +65,590 @@ export function useWebSocketMessage() {
50
65
  "active_branch_phone": "(717)-689-3314",
51
66
  "active_brand_name": "BEL-AQUA"
52
67
  }, */
53
- user_query: lastUserMessage,
54
- session_id : data.session_id || data.session || sessionId,
55
- conversation_start_time: conversationStartTime,
56
- // /* customer_name: "Cristin Connerney",
57
- user_UUID: data.user_id || "mobile_user_unspecified",
58
- device: "mobile",
59
- window_location: "mobile"
60
- };
61
-
62
- const wsRef = useRef(null);
68
+ user_query: lastUserMessage,
69
+ session_id: data.session_id || data.session || sessionId,
70
+ conversation_start_time: conversationStartTime,
71
+ // /* customer_name: "Cristin Connerney",
72
+ user_UUID: data.user_id || 'mobile_user_unspecified',
73
+ device: 'mobile',
74
+ window_location: 'mobile',
75
+ };
76
+
77
+ const wsRef = useRef(null);
78
+
79
+ useEffect(() => {
80
+ if (startStreaming) {
81
+ console.log(payload, BASE_URL);
82
+ const socketUrl = `${wsProtocol}${wsUrl}${ENDPOINT}`;
83
+ console.log(socketUrl);
84
+
85
+ const ws = new WebSocket(socketUrl);
86
+ wsRef.current = ws;
63
87
 
64
- useEffect(() => {
65
- if (startStreaming) {
66
- console.log(payload, BASE_URL)
67
- const socketUrl = `${wsProtocol}${wsUrl}${ENDPOINT}`;
68
- console.log(socketUrl)
88
+ ws.onopen = () => {
89
+ console.log('WebSocket connection established.');
90
+ ws.send(JSON.stringify(payload));
91
+ };
69
92
 
70
- const ws = new WebSocket(socketUrl);
71
- wsRef.current = ws;
93
+ ws.onmessage = event => {
94
+ const response = JSON.parse(event.data);
72
95
 
73
- ws.onopen = () => {
74
- console.log("WebSocket connection established.");
75
- ws.send(JSON.stringify(payload));
96
+ if (response.type !== 'chunk') {
97
+ console.log(JSON.stringify(response, null, 2));
98
+ }
99
+ switch (response.type) {
100
+ case 'middle_message':
101
+ const middleMessage = {
102
+ type: 'middle',
103
+ text: response.message,
104
+ products: [],
105
+ product_cards: 'False',
106
+ };
107
+ setMessages([...messages, middleMessage]);
108
+ break;
109
+ case 'message':
110
+ if (
111
+ response.product_cards == 'False' ||
112
+ response.product_cards == false
113
+ ) {
114
+ setGhostMessage(false);
115
+ setTypingIndicator(false);
116
+ } else {
117
+ setGhostMessage(false);
118
+ setGhostCard(true);
119
+ }
120
+ const newMessage = {
121
+ type: 'ai',
122
+ message_id: response.message_id || '',
123
+ text: response.message,
124
+ feedback: 'True',
125
+ products: [],
126
+ product_cards: response.product_cards || 'False',
127
+ resource: response?.resource_details?.[0]?.link ?? '',
128
+ resource_type: response?.resource_details?.[0]?.type ?? '',
76
129
  };
130
+ setMessages(prevMessages => [...prevMessages, newMessage]);
131
+ setLastMessageId(response.message_id);
132
+ break;
133
+ case 'chunk':
134
+ const newContent = response.chunk;
135
+ const newMessageId = response.message_id;
77
136
 
78
- ws.onmessage = (event) => {
79
- const response = JSON.parse(event.data);
80
-
81
- if (response.type !== "chunk") {
82
- console.log(JSON.stringify(response, null, 2));
83
- }
84
- switch (response.type) {
85
- case 'middle_message':
86
- const middleMessage = {
87
- type: "middle",
88
- text: response.message,
89
- products: [],
90
- product_cards: "False",
91
- }
92
- setMessages([...messages, middleMessage])
93
- break;
94
- case 'message':
95
- if (response.product_cards == "False" || response.product_cards == false ) {
96
- setGhostMessage(false);
97
- setTypingIndicator(false)
98
- } else {
99
- setGhostMessage(false)
100
- setGhostCard(true)
101
- }
102
- const newMessage = {
103
- type: "ai",
104
- message_id: response.message_id || '',
105
- text: response.message,
106
- feedback: "True",
107
- products: [],
108
- product_cards: response.product_cards || "False",
109
- resource: response?.resource_details?.[0]?.link ?? "",
110
- resource_type: response?.resource_details?.[0]?.type ?? ""
111
- };
112
- setMessages((prevMessages) => [...prevMessages, newMessage]);
113
- setLastMessageId(response.message_id)
114
- break;
115
- case 'chunk':
116
- const newContent = response.chunk;
117
- const newMessageId = response.message_id;
118
-
119
- setMessages(prevMessages => {
120
- if (prevMessages.length > 0 && prevMessages[prevMessages.length - 1].type === "ai") {
121
- return prevMessages.map((message, index) =>
122
- index === prevMessages.length - 1
123
- ? {
124
- ...message,
125
- text: message.text + newContent,
126
- message_id: newMessageId || message.message_id,
127
- feedback: "True"
128
- }
129
- : message
130
- );
131
- } else {
132
- return [
133
- ...prevMessages,
134
- {
135
- type: "ai",
136
- text: newContent,
137
- message_id: newMessageId,
138
- feedback: "True"
139
- }
140
- ];
141
- }
142
- });
143
- setGhostMessage(false);
144
- if (newMessageId) {
145
- setLastMessageId(newMessageId);
146
- }
147
- break;
148
- case 'product_cards':
149
- setMessages(prevMessages => {
150
- const lastMessageIndex = prevMessages.length - 1;
151
-
152
- if (prevMessages[lastMessageIndex] && prevMessages[lastMessageIndex].type === "ai") {
153
- const expandedProducts = response.products.map(prod => ({
154
- part_number: prod.part_number || "",
155
- inventory_info: prod.inventory_info ? {
156
- default_uom: prod.inventory_info.default_uom || "",
157
- is_valid: prod.inventory_info.is_valid || false,
158
- info_by_uom: prod.inventory_info.info_by_uom
159
- ? Object.keys(prod.inventory_info.info_by_uom).reduce((acc, key) => {
160
- const value = prod.inventory_info.info_by_uom[key] || {};
161
- acc[key] = {
162
- gross_price: value.gross_price ?? 0,
163
- net_price: value.net_price ?? 0,
164
- is_on_sale: value.is_on_sale ?? false,
165
- quantity_available: value.quantity_available ?? 0,
166
- discounts: value.discounts ?? null,
167
- min_pack_qty: value.min_pack_qty ?? 0,
168
- };
169
- return acc;
170
- }, {})
171
- : {}
172
- } : {},
173
- product_details: prod.product_details ? {
174
- brand: prod.product_details.brand || "",
175
- flow: prod.product_details.flow || "",
176
- heritage_link: prod.product_details.heritage_link || "",
177
- image_url: prod.product_details.image_url || "",
178
- is_pump: prod.product_details.is_pump || "",
179
- manufacturer_id: prod.product_details.manufacturer_id || "",
180
- mfg_number: prod.product_details.mfg_number || "",
181
- part_number: prod.product_details.part_number || "",
182
- product_description: prod.product_details.product_description || "",
183
- product_name: prod.product_details.product_name || "",
184
- type: prod.product_details.type || "",
185
- vertical: prod.product_details.vertical || "",
186
- sku: prod.product_details.sku || ""
187
- } : {}
188
- }));
137
+ setMessages(prevMessages => {
138
+ if (
139
+ prevMessages.length > 0 &&
140
+ prevMessages[prevMessages.length - 1].type === 'ai'
141
+ ) {
142
+ return prevMessages.map((message, index) =>
143
+ index === prevMessages.length - 1
144
+ ? {
145
+ ...message,
146
+ text: message.text + newContent,
147
+ message_id: newMessageId || message.message_id,
148
+ feedback: 'True',
149
+ }
150
+ : message,
151
+ );
152
+ } else {
153
+ return [
154
+ ...prevMessages,
155
+ {
156
+ type: 'ai',
157
+ text: newContent,
158
+ message_id: newMessageId,
159
+ feedback: 'True',
160
+ },
161
+ ];
162
+ }
163
+ });
164
+ setGhostMessage(false);
165
+ if (newMessageId) {
166
+ setLastMessageId(newMessageId);
167
+ }
168
+ break;
169
+ case 'product_cards':
170
+ console.log(
171
+ '\n\n\n\nthis is for my own sanity: ',
172
+ response.products[0],
173
+ '\n\n\n\n',
174
+ );
175
+ setMessages(prevMessages => {
176
+ const lastMessageIndex = prevMessages.length - 1;
189
177
 
190
- const updatedLastMessage = {
191
- ...prevMessages[lastMessageIndex],
192
- products: expandedProducts,
193
- product_cards: "True"
194
- };
195
-
196
- return [
197
- ...prevMessages.slice(0, lastMessageIndex),
198
- updatedLastMessage
199
- ];
200
- }
201
-
202
- return prevMessages;
203
- });
204
-
205
- setGhostMessage(false);
206
- setTypingIndicator(false);
207
- setGhostCard(false);
208
- break;
209
- case 'product_document':
210
- setMessages(prevMessages => {
211
- const lastMessageIndex = prevMessages.length - 1;
212
- if (prevMessages[lastMessageIndex] && prevMessages[lastMessageIndex].type === "ai") {
213
- const updatedLastMessage = {
214
- ...prevMessages[lastMessageIndex],
215
- resource: response?.resource_details?.[0]?.link ?? "",
216
- resource_type: response?.resource_details?.[0]?.type ?? ""
217
- };
218
- return [
219
- ...prevMessages.slice(0, lastMessageIndex),
220
- updatedLastMessage
221
- ];
222
- }
223
- });
224
- setGhostMessage(false);
225
- setTypingIndicator(false)
226
- setGhostCard(false)
227
- break;
228
- case 'suggested_questions':
229
- setMessages(prevMessages => {
230
- const lastMessageIndex = prevMessages.length - 1;
231
- if (prevMessages[lastMessageIndex] && prevMessages[lastMessageIndex].type === "ai") {
232
- const updatedLastMessage = {
233
- ...prevMessages[lastMessageIndex],
234
- suggested_questions: true,
235
- questions: response.suggested_questions
178
+ if (
179
+ prevMessages[lastMessageIndex] &&
180
+ prevMessages[lastMessageIndex].type === 'ai'
181
+ ) {
182
+ const expandedProducts = response.products.map(prod => ({
183
+ part_number: prod.part_number || '',
184
+ inventory_info: prod.inventory_info
185
+ ? {
186
+ default_uom: prod.inventory_info.default_uom || '',
187
+ is_valid: prod.inventory_info.is_valid || false,
188
+ info_by_uom: prod.inventory_info.info_by_uom
189
+ ? Object.keys(prod.inventory_info.info_by_uom).reduce(
190
+ (acc, key) => {
191
+ const value =
192
+ prod.inventory_info.info_by_uom[key] || {};
193
+ acc[key] = {
194
+ gross_price: value.gross_price ?? 0,
195
+ net_price: value.net_price ?? 0,
196
+ is_on_sale: value.is_on_sale ?? false,
197
+ quantity_available:
198
+ value.quantity_available ?? 0,
199
+ discounts: value.discounts ?? null,
200
+ min_pack_qty: value.min_pack_qty ?? 0,
236
201
  };
237
- return [
238
- ...prevMessages.slice(0, lastMessageIndex),
239
- updatedLastMessage
240
- ];
241
- }
242
- });
243
- break;
244
- case 'setComplete':
245
- setTypingIndicator(false);
246
- setStartStreaming(false)
247
- setGhostCard(false)
248
- break;
249
- }
250
- };
202
+ return acc;
203
+ },
204
+ {},
205
+ )
206
+ : {},
207
+ }
208
+ : {},
209
+ product_details: prod.product_details
210
+ ? {
211
+ brand: prod.product_details.brand || '',
212
+ flow: prod.product_details.flow || '',
213
+ heritage_link: prod.product_details.heritage_link || '',
214
+ image_url: prod.product_details.image_url || '',
215
+ is_pump: prod.product_details.is_pump || '',
216
+ manufacturer_id:
217
+ prod.product_details.manufacturer_id || '',
218
+ mfg_number: prod.product_details.mfg_number || '',
219
+ part_number: prod.product_details.part_number || '',
220
+ product_description:
221
+ prod.product_details.product_description || '',
222
+ product_name: prod.product_details.product_name || '',
223
+ type: prod.product_details.type || '',
224
+ vertical: prod.product_details.vertical || '',
225
+ sku: prod.product_details.sku || '',
226
+ }
227
+ : {},
228
+ }));
251
229
 
252
- ws.onerror = (error) => {
253
- setStartStreaming(false)
254
- setGhostMessage(false);
255
- setTypingIndicator(false)
256
- setGhostCard(false)
257
- };
230
+ const updatedLastMessage = {
231
+ ...prevMessages[lastMessageIndex],
232
+ products: expandedProducts,
233
+ product_cards: 'True',
234
+ };
258
235
 
259
- ws.onclose = (event) => {
260
- console.log("WebSocket connection closed:", event.reason);
261
- setStartStreaming(false)
262
- setGhostMessage(false);
263
- setTypingIndicator(false)
264
- setGhostCard(false)
265
- };
236
+ return [
237
+ ...prevMessages.slice(0, lastMessageIndex),
238
+ updatedLastMessage,
239
+ ];
240
+ }
266
241
 
267
- return () => {
268
- ws.close();
269
- };
270
- };
271
- }, [startStreaming]);
242
+ return prevMessages;
243
+ });
272
244
 
273
- useEffect(() => {
274
- if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
275
- wsRef.current.close();
276
- setStartStreaming(false);
277
- setGhostMessage(false)
278
- setGhostCard(false)
279
- setTypingIndicator(false)
280
- setStopActivated(false)
245
+ setGhostMessage(false);
246
+ setTypingIndicator(false);
247
+ setGhostCard(false);
248
+ break;
249
+ case 'product_document':
250
+ setMessages(prevMessages => {
251
+ const lastMessageIndex = prevMessages.length - 1;
252
+ if (
253
+ prevMessages[lastMessageIndex] &&
254
+ prevMessages[lastMessageIndex].type === 'ai'
255
+ ) {
256
+ const updatedLastMessage = {
257
+ ...prevMessages[lastMessageIndex],
258
+ resource: response?.resource_details?.[0]?.link ?? '',
259
+ resource_type: response?.resource_details?.[0]?.type ?? '',
260
+ };
261
+ return [
262
+ ...prevMessages.slice(0, lastMessageIndex),
263
+ updatedLastMessage,
264
+ ];
265
+ }
266
+ });
267
+ setGhostMessage(false);
268
+ setTypingIndicator(false);
269
+ setGhostCard(false);
270
+ break;
271
+ case 'suggested_questions':
272
+ setMessages(prevMessages => {
273
+ const lastMessageIndex = prevMessages.length - 1;
274
+ if (
275
+ prevMessages[lastMessageIndex] &&
276
+ prevMessages[lastMessageIndex].type === 'ai'
277
+ ) {
278
+ const updatedLastMessage = {
279
+ ...prevMessages[lastMessageIndex],
280
+ suggested_questions: true,
281
+ questions: response.suggested_questions,
282
+ };
283
+ return [
284
+ ...prevMessages.slice(0, lastMessageIndex),
285
+ updatedLastMessage,
286
+ ];
287
+ }
288
+ });
289
+ break;
290
+ case 'setComplete':
291
+ setTypingIndicator(false);
292
+ setStartStreaming(false);
293
+ setGhostCard(false);
294
+ break;
281
295
  }
282
- }, [stopActivated, setStartStreaming]);
296
+ };
283
297
 
298
+ ws.onerror = error => {
299
+ setStartStreaming(false);
300
+ setGhostMessage(false);
301
+ setTypingIndicator(false);
302
+ setGhostCard(false);
303
+ };
304
+
305
+ ws.onclose = event => {
306
+ console.log('WebSocket connection closed:', event.reason);
307
+ setStartStreaming(false);
308
+ setGhostMessage(false);
309
+ setTypingIndicator(false);
310
+ setGhostCard(false);
311
+ };
312
+
313
+ return () => {
314
+ ws.close();
315
+ };
316
+ }
317
+ }, [startStreaming]);
318
+
319
+ useEffect(() => {
320
+ if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
321
+ wsRef.current.close();
322
+ setStartStreaming(false);
323
+ setGhostMessage(false);
324
+ setGhostCard(false);
325
+ setTypingIndicator(false);
326
+ setStopActivated(false);
327
+ }
328
+ }, [stopActivated, setStartStreaming]);
284
329
  }
330
+
331
+ // import React, { useState, useEffect, useRef, useContext } from 'react';
332
+ // import { AppContext } from '../contexts/AppContext';
333
+ //
334
+ // export function useWebSocketMessage() {
335
+ // const {
336
+ // setIsComplete,
337
+ // startStreaming,
338
+ // setMessages,
339
+ // messages,
340
+ // setGhostMessage,
341
+ // data,
342
+ // setTypingIndicator,
343
+ // setStartStreaming,
344
+ // lastUserMessage,
345
+ // stopActivated,
346
+ // sessionId,
347
+ // setGhostCard,
348
+ // BASE_URL,
349
+ // setStopActivated,
350
+ // setLastMessageId,
351
+ // conversationStartTime,
352
+ // } = useContext(AppContext);
353
+ //
354
+ // const wsProtocol = 'wss://';
355
+ // const wsUrl = BASE_URL.replace(/^http(s)?:\/\//, '');
356
+ // const ENDPOINT = '/send/event';
357
+ //
358
+ // const payload = {
359
+ // customer_code: data.customer_code,
360
+ // branch_code: data.branch_code,
361
+ // branch_full_name: data.branch_full_name,
362
+ // customer_token: data.customer_token,
363
+ // active_ship_to_information: {
364
+ // shipToId: data.active_ship_to,
365
+ // },
366
+ // branch_details: data.branch_details,
367
+ // user_query: lastUserMessage,
368
+ // session_id: data.session_id || data.session || sessionId,
369
+ // conversation_start_time: conversationStartTime,
370
+ // user_UUID: data.user_id || 'mobile_user_unspecified',
371
+ // device: 'mobile',
372
+ // window_location: 'mobile',
373
+ // };
374
+ //
375
+ // const wsRef = useRef(null);
376
+ //
377
+ // useEffect(() => {
378
+ // if (startStreaming) {
379
+ // console.log(payload, BASE_URL);
380
+ // const socketUrl = `${wsProtocol}${wsUrl}${ENDPOINT}`;
381
+ // console.log(socketUrl);
382
+ //
383
+ // const ws = new WebSocket(socketUrl);
384
+ // wsRef.current = ws;
385
+ //
386
+ // ws.onopen = () => {
387
+ // console.log('WebSocket connection established.');
388
+ // ws.send(JSON.stringify(payload));
389
+ // };
390
+ //
391
+ // ws.onmessage = event => {
392
+ // const response = JSON.parse(event.data);
393
+ //
394
+ // if (response.type !== 'chunk') {
395
+ // console.log(JSON.stringify(response, null, 2));
396
+ // }
397
+ // switch (response.type) {
398
+ // case 'middle_message':
399
+ // const middleMessage = {
400
+ // type: 'middle',
401
+ // text: response.message,
402
+ // products: [],
403
+ // product_cards: 'False',
404
+ // };
405
+ // setMessages(prevMessages => [...prevMessages, middleMessage]);
406
+ // break;
407
+ // case 'message':
408
+ // if (
409
+ // response.product_cards == 'False' ||
410
+ // response.product_cards == false
411
+ // ) {
412
+ // setGhostMessage(false);
413
+ // setTypingIndicator(false);
414
+ // } else {
415
+ // setGhostMessage(false);
416
+ // setGhostCard(true);
417
+ // }
418
+ // const newMessage = {
419
+ // type: 'ai',
420
+ // message_id: response.message_id || '',
421
+ // text: response.message,
422
+ // feedback: 'True',
423
+ // products: [],
424
+ // product_cards: response.product_cards || 'False',
425
+ // resource: response?.resource_details?.[0]?.link ?? '',
426
+ // resource_type: response?.resource_details?.[0]?.type ?? '',
427
+ // };
428
+ // setMessages(prevMessages => [...prevMessages, newMessage]);
429
+ // setLastMessageId(response.message_id);
430
+ // break;
431
+ // case 'chunk':
432
+ // const newContent = response.chunk;
433
+ // const newMessageId = response.message_id;
434
+ //
435
+ // setMessages(prevMessages => {
436
+ // if (
437
+ // prevMessages.length > 0 &&
438
+ // prevMessages[prevMessages.length - 1].type === 'ai'
439
+ // ) {
440
+ // return prevMessages.map((message, index) =>
441
+ // index === prevMessages.length - 1
442
+ // ? {
443
+ // ...message,
444
+ // text: message.text + newContent,
445
+ // message_id: newMessageId || message.message_id,
446
+ // feedback: 'True',
447
+ // }
448
+ // : message,
449
+ // );
450
+ // } else {
451
+ // return [
452
+ // ...prevMessages,
453
+ // {
454
+ // type: 'ai',
455
+ // text: newContent,
456
+ // message_id: newMessageId,
457
+ // feedback: 'True',
458
+ // },
459
+ // ];
460
+ // }
461
+ // });
462
+ // setGhostMessage(false);
463
+ // if (newMessageId) {
464
+ // setLastMessageId(newMessageId);
465
+ // }
466
+ // break;
467
+ // case 'product_cards':
468
+ // console.log('🛒 PRODUCT_CARDS RECEIVED:', response);
469
+ // setMessages(prevMessages => {
470
+ // console.log(
471
+ // '📦 Current messages array length:',
472
+ // prevMessages.length,
473
+ // );
474
+ // const lastMessageIndex = prevMessages.length - 1;
475
+ //
476
+ // if (lastMessageIndex < 0) {
477
+ // console.warn('⚠️ No messages exist yet!');
478
+ // return prevMessages;
479
+ // }
480
+ //
481
+ // const lastMessage = prevMessages[lastMessageIndex];
482
+ // console.log('📝 Last message:', {
483
+ // type: lastMessage?.type,
484
+ // message_id: lastMessage?.message_id,
485
+ // has_products: !!lastMessage?.products,
486
+ // text_preview: lastMessage?.text?.substring(0, 50),
487
+ // });
488
+ //
489
+ // if (lastMessage && lastMessage.type === 'ai') {
490
+ // const expandedProducts = response.products.map(prod => ({
491
+ // part_number: prod.part_number || '',
492
+ // inventory_info: prod.inventory_info
493
+ // ? {
494
+ // default_uom: prod.inventory_info.default_uom || '',
495
+ // is_valid: prod.inventory_info.is_valid || false,
496
+ // info_by_uom: prod.inventory_info.info_by_uom
497
+ // ? Object.keys(prod.inventory_info.info_by_uom).reduce(
498
+ // (acc, key) => {
499
+ // const value =
500
+ // prod.inventory_info.info_by_uom[key] || {};
501
+ // acc[key] = {
502
+ // gross_price: value.gross_price ?? 0,
503
+ // net_price: value.net_price ?? 0,
504
+ // is_on_sale: value.is_on_sale ?? false,
505
+ // quantity_available:
506
+ // value.quantity_available ?? 0,
507
+ // discounts: value.discounts ?? null,
508
+ // min_pack_qty: value.min_pack_qty ?? 0,
509
+ // };
510
+ // return acc;
511
+ // },
512
+ // {},
513
+ // )
514
+ // : {},
515
+ // }
516
+ // : {},
517
+ // product_details: prod.product_details
518
+ // ? {
519
+ // brand: prod.product_details.brand || '',
520
+ // flow: prod.product_details.flow || '',
521
+ // heritage_link: prod.product_details.heritage_link || '',
522
+ // image_url: prod.product_details.image_url || '',
523
+ // is_pump: prod.product_details.is_pump || '',
524
+ // manufacturer_id:
525
+ // prod.product_details.manufacturer_id || '',
526
+ // mfg_number: prod.product_details.mfg_number || '',
527
+ // part_number: prod.product_details.part_number || '',
528
+ // product_description:
529
+ // prod.product_details.product_description || '',
530
+ // product_name: prod.product_details.product_name || '',
531
+ // type: prod.product_details.type || '',
532
+ // vertical: prod.product_details.vertical || '',
533
+ // sku: prod.product_details.sku || '',
534
+ // }
535
+ // : {},
536
+ // }));
537
+ //
538
+ // console.log(
539
+ // '✅ Merging',
540
+ // expandedProducts.length,
541
+ // 'products into last message',
542
+ // );
543
+ //
544
+ // const updatedLastMessage = {
545
+ // ...lastMessage,
546
+ // products: expandedProducts,
547
+ // product_cards: 'True',
548
+ // };
549
+ //
550
+ // const newMessages = [
551
+ // ...prevMessages.slice(0, lastMessageIndex),
552
+ // updatedLastMessage,
553
+ // ];
554
+ //
555
+ // console.log(
556
+ // '🎯 Updated message now has products:',
557
+ // updatedLastMessage.products.length,
558
+ // );
559
+ // return newMessages;
560
+ // }
561
+ //
562
+ // console.warn("⚠️ Last message is not AI type or doesn't exist");
563
+ // return prevMessages;
564
+ // });
565
+ //
566
+ // setGhostMessage(false);
567
+ // setTypingIndicator(false);
568
+ // setGhostCard(false);
569
+ // break;
570
+ // case 'product_document':
571
+ // setMessages(prevMessages => {
572
+ // const lastMessageIndex = prevMessages.length - 1;
573
+ // if (
574
+ // prevMessages[lastMessageIndex] &&
575
+ // prevMessages[lastMessageIndex].type === 'ai'
576
+ // ) {
577
+ // const updatedLastMessage = {
578
+ // ...prevMessages[lastMessageIndex],
579
+ // resource: response?.resource_details?.[0]?.link ?? '',
580
+ // resource_type: response?.resource_details?.[0]?.type ?? '',
581
+ // };
582
+ // return [
583
+ // ...prevMessages.slice(0, lastMessageIndex),
584
+ // updatedLastMessage,
585
+ // ];
586
+ // }
587
+ // // FIX: Always return prevMessages if condition not met
588
+ // return prevMessages;
589
+ // });
590
+ // setGhostMessage(false);
591
+ // setTypingIndicator(false);
592
+ // setGhostCard(false);
593
+ // break;
594
+ // case 'suggested_questions':
595
+ // setMessages(prevMessages => {
596
+ // const lastMessageIndex = prevMessages.length - 1;
597
+ // if (
598
+ // prevMessages[lastMessageIndex] &&
599
+ // prevMessages[lastMessageIndex].type === 'ai'
600
+ // ) {
601
+ // const updatedLastMessage = {
602
+ // ...prevMessages[lastMessageIndex],
603
+ // suggested_questions: true,
604
+ // questions: response.suggested_questions,
605
+ // };
606
+ // return [
607
+ // ...prevMessages.slice(0, lastMessageIndex),
608
+ // updatedLastMessage,
609
+ // ];
610
+ // }
611
+ // // FIX: Always return prevMessages if condition not met
612
+ // return prevMessages;
613
+ // });
614
+ // break;
615
+ // case 'setComplete':
616
+ // setTypingIndicator(false);
617
+ // setStartStreaming(false);
618
+ // setGhostCard(false);
619
+ // break;
620
+ // }
621
+ // };
622
+ //
623
+ // ws.onerror = error => {
624
+ // setStartStreaming(false);
625
+ // setGhostMessage(false);
626
+ // setTypingIndicator(false);
627
+ // setGhostCard(false);
628
+ // };
629
+ //
630
+ // ws.onclose = event => {
631
+ // console.log('WebSocket connection closed:', event.reason);
632
+ // setStartStreaming(false);
633
+ // setGhostMessage(false);
634
+ // setTypingIndicator(false);
635
+ // setGhostCard(false);
636
+ // };
637
+ //
638
+ // return () => {
639
+ // ws.close();
640
+ // };
641
+ // }
642
+ // }, [startStreaming]);
643
+ //
644
+ // useEffect(() => {
645
+ // if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
646
+ // wsRef.current.close();
647
+ // setStartStreaming(false);
648
+ // setGhostMessage(false);
649
+ // setGhostCard(false);
650
+ // setTypingIndicator(false);
651
+ // setStopActivated(false);
652
+ // }
653
+ // }, [stopActivated, setStartStreaming]);
654
+ // }