impact-chatbot 2.3.19 → 2.3.21

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.cjs.js CHANGED
@@ -35,6 +35,7 @@ var globalStyles$1 = require('core/Styles/globalStyles');
35
35
  var FormatListBulletedOutlinedIcon = require('@mui/icons-material/FormatListBulletedOutlined');
36
36
  var PsychologyOutlinedIcon = require('@mui/icons-material/PsychologyOutlined');
37
37
  var chatbotServices = require('core/commonComponents/smartBot/services/chatbot-services');
38
+ var SaveOutlinedIcon = require('@mui/icons-material/SaveOutlined');
38
39
  var RangePicker = require('core/commonComponents/dateRangePicker');
39
40
 
40
41
  function _interopNamespaceDefault(e) {
@@ -614,7 +615,7 @@ const handleMessageLike = async (question, liked, setLoadingState, displaySnackM
614
615
  // question ===
615
616
  // `${item?.response_heading || item?.screen_name}_${item?.timeStamp}`
616
617
  // );
617
- const activeMessage = chatDataInfoRef?.[currentMode]?.conversations?.[1]?.messages?.[chatIndex];
618
+ const activeMessage = chatDataInfoRef?.[currentMode]?.conversations?.[activeConversationId]?.messages?.[chatIndex];
618
619
  // const activeMessage = chats?.[currentMode].conversations[activeConversationId].messages[activeMessageIndex];
619
620
  try {
620
621
  let request;
@@ -640,7 +641,7 @@ const handleMessageLike = async (question, liked, setLoadingState, displaySnackM
640
641
  // activeMessageIndex,
641
642
  // () => updatedMessage
642
643
  // );
643
- chatDataInfoRef[currentMode].conversations[1].messages[chatIndex] = updatedMessage;
644
+ chatDataInfoRef[currentMode].conversations[activeConversationId].messages[chatIndex] = updatedMessage;
644
645
  // templateData[currentMode].conversations[activeConversationId].messages = newChats;
645
646
  setChatDataState({ ...chatDataInfoRef });
646
647
  localStorage.setItem("chatData", JSON.stringify(templateData));
@@ -739,34 +740,35 @@ const getDynamicFunction = async (path, functionName) => {
739
740
  return null;
740
741
  }
741
742
  };
743
+ const generateConversationId = () => {
744
+ try {
745
+ return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
746
+ }
747
+ catch (error) {
748
+ console.error("generateConversationId error", error);
749
+ return 0;
750
+ }
751
+ };
742
752
  /**
743
753
  * Generates a conversation object structure with empty messages array and current timestamp
744
754
  * @returns {object} - The conversation object structure
745
755
  */
746
- const generateConversationObject = () => {
756
+ const generateConversationObject = (conversationId) => {
747
757
  try {
748
758
  return {
749
- conversations: {
750
- 1: {
751
- id: 1,
752
- name: "Conversation 1",
753
- timestamp: new Date().toISOString(),
754
- messages: [],
755
- },
756
- },
759
+ id: conversationId,
760
+ name: `Conversation ${conversationId}`,
761
+ timestamp: new Date().toISOString(),
762
+ messages: [],
757
763
  };
758
764
  }
759
765
  catch (error) {
760
766
  console.error("generateConversationObject error", error);
761
767
  return {
762
- conversations: {
763
- 1: {
764
- id: 1,
765
- name: "Conversation 1",
766
- timestamp: new Date().toISOString(),
767
- messages: [],
768
- },
769
- },
768
+ id: conversationId,
769
+ name: `Conversation ${conversationId}`,
770
+ timestamp: new Date().toISOString(),
771
+ messages: [],
770
772
  };
771
773
  }
772
774
  };
@@ -963,6 +965,12 @@ const replaceSpecialCharToCharCode = (str) => {
963
965
  // Convert pixels to rem
964
966
  const pxToRem = (px) => `${px / 16}rem`;
965
967
 
968
+ // Get current user ID from session storage
969
+ const getCurrentUserId = () => {
970
+ const userDetails = JSON.parse(sessionStorage.getItem("userDetails") || "{}");
971
+ return userDetails?.user_id || null;
972
+ };
973
+
966
974
  // Get user name from session storage
967
975
  const getUserName = () => {
968
976
  const userDetails = JSON.parse(sessionStorage.getItem("userDetails") || "{}");
@@ -1212,7 +1220,9 @@ const ThinkinHeaderInfo = (props) => {
1212
1220
  // import { stackedBarChartExample } from "../examples/GraphExample";
1213
1221
  // import { examplePieChartData } from "../examples/GraphExample";
1214
1222
  const useAgentFlow = (dateFormat, chatDataRef, currentMode, setShowChatPlaceholder, setLoader, baseUrl = "", setCurrentSessionId = (params) => { }, customChatConfig = null, chatDataInfoRef = null, utilityObjectData = {}) => {
1215
- const setAgentFlow = React.useCallback(async (payload, input = "", baseUrlTemp = "") => {
1223
+ const { activeConversationId, setActiveConversationId } = utilityObjectData;
1224
+ const setAgentFlow = React.useCallback(async (payload, input = "", baseUrlTemp = "", conversationIdParam = null) => {
1225
+ let conversationId = conversationIdParam || activeConversationId;
1216
1226
  try {
1217
1227
  const currentTimeString = getCurrentDateTimeString(dateFormat);
1218
1228
  const currentModeValue = localStorage.getItem("currentModeData") || currentMode;
@@ -1230,17 +1240,24 @@ const useAgentFlow = (dateFormat, chatDataRef, currentMode, setShowChatPlacehold
1230
1240
  timeStamp: currentTimeString,
1231
1241
  userType: "loader",
1232
1242
  };
1233
- if (isEmpty(chatDataInfoRef.current[currentModeValue])) {
1234
- chatDataInfoRef.current[currentModeValue] = generateConversationObject();
1235
- }
1243
+ if (!conversationId || isEmpty(chatDataInfoRef.current[currentModeValue].conversations[conversationId])) {
1244
+ conversationId = generateConversationId();
1245
+ setActiveConversationId(conversationId);
1246
+ chatDataInfoRef.current[currentModeValue].conversations[conversationId] = generateConversationObject(conversationId);
1247
+ }
1248
+ // if (isEmpty(chatDataInfoRef.current[currentModeValue])) {
1249
+ // chatDataInfoRef.current[
1250
+ // currentModeValue
1251
+ // ] = generateConversationObject();
1252
+ // }
1236
1253
  if (showUserChat) {
1237
1254
  chatDataRef.current[currentModeValue] = [
1238
1255
  ...chatDataRef.current?.[currentModeValue],
1239
1256
  userChat,
1240
1257
  loaderData,
1241
1258
  ];
1242
- chatDataInfoRef.current[currentModeValue].conversations[1].messages = [
1243
- ...chatDataInfoRef.current[currentModeValue].conversations[1]
1259
+ chatDataInfoRef.current[currentModeValue].conversations[conversationId].messages = [
1260
+ ...chatDataInfoRef.current[currentModeValue].conversations[conversationId]
1244
1261
  .messages,
1245
1262
  userChat,
1246
1263
  ];
@@ -1258,7 +1275,7 @@ const useAgentFlow = (dateFormat, chatDataRef, currentMode, setShowChatPlacehold
1258
1275
  let response = {};
1259
1276
  if (utilityObjectData?.runStreaming) {
1260
1277
  let utilityObject = {
1261
- activeConversationId: utilityObjectData?.activeConversationId,
1278
+ activeConversationId: conversationId,
1262
1279
  currentMode: currentModeValue,
1263
1280
  chatDataRef,
1264
1281
  chatBodyRef: utilityObjectData?.chatBodyRef,
@@ -1297,9 +1314,9 @@ const useAgentFlow = (dateFormat, chatDataRef, currentMode, setShowChatPlacehold
1297
1314
  baseUrl: baseUrlTemp,
1298
1315
  };
1299
1316
  response = await parseResponse(null, "stream", "", currentModeValue, false, "", {}, payload, utilityObject);
1300
- let chatDataMessages = chatDataInfoRef.current[currentModeValue].conversations[1].messages;
1317
+ let chatDataMessages = chatDataInfoRef.current[currentModeValue].conversations[conversationId].messages;
1301
1318
  chatDataMessages = [...chatDataMessages, response];
1302
- chatDataInfoRef.current[currentModeValue].conversations[1].messages = chatDataMessages;
1319
+ chatDataInfoRef.current[currentModeValue].conversations[conversationId].messages = chatDataMessages;
1303
1320
  // Trigger re-render by updating chatDataState
1304
1321
  if (utilityObjectData?.setChatDataState) {
1305
1322
  utilityObjectData.setChatDataState({ ...chatDataRef.current });
@@ -1631,7 +1648,7 @@ const useAgentFlow = (dateFormat, chatDataRef, currentMode, setShowChatPlacehold
1631
1648
  // data: tableResponse,
1632
1649
  // },
1633
1650
  // };
1634
- processResponse(response, payload, currentModeValue, customChatConfig);
1651
+ processResponse(response, payload, currentModeValue, customChatConfig, {}, conversationId);
1635
1652
  // let parsedResponse = {};
1636
1653
  // let customParseResponse = null;
1637
1654
  // // Check if a custom parser is provided and load it
@@ -1794,9 +1811,9 @@ const useAgentFlow = (dateFormat, chatDataRef, currentMode, setShowChatPlacehold
1794
1811
  bodyType: "text",
1795
1812
  };
1796
1813
  const currentModeValue = localStorage.getItem("currentModeData") || currentMode;
1797
- let chatDataMessages = chatDataInfoRef.current[currentModeValue].conversations[1].messages;
1814
+ let chatDataMessages = chatDataInfoRef.current[currentModeValue].conversations[conversationId].messages;
1798
1815
  chatDataMessages = [...chatDataMessages, failResponseText];
1799
- chatDataInfoRef.current[currentModeValue].conversations[1].messages = chatDataMessages;
1816
+ chatDataInfoRef.current[currentModeValue].conversations[conversationId].messages = chatDataMessages;
1800
1817
  chatDataRef.current[currentMode] = [
1801
1818
  ...chatDataRef.current[currentMode]?.filter((data) => data.userType !== "loader"),
1802
1819
  failResponseText,
@@ -1807,7 +1824,7 @@ const useAgentFlow = (dateFormat, chatDataRef, currentMode, setShowChatPlacehold
1807
1824
  }
1808
1825
  setLoader(false);
1809
1826
  }
1810
- }, [currentMode, chatDataRef, baseUrl, customChatConfig, utilityObjectData?.thinkingContent]);
1827
+ }, [currentMode, chatDataRef, baseUrl, customChatConfig, utilityObjectData?.thinkingContent, activeConversationId]);
1811
1828
  const prepareDataAndSendToAgent = React.useCallback((data, init = false, utilityObjectData) => {
1812
1829
  try {
1813
1830
  let payload = {};
@@ -1851,13 +1868,15 @@ const useAgentFlow = (dateFormat, chatDataRef, currentMode, setShowChatPlacehold
1851
1868
  }
1852
1869
  dispatch(setChatbotContext({}));
1853
1870
  }
1854
- setAgentFlow(payload, "", data?.baseUrl);
1871
+ // Get activeConversationId from utilityObjectData if available, otherwise use the one from closure
1872
+ const currentConversationId = utilityObjectData?.activeConversationId || activeConversationId;
1873
+ setAgentFlow(payload, "", data?.baseUrl, currentConversationId);
1855
1874
  }
1856
1875
  catch (error) {
1857
1876
  console.error("Error in prepareDataAndSendToAgent: ", error);
1858
1877
  }
1859
- }, []);
1860
- const processResponse = React.useCallback(async (response, payload, currentModeValue, customChatConfig, utilsObject) => {
1878
+ }, [activeConversationId, setAgentFlow]);
1879
+ const processResponse = React.useCallback(async (response, payload, currentModeValue, customChatConfig, utilsObject, conversationId) => {
1861
1880
  try {
1862
1881
  let parsedResponse = {};
1863
1882
  let customParseResponse = null;
@@ -1959,7 +1978,7 @@ const useAgentFlow = (dateFormat, chatDataRef, currentMode, setShowChatPlacehold
1959
1978
  if (utilsObject?.newChatData) {
1960
1979
  chatDataInfoRef.current = utilsObject?.newChatData.current;
1961
1980
  }
1962
- let chatDataMessages = chatDataInfoRef.current[currentModeValue].conversations[1].messages;
1981
+ let chatDataMessages = chatDataInfoRef.current[currentModeValue].conversations[conversationId].messages;
1963
1982
  let finalParsedResponse = isArray(parsedResponse)
1964
1983
  ? parsedResponse
1965
1984
  : [parsedResponse];
@@ -1967,7 +1986,7 @@ const useAgentFlow = (dateFormat, chatDataRef, currentMode, setShowChatPlacehold
1967
1986
  message.firstMessage = index === 0 ? true : false;
1968
1987
  });
1969
1988
  chatDataMessages = [...chatDataMessages, ...(Array.isArray(finalParsedResponse) ? finalParsedResponse : [])];
1970
- chatDataInfoRef.current[currentModeValue].conversations[1].messages = chatDataMessages;
1989
+ chatDataInfoRef.current[currentModeValue].conversations[conversationId].messages = chatDataMessages;
1971
1990
  // Trigger re-render by updating chatDataState
1972
1991
  if (utilityObjectData?.setChatDataState) {
1973
1992
  utilityObjectData.setChatDataState({ ...chatDataRef.current });
@@ -1987,7 +2006,7 @@ const useAgentFlow = (dateFormat, chatDataRef, currentMode, setShowChatPlacehold
1987
2006
  };
1988
2007
  };
1989
2008
 
1990
- const useChatFlow = (chatDataRef, setLoader, setFlowType, setScreenName, setUserInput, setQuestionIndex, setCurrentAppLink, flowType, screenName, questionIndex, userInput, dateFormat, currentMode, activeConversationId, setIsModuleChanged, chatBodyRef, filterReducerState, dispatch, navigate, setShowChatPlaceholder, baseUrl, setChatDataState, setCurrentSessionId, customChatConfig, chatDataInfoRef, chatbotContext, setInitValue, setSessionId, thinkingContent, setThinkingContent, isThinking, setIsThinking, chatId, setChatId, isStop, setIsStop, functionsRef, functionsState, setFunctionsState, thinkingHeaderMessage, setThinkingHeaderMessage, uniqueChatId, initValue, sessionId, fieldNumber, setFieldNumber, additionalArgs) => {
2009
+ const useChatFlow = (chatDataRef, setLoader, setFlowType, setScreenName, setUserInput, setQuestionIndex, setCurrentAppLink, flowType, screenName, questionIndex, userInput, dateFormat, currentMode, activeConversationId, setIsModuleChanged, chatBodyRef, filterReducerState, dispatch, navigate, setShowChatPlaceholder, baseUrl, setChatDataState, setCurrentSessionId, customChatConfig, chatDataInfoRef, chatbotContext, setInitValue, setSessionId, thinkingContent, setThinkingContent, isThinking, setIsThinking, chatId, setChatId, isStop, setIsStop, functionsRef, functionsState, setFunctionsState, thinkingHeaderMessage, setThinkingHeaderMessage, uniqueChatId, initValue, sessionId, fieldNumber, setFieldNumber, additionalArgs, setActiveConversationId) => {
1991
2010
  const { prepareDataAndSendToAgent, setAgentFlow, processResponse, } = useAgentFlow(dateFormat, chatDataRef, currentMode, setShowChatPlaceholder, setLoader, baseUrl, setCurrentSessionId, customChatConfig, chatDataInfoRef, {
1992
2011
  setChatDataState,
1993
2012
  activeConversationId,
@@ -2183,12 +2202,11 @@ const useChatFlow = (chatDataRef, setLoader, setFlowType, setScreenName, setUser
2183
2202
  setUserInput(data.displayText);
2184
2203
  }
2185
2204
  else {
2186
- fetchUserResultsFromQuery(data, true);
2205
+ fetchUserResultsFromQuery(data, true, "", activeConversationId);
2187
2206
  }
2188
2207
  }, [activeConversationId, baseUrl]);
2189
- const fetchUserResultsFromQuery = React.useCallback(async (refObject, fetchQuestions = false, inputValue = userInput) => {
2208
+ const fetchUserResultsFromQuery = React.useCallback(async (refObject, fetchQuestions = false, inputValue = userInput, conversationId = activeConversationId) => {
2190
2209
  let flowType = refObject?.flow_type ? refObject?.flow_type : currentMode;
2191
- ensureConversationExists(flowType, activeConversationId, chatDataRef);
2192
2210
  const currentTimeString = getCurrentDateTimeString();
2193
2211
  const input = fetchQuestions ? refObject?.screen_name : inputValue;
2194
2212
  setUserInput("");
@@ -2205,16 +2223,21 @@ const useChatFlow = (chatDataRef, setLoader, setFlowType, setScreenName, setUser
2205
2223
  timeStamp: currentTimeString,
2206
2224
  userType: "loader",
2207
2225
  };
2208
- if (lodash.isEmpty(chatDataInfoRef.current[currentMode])) {
2209
- chatDataInfoRef.current[currentMode] = generateConversationObject();
2210
- }
2211
- chatDataRef.current[flowType].conversations[activeConversationId].messages = [
2212
- ...chatDataRef.current[flowType].conversations[activeConversationId].messages,
2226
+ if (!conversationId || lodash.isEmpty(chatDataInfoRef.current[currentMode].conversations[conversationId])) {
2227
+ conversationId = generateConversationId();
2228
+ setActiveConversationId(conversationId);
2229
+ chatDataInfoRef.current[currentMode].conversations[conversationId] = generateConversationObject(conversationId);
2230
+ }
2231
+ // Ensure chatDataRef conversation entry exists for the (potentially new) conversationId.
2232
+ // Must be called AFTER the ID check above so it uses the correct ID.
2233
+ ensureConversationExists(flowType, conversationId, chatDataRef);
2234
+ chatDataRef.current[flowType].conversations[conversationId].messages = [
2235
+ ...chatDataRef.current[flowType].conversations[conversationId].messages,
2213
2236
  userChat,
2214
2237
  loaderData,
2215
2238
  ];
2216
- chatDataInfoRef.current[currentMode].conversations[1].messages = [
2217
- ...chatDataInfoRef.current[currentMode].conversations[1].messages,
2239
+ chatDataInfoRef.current[currentMode].conversations[conversationId].messages = [
2240
+ ...chatDataInfoRef.current[currentMode].conversations[conversationId].messages,
2218
2241
  userChat,
2219
2242
  ];
2220
2243
  setLoader(true);
@@ -2237,13 +2260,13 @@ const useChatFlow = (chatDataRef, setLoader, setFlowType, setScreenName, setUser
2237
2260
  // );
2238
2261
  getUpdatedChat = parseResponse({ ...queryResponse?.data?.data }, "questions");
2239
2262
  }
2240
- chatDataRef.current[flowType].conversations[activeConversationId].messages = [
2241
- ...chatDataRef.current[flowType].conversations[activeConversationId].messages?.filter((data) => data?.userType !== "loader"),
2263
+ chatDataRef.current[flowType].conversations[conversationId].messages = [
2264
+ ...chatDataRef.current[flowType].conversations[conversationId].messages?.filter((data) => data?.userType !== "loader"),
2242
2265
  getUpdatedChat,
2243
2266
  ];
2244
- let chatDataMessages = chatDataInfoRef.current[currentMode].conversations[1].messages;
2267
+ let chatDataMessages = chatDataInfoRef.current[currentMode].conversations[conversationId].messages;
2245
2268
  chatDataMessages = [...chatDataMessages, getUpdatedChat];
2246
- chatDataInfoRef.current[currentMode].conversations[1].messages = chatDataMessages;
2269
+ chatDataInfoRef.current[currentMode].conversations[conversationId].messages = chatDataMessages;
2247
2270
  // Trigger re-render by updating chatDataState
2248
2271
  setChatDataState({ ...chatDataRef.current });
2249
2272
  }
@@ -2262,7 +2285,7 @@ const useChatFlow = (chatDataRef, setLoader, setFlowType, setScreenName, setUser
2262
2285
  };
2263
2286
  }
2264
2287
  let utitlityObject = {
2265
- activeConversationId,
2288
+ activeConversationId: conversationId,
2266
2289
  currentMode,
2267
2290
  chatDataRef,
2268
2291
  chatBodyRef,
@@ -2299,13 +2322,13 @@ const useChatFlow = (chatDataRef, setLoader, setFlowType, setScreenName, setUser
2299
2322
  getUpdatedChat = parseResponse({ ...responseData, enableLikes: true }, "text");
2300
2323
  }
2301
2324
  }
2302
- chatDataRef.current[currentMode].conversations[activeConversationId].messages = [
2303
- ...chatDataRef.current[currentMode].conversations[activeConversationId].messages?.filter((data) => data?.userType !== "loader"),
2325
+ chatDataRef.current[currentMode].conversations[conversationId].messages = [
2326
+ ...chatDataRef.current[currentMode].conversations[conversationId].messages?.filter((data) => data?.userType !== "loader"),
2304
2327
  getUpdatedChat,
2305
2328
  ];
2306
- let chatDataMessages = chatDataInfoRef.current[currentMode].conversations[1].messages;
2329
+ let chatDataMessages = chatDataInfoRef.current[currentMode].conversations[conversationId].messages;
2307
2330
  chatDataMessages = [...chatDataMessages, getUpdatedChat];
2308
- chatDataInfoRef.current[currentMode].conversations[1].messages = chatDataMessages;
2331
+ chatDataInfoRef.current[currentMode].conversations[conversationId].messages = chatDataMessages;
2309
2332
  }
2310
2333
  setChatDataState({ ...chatDataRef.current });
2311
2334
  setLoader(false);
@@ -2322,13 +2345,13 @@ const useChatFlow = (chatDataRef, setLoader, setFlowType, setScreenName, setUser
2322
2345
  noShowHeaderTitle: true,
2323
2346
  bodyType: "text",
2324
2347
  };
2325
- chatDataRef.current[currentMode].conversations[activeConversationId].messages = [
2326
- ...chatDataRef.current[currentMode].conversations[activeConversationId].messages?.filter((data) => data.userType !== "loader"),
2348
+ chatDataRef.current[currentMode].conversations[conversationId].messages = [
2349
+ ...chatDataRef.current[currentMode].conversations[conversationId].messages?.filter((data) => data.userType !== "loader"),
2327
2350
  failResponseText,
2328
2351
  ];
2329
- let chatDataMessages = chatDataInfoRef.current[currentMode].conversations[1].messages;
2352
+ let chatDataMessages = chatDataInfoRef.current[currentMode].conversations[conversationId].messages;
2330
2353
  chatDataMessages = [...chatDataMessages, failResponseText];
2331
- chatDataInfoRef.current[currentMode].conversations[1].messages = chatDataMessages;
2354
+ chatDataInfoRef.current[currentMode].conversations[conversationId].messages = chatDataMessages;
2332
2355
  // Trigger re-render by updating chatDataState
2333
2356
  setChatDataState({ ...chatDataRef.current });
2334
2357
  setLoader(false);
@@ -2517,7 +2540,7 @@ const useChatSession = (chatDataRef, setFlowType, setScreenName, setUserInput, s
2517
2540
  let chatDataInfo = lodash.cloneDeep(chatDataRef.current);
2518
2541
  delete chatDataInfo.agent;
2519
2542
  for (const property in chatDataInfo) {
2520
- if (lodash.isEmpty(chatDataRef.current[property].conversations)) {
2543
+ if (lodash.isEmpty(chatDataRef.current[property].conversations) || !chatDataRef.current[property].conversations[activeConversationId]) {
2521
2544
  ensureConversationExists(property, activeConversationId, chatDataRef);
2522
2545
  }
2523
2546
  }
@@ -3972,8 +3995,12 @@ const useChatState = () => {
3972
3995
  });
3973
3996
  const chatDataInfoRef = React.useRef({
3974
3997
  insights: {},
3975
- navigation: {},
3976
- agent: {}
3998
+ navigation: {
3999
+ conversations: {},
4000
+ },
4001
+ agent: {
4002
+ conversations: {},
4003
+ }
3977
4004
  });
3978
4005
  const chatBodyRef = React.useRef({});
3979
4006
  const isDraggingRef = React.useRef(null);
@@ -4556,7 +4583,7 @@ const Rectangle = ({ type, icon, title, description, onClick, hoverable }) => {
4556
4583
  return (jsxRuntime.jsx("div", { className: `${classes.rectangle} ${classes[type]} ${hoverable ? classes.rectangleHoverable : ''}`, onClick: onClick, title: isTruncated ? title : null, children: jsxRuntime.jsxs("div", { className: classes.textContainer, children: [jsxRuntime.jsx(material.Typography, { className: classes.title, ref: titleRef, children: title }), jsxRuntime.jsx(material.Typography, { className: classes.description, children: description })] }) }));
4557
4584
  };
4558
4585
  const ChatPlaceholder = (props) => {
4559
- const { dateFormat, chatDataRef, currentMode, setShowChatPlaceholder, setLoader, setCurrentAgentId, baseUrl, setBaseUrl, setCurrentSessionId, customChatConfig, chatDataInfoRef, setChatDataState, userInput, legacyAgentScreen, activeConversationId, chatBodyRef, chatbotContext, setInitValue, setSessionId, thinkingContent, setThinkingContent, isThinking, setIsThinking, chatId, setChatId, isStop, setIsStop, functionsRef, functionsState, setFunctionsState, thinkingHeaderMessage, setThinkingHeaderMessage, uniqueChatId, setUniqueChatId, fieldNumber, setFieldNumber, setAdditionalArgs, questions, displayQuestions } = props;
4586
+ const { dateFormat, chatDataRef, currentMode, setShowChatPlaceholder, setLoader, setCurrentAgentId, baseUrl, setBaseUrl, setCurrentSessionId, customChatConfig, chatDataInfoRef, setChatDataState, userInput, legacyAgentScreen, activeConversationId, chatBodyRef, chatbotContext, setInitValue, setSessionId, thinkingContent, setThinkingContent, isThinking, setIsThinking, chatId, setChatId, isStop, setIsStop, functionsRef, functionsState, setFunctionsState, thinkingHeaderMessage, setThinkingHeaderMessage, uniqueChatId, setUniqueChatId, fieldNumber, setFieldNumber, setAdditionalArgs, questions, displayQuestions, setActiveConversationId } = props;
4560
4587
  const classes = useStyles$5();
4561
4588
  globalStyles();
4562
4589
  const [cardList, setCardList] = React.useState([]);
@@ -4587,6 +4614,7 @@ const ChatPlaceholder = (props) => {
4587
4614
  fieldNumber,
4588
4615
  setFieldNumber,
4589
4616
  setAdditionalArgs,
4617
+ setActiveConversationId
4590
4618
  });
4591
4619
  const getBaseUrl = async () => {
4592
4620
  try {
@@ -5985,7 +6013,7 @@ const formatThinkingTime = (seconds) => {
5985
6013
  * @param {Function} botData.utilityObject.setChatDataState - Function to update chat data state
5986
6014
  */
5987
6015
  const StreamedContent = ({ botData }) => {
5988
- const { activeConversationId, currentMode, chatDataRef, chatBodyRef, setChatDataState, chatDataInfoRef, setLoader = (params) => { }, processResponse = (params) => { }, setThinkingContent, thinkingContent, isThinking: isThinkingFromParent, setIsThinking: setIsThinkingFromParent, chatId, setChatId, isStop, setIsStop, functionsRef, functionsState, setFunctionsState, thinkingHeaderMessage, setThinkingHeaderMessage, baseUrl } = botData.utilityObject;
6016
+ const { activeConversationId, currentMode, chatDataRef, chatBodyRef, setChatDataState, chatDataInfoRef, setLoader = (params) => { }, processResponse = (params) => { }, setThinkingContent, thinkingContent, isThinking: isThinkingFromParent, setIsThinking: setIsThinkingFromParent, chatId, setChatId, isStop, setIsStop, functionsRef, functionsState, setFunctionsState, thinkingHeaderMessage, setThinkingHeaderMessage, baseUrl } = botData.utilityObject || {};
5989
6017
  const classes = useStyles$3();
5990
6018
  useStyles$6();
5991
6019
  const dispatch = reactRedux.useDispatch();
@@ -6359,8 +6387,8 @@ const StreamedContent = ({ botData }) => {
6359
6387
  chatDataRef.current[currentMode] = [
6360
6388
  ...chatDataRef.current[currentMode].slice(0, -1),
6361
6389
  ];
6362
- chatDataInfoRef.current[currentMode].conversations[1].messages = [
6363
- ...chatDataInfoRef.current[currentMode].conversations[1].messages.slice(0, -1),
6390
+ chatDataInfoRef.current[currentMode].conversations[activeConversationId].messages = [
6391
+ ...chatDataInfoRef.current[currentMode].conversations[activeConversationId].messages.slice(0, -1),
6364
6392
  ];
6365
6393
  botData.utilityObject.setInitValue(messageToStoreRef.current.initValue);
6366
6394
  botData.utilityObject.setSessionId(messageToStoreRef.current.sessionId);
@@ -6426,7 +6454,7 @@ const StreamedContent = ({ botData }) => {
6426
6454
  currentTabValue: "agent_response",
6427
6455
  questions: lodash.cloneDeep(questionsRef.current),
6428
6456
  questionsStepsMap: lodash.cloneDeep(questionsStepsMapRef.current),
6429
- });
6457
+ }, activeConversationId);
6430
6458
  // [
6431
6459
  // {
6432
6460
  // header: "Finding relevant information",
@@ -6476,13 +6504,15 @@ const StreamedContent = ({ botData }) => {
6476
6504
  // // enableLikes: true
6477
6505
  // },
6478
6506
  ];
6479
- chatDataInfoRef.current[currentMode].conversations[1].messages = [
6480
- ...chatDataInfoRef.current[currentMode].conversations[1].messages.slice(0, -1),
6481
- // {
6482
- // ...parsedResponse,
6483
- // // enableLikes: true
6484
- // },
6485
- ];
6507
+ if (chatDataInfoRef.current[currentMode]?.conversations?.[activeConversationId]) {
6508
+ chatDataInfoRef.current[currentMode].conversations[activeConversationId].messages = [
6509
+ ...chatDataInfoRef.current[currentMode].conversations?.[activeConversationId]?.messages?.slice(0, -1),
6510
+ // {
6511
+ // ...parsedResponse,
6512
+ // // enableLikes: true
6513
+ // },
6514
+ ];
6515
+ }
6486
6516
  let finalData = isArray(messageToStoreRef?.current?.appendedData)
6487
6517
  ? messageToStoreRef?.current?.appendedData
6488
6518
  : isEmpty(messageToStoreRef?.current?.appendedData)
@@ -6506,7 +6536,7 @@ const StreamedContent = ({ botData }) => {
6506
6536
  currentTabValue: "agent_response",
6507
6537
  questions: lodash.cloneDeep(questionsRef.current),
6508
6538
  questionsStepsMap: lodash.cloneDeep(questionsStepsMapRef.current),
6509
- });
6539
+ }, activeConversationId);
6510
6540
  }
6511
6541
  // Clean up module-level Map entry - stream is fully processed
6512
6542
  streamStateMap.delete(streamKey);
@@ -6515,7 +6545,7 @@ const StreamedContent = ({ botData }) => {
6515
6545
  setChatDataState({ ...chatDataRef.current });
6516
6546
  }, 1000);
6517
6547
  }
6518
- }, [isStreamingDone, thinkingTime]);
6548
+ }, [isStreamingDone, thinkingTime, activeConversationId]);
6519
6549
  React.useEffect(() => {
6520
6550
  if (currentMode === "agent") {
6521
6551
  if (sourceRef.current && isStreaming) {
@@ -8521,7 +8551,7 @@ const useMentionState = () => {
8521
8551
  };
8522
8552
 
8523
8553
  const ChatbotInput = (props) => {
8524
- const { newChatScreen, inputValue, setInputValue, isStopIcon, handleMicClick, handleRefresh, onSendIconClick, onStopIconClick, currentMode, filterOptions, } = props;
8554
+ const { newChatScreen, inputValue, setInputValue, isStopIcon, handleMicClick, handleRefresh, onSendIconClick, onStopIconClick, currentMode, filterOptions, onSaveClick, } = props;
8525
8555
  const editorRef = React.useRef(null);
8526
8556
  const selectRef = React.useRef(null);
8527
8557
  const dateRangePickerRef = React.useRef(null);
@@ -9831,7 +9861,9 @@ const ChatbotInput = (props) => {
9831
9861
  // disableType="disableOnlyPast"
9832
9862
  , {
9833
9863
  // disableType="disableOnlyPast"
9834
- startDate: dateRangeStartDate, endDate: dateRangeEndDate, focusedInput: dateRangeFocusedInput, onDatesChange: handleDateRangeChange, onFocusChange: setDateRangeFocusedInput }) })), jsxRuntime.jsxs("div", { className: `chat-actions ${isFixed ? "fixed" : ""}`, children: [handleRefresh && (jsxRuntime.jsx(impactUiV3.Button, { icon: jsxRuntime.jsx(SvgChatBotRefreshIcon, {}), iconPlacement: "left", size: "large", type: "default", variant: "url", onClick: handleRefresh })), handleMicClick && (jsxRuntime.jsx(impactUiV3.Button, { icon: jsxRuntime.jsx(SvgChatBotMicIcon, {}), iconPlacement: "left", size: "large", type: "default", variant: "tertiary", onClick: handleMicClick })), jsxRuntime.jsx(impactUiV3.Button, { icon: !isStopIcon ? jsxRuntime.jsx(SvgChatBotSendIcon, {}) : jsxRuntime.jsx(SvgChatbotStopIcon, {}), iconPlacement: "left", size: "large", type: "default", variant: "primary", onClick: !isStopIcon ? handleSendMessage : onStopIconClick, id: "chat-input-send-button", className: isStopIcon ? "stop-icon-button" : "" })] })] }) }));
9864
+ startDate: dateRangeStartDate, endDate: dateRangeEndDate, focusedInput: dateRangeFocusedInput, onDatesChange: handleDateRangeChange, onFocusChange: setDateRangeFocusedInput }) })), jsxRuntime.jsxs("div", { className: `chat-actions ${isFixed ? "fixed" : ""}`, children: [handleRefresh && (jsxRuntime.jsx(impactUiV3.Button, { icon: jsxRuntime.jsx(SvgChatBotRefreshIcon, {}), iconPlacement: "left", size: "large", type: "default", variant: "url", onClick: handleRefresh })), handleMicClick && (jsxRuntime.jsx(impactUiV3.Button, { icon: jsxRuntime.jsx(SvgChatBotMicIcon, {}), iconPlacement: "left", size: "large", type: "default", variant: "tertiary", onClick: handleMicClick })), onSaveClick && (jsxRuntime.jsx(impactUiV3.Tooltip, { title: "Save Chat", children: jsxRuntime.jsx(impactUiV3.Button, { icon: jsxRuntime.jsx(SaveOutlinedIcon, {}), iconPlacement: "left", size: "large", type: "default", variant: "tertiary", onClick: onSaveClick, id: "chat-input-save-button" }) })), jsxRuntime.jsx(impactUiV3.Button, { icon: !isStopIcon ? jsxRuntime.jsx(SvgChatBotSendIcon, {}) : jsxRuntime.jsx(SvgChatbotStopIcon, {}), iconPlacement: "left", size: "large", type: "default", variant: "primary", onClick: () => {
9865
+ !isStopIcon ? handleSendMessage() : onStopIconClick();
9866
+ }, id: "chat-input-send-button", className: isStopIcon ? "stop-icon-button" : "" })] })] }) }));
9835
9867
  };
9836
9868
 
9837
9869
  let chatbotFilterCustomConfig = {
@@ -9908,6 +9940,519 @@ let chatbotFilterCustomConfig = {
9908
9940
  sub_offset: null,
9909
9941
  download_rows: null,
9910
9942
  };
9943
+ let singleConversationNewData = [
9944
+ {
9945
+ userType: "user",
9946
+ chatType: "text",
9947
+ data: "List the products which are about to change status in next 10 days",
9948
+ },
9949
+ {
9950
+ userType: "bot",
9951
+ chatType: "thinking",
9952
+ data: "I will fetch all product status records with effective date ranges that begin or end within the next 10 days. This will provide the raw data needed to identify which products are about to change their active/inactive status soon. Downstream nodes will filter and compute which products have a status transition in the specified window, ensuring the user receives a list of products with upcoming status changes.I will fetch all product status records with effective date ranges that begin or end within the next 10 days. This will provide the raw data needed to identify which products are about to change their active/inactive status soon. Downstream nodes will filter and compute which products have a status transition in the specified window, ensuring the user receives a list of products with upcoming status changes.",
9953
+ },
9954
+ {
9955
+ userType: "bot",
9956
+ chatType: "steps",
9957
+ data: [
9958
+ {
9959
+ header: "Assessing user query",
9960
+ step_status: "completed",
9961
+ sub_header: "Query is within scope and determined as New query",
9962
+ current_intent: "List the products which are about to change status in next 10 days"
9963
+ },
9964
+ {
9965
+ header: "Creating Plan of Action",
9966
+ step_status: "completed",
9967
+ sub_header: "Alan is working to determine the best approach to answer user query",
9968
+ current_intent: "List the products which are about to change status in next 10 days"
9969
+ },
9970
+ {
9971
+ header: "Executing Step",
9972
+ step_status: "completed",
9973
+ sub_header: "Executing Step 1/1",
9974
+ current_intent: "List the products which are about to change status in next 10 days"
9975
+ },
9976
+ ]
9977
+ },
9978
+ {
9979
+ userType: "bot",
9980
+ chatType: "agent",
9981
+ data: [
9982
+ { "type": "select", "data": { "header": "Select", "inputPosition": "inline", "labelOrientation": "top", "label": "L0 Name", "param_name": "l0_name", "options": [{ "label": "Coach", "value": "Coach" }, { "label": "KateSpade", "value": "KateSpade" }], "isRequired": true, "isDisabled": false, "isMulti": true } }, { "type": "select", "data": { "header": "Select", "inputPosition": "inline", "labelOrientation": "top", "label": "L1 Name", "param_name": "l1_name", "options": [{ "label": "Outlet-Store", "value": "Outlet-Store" }, { "label": "Retail-Store", "value": "Retail-Store" }], "isRequired": true, "isDisabled": false, "isMulti": true } }, { "type": "table", "data": { "display_name": "Results", "unique_id": "", "row_data": [{ "Style Color ID": "CDM80 B4__ia_char_03M2-Retail-Store", "Style Description": "DSNY GLOV SWINGER", "stockout_store_count": 346, "max_dc_oh_it_oo": 284.0, "lw_sales_units": 6 }, { "Style Color ID": "CDN03 B4PF7-Retail-Store", "Style Description": "DSNY GLOV SWINGER", "stockout_store_count": 346, "max_dc_oh_it_oo": 274.0, "lw_sales_units": 5 }, { "Style Color ID": "CT255 IMWQJ-Retail-Store", "Style Description": "LTH STP JAMIE CMR", "stockout_store_count": 346, "max_dc_oh_it_oo": 13.0, "lw_sales_units": 2 }, { "Style Color ID": "CZ186 IMY4C-Retail-Store", "Style Description": "SIG JAMIE CMR", "stockout_store_count": 346, "max_dc_oh_it_oo": 6.0, "lw_sales_units": 1 }, { "Style Color ID": "CCZ17 IMA47-Retail-Store", "Style Description": "CHRRY PT RWN BKT", "stockout_store_count": 346, "max_dc_oh_it_oo": 4.0, "lw_sales_units": 1 }], "table_config": [{ "column_header": "Style Color Id", "field": "Style Color ID", "is_searchable": true, "type": "str" }, { "column_header": "Style Description", "field": "Style Description", "is_searchable": true }, { "column_header": "Stockout Store Count", "field": "stockout_store_count", "is_searchable": true }, { "column_header": "Max Dc Oh It Oo", "field": "max_dc_oh_it_oo", "is_searchable": true }, { "column_header": "Lw Sales Units", "field": "lw_sales_units", "is_searchable": true }] } }
9983
+ ]
9984
+ }
9985
+ ];
9986
+
9987
+ const fetchConversations = async (currentMode) => {
9988
+ try {
9989
+ // Will be replaced with actual API call
9990
+ return axiosInstance({
9991
+ url: `core/chatbot/conversation/${currentMode}`,
9992
+ method: "GET"
9993
+ });
9994
+ // return {
9995
+ // status: true,
9996
+ // data: {
9997
+ // data: [
9998
+ // {
9999
+ // conversation_id: 10,
10000
+ // module_name: moduleType.toUpperCase(),
10001
+ // flow_type: moduleType.toUpperCase(),
10002
+ // name: "test chatbot's name",
10003
+ // created_at: new Date().toISOString(),
10004
+ // updated_at: new Date().toISOString(),
10005
+ // }
10006
+ // ]
10007
+ // }
10008
+ // };
10009
+ }
10010
+ catch (error) {
10011
+ console.error("fetchConversations error", error);
10012
+ return null;
10013
+ }
10014
+ };
10015
+ const createConversation = async (payload) => {
10016
+ try {
10017
+ return axiosInstance({
10018
+ url: `core/chatbot/conversation`,
10019
+ method: "POST",
10020
+ data: payload
10021
+ });
10022
+ }
10023
+ catch (error) {
10024
+ console.error("createConversation error", error);
10025
+ return null;
10026
+ }
10027
+ };
10028
+ const updateConversation = async (conversationId, payload) => {
10029
+ try {
10030
+ return axiosInstance({
10031
+ url: `core/chatbot/conversation/update`,
10032
+ method: "POST",
10033
+ data: payload
10034
+ });
10035
+ }
10036
+ catch (error) {
10037
+ console.error("updateConversation error", error);
10038
+ return null;
10039
+ }
10040
+ };
10041
+ const deleteConversation = async (conversationId) => {
10042
+ try {
10043
+ return axiosInstance({
10044
+ url: `core/chatbot/conversation/${conversationId}`,
10045
+ method: "DELETE"
10046
+ });
10047
+ }
10048
+ catch (error) {
10049
+ console.error("deleteConversation error", error);
10050
+ return null;
10051
+ }
10052
+ };
10053
+ const saveChat = async (payload) => {
10054
+ try {
10055
+ return axiosInstance({
10056
+ url: `core/chatbot/conversation`,
10057
+ method: "POST",
10058
+ data: payload
10059
+ });
10060
+ }
10061
+ catch (error) {
10062
+ console.error("saveChat error", error);
10063
+ return null;
10064
+ }
10065
+ };
10066
+
10067
+ const useConversationManagement = (chatDataRef, currentMode, activeConversationId, setActiveConversationId, setChatDataState, selectedModule, setSelectedModule, isModuleChanged, setIsModuleChanged, setActiveChatId = () => { }, saveCurrentChanges = () => { }, chatDataInfoRef = null, setHistoryPanelData = (_data) => { }, processResponse = null) => {
10068
+ const [loading, setLoading] = React.useState(false);
10069
+ const [error, setError] = React.useState(null);
10070
+ const fetchConversations$1 = React.useCallback(async (activeChatId = null, mode = null) => {
10071
+ try {
10072
+ setLoading(true);
10073
+ const effectiveMode = mode || currentMode;
10074
+ const response = await fetchConversations(effectiveMode);
10075
+ // const response = {
10076
+ // status: true,
10077
+ // data: {
10078
+ // data: [
10079
+ // {
10080
+ // conversation_id: 1,
10081
+ // name: "Getting Started Guide",
10082
+ // created_at: new Date().toISOString(),
10083
+ // updated_at: new Date().toISOString(),
10084
+ // },
10085
+ // {
10086
+ // conversation_id: 2,
10087
+ // name: "Product Features Discussion",
10088
+ // created_at: new Date(Date.now() - 86400000).toISOString(), // 1 day ago
10089
+ // updated_at: new Date(Date.now() - 86400000).toISOString(),
10090
+ // },
10091
+ // {
10092
+ // conversation_id: 3,
10093
+ // name: "Troubleshooting Help",
10094
+ // created_at: new Date(Date.now() - 172800000).toISOString(), // 2 days ago
10095
+ // updated_at: new Date(Date.now() - 172800000).toISOString(),
10096
+ // },
10097
+ // {
10098
+ // conversation_id: 4,
10099
+ // name: "Project Discussion",
10100
+ // created_at: new Date(Date.now() - 948220200000).toISOString(), // 2 days ago
10101
+ // updated_at: new Date(Date.now() - 948220200000).toISOString(),
10102
+ // },
10103
+ // ],
10104
+ // },
10105
+ // };
10106
+ if (response?.data?.status) {
10107
+ const conversationsList = response.data.data.data;
10108
+ chatDataRef.current[effectiveMode].conversationsList = conversationsList;
10109
+ // Process conversations from each time group
10110
+ conversationsList.forEach(group => {
10111
+ group.conversation_list.forEach(conversation => {
10112
+ // chatDataRef.current[currentMode].conversations[conversation.conversation_id] = {
10113
+ // id: conversation.conversation_id,
10114
+ // name: conversation.name,
10115
+ // idGenerated: true,
10116
+ // timestamp: conversation.created_at || new Date().toISOString(),
10117
+ // messages: []
10118
+ // };
10119
+ if (chatDataInfoRef?.current[effectiveMode]?.conversations?.[conversation.conversation_id]?.messages) {
10120
+ chatDataInfoRef.current[effectiveMode].conversations[conversation.conversation_id] = {
10121
+ id: conversation.conversation_id,
10122
+ name: conversation.name,
10123
+ idGenerated: true,
10124
+ timestamp: conversation.created_at || new Date().toISOString(),
10125
+ messages: chatDataInfoRef.current[effectiveMode].conversations[conversation.conversation_id].messages
10126
+ };
10127
+ }
10128
+ });
10129
+ });
10130
+ setHistoryPanelData(conversationsList);
10131
+ setChatDataState({ ...chatDataRef.current });
10132
+ if (activeChatId) {
10133
+ setActiveChatId(activeChatId);
10134
+ }
10135
+ // Set first conversation as active if none selected
10136
+ // if (!activeConversationId && Object.keys(conversations).length > 0) {
10137
+ // setActiveConversationId(Object.keys(conversations)[0]);
10138
+ // }
10139
+ }
10140
+ }
10141
+ catch (err) {
10142
+ setError(err.message);
10143
+ }
10144
+ finally {
10145
+ setLoading(false);
10146
+ }
10147
+ }, [currentMode]);
10148
+ const fetchConversationChats = React.useCallback(async (conversationId, mode = null) => {
10149
+ const effectiveMode = mode || currentMode;
10150
+ try {
10151
+ setLoading(true);
10152
+ // --- Use hardcoded test data for now ---
10153
+ const savedData = singleConversationNewData;
10154
+ // Generate a conversation ID for the saved chat
10155
+ const savedConvId = conversationId || generateConversationId();
10156
+ // Ensure a conversation slot exists in chatDataInfoRef
10157
+ if (chatDataInfoRef) {
10158
+ if (!chatDataInfoRef.current[effectiveMode]?.conversations) {
10159
+ chatDataInfoRef.current[effectiveMode] = { conversations: {} };
10160
+ }
10161
+ chatDataInfoRef.current[effectiveMode].conversations[savedConvId] =
10162
+ generateConversationObject(savedConvId);
10163
+ }
10164
+ setActiveConversationId(savedConvId);
10165
+ // Build combined bot entries from the saved data
10166
+ // Collect thinking, steps, and agent response into a single combined message
10167
+ let thinkingResponse = {};
10168
+ let steps = [];
10169
+ const agentDataItems = [];
10170
+ let userMessage = null;
10171
+ savedData.forEach((item) => {
10172
+ if (item.userType === "user") {
10173
+ userMessage = {
10174
+ timeStamp: moment().format("DD-MM-YYYY HH:mm:ss"),
10175
+ userType: "user",
10176
+ bodyText: item.data,
10177
+ bodyType: "text",
10178
+ };
10179
+ }
10180
+ else if (item.chatType === "thinking") {
10181
+ thinkingResponse = {
10182
+ thinkingStream: item.data,
10183
+ thinkingContent: item.data,
10184
+ thinkingTime: 1,
10185
+ thinkingHeading: "Thinking Completed",
10186
+ };
10187
+ }
10188
+ else if (item.chatType === "steps") {
10189
+ steps = item.data;
10190
+ }
10191
+ else if (item.chatType === "agent") {
10192
+ // Agent response items (widgets, selects, etc.)
10193
+ if (Array.isArray(item.data)) {
10194
+ agentDataItems.push(...item.data);
10195
+ }
10196
+ else {
10197
+ agentDataItems.push(item.data);
10198
+ }
10199
+ }
10200
+ });
10201
+ // Add user message to conversation
10202
+ if (userMessage && chatDataInfoRef) {
10203
+ chatDataInfoRef.current[effectiveMode].conversations[savedConvId].messages.push(userMessage);
10204
+ chatDataRef.current[effectiveMode] = [
10205
+ ...(chatDataRef.current[effectiveMode] || []),
10206
+ userMessage,
10207
+ ];
10208
+ }
10209
+ // Build the response in the shape processResponse expects:
10210
+ // response.data.data.data = array of items
10211
+ const textItem = {
10212
+ type: "text",
10213
+ response: "",
10214
+ response_heading: "",
10215
+ thinkingResponse,
10216
+ };
10217
+ const responseData = [textItem, ...agentDataItems];
10218
+ const fakeResponse = {
10219
+ data: {
10220
+ data: {
10221
+ data: responseData,
10222
+ session_id: "",
10223
+ },
10224
+ },
10225
+ };
10226
+ // Call processResponse with steps/tabs context
10227
+ if (processResponse) {
10228
+ await processResponse(fakeResponse, {}, effectiveMode, null, {
10229
+ isTabEnabled: true,
10230
+ steps,
10231
+ currentTabValue: "agent_response",
10232
+ questions: [],
10233
+ questionsStepsMap: {},
10234
+ }, savedConvId);
10235
+ }
10236
+ setChatDataState({ ...chatDataRef.current });
10237
+ }
10238
+ catch (err) {
10239
+ setError(err.message);
10240
+ console.error("fetchConversationChats error:", err);
10241
+ }
10242
+ finally {
10243
+ setLoading(false);
10244
+ }
10245
+ }, [currentMode, processResponse]);
10246
+ const createNewConversation = React.useCallback(async (name) => {
10247
+ try {
10248
+ setLoading(true);
10249
+ const payload = {
10250
+ module_name: currentMode.toUpperCase(),
10251
+ flow_type: currentMode,
10252
+ name: name,
10253
+ application_code: 1,
10254
+ user_id: 251, // This should come from your auth context
10255
+ };
10256
+ const response = await createConversation(payload);
10257
+ if (response.status) {
10258
+ await fetchConversations$1();
10259
+ }
10260
+ }
10261
+ catch (err) {
10262
+ setError(err.message);
10263
+ }
10264
+ finally {
10265
+ setLoading(false);
10266
+ }
10267
+ }, [currentMode]);
10268
+ const renameConversation = React.useCallback(async (conversationId, newName, mode = null) => {
10269
+ const effectiveMode = mode || currentMode;
10270
+ try {
10271
+ setLoading(true);
10272
+ const payload = {
10273
+ conversation_id: conversationId,
10274
+ name: newName
10275
+ };
10276
+ const response = await updateConversation(conversationId, payload);
10277
+ // const response = {
10278
+ // status: true,
10279
+ // message: "Conversation updated successfully"
10280
+ // };
10281
+ if (response?.data?.status) {
10282
+ // chatDataRef.current[currentMode].conversations[conversationId].name = newName;
10283
+ if (chatDataInfoRef) {
10284
+ chatDataInfoRef.current[effectiveMode].conversations[conversationId].name = newName;
10285
+ }
10286
+ setChatDataState({ ...chatDataRef.current });
10287
+ return true;
10288
+ }
10289
+ setLoading(false);
10290
+ }
10291
+ catch (err) {
10292
+ setError(err.message);
10293
+ console.error("renameConversation error:", err);
10294
+ setLoading(false);
10295
+ }
10296
+ finally {
10297
+ setLoading(false);
10298
+ }
10299
+ }, [currentMode]);
10300
+ const deleteConversation$1 = React.useCallback(async (conversationId, mode = null) => {
10301
+ const effectiveMode = mode || currentMode;
10302
+ try {
10303
+ setLoading(true);
10304
+ const response = await deleteConversation(conversationId);
10305
+ // const response = {
10306
+ // status: true,
10307
+ // message: "Conversation deleted successfully"
10308
+ // };
10309
+ if (response?.data?.status) {
10310
+ // delete chatDataRef.current[currentMode].conversations[conversationId];
10311
+ if (chatDataInfoRef) {
10312
+ delete chatDataInfoRef.current[effectiveMode].conversations[conversationId];
10313
+ }
10314
+ setChatDataState({ ...chatDataRef.current });
10315
+ // If deleted conversation was active, select another one
10316
+ if (activeConversationId === conversationId) {
10317
+ const remainingConversations = Object.keys(chatDataRef.current[effectiveMode].conversations);
10318
+ setActiveConversationId(remainingConversations[0] || null);
10319
+ }
10320
+ return true;
10321
+ }
10322
+ }
10323
+ catch (err) {
10324
+ setError(err.message);
10325
+ }
10326
+ finally {
10327
+ setLoading(false);
10328
+ }
10329
+ }, [currentMode, activeConversationId]);
10330
+ const saveCurrentChat = React.useCallback(async () => {
10331
+ try {
10332
+ setLoading(true);
10333
+ let userId = await getCurrentUserId();
10334
+ let isNewConversation = false;
10335
+ let newConversationName = "New Conversation";
10336
+ const dataRef = chatDataInfoRef || chatDataRef;
10337
+ // If no active conversation is selected, create a new one
10338
+ if (!activeConversationId) {
10339
+ isNewConversation = true;
10340
+ const conversationCount = Object.keys(dataRef.current[currentMode].conversations).length;
10341
+ const newConversationId = Date.now(); // Using timestamp as unique ID
10342
+ newConversationName = `Conversation ${conversationCount + 1}`;
10343
+ // Create new conversation object
10344
+ dataRef.current[currentMode].conversations[newConversationId] = {
10345
+ id: newConversationId,
10346
+ name: newConversationName,
10347
+ timestamp: new Date().toISOString(),
10348
+ messages: dataRef.current[currentMode].conversations[activeConversationId]?.messages || []
10349
+ };
10350
+ // Update active conversation
10351
+ setActiveConversationId(newConversationId);
10352
+ setChatDataState({ ...chatDataRef.current });
10353
+ }
10354
+ const currentChat = dataRef.current[currentMode].conversations[activeConversationId];
10355
+ let currentSelectedModuleData = JSON.parse(localStorage.getItem("currentSelectedModuleData"));
10356
+ let currentSelectedModuleForInsights = localStorage.getItem("smartBotScreenName");
10357
+ // if (currentMode === "insights") {
10358
+ // currentSelectedModuleData = JSON.parse(
10359
+ // localStorage.getItem("smartBotScreenName")
10360
+ // );
10361
+ // }
10362
+ const payload = {
10363
+ conversation_id: currentChat?.idGenerated ? currentChat.id : null,
10364
+ module_name: currentMode === "insights" ? currentSelectedModuleForInsights : currentSelectedModuleData ? currentSelectedModuleData[activeConversationId] : "",
10365
+ flow_type: currentMode,
10366
+ name: isNewConversation ? newConversationName : currentChat.name,
10367
+ is_module_changed: isModuleChanged,
10368
+ chats: currentChat.messages.map(msg => ({
10369
+ chat_id: null, // null for new chat messages
10370
+ chat_object: {
10371
+ bodyText: msg.bodyText,
10372
+ bodyType: msg.bodyType === "stream" ? "text" : (msg.bodyType || 'text'),
10373
+ userName: msg.userName,
10374
+ userType: msg.userType,
10375
+ timeStamp: msg.timeStamp,
10376
+ headerTitle: msg.headerTitle,
10377
+ thinkingResponse: msg.thinkingResponse ? {
10378
+ thinkingStream: msg.thinkingResponse.thinkingStream,
10379
+ thinkingTime: msg.thinkingResponse.thinkingTime,
10380
+ thinkingHeading: msg.thinkingResponse.thinkingHeading,
10381
+ } : undefined,
10382
+ }
10383
+ }))
10384
+ };
10385
+ setIsModuleChanged(false);
10386
+ const response = await saveChat(payload);
10387
+ let newConversationId = null;
10388
+ if (response && response?.data?.status) {
10389
+ // Extract the new conversation data from the response
10390
+ const newConversationData = response?.data?.data?.data[0];
10391
+ if (newConversationData) {
10392
+ // Get the new conversation ID
10393
+ newConversationId = newConversationData.conversation_id;
10394
+ // Preserve the existing rich in-memory messages (they contain
10395
+ // thinkingResponse, combined bodyText arrays, JSX, etc. that
10396
+ // the server response does not return). Only update metadata.
10397
+ const existingMessages = currentChat.messages;
10398
+ // Map server-assigned chat_ids back onto existing messages
10399
+ if (newConversationData.chats) {
10400
+ newConversationData.chats.forEach((chat, index) => {
10401
+ if (existingMessages[index]) {
10402
+ existingMessages[index].id = chat.chat_id;
10403
+ }
10404
+ });
10405
+ }
10406
+ // Update conversation with server metadata but keep existing messages
10407
+ dataRef.current[currentMode].conversations[newConversationId] = {
10408
+ id: newConversationId,
10409
+ name: newConversationData.name,
10410
+ idGenerated: true,
10411
+ timestamp: newConversationData.created_at,
10412
+ messages: existingMessages,
10413
+ };
10414
+ // Keep chatDataRef in sync as well. Many parts of the UI re-render
10415
+ // based on setChatDataState({...chatDataRef.current}). If we only
10416
+ // update chatDataInfoRef, the UI can temporarily see an empty chat
10417
+ // and clear the conversation.
10418
+ if (chatDataInfoRef) {
10419
+ chatDataInfoRef.current[currentMode].conversations[newConversationId] = {
10420
+ id: newConversationId,
10421
+ name: newConversationData.name,
10422
+ idGenerated: true,
10423
+ timestamp: newConversationData.created_at,
10424
+ messages: existingMessages,
10425
+ };
10426
+ }
10427
+ // Update active conversation ID to the server-provided one
10428
+ setActiveConversationId(newConversationId);
10429
+ // Update the chat data state
10430
+ setChatDataState({ ...chatDataInfoRef.current });
10431
+ // Refresh the conversation list to show the new conversation
10432
+ await fetchConversations$1(newConversationId, "agent");
10433
+ }
10434
+ }
10435
+ }
10436
+ catch (err) {
10437
+ setError(err.message);
10438
+ console.error("saveCurrentChat error:", err);
10439
+ return false;
10440
+ }
10441
+ finally {
10442
+ setLoading(false);
10443
+ }
10444
+ }, [currentMode, activeConversationId, isModuleChanged]);
10445
+ return {
10446
+ loading,
10447
+ error,
10448
+ fetchConversations: fetchConversations$1,
10449
+ fetchConversationChats,
10450
+ createNewConversation,
10451
+ renameConversation,
10452
+ deleteConversation: deleteConversation$1,
10453
+ saveCurrentChat
10454
+ };
10455
+ };
9911
10456
 
9912
10457
  const SmartBot = (props) => {
9913
10458
  const { userName, partialClose, setPartialClose, forceOpen, customBaseUrl = "", displayQuestions, questions = [] } = props;
@@ -9919,6 +10464,9 @@ const SmartBot = (props) => {
9919
10464
  React.useState(false);
9920
10465
  const [conversation, setConversation] = React.useState({});
9921
10466
  const { chatbotContext, currentAgentChatId } = reactRedux.useSelector((state) => state.smartBotReducer);
10467
+ // Per-mode conversation ID tracking — prevents cross-mode contamination when
10468
+ // switching tabs while streams are pending.
10469
+ React.useRef({});
9922
10470
  const activeTab = React.useRef({
9923
10471
  activeTab: "dashboard",
9924
10472
  });
@@ -9935,12 +10483,14 @@ const SmartBot = (props) => {
9935
10483
  const [isLandingScreen, setIsLandingScreen] = React.useState(true);
9936
10484
  const [showSuggestionBanner, setShowSuggestionBanner] = React.useState(true);
9937
10485
  const [filterOptions, setFilterOptions] = React.useState([]);
9938
- const { setUserFlow, setUserScreenAndFlow, fetchUserResultsFromQuery, getCurrentDateTimeString, setLink, } = useChatFlow(chatDataRef, setLoader, setFlowType, setScreenName, setUserInput, setQuestionIndex, setCurrentAppLink, flowType, screenName, questionIndex, userInput, dateFormat, currentMode, activeConversationId, setIsModuleChanged, chatBodyRef, filterReducerState, dispatch, navigate, setShowChatPlaceholder, baseUrl, setChatDataState, setCurrentSessionId, customChatConfig, chatDataInfoRef, chatbotContext, setInitValue, setSessionId, thinkingContent, setThinkingContent, isThinking, setIsThinking, chatId, setChatId, isStop, setIsStop, functionsRef, functionsState, setFunctionsState, thinkingHeaderMessage, setThinkingHeaderMessage, uniqueChatId, initValue, sessionId, fieldNumber, setFieldNumber, additionalArgs);
10486
+ React.useRef(0);
10487
+ const { setUserFlow, setUserScreenAndFlow, fetchUserResultsFromQuery, getCurrentDateTimeString, setLink, } = useChatFlow(chatDataRef, setLoader, setFlowType, setScreenName, setUserInput, setQuestionIndex, setCurrentAppLink, flowType, screenName, questionIndex, userInput, dateFormat, currentMode, activeConversationId, setIsModuleChanged, chatBodyRef, filterReducerState, dispatch, navigate, setShowChatPlaceholder, baseUrl, setChatDataState, setCurrentSessionId, customChatConfig, chatDataInfoRef, chatbotContext, setInitValue, setSessionId, thinkingContent, setThinkingContent, isThinking, setIsThinking, chatId, setChatId, isStop, setIsStop, functionsRef, functionsState, setFunctionsState, thinkingHeaderMessage, setThinkingHeaderMessage, uniqueChatId, initValue, sessionId, fieldNumber, setFieldNumber, additionalArgs, setActiveConversationId);
9939
10488
  const { parseSavedFlow, saveCurrentChanges, endCurrentSession, clearChatSession, initiateNewChat, hasUnsavedChanges, } = useChatSession(chatDataRef, setFlowType, setScreenName, setUserInput, setTemplateData, chatDataScreenLinkRef, setShowModal, setMinimizedMode, setSelectedModule, setChatDataState, currentMode, setUserFlow, getCurrentDateTimeString, setCurrentAppLink, selectedModule, fetchUserResultsFromQuery, props.closeBot, activeConversationId, setActiveConversationId, setShowChatPlaceholder);
9940
10489
  const { refreshAndUpdateUserManual, configureBotActions, displaySnackMessages, } = useBotConfiguration(setRefreshLoader, setEnableRefreshAction, dispatch);
9941
- const { prepareDataAndSendToAgent } = useAgentFlow(dateFormat, chatDataRef, currentMode, setShowChatPlaceholder, setLoader, baseUrl, setCurrentSessionId, customChatConfig, chatDataInfoRef, {
10490
+ const { prepareDataAndSendToAgent, processResponse } = useAgentFlow(dateFormat, chatDataRef, currentMode, setShowChatPlaceholder, setLoader, baseUrl, setCurrentSessionId, customChatConfig, chatDataInfoRef, {
9942
10491
  setChatDataState,
9943
10492
  activeConversationId,
10493
+ setActiveConversationId,
9944
10494
  chatBodyRef,
9945
10495
  runStreaming: true,
9946
10496
  chatbotContext,
@@ -10062,7 +10612,7 @@ const SmartBot = (props) => {
10062
10612
  [isLike ? "like" : "dislike"]: key,
10063
10613
  });
10064
10614
  handleMessageLike(key, isLike, setLoadingState, displaySnackMessages, templateData, activeConversationId, answer, chatDataInfoRef.current, chatIndex, setChatDataState, baseUrl, sessionId);
10065
- }, 5000, { trailing: false }), [loadingState, templateData, displaySnackMessages, sessionId, baseUrl]);
10615
+ }, 5000, { trailing: false }), [loadingState, templateData, displaySnackMessages, activeConversationId, sessionId, baseUrl]);
10066
10616
  React.useEffect(() => {
10067
10617
  handleUploadAccess();
10068
10618
  }, []);
@@ -10184,17 +10734,17 @@ const SmartBot = (props) => {
10184
10734
  }, [notificationData, baseUrl, currentAgentId, currentSessionId]);
10185
10735
  React.useEffect(() => {
10186
10736
  // Continue with current mode specific logic
10187
- if (chatDataInfoRef?.current[currentMode]?.conversations?.[1]?.messages
10737
+ if (chatDataInfoRef?.current[currentMode]?.conversations?.[activeConversationId]?.messages
10188
10738
  ?.length > 0) {
10189
10739
  // setConversation(chatDataInfoRef?.current[currentMode]?.conversations?.[1]?.messages);
10190
- let chatDataInfoRefLength = chatDataInfoRef?.current[currentMode]?.conversations?.[1]?.messages
10740
+ let chatDataInfoRefLength = chatDataInfoRef?.current[currentMode]?.conversations?.[activeConversationId]?.messages
10191
10741
  ?.length;
10192
- let chatDataInfoRefLastMessage = chatDataInfoRef?.current[currentMode]?.conversations?.[1]?.messages[chatDataInfoRefLength - 1];
10742
+ let chatDataInfoRefLastMessage = chatDataInfoRef?.current[currentMode]?.conversations?.[activeConversationId]?.messages[chatDataInfoRefLength - 1];
10193
10743
  if (chatDataInfoRefLastMessage?.bodyType === "stream") {
10194
- let newChatData = chatDataState?.[currentMode]?.conversations?.[null]?.messages;
10744
+ let newChatData = chatDataState?.[currentMode]?.conversations?.[activeConversationId]?.messages;
10195
10745
  let newChatDataLength = newChatData?.length - 1;
10196
10746
  if (newChatDataLength) {
10197
- chatDataInfoRef.current[currentMode].conversations[1].messages[chatDataInfoRefLength - 1] = lodash.cloneDeep(newChatData?.[newChatDataLength]);
10747
+ chatDataInfoRef.current[currentMode].conversations[activeConversationId].messages[chatDataInfoRefLength - 1] = lodash.cloneDeep(newChatData?.[newChatDataLength]);
10198
10748
  }
10199
10749
  }
10200
10750
  // let chatDataForReference = JSON.stringify(
@@ -10217,7 +10767,7 @@ const SmartBot = (props) => {
10217
10767
  customChatConfig: customChatConfig,
10218
10768
  loader: loader,
10219
10769
  };
10220
- const allMessages = chatDataInfoRef?.current[currentMode]?.conversations?.[1]?.messages || [];
10770
+ const allMessages = chatDataInfoRef?.current[currentMode]?.conversations?.[activeConversationId]?.messages || [];
10221
10771
  const lastBotMessageIndex = allMessages.reduce((lastIdx, msg, idx) => msg.userType === "bot" ? idx : lastIdx, -1);
10222
10772
  allMessages.forEach((message, index) => {
10223
10773
  if (message.userType === "bot") {
@@ -10230,8 +10780,20 @@ const SmartBot = (props) => {
10230
10780
  // />
10231
10781
  // ;
10232
10782
  message.isFormDisabled = index !== lastBotMessageIndex;
10233
- message.jsx = (jsxRuntime.jsx(BotMessage, { botData: message, state: loadingState, handleLikeDislike: handleLikeDislike, props: properties }));
10783
+ let originalUtilityObject = message.utilityObject;
10784
+ let newMessage = lodash.cloneDeep(message);
10785
+ if (originalUtilityObject) {
10786
+ newMessage.utilityObject = originalUtilityObject;
10787
+ }
10788
+ message.jsx = (jsxRuntime.jsx(BotMessage, { botData: newMessage, state: loadingState, handleLikeDislike: handleLikeDislike, props: properties }));
10234
10789
  message.firstMessage = true;
10790
+ let actualProps = {
10791
+ botData: newMessage,
10792
+ state: loadingState,
10793
+ handleLikeDislike: handleLikeDislike,
10794
+ props: properties,
10795
+ };
10796
+ message.actualProps = actualProps;
10235
10797
  // message.enableLikes = true;
10236
10798
  }
10237
10799
  });
@@ -10239,7 +10801,15 @@ const SmartBot = (props) => {
10239
10801
  let newChat = lodash.cloneDeep(chatDataInfoRef?.current[currentMode]);
10240
10802
  setConversation(newChat);
10241
10803
  }
10242
- }, [chatDataState, currentMode]);
10804
+ else if (showModal) {
10805
+ // Current mode has no messages — clear conversation so the previous
10806
+ // mode's components (including any active StreamedContent) unmount.
10807
+ // Without this, switching from agent→navigation while agent is streaming
10808
+ // would keep the agent's StreamedContent mounted and its response would
10809
+ // render in the navigation tab.
10810
+ setConversation({});
10811
+ }
10812
+ }, [chatDataState, currentMode, activeConversationId]);
10243
10813
  const fetchLegacyAgentInfo = async () => {
10244
10814
  try {
10245
10815
  let legacyAgentScreenData = await utils.fetchLegacyAgentScreen();
@@ -10268,7 +10838,7 @@ const SmartBot = (props) => {
10268
10838
  return;
10269
10839
  }
10270
10840
  if (currentMode !== "agent") {
10271
- fetchUserResultsFromQuery({}, false, userInput);
10841
+ fetchUserResultsFromQuery({}, false, userInput, activeConversationId);
10272
10842
  }
10273
10843
  else if (customChatConfig?.useMiddleware) {
10274
10844
  let middleWareFunction = await getDynamicFunction(customChatConfig.middleWareFunctionPath, customChatConfig.middleWareFunctionName);
@@ -10278,8 +10848,6 @@ const SmartBot = (props) => {
10278
10848
  sessionId: currentSessionId,
10279
10849
  baseUrl: baseUrl,
10280
10850
  uniqueChatId: uniqueChatId,
10281
- userExplicitInput: userExplicitInput,
10282
- textWithColumnNames: textWithColumnNames,
10283
10851
  };
10284
10852
  let middleWareResponse = await middleWareFunction(data, chatBotInfoRef);
10285
10853
  if (middleWareResponse) {
@@ -10334,7 +10902,8 @@ const SmartBot = (props) => {
10334
10902
  setInitValue: setInitValue,
10335
10903
  uniqueChatId: uniqueChatId,
10336
10904
  currentAgentChatId: currentAgentChatId,
10337
- additionalArgs: lodash.isEmpty(userInput) ? additionalArgs : {}
10905
+ additionalArgs: lodash.isEmpty(userInput) ? additionalArgs : {},
10906
+ activeConversationId: activeConversationId,
10338
10907
  });
10339
10908
  setUserInput("");
10340
10909
  }
@@ -10481,13 +11050,38 @@ const SmartBot = (props) => {
10481
11050
  setBaseUrl(customBaseUrl);
10482
11051
  }
10483
11052
  }, [forceOpen]);
10484
- return (jsxRuntime.jsxs("div", { className: `${classes.agentStyleOverride} ${partialClose ? classes.hideBotStyle : ""}`, children: [jsxRuntime.jsx(MemoryModal, { isModalOpen: isModalOpen, setIsModalOpen: setIsModalOpen, displaySnackMessages: displaySnackMessages }), jsxRuntime.jsx(UploadModal, { isUploadModalOpen: isUploadModalOpen, setIsUploadModalOpen: setIsUploadModalOpen, displaySnackMessages: displaySnackMessages }), jsxRuntime.jsx(impactUiV3.ChatBotComponent, { isFullWidth: forceOpen, userName: userName, showHistoryPanel: false, customInputComponent: currentMode === "agent" ? (jsxRuntime.jsx(ChatbotInput, { newChatScreen: newChatScreen, inputValue: userInput, setInputValue: setUserInput, isStopIcon: isStop, onSendIconClick: onSendIconClick, onStopIconClick: onStopIconClick, currentMode: currentMode, filterOptions: filterOptions })) : null, isChatBotOpen: showModal || forceOpen,
11053
+ const [historyPanelData, setHistoryPanelData] = React.useState([]);
11054
+ const { fetchConversations, saveCurrentChat, renameConversation, deleteConversation, fetchConversationChats, } = useConversationManagement(chatDataRef, currentMode, activeConversationId, setActiveConversationId, setChatDataState, selectedModule, setSelectedModule, isModuleChanged, setIsModuleChanged, undefined, undefined, chatDataInfoRef, setHistoryPanelData, processResponse);
11055
+ const handleHistoryMenuAction = React.useCallback(async (action, conversationData, renamedConversation = "") => {
11056
+ const conversationId = conversationData?.conversation_id;
11057
+ if (action === "rename") {
11058
+ await renameConversation(conversationId, renamedConversation, "agent");
11059
+ }
11060
+ else if (action === "delete") {
11061
+ await deleteConversation(conversationId, "agent");
11062
+ }
11063
+ fetchConversations(null, "agent");
11064
+ }, [renameConversation, deleteConversation, fetchConversations]);
11065
+ return (jsxRuntime.jsxs("div", { className: `${classes.agentStyleOverride} ${partialClose ? classes.hideBotStyle : ""} `, children: [jsxRuntime.jsx(MemoryModal, { isModalOpen: isModalOpen, setIsModalOpen: setIsModalOpen, displaySnackMessages: displaySnackMessages }), jsxRuntime.jsx(UploadModal, { isUploadModalOpen: isUploadModalOpen, setIsUploadModalOpen: setIsUploadModalOpen, displaySnackMessages: displaySnackMessages }), jsxRuntime.jsx(impactUiV3.ChatBotComponent, { isFullWidth: forceOpen, userName: userName, showHistoryPanel: false, customInputComponent: currentMode === "agent" ? (jsxRuntime.jsx(ChatbotInput, { newChatScreen: newChatScreen, inputValue: userInput, setInputValue: setUserInput, isStopIcon: isStop, onSendIconClick: onSendIconClick, onStopIconClick: onStopIconClick, currentMode: currentMode, filterOptions: filterOptions, onSaveClick: saveCurrentChat })) : null, isChatBotOpen: showModal || forceOpen, historyPanelData: historyPanelData, onHistorySearchChange: (params) => { console.log("History Search Change", params); }, onHistorySelectConversation: (params) => {
11066
+ console.log("History Select Conversation", params);
11067
+ setNewChatScreen(false);
11068
+ setShowChatPlaceholder(false);
11069
+ fetchConversationChats(params?.conversation_id, "agent");
11070
+ }, onHistoryPanelClick: (p1, p2) => {
11071
+ console.log("History", p1, p2);
11072
+ fetchConversations(null, "agent");
11073
+ }, onHistoryMenuAction: (action, conversationData, renamedConversation) => {
11074
+ console.log("History Menu Action", action, conversationData);
11075
+ handleHistoryMenuAction(action, conversationData, renamedConversation);
11076
+ },
10485
11077
  // landingScreen={true}
10486
11078
  handleNewChatClick: () => {
10487
11079
  localStorage.setItem("isStreaming", "false");
10488
11080
  dispatch(smartBotActions.setChatbotContext({}));
10489
11081
  setConversation([]);
10490
- chatDataInfoRef.current[currentMode] = [];
11082
+ chatDataInfoRef.current[currentMode] = {
11083
+ conversations: {},
11084
+ };
10491
11085
  setChatDataState({});
10492
11086
  if (currentMode === "agent") {
10493
11087
  setShowChatPlaceholder(true);
@@ -10556,8 +11150,10 @@ const SmartBot = (props) => {
10556
11150
  // );
10557
11151
  // return;
10558
11152
  // } else {
11153
+ const agentConversations = chatDataInfoRef?.current[params?.name?.toLowerCase()]?.conversations;
11154
+ const firstConversationId = agentConversations ? Object.keys(agentConversations)[0] : undefined;
10559
11155
  if (params?.name?.toLowerCase() === "agent") {
10560
- if (!lodash.isEmpty(chatDataInfoRef?.current[params?.name?.toLowerCase()])) {
11156
+ if (!lodash.isEmpty(agentConversations?.[firstConversationId]?.messages)) {
10561
11157
  setShowChatPlaceholder(false);
10562
11158
  }
10563
11159
  else {
@@ -10565,6 +11161,9 @@ const SmartBot = (props) => {
10565
11161
  }
10566
11162
  }
10567
11163
  setCurrentMode(params?.name?.toLowerCase());
11164
+ if (firstConversationId) {
11165
+ setActiveConversationId(firstConversationId);
11166
+ }
10568
11167
  localStorage.setItem("currentModeData", params?.name?.toLowerCase());
10569
11168
  setNewChatScreen(false);
10570
11169
  activeTab.current.activeTab = "agent";
@@ -10588,7 +11187,9 @@ const SmartBot = (props) => {
10588
11187
  // return;
10589
11188
  // } else {
10590
11189
  let currentModeValue = params?.name?.toLowerCase();
10591
- if (!lodash.isEmpty(chatDataInfoRef?.current[currentModeValue])) {
11190
+ const modeConversations = chatDataInfoRef?.current[currentModeValue]?.conversations;
11191
+ const firstConversationId = modeConversations ? Object.keys(modeConversations)[0] : undefined;
11192
+ if (!lodash.isEmpty(modeConversations?.[firstConversationId]?.messages)) {
10592
11193
  setNewChatScreen(false);
10593
11194
  }
10594
11195
  else {
@@ -10609,13 +11210,16 @@ const SmartBot = (props) => {
10609
11210
  // setNewChatScreen(true);
10610
11211
  setIsStop(false);
10611
11212
  setCurrentMode(params?.name?.toLowerCase());
11213
+ if (firstConversationId) {
11214
+ setActiveConversationId(firstConversationId);
11215
+ }
10612
11216
  // setConversation([]);
10613
11217
  // chatDataInfoRef.current[currentMode] = [];
10614
11218
  // }
10615
11219
  },
10616
11220
  icon: jsxRuntime.jsx(SvgNavigationIcon, {}),
10617
11221
  },
10618
- ], utilityList: utilityList, isAssistantThinking: loader, isCustomScreen: showChatPlaceholder, customScreenJsx: jsxRuntime.jsx(ChatPlaceholder, { dateFormat: dateFormat, chatDataRef: chatDataRef, currentMode: currentMode, setShowChatPlaceholder: setShowChatPlaceholder, setLoader: setLoader, setCurrentAgentId: setCurrentAgentId, baseUrl: baseUrl, setBaseUrl: setBaseUrl, setCurrentSessionId: setCurrentSessionId, customChatConfig: customChatConfig, chatDataInfoRef: chatDataInfoRef, setChatDataState: setChatDataState, userInput: userInput, legacyAgentScreen: legacyAgentScreen, activeConversationId: activeConversationId, chatBodyRef: chatBodyRef, chatbotContext: chatbotContext, setInitValue: setInitValue, setSessionId: setSessionId, thinkingContent: thinkingContext?.thinkingContent, setThinkingContent: setThinkingContent, isThinking: isThinking, setIsThinking: setIsThinking, chatId: chatId, setChatId: setChatId, isStop: isStop, setIsStop: setIsStop, functionsRef: functionsRef, functionsState: functionsState, setFunctionsState: setFunctionsState, thinkingHeaderMessage: thinkingContext?.thinkingHeaderMessage, setThinkingHeaderMessage: setThinkingHeaderMessage, uniqueChatId: uniqueChatId, setUniqueChatId: setUniqueChatId, fieldNumber: fieldNumber, setFieldNumber: setFieldNumber, setAdditionalArgs: setAdditionalArgs, displayQuestions: displayQuestions, questions: questions }), inputText: userInput, threadList: ["Home"], hideMenuArrow: hideMenu, newChatScreen: newChatScreen, isModuleListLoading: modulesLoading, suggestionBanner: {
11222
+ ], utilityList: utilityList, isAssistantThinking: loader, isCustomScreen: showChatPlaceholder, customScreenJsx: jsxRuntime.jsx(ChatPlaceholder, { dateFormat: dateFormat, chatDataRef: chatDataRef, currentMode: currentMode, setShowChatPlaceholder: setShowChatPlaceholder, setLoader: setLoader, setCurrentAgentId: setCurrentAgentId, baseUrl: baseUrl, setBaseUrl: setBaseUrl, setCurrentSessionId: setCurrentSessionId, customChatConfig: customChatConfig, chatDataInfoRef: chatDataInfoRef, setChatDataState: setChatDataState, userInput: userInput, legacyAgentScreen: legacyAgentScreen, activeConversationId: activeConversationId, chatBodyRef: chatBodyRef, chatbotContext: chatbotContext, setInitValue: setInitValue, setSessionId: setSessionId, thinkingContent: thinkingContext?.thinkingContent, setThinkingContent: setThinkingContent, isThinking: isThinking, setIsThinking: setIsThinking, chatId: chatId, setChatId: setChatId, isStop: isStop, setIsStop: setIsStop, functionsRef: functionsRef, functionsState: functionsState, setFunctionsState: setFunctionsState, thinkingHeaderMessage: thinkingContext?.thinkingHeaderMessage, setThinkingHeaderMessage: setThinkingHeaderMessage, uniqueChatId: uniqueChatId, setUniqueChatId: setUniqueChatId, fieldNumber: fieldNumber, setFieldNumber: setFieldNumber, setAdditionalArgs: setAdditionalArgs, displayQuestions: displayQuestions, questions: questions, setActiveConversationId: setActiveConversationId }), inputText: userInput, threadList: ["Home"], hideMenuArrow: hideMenu, newChatScreen: newChatScreen, isModuleListLoading: modulesLoading, suggestionBanner: {
10619
11223
  freeTextHeading: "Try adding more details :",
10620
11224
  freeTextContent: "Alan works better when you provide more context and pointed questions",
10621
11225
  }, isStopIcon: isStop, onStopIconClick: onStopIconClick, footerText: "AI-generated responses may contain errors\u2014please verify important information", showSuggestionBanner: showSuggestionBanner, onCloseSuggestionBanner: () => {
@@ -10632,6 +11236,9 @@ const SmartBot = (props) => {
10632
11236
  }
10633
11237
  const likeDislikeKey = `${params?.response_heading || params?.screen_name}_${params?.timeStamp}`;
10634
11238
  handleLikeDislike(likeDislikeKey, false, params?.bodyText, params2);
11239
+ }, handleSaveChat: () => {
11240
+ // Handle save chat logic here
11241
+ saveCurrentChat();
10635
11242
  } })] }));
10636
11243
  };
10637
11244