impact-chatbot 2.3.81 → 2.3.83
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/components/message-template/components/message-content/StepFormContent.d.ts +5 -1
- package/dist/components/message-template/components/message-content/tabular-content/index.d.ts +4 -1
- package/dist/components/message-template/components/message-types/streamed-content/StreamedContent.d.ts +2 -1
- package/dist/components/message-template/components/message-types/streamed-content/steps-response-tab/components/Steps.d.ts +4 -1
- package/dist/index.cjs.js +155 -96
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +155 -96
- package/dist/index.esm.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,12 +7,16 @@
|
|
|
7
7
|
* @param {Array} props.formData - Array of raw widget_data items from step_form chunk
|
|
8
8
|
* @param {number} props.messageIndex - Index for form state persistence keys
|
|
9
9
|
*/
|
|
10
|
-
declare const StepFormContent: ({ formData, messageIndex, isFormDisabled, showSavedFilters, preSelectedFilters }: {
|
|
10
|
+
declare const StepFormContent: ({ formData, messageIndex, isFormDisabled, showSavedFilters, preSelectedFilters, botProps, currentMode, agentId, sessionId, }: {
|
|
11
11
|
formData: any;
|
|
12
12
|
messageIndex?: number;
|
|
13
13
|
isFormDisabled?: boolean;
|
|
14
14
|
showSavedFilters?: boolean;
|
|
15
15
|
preSelectedFilters?: any;
|
|
16
|
+
botProps?: any;
|
|
17
|
+
currentMode?: string;
|
|
18
|
+
agentId?: string;
|
|
19
|
+
sessionId?: string;
|
|
16
20
|
}) => import("react/jsx-runtime").JSX.Element;
|
|
17
21
|
/** Reset the timeout flag (call when a new conversation/message starts) */
|
|
18
22
|
export declare const resetStepFormTimeoutFlag: () => void;
|
package/dist/components/message-template/components/message-content/tabular-content/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
declare const TabularContent: ({ steps: initialSteps, currentTabValue, children, questions: initialQuestions, questionsStepsMap: initialQuestionsStepsMap, stepFormDataMap: initialStepFormDataMap, isFormDisabled, sessionId: propSessionId }: {
|
|
1
|
+
declare const TabularContent: ({ steps: initialSteps, currentTabValue, children, questions: initialQuestions, questionsStepsMap: initialQuestionsStepsMap, stepFormDataMap: initialStepFormDataMap, isFormDisabled, sessionId: propSessionId, botProps, currentMode, agentId }: {
|
|
2
2
|
steps: any;
|
|
3
3
|
currentTabValue: any;
|
|
4
4
|
children: any;
|
|
@@ -7,6 +7,9 @@ declare const TabularContent: ({ steps: initialSteps, currentTabValue, children,
|
|
|
7
7
|
stepFormDataMap?: {};
|
|
8
8
|
isFormDisabled?: boolean;
|
|
9
9
|
sessionId?: string;
|
|
10
|
+
botProps?: any;
|
|
11
|
+
currentMode?: string;
|
|
12
|
+
agentId?: string;
|
|
10
13
|
}) => import("react/jsx-runtime").JSX.Element;
|
|
11
14
|
/** Reset the active instance tracker (call when a new conversation starts from the input field) */
|
|
12
15
|
export declare const resetActiveTabularInstance: () => void;
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
* @param {React.RefObject} botData.utilityObject.chatBodyRef - Ref to chat body element
|
|
11
11
|
* @param {Function} botData.utilityObject.setChatDataState - Function to update chat data state
|
|
12
12
|
*/
|
|
13
|
-
declare const StreamedContent: ({ botData }: {
|
|
13
|
+
declare const StreamedContent: ({ botData, botProps }: {
|
|
14
14
|
botData: any;
|
|
15
|
+
botProps: any;
|
|
15
16
|
}) => import("react/jsx-runtime").JSX.Element;
|
|
16
17
|
export default StreamedContent;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
declare const Steps: ({ steps, setSteps, done, setTabValue, setDone, finalStepDone, setFinalStepDone, stepChange, currentMode, questions, questionsStepsMap, stepFormDataMap, isFormDisabled, }: {
|
|
1
|
+
declare const Steps: ({ steps, setSteps, done, setTabValue, setDone, finalStepDone, setFinalStepDone, stepChange, currentMode, questions, questionsStepsMap, stepFormDataMap, isFormDisabled, botProps, agentId, sessionId, }: {
|
|
2
2
|
steps: any;
|
|
3
3
|
setSteps: any;
|
|
4
4
|
done: any;
|
|
@@ -12,5 +12,8 @@ declare const Steps: ({ steps, setSteps, done, setTabValue, setDone, finalStepDo
|
|
|
12
12
|
questionsStepsMap?: {};
|
|
13
13
|
stepFormDataMap?: {};
|
|
14
14
|
isFormDisabled?: boolean;
|
|
15
|
+
botProps?: any;
|
|
16
|
+
agentId?: string;
|
|
17
|
+
sessionId?: string;
|
|
15
18
|
}) => import("react/jsx-runtime").JSX.Element;
|
|
16
19
|
export default Steps;
|
package/dist/index.cjs.js
CHANGED
|
@@ -348,9 +348,9 @@ const parseResponse = (data, type, agentId = "", currentMode = "", disableTimeAn
|
|
|
348
348
|
userType: "bot",
|
|
349
349
|
userName: userName,
|
|
350
350
|
bodyText: data?.response,
|
|
351
|
-
headerTitle:
|
|
351
|
+
headerTitle: "",
|
|
352
352
|
thinkingResponse: data?.thinkingResponse,
|
|
353
|
-
noShowHeaderTitle:
|
|
353
|
+
noShowHeaderTitle: true,
|
|
354
354
|
bodyType: "text",
|
|
355
355
|
};
|
|
356
356
|
case "stream":
|
|
@@ -614,7 +614,8 @@ const parseResponse = (data, type, agentId = "", currentMode = "", disableTimeAn
|
|
|
614
614
|
timeStamp: timeString,
|
|
615
615
|
userType: "bot",
|
|
616
616
|
userName: userName,
|
|
617
|
-
headerTitle:
|
|
617
|
+
headerTitle: "",
|
|
618
|
+
noShowHeaderTitle: true,
|
|
618
619
|
bodyType: "image",
|
|
619
620
|
bodyText: data?.image || data,
|
|
620
621
|
};
|
|
@@ -1173,8 +1174,8 @@ const preprocessMarkdown = (content) => {
|
|
|
1173
1174
|
* Custom components for markdown rendering
|
|
1174
1175
|
*/
|
|
1175
1176
|
const markdownComponents = {
|
|
1176
|
-
// Custom link component
|
|
1177
|
-
a: ({ href, children, ...props }) => (jsxRuntime.jsx("a", { href: href, target: "
|
|
1177
|
+
// Custom link component that opens in the same tab
|
|
1178
|
+
a: ({ href, children, ...props }) => (jsxRuntime.jsx("a", { href: href, target: "_self", ...props, children: children })),
|
|
1178
1179
|
// Custom code component
|
|
1179
1180
|
code: ({ children, className, ...props }) => (jsxRuntime.jsx("code", { className: `markdown-code ${className || ''}`, ...props, children: children })),
|
|
1180
1181
|
// Custom pre component for code blocks
|
|
@@ -5031,7 +5032,7 @@ const ChipsContent = ({ bodyText, props }) => {
|
|
|
5031
5032
|
const classes = useStyles$a();
|
|
5032
5033
|
const globalClasses = globalStyles();
|
|
5033
5034
|
return (jsxRuntime.jsx("div", { className: `${globalClasses.flexRow} ${globalClasses.flexWrap} ${globalClasses.gap} ${globalClasses.verticalAlignCenter}`, children: bodyText.map((data, index) => {
|
|
5034
|
-
const callBack = data.interactable
|
|
5035
|
+
const callBack = data.interactable && props
|
|
5035
5036
|
? Object.entries(props).filter((entry) => entry[0] === data.actionName)?.[0]?.[1]
|
|
5036
5037
|
: null;
|
|
5037
5038
|
return (jsxRuntime.jsx(material.Typography, { component: "span", variant: "body1", className: `${classes.gptChips} ${data.interactable ? globalClasses.cursorPointer : ""}`, onClick: () => {
|
|
@@ -5098,7 +5099,7 @@ const QuestionsContent = ({ bodyText, props }) => {
|
|
|
5098
5099
|
};
|
|
5099
5100
|
};
|
|
5100
5101
|
return (jsxRuntime.jsx("div", { className: `${globalClasses.flexRow} ${globalClasses.flexColumn} ${classes.gptQuestionContainer}`, children: bodyText.map((data, index) => {
|
|
5101
|
-
const callBack = data.interactable
|
|
5102
|
+
const callBack = data.interactable && props
|
|
5102
5103
|
? Object.entries(props).filter((entry) => entry[0] === data.actionName)?.[0]?.[1]
|
|
5103
5104
|
: null;
|
|
5104
5105
|
return (jsxRuntime.jsxs("div", { className: `${globalClasses.layoutAlignStart} ${classes.gptQuestionBlock}`, style: {
|
|
@@ -6849,6 +6850,36 @@ const fetchCrossFilterOptions = async (filterConfig, existingSelections = [], al
|
|
|
6849
6850
|
}
|
|
6850
6851
|
};
|
|
6851
6852
|
|
|
6853
|
+
const useStyles$6 = styles.makeStyles(() => ({
|
|
6854
|
+
htmlContentContainer: {
|
|
6855
|
+
width: "100%",
|
|
6856
|
+
"& *": {
|
|
6857
|
+
boxSizing: "border-box",
|
|
6858
|
+
},
|
|
6859
|
+
},
|
|
6860
|
+
}));
|
|
6861
|
+
const HtmlContent = ({ bodyText }) => {
|
|
6862
|
+
const classes = useStyles$6();
|
|
6863
|
+
const containerRef = React.useRef(null);
|
|
6864
|
+
const content = bodyText?.content || "";
|
|
6865
|
+
React.useEffect(() => {
|
|
6866
|
+
if (containerRef.current && content) {
|
|
6867
|
+
const sanitizedHtml = DOMPurify.sanitize(content, {
|
|
6868
|
+
ADD_TAGS: ["style", "details", "summary"],
|
|
6869
|
+
ADD_ATTR: ["open", "target", "rel", "class", "style"],
|
|
6870
|
+
ALLOW_DATA_ATTR: true,
|
|
6871
|
+
FORCE_BODY: true,
|
|
6872
|
+
WHOLE_DOCUMENT: false,
|
|
6873
|
+
});
|
|
6874
|
+
containerRef.current.innerHTML = sanitizedHtml;
|
|
6875
|
+
}
|
|
6876
|
+
}, [content]);
|
|
6877
|
+
if (!content) {
|
|
6878
|
+
return null;
|
|
6879
|
+
}
|
|
6880
|
+
return (jsxRuntime.jsx("div", { ref: containerRef, className: classes.htmlContentContainer }));
|
|
6881
|
+
};
|
|
6882
|
+
|
|
6852
6883
|
const SliderContent = ({ bodyText, isFormDisabled = false, messageIndex }) => {
|
|
6853
6884
|
const formKey = `${messageIndex}_${bodyText?.paramName}`;
|
|
6854
6885
|
const { header, headerOrentiation, inputPosition, label, max, min, required, disabled, } = bodyText;
|
|
@@ -7394,8 +7425,9 @@ const STEP_FORM_TIMEOUT_KEY = "__stepFormTimedOut";
|
|
|
7394
7425
|
* @param {Array} props.formData - Array of raw widget_data items from step_form chunk
|
|
7395
7426
|
* @param {number} props.messageIndex - Index for form state persistence keys
|
|
7396
7427
|
*/
|
|
7397
|
-
const StepFormContent = ({ formData, messageIndex = 0, isFormDisabled = false, showSavedFilters = true, preSelectedFilters = null }) => {
|
|
7428
|
+
const StepFormContent = ({ formData, messageIndex = 0, isFormDisabled = false, showSavedFilters = true, preSelectedFilters = null, botProps = null, currentMode = "", agentId = "", sessionId = "", }) => {
|
|
7398
7429
|
const dispatch = reactRedux.useDispatch();
|
|
7430
|
+
const classes = useStyles$a();
|
|
7399
7431
|
const savedFilterSets = reactRedux.useSelector((state) => state.smartBotReducer.savedFilterSets);
|
|
7400
7432
|
const persistedFormValues = reactRedux.useSelector((state) => state.smartBotReducer.persistedFormValues);
|
|
7401
7433
|
const chatbotContext = reactRedux.useSelector((state) => state.smartBotReducer.chatbotContext);
|
|
@@ -7668,7 +7700,11 @@ const StepFormContent = ({ formData, messageIndex = 0, isFormDisabled = false, s
|
|
|
7668
7700
|
case "text":
|
|
7669
7701
|
return jsxRuntime.jsx(TextContent, { bodyText: parsedData.bodyText, botData: parsedData }, key);
|
|
7670
7702
|
case "chips":
|
|
7671
|
-
return jsxRuntime.jsx(
|
|
7703
|
+
return parsedData.isMultiSelect ? (jsxRuntime.jsx(SelectableChips, { bodyText: parsedData.bodyText, chipType: "selectable", utilityData: parsedData.utilityData, props: botProps }, key)) : (jsxRuntime.jsx(ChipsContent, { bodyText: parsedData.bodyText, props: botProps }, key));
|
|
7704
|
+
case "questions":
|
|
7705
|
+
return jsxRuntime.jsx(QuestionsContent, { bodyText: parsedData.bodyText, props: botProps }, key);
|
|
7706
|
+
case "html":
|
|
7707
|
+
return jsxRuntime.jsx(HtmlContent, { bodyText: parsedData.bodyText }, key);
|
|
7672
7708
|
case "table":
|
|
7673
7709
|
return jsxRuntime.jsx(TableContent, { bodyText: parsedData.bodyText }, key);
|
|
7674
7710
|
case "graph":
|
|
@@ -7699,12 +7735,18 @@ const StepFormContent = ({ formData, messageIndex = 0, isFormDisabled = false, s
|
|
|
7699
7735
|
const buttonItems = [];
|
|
7700
7736
|
formData.forEach((item, index) => {
|
|
7701
7737
|
try {
|
|
7702
|
-
const parsedData = parseResponse(item, item.type,
|
|
7738
|
+
const parsedData = parseResponse(item, item.type, agentId, currentMode, true, sessionId);
|
|
7703
7739
|
if (!parsedData)
|
|
7704
7740
|
return;
|
|
7705
|
-
const
|
|
7706
|
-
if (!
|
|
7741
|
+
const body = renderItem(parsedData, index);
|
|
7742
|
+
if (!body)
|
|
7707
7743
|
return;
|
|
7744
|
+
// Skip the block header when it is just a repeat of the label the widget
|
|
7745
|
+
// renders itself (parseResponse derives headerTitle from label for inputs).
|
|
7746
|
+
const showHeaderTitle = !parsedData?.noShowHeaderTitle &&
|
|
7747
|
+
Boolean(parsedData?.headerTitle?.length) &&
|
|
7748
|
+
parsedData.headerTitle !== parsedData?.bodyText?.label;
|
|
7749
|
+
const rendered = showHeaderTitle ? (jsxRuntime.jsxs(React.Fragment, { children: [jsxRuntime.jsx("div", { className: `${classes.chatbotText} ${classes.boldText} ${classes.combinedBlockHeaderTitle}`, children: parsedData.headerTitle }), body] }, `step-form-block-${index}`)) : (body);
|
|
7708
7750
|
if (parsedData.bodyType === "button") {
|
|
7709
7751
|
buttonItems.push(rendered);
|
|
7710
7752
|
}
|
|
@@ -7727,7 +7769,7 @@ const resetStepFormTimeoutFlag = () => {
|
|
|
7727
7769
|
sessionStorage.removeItem(STEP_FORM_TIMEOUT_KEY);
|
|
7728
7770
|
};
|
|
7729
7771
|
|
|
7730
|
-
const useStyles$
|
|
7772
|
+
const useStyles$5 = styles.makeStyles(() => ({
|
|
7731
7773
|
subStepMarkdown: {
|
|
7732
7774
|
// Inherit font styles from parent (.progressSubItem)
|
|
7733
7775
|
fontFamily: 'inherit',
|
|
@@ -7801,14 +7843,14 @@ const preprocessSubStepMarkdown = (content) => {
|
|
|
7801
7843
|
.trim();
|
|
7802
7844
|
};
|
|
7803
7845
|
const SubStepRenderer = ({ text }) => {
|
|
7804
|
-
const classes = useStyles$
|
|
7846
|
+
const classes = useStyles$5();
|
|
7805
7847
|
if (!text)
|
|
7806
7848
|
return null;
|
|
7807
7849
|
const processed = preprocessSubStepMarkdown(text);
|
|
7808
7850
|
return (jsxRuntime.jsx("div", { className: classes.subStepMarkdown, children: jsxRuntime.jsx(ReactMarkdown, { remarkPlugins: [remarkGfm, remarkBreaks], children: processed }) }));
|
|
7809
7851
|
};
|
|
7810
7852
|
|
|
7811
|
-
const useStyles$
|
|
7853
|
+
const useStyles$4 = makeStyles((theme) => ({
|
|
7812
7854
|
"@global": {
|
|
7813
7855
|
"@keyframes progressDotPulse": {
|
|
7814
7856
|
"0%": {
|
|
@@ -8082,7 +8124,7 @@ const getQuestionStatus$1 = (questionSteps) => {
|
|
|
8082
8124
|
/**
|
|
8083
8125
|
* Renders a single progress bar item (main point + sub-items)
|
|
8084
8126
|
*/
|
|
8085
|
-
const ProgressBarItem$1 = ({ question, questionSteps, isLast, classes, formData, showSavedFilters = true, preSelectedFilters = null, isFormDisabled, onAllSubItemsAnimated = undefined }) => {
|
|
8127
|
+
const ProgressBarItem$1 = ({ question, questionSteps, isLast, classes, formData, showSavedFilters = true, preSelectedFilters = null, isFormDisabled, onAllSubItemsAnimated = undefined, botProps = null, currentMode = "", agentId = "", sessionId = "" }) => {
|
|
8086
8128
|
const status = getQuestionStatus$1(questionSteps);
|
|
8087
8129
|
const animatedCountRef = React.useRef(0);
|
|
8088
8130
|
const [isExpanded, setIsExpanded] = React.useState(true);
|
|
@@ -8116,10 +8158,10 @@ const ProgressBarItem$1 = ({ question, questionSteps, isLast, classes, formData,
|
|
|
8116
8158
|
if (animatedCountRef.current >= arr.length && onAllSubItemsAnimated) {
|
|
8117
8159
|
onAllSubItemsAnimated();
|
|
8118
8160
|
}
|
|
8119
|
-
} }) }, idx))) })), formData && isExpanded && (jsxRuntime.jsx("div", { className: classes.stepFormContainer, children: jsxRuntime.jsx(StepFormContent, { formData: formData, isFormDisabled: isFormDisabled, showSavedFilters: showSavedFilters, preSelectedFilters: preSelectedFilters }) }))] })] }));
|
|
8161
|
+
} }) }, idx))) })), formData && isExpanded && (jsxRuntime.jsx("div", { className: classes.stepFormContainer, children: jsxRuntime.jsx(StepFormContent, { formData: formData, isFormDisabled: isFormDisabled, showSavedFilters: showSavedFilters, preSelectedFilters: preSelectedFilters, botProps: botProps, currentMode: currentMode, agentId: agentId, sessionId: sessionId }) }))] })] }));
|
|
8120
8162
|
};
|
|
8121
|
-
const Steps$1 = ({ steps, setSteps, done, setTabValue, setDone, finalStepDone, setFinalStepDone, stepChange, currentMode, questions = [], questionsStepsMap = {}, stepFormDataMap = {}, isFormDisabled = false, }) => {
|
|
8122
|
-
const classes = useStyles$
|
|
8163
|
+
const Steps$1 = ({ steps, setSteps, done, setTabValue, setDone, finalStepDone, setFinalStepDone, stepChange, currentMode, questions = [], questionsStepsMap = {}, stepFormDataMap = {}, isFormDisabled = false, botProps = null, agentId = "", sessionId = "", }) => {
|
|
8164
|
+
const classes = useStyles$4();
|
|
8123
8165
|
React.useState(false);
|
|
8124
8166
|
const [showThinking, setShowThinking] = React.useState(false);
|
|
8125
8167
|
// Determine if last question is fully completed (all sub-steps done)
|
|
@@ -8201,7 +8243,7 @@ const Steps$1 = ({ steps, setSteps, done, setTabValue, setDone, finalStepDone, s
|
|
|
8201
8243
|
const showSavedFilters = formEntry && !Array.isArray(formEntry) ? formEntry.showSavedFilters : true;
|
|
8202
8244
|
const preSelectedFilters = formEntry && !Array.isArray(formEntry) ? formEntry.preSelectedFilters : null;
|
|
8203
8245
|
const isLast = index === questions.length - 1;
|
|
8204
|
-
return (jsxRuntime.jsx(ProgressBarItem$1, { question: question, questionSteps: questionSteps, isLast: isLast && !showThinking, classes: classes, formData: formData, isFormDisabled: isFormDisabled, showSavedFilters: showSavedFilters, preSelectedFilters: preSelectedFilters, onAllSubItemsAnimated: isLast && lastQuestionCompleted && !done
|
|
8246
|
+
return (jsxRuntime.jsx(ProgressBarItem$1, { question: question, questionSteps: questionSteps, isLast: isLast && !showThinking, classes: classes, formData: formData, isFormDisabled: isFormDisabled, showSavedFilters: showSavedFilters, preSelectedFilters: preSelectedFilters, botProps: botProps, currentMode: currentMode, agentId: agentId, sessionId: sessionId, onAllSubItemsAnimated: isLast && lastQuestionCompleted && !done
|
|
8205
8247
|
? () => setShowThinking(true)
|
|
8206
8248
|
: undefined }, index));
|
|
8207
8249
|
}), showThinking && !done && (jsxRuntime.jsx("div", { style: {
|
|
@@ -8209,36 +8251,6 @@ const Steps$1 = ({ steps, setSteps, done, setTabValue, setDone, finalStepDone, s
|
|
|
8209
8251
|
}, children: jsxRuntime.jsx(ProgressBarItem$1, { question: "Thinking", questionSteps: [{ header: "", sub_header: "", step_status: "not-completed" }], isLast: true, classes: classes, formData: null, isFormDisabled: isFormDisabled }) }))] }));
|
|
8210
8252
|
};
|
|
8211
8253
|
|
|
8212
|
-
const useStyles$4 = styles.makeStyles(() => ({
|
|
8213
|
-
htmlContentContainer: {
|
|
8214
|
-
width: "100%",
|
|
8215
|
-
"& *": {
|
|
8216
|
-
boxSizing: "border-box",
|
|
8217
|
-
},
|
|
8218
|
-
},
|
|
8219
|
-
}));
|
|
8220
|
-
const HtmlContent = ({ bodyText }) => {
|
|
8221
|
-
const classes = useStyles$4();
|
|
8222
|
-
const containerRef = React.useRef(null);
|
|
8223
|
-
const content = bodyText?.content || "";
|
|
8224
|
-
React.useEffect(() => {
|
|
8225
|
-
if (containerRef.current && content) {
|
|
8226
|
-
const sanitizedHtml = DOMPurify.sanitize(content, {
|
|
8227
|
-
ADD_TAGS: ["style", "details", "summary"],
|
|
8228
|
-
ADD_ATTR: ["open", "target", "rel", "class", "style"],
|
|
8229
|
-
ALLOW_DATA_ATTR: true,
|
|
8230
|
-
FORCE_BODY: true,
|
|
8231
|
-
WHOLE_DOCUMENT: false,
|
|
8232
|
-
});
|
|
8233
|
-
containerRef.current.innerHTML = sanitizedHtml;
|
|
8234
|
-
}
|
|
8235
|
-
}, [content]);
|
|
8236
|
-
if (!content) {
|
|
8237
|
-
return null;
|
|
8238
|
-
}
|
|
8239
|
-
return (jsxRuntime.jsx("div", { ref: containerRef, className: classes.htmlContentContainer }));
|
|
8240
|
-
};
|
|
8241
|
-
|
|
8242
8254
|
const renderWidgetItem = (item, index, isFormDisabled) => {
|
|
8243
8255
|
try {
|
|
8244
8256
|
const parsedData = parseResponse(item, item.type, "", "", true);
|
|
@@ -8290,7 +8302,7 @@ const AgentResponse$1 = (props) => {
|
|
|
8290
8302
|
};
|
|
8291
8303
|
|
|
8292
8304
|
const StepsResponseTab = (props) => {
|
|
8293
|
-
const { steps, setSteps, stepsDone, setStepsDone, finalStepDone, setFinalStepDone, content, isStreaming, stepChange, currentMode, questions, questionsStepsMap, stepFormDataMap, isFormDisabled, streamingWidgetData, isRetrying, } = props;
|
|
8305
|
+
const { steps, setSteps, stepsDone, setStepsDone, finalStepDone, setFinalStepDone, content, isStreaming, stepChange, currentMode, questions, questionsStepsMap, stepFormDataMap, isFormDisabled, streamingWidgetData, isRetrying, botProps, agentId, sessionId, } = props;
|
|
8294
8306
|
const dispatch = reactRedux.useDispatch();
|
|
8295
8307
|
const thinkingContext = reactRedux.useSelector((state) => state.smartBotReducer.thinkingContext);
|
|
8296
8308
|
const streamStartTimeRef = React.useRef(thinkingContext?.streamStartTime);
|
|
@@ -8354,7 +8366,7 @@ const StepsResponseTab = (props) => {
|
|
|
8354
8366
|
icon: jsxRuntime.jsx(PsychologyOutlinedIcon, { fontSize: "large" }),
|
|
8355
8367
|
},
|
|
8356
8368
|
], tabPanels: [
|
|
8357
|
-
jsxRuntime.jsx(Steps$1, { steps: steps, setSteps: setSteps, done: stepsDone, setDone: setStepsDone, setTabValue: setTabValue, finalStepDone: finalStepDone, setFinalStepDone: setFinalStepDone, stepChange: stepChange, currentMode: currentMode, questions: questions, questionsStepsMap: questionsStepsMap, stepFormDataMap: stepFormDataMap, isFormDisabled: isFormDisabled || isTimedOut }),
|
|
8369
|
+
jsxRuntime.jsx(Steps$1, { steps: steps, setSteps: setSteps, done: stepsDone, setDone: setStepsDone, setTabValue: setTabValue, finalStepDone: finalStepDone, setFinalStepDone: setFinalStepDone, stepChange: stepChange, currentMode: currentMode, questions: questions, questionsStepsMap: questionsStepsMap, stepFormDataMap: stepFormDataMap, isFormDisabled: isFormDisabled || isTimedOut, botProps: botProps, agentId: agentId, sessionId: sessionId }),
|
|
8358
8370
|
jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(AgentResponse$1, { content: content, isStreaming: isStreaming, streamingWidgetData: streamingWidgetData, isFormDisabled: isFormDisabled || isTimedOut }), timeoutMessage && (jsxRuntime.jsx("div", { style: { marginTop: "8px", padding: "0 8px" }, children: jsxRuntime.jsx(TextRenderer, { text: timeoutMessage, thinking: "" }) }))] }),
|
|
8359
8371
|
], value: tabValue }) }));
|
|
8360
8372
|
};
|
|
@@ -8536,7 +8548,7 @@ const streamStateMap = new Map();
|
|
|
8536
8548
|
* @param {React.RefObject} botData.utilityObject.chatBodyRef - Ref to chat body element
|
|
8537
8549
|
* @param {Function} botData.utilityObject.setChatDataState - Function to update chat data state
|
|
8538
8550
|
*/
|
|
8539
|
-
const StreamedContent = ({ botData }) => {
|
|
8551
|
+
const StreamedContent = ({ botData, botProps }) => {
|
|
8540
8552
|
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, setNavSessionId } = botData.utilityObject || {};
|
|
8541
8553
|
const classes = useStyles$7();
|
|
8542
8554
|
useStyles$a();
|
|
@@ -9715,8 +9727,13 @@ const StreamedContent = ({ botData }) => {
|
|
|
9715
9727
|
}, 1000);
|
|
9716
9728
|
}
|
|
9717
9729
|
}, [isStreamingDone, thinkingTime, activeConversationId]);
|
|
9730
|
+
// Show/hide the stop (cancel execution) icon while the stream is active.
|
|
9731
|
+
// Gate on state only - sourceRef is a ref, so mutating it never re-runs this
|
|
9732
|
+
// effect. Relying on it meant that if the source wasn't assigned yet on the
|
|
9733
|
+
// first run, isStop was set to false and never re-evaluated for the rest of
|
|
9734
|
+
// the stream, leaving the cancel button hidden.
|
|
9718
9735
|
React.useEffect(() => {
|
|
9719
|
-
if (
|
|
9736
|
+
if (isStreaming && !isStreamingDone) {
|
|
9720
9737
|
setIsStop(true);
|
|
9721
9738
|
setFunctionsState({
|
|
9722
9739
|
...functionsState,
|
|
@@ -9727,7 +9744,7 @@ const StreamedContent = ({ botData }) => {
|
|
|
9727
9744
|
else {
|
|
9728
9745
|
setIsStop(false);
|
|
9729
9746
|
}
|
|
9730
|
-
}, [isStreaming]);
|
|
9747
|
+
}, [isStreaming, isStreamingDone]);
|
|
9731
9748
|
/**
|
|
9732
9749
|
* Aborts the current streaming connection
|
|
9733
9750
|
*/
|
|
@@ -9740,10 +9757,12 @@ const StreamedContent = ({ botData }) => {
|
|
|
9740
9757
|
setRetryCountdown(0);
|
|
9741
9758
|
}
|
|
9742
9759
|
retryCountRef.current = MAX_RETRY_COUNT; // Exhaust retries so no further auto-retries happen
|
|
9743
|
-
if (
|
|
9760
|
+
if (isStreaming) {
|
|
9744
9761
|
setWasStreamingAborted(true);
|
|
9745
9762
|
wasStreamingAbortedRef.current = true;
|
|
9746
|
-
sourceRef.current
|
|
9763
|
+
if (sourceRef.current) {
|
|
9764
|
+
sourceRef.current.close();
|
|
9765
|
+
}
|
|
9747
9766
|
setIsStreaming(false);
|
|
9748
9767
|
setIsStreamingDone(true);
|
|
9749
9768
|
// Mark as completed+aborted so tab-switch remounts don't restart the stream.
|
|
@@ -9903,7 +9922,7 @@ const StreamedContent = ({ botData }) => {
|
|
|
9903
9922
|
* @returns {JSX.Element} Rendered content with optional blinking cursor
|
|
9904
9923
|
*/
|
|
9905
9924
|
const renderContent = () => {
|
|
9906
|
-
return (jsxRuntime.jsxs("div", { className: classes.streamContainer, children: [jsxRuntime.jsx(StepsResponseTab, { steps: steps, stepChange: stepChange, setSteps: setSteps, stepsDone: stepsDone, setStepsDone: setStepsDone, finalStepDone: finalStepDone, setFinalStepDone: setFinalStepDone, content: content, isStreaming: isStreaming, currentMode: currentMode, questions: questions, questionsStepsMap: questionsStepsMap, stepFormDataMap: stepFormDataMap, isFormDisabled: botData?.isFormDisabled || false, streamingWidgetData: streamingWidgetData, isRetrying: isRetrying }), isRetrying && (jsxRuntime.jsx("div", { className: classes.retryContainer, children: jsxRuntime.jsx(TextRenderer, { text: `Auto re-trying in ${retryCountdown}s`, thinking: "" }) }))] }));
|
|
9925
|
+
return (jsxRuntime.jsxs("div", { className: classes.streamContainer, children: [jsxRuntime.jsx(StepsResponseTab, { steps: steps, stepChange: stepChange, setSteps: setSteps, stepsDone: stepsDone, setStepsDone: setStepsDone, finalStepDone: finalStepDone, setFinalStepDone: setFinalStepDone, content: content, isStreaming: isStreaming, currentMode: currentMode, questions: questions, questionsStepsMap: questionsStepsMap, stepFormDataMap: stepFormDataMap, isFormDisabled: botData?.isFormDisabled || false, streamingWidgetData: streamingWidgetData, isRetrying: isRetrying, botProps: botProps, agentId: botData?.inputBody?.agent_id || "", sessionId: messageToStoreRef.current?.sessionId || "" }), isRetrying && (jsxRuntime.jsx("div", { className: classes.retryContainer, children: jsxRuntime.jsx(TextRenderer, { text: `Auto re-trying in ${retryCountdown}s`, thinking: "" }) }))] }));
|
|
9907
9926
|
};
|
|
9908
9927
|
if (currentMode === "agent") {
|
|
9909
9928
|
return renderContent();
|
|
@@ -10173,8 +10192,9 @@ const AgentResponse = ({ children }) => {
|
|
|
10173
10192
|
// Only the active instance should process stepFormStreamData from Redux.
|
|
10174
10193
|
let instanceCounter = 0;
|
|
10175
10194
|
let activeTabularInstanceId = null;
|
|
10176
|
-
const TabularContent = ({ steps: initialSteps, currentTabValue, children, questions: initialQuestions = [], questionsStepsMap: initialQuestionsStepsMap = {}, stepFormDataMap: initialStepFormDataMap = {}, isFormDisabled = false, sessionId: propSessionId = "" }) => {
|
|
10195
|
+
const TabularContent = ({ steps: initialSteps, currentTabValue, children, questions: initialQuestions = [], questionsStepsMap: initialQuestionsStepsMap = {}, stepFormDataMap: initialStepFormDataMap = {}, isFormDisabled = false, sessionId: propSessionId = "", botProps = null, currentMode = "", agentId = "" }) => {
|
|
10177
10196
|
const dispatch = reactRedux.useDispatch();
|
|
10197
|
+
const chatClasses = useStyles$a();
|
|
10178
10198
|
const stepFormStreamData = reactRedux.useSelector((state) => state.smartBotReducer.stepFormStreamData);
|
|
10179
10199
|
const thinkingContext = reactRedux.useSelector((state) => state.smartBotReducer.thinkingContext);
|
|
10180
10200
|
const streamStartTimeRef = React.useRef(thinkingContext?.streamStartTime);
|
|
@@ -10258,40 +10278,55 @@ const TabularContent = ({ steps: initialSteps, currentTabValue, children, questi
|
|
|
10258
10278
|
};
|
|
10259
10279
|
}, []);
|
|
10260
10280
|
// Render a widget item from SSE data
|
|
10281
|
+
const renderWidgetBody = (parsedData, key) => {
|
|
10282
|
+
switch (parsedData.bodyType) {
|
|
10283
|
+
case "text":
|
|
10284
|
+
return jsxRuntime.jsx(TextContent, { bodyText: parsedData.bodyText, botData: parsedData }, key);
|
|
10285
|
+
case "chips":
|
|
10286
|
+
return parsedData.isMultiSelect ? (jsxRuntime.jsx(SelectableChips, { bodyText: parsedData.bodyText, chipType: "selectable", utilityData: parsedData.utilityData, props: botProps }, key)) : (jsxRuntime.jsx(ChipsContent, { bodyText: parsedData.bodyText, props: botProps }, key));
|
|
10287
|
+
case "questions":
|
|
10288
|
+
return jsxRuntime.jsx(QuestionsContent, { bodyText: parsedData.bodyText, props: botProps }, key);
|
|
10289
|
+
case "image":
|
|
10290
|
+
return jsxRuntime.jsx(ImageContent, { bodyText: parsedData.bodyText }, key);
|
|
10291
|
+
case "table":
|
|
10292
|
+
return jsxRuntime.jsx(TableContent, { bodyText: parsedData.bodyText }, key);
|
|
10293
|
+
case "graph":
|
|
10294
|
+
return jsxRuntime.jsx(GraphContent, { bodyText: parsedData.bodyText }, key);
|
|
10295
|
+
case "radio":
|
|
10296
|
+
return jsxRuntime.jsx(RadioContent, { bodyText: parsedData.bodyText, isFormDisabled: isFormDisabled }, key);
|
|
10297
|
+
case "checkbox":
|
|
10298
|
+
return jsxRuntime.jsx(CheckboxContent, { bodyText: parsedData.bodyText, isFormDisabled: isFormDisabled }, key);
|
|
10299
|
+
case "select":
|
|
10300
|
+
return jsxRuntime.jsx(SelectContent, { bodyText: parsedData.bodyText, isFormDisabled: isFormDisabled }, key);
|
|
10301
|
+
case "slider":
|
|
10302
|
+
return jsxRuntime.jsx(SliderContent, { bodyText: parsedData.bodyText, isFormDisabled: isFormDisabled }, key);
|
|
10303
|
+
case "button":
|
|
10304
|
+
return jsxRuntime.jsx(ButtonContent, { bodyText: parsedData.bodyText, isFormDisabled: isFormDisabled }, key);
|
|
10305
|
+
case "input":
|
|
10306
|
+
return jsxRuntime.jsx(InputContent, { bodyText: parsedData.bodyText, isFormDisabled: isFormDisabled }, key);
|
|
10307
|
+
case "datePicker":
|
|
10308
|
+
return jsxRuntime.jsx(DatePickerContent, { bodyText: parsedData.bodyText, isFormDisabled: isFormDisabled }, key);
|
|
10309
|
+
case "dateRangePicker":
|
|
10310
|
+
return jsxRuntime.jsx(DateRangePickerContent, { bodyText: parsedData.bodyText, isFormDisabled: isFormDisabled }, key);
|
|
10311
|
+
case "html":
|
|
10312
|
+
return jsxRuntime.jsx(HtmlContent, { bodyText: parsedData.bodyText }, key);
|
|
10313
|
+
default:
|
|
10314
|
+
return null;
|
|
10315
|
+
}
|
|
10316
|
+
};
|
|
10261
10317
|
const renderWidget = (item, index) => {
|
|
10262
10318
|
try {
|
|
10263
|
-
const parsedData = parseResponse(item, item.type,
|
|
10319
|
+
const parsedData = parseResponse(item, item.type, agentId, currentMode, true, propSessionId);
|
|
10264
10320
|
if (!parsedData)
|
|
10265
10321
|
return null;
|
|
10266
10322
|
const key = `restream-widget-${index}`;
|
|
10267
|
-
|
|
10268
|
-
|
|
10269
|
-
|
|
10270
|
-
|
|
10271
|
-
|
|
10272
|
-
|
|
10273
|
-
|
|
10274
|
-
case "radio":
|
|
10275
|
-
return jsxRuntime.jsx(RadioContent, { bodyText: parsedData.bodyText, isFormDisabled: isFormDisabled }, key);
|
|
10276
|
-
case "checkbox":
|
|
10277
|
-
return jsxRuntime.jsx(CheckboxContent, { bodyText: parsedData.bodyText, isFormDisabled: isFormDisabled }, key);
|
|
10278
|
-
case "select":
|
|
10279
|
-
return jsxRuntime.jsx(SelectContent, { bodyText: parsedData.bodyText, isFormDisabled: isFormDisabled }, key);
|
|
10280
|
-
case "slider":
|
|
10281
|
-
return jsxRuntime.jsx(SliderContent, { bodyText: parsedData.bodyText, isFormDisabled: isFormDisabled }, key);
|
|
10282
|
-
case "button":
|
|
10283
|
-
return jsxRuntime.jsx(ButtonContent, { bodyText: parsedData.bodyText, isFormDisabled: isFormDisabled }, key);
|
|
10284
|
-
case "input":
|
|
10285
|
-
return jsxRuntime.jsx(InputContent, { bodyText: parsedData.bodyText, isFormDisabled: isFormDisabled }, key);
|
|
10286
|
-
case "datePicker":
|
|
10287
|
-
return jsxRuntime.jsx(DatePickerContent, { bodyText: parsedData.bodyText, isFormDisabled: isFormDisabled }, key);
|
|
10288
|
-
case "dateRangePicker":
|
|
10289
|
-
return jsxRuntime.jsx(DateRangePickerContent, { bodyText: parsedData.bodyText, isFormDisabled: isFormDisabled }, key);
|
|
10290
|
-
case "html":
|
|
10291
|
-
return jsxRuntime.jsx(HtmlContent, { bodyText: parsedData.bodyText }, key);
|
|
10292
|
-
default:
|
|
10293
|
-
return null;
|
|
10294
|
-
}
|
|
10323
|
+
const body = renderWidgetBody(parsedData, key);
|
|
10324
|
+
if (!body)
|
|
10325
|
+
return null;
|
|
10326
|
+
const showHeaderTitle = !parsedData?.noShowHeaderTitle && Boolean(parsedData?.headerTitle?.length);
|
|
10327
|
+
if (!showHeaderTitle)
|
|
10328
|
+
return body;
|
|
10329
|
+
return (jsxRuntime.jsxs(React.Fragment, { children: [jsxRuntime.jsx("div", { className: `${chatClasses.chatbotText} ${chatClasses.boldText} ${chatClasses.combinedBlockHeaderTitle}`, children: parsedData.headerTitle }), body] }, `restream-widget-block-${index}`));
|
|
10295
10330
|
}
|
|
10296
10331
|
catch (e) {
|
|
10297
10332
|
console.error("[TabularContent] renderWidget error:", e);
|
|
@@ -10660,9 +10695,10 @@ const CombinedContent = ({ botData, props }) => {
|
|
|
10660
10695
|
const isTabEnabled = botData?.utilityData?.isTabEnabled;
|
|
10661
10696
|
// Get the array of content items from bodyText
|
|
10662
10697
|
const contentItems = Array.isArray(botData.bodyText) ? botData.bodyText : [];
|
|
10663
|
-
// Renders the optional block-level header title above a content item
|
|
10698
|
+
// Renders the optional block-level header title above a content item.
|
|
10664
10699
|
const renderHeaderTitle = (parsedData) => {
|
|
10665
|
-
const showHeaderTitle = !parsedData?.noShowHeaderTitle &&
|
|
10700
|
+
const showHeaderTitle = !parsedData?.noShowHeaderTitle &&
|
|
10701
|
+
Boolean(parsedData?.headerTitle?.length);
|
|
10666
10702
|
if (!showHeaderTitle)
|
|
10667
10703
|
return null;
|
|
10668
10704
|
return (jsxRuntime.jsx("div", { className: `${classes.chatbotText} ${classes.boldText} ${classes.combinedBlockHeaderTitle}`, children: parsedData.headerTitle }));
|
|
@@ -10731,7 +10767,7 @@ const CombinedContent = ({ botData, props }) => {
|
|
|
10731
10767
|
const validContent = renderedContent.filter(content => content !== null);
|
|
10732
10768
|
const renderCombinedContent = () => (jsxRuntime.jsx("div", { className: "combined-content-container", children: validContent.length > 0 ? (validContent.map((content, index) => (jsxRuntime.jsx("div", { className: "combined-content-item", children: content }, `wrapper-${index}`)))) : (jsxRuntime.jsx("div", { children: "No valid content to display" })) }));
|
|
10733
10769
|
if (isTabEnabled) {
|
|
10734
|
-
return (jsxRuntime.jsx(TabularContent, { steps: botData?.utilityData?.steps || [], currentTabValue: botData?.utilityData?.currentTabValue || "steps", questions: botData?.utilityData?.questions || [], questionsStepsMap: botData?.utilityData?.questionsStepsMap || {}, stepFormDataMap: botData?.utilityData?.stepFormDataMap || {}, isFormDisabled: isFormDisabled, sessionId: botData?.sessionId || "", children: renderCombinedContent() }));
|
|
10770
|
+
return (jsxRuntime.jsx(TabularContent, { steps: botData?.utilityData?.steps || [], currentTabValue: botData?.utilityData?.currentTabValue || "steps", questions: botData?.utilityData?.questions || [], questionsStepsMap: botData?.utilityData?.questionsStepsMap || {}, stepFormDataMap: botData?.utilityData?.stepFormDataMap || {}, isFormDisabled: isFormDisabled, sessionId: botData?.sessionId || "", botProps: props, currentMode: botData?.currentMode || "", agentId: botData?.agentId || "", children: renderCombinedContent() }));
|
|
10735
10771
|
}
|
|
10736
10772
|
return renderCombinedContent();
|
|
10737
10773
|
};
|
|
@@ -10770,7 +10806,7 @@ const BotMessage = ({ botData, state, handleLikeDislike, props }) => {
|
|
|
10770
10806
|
case "text":
|
|
10771
10807
|
return jsxRuntime.jsx(TextContent, { bodyText: botData.bodyText, botData: botData });
|
|
10772
10808
|
case "stream":
|
|
10773
|
-
return jsxRuntime.jsx(StreamedContent, { botData: botData });
|
|
10809
|
+
return jsxRuntime.jsx(StreamedContent, { botData: botData, botProps: props });
|
|
10774
10810
|
case "chips":
|
|
10775
10811
|
if (botData.isMultiSelect) {
|
|
10776
10812
|
return (jsxRuntime.jsx(SelectableChips, { bodyText: botData.bodyText, utilityData: botData.utilityData, props: props }));
|
|
@@ -15159,6 +15195,13 @@ const SmartBot = (props) => {
|
|
|
15159
15195
|
// );
|
|
15160
15196
|
// return;
|
|
15161
15197
|
// } else {
|
|
15198
|
+
// The library re-fires the `initialClick` tab's onClick from an
|
|
15199
|
+
// effect whose deps (tabList/menuItems/onChatBotResize) are
|
|
15200
|
+
// recreated on every render. Track the previous tab so we only
|
|
15201
|
+
// reset transient state on a real tab change - otherwise these
|
|
15202
|
+
// spurious re-invocations wipe isStop mid-stream and hide the
|
|
15203
|
+
// cancel execution button.
|
|
15204
|
+
const previousActiveTab = activeTab.current.activeTab;
|
|
15162
15205
|
setShowSavedFilters(false);
|
|
15163
15206
|
const agentConversations = chatDataInfoRef?.current[params?.name?.toLowerCase()]?.conversations;
|
|
15164
15207
|
const firstConversationId = agentConversations ? Object.keys(agentConversations)[0] : undefined;
|
|
@@ -15177,7 +15220,9 @@ const SmartBot = (props) => {
|
|
|
15177
15220
|
localStorage.setItem("currentModeData", params?.name?.toLowerCase());
|
|
15178
15221
|
setNewChatScreen(false);
|
|
15179
15222
|
activeTab.current.activeTab = "agent";
|
|
15180
|
-
|
|
15223
|
+
if (previousActiveTab !== "agent") {
|
|
15224
|
+
setIsStop(false);
|
|
15225
|
+
}
|
|
15181
15226
|
// }
|
|
15182
15227
|
// setConversation([]);
|
|
15183
15228
|
// chatDataInfoRef.current[currentMode] = [];
|
|
@@ -15196,6 +15241,8 @@ const SmartBot = (props) => {
|
|
|
15196
15241
|
// );
|
|
15197
15242
|
// return;
|
|
15198
15243
|
// } else {
|
|
15244
|
+
// Only reset transient state on a real tab change.
|
|
15245
|
+
const previousActiveTab = activeTab.current.activeTab;
|
|
15199
15246
|
setShowSavedFilters(false);
|
|
15200
15247
|
let currentModeValue = params?.name?.toLowerCase();
|
|
15201
15248
|
const modeConversations = chatDataInfoRef?.current[currentModeValue]?.conversations;
|
|
@@ -15219,7 +15266,9 @@ const SmartBot = (props) => {
|
|
|
15219
15266
|
chatDataInfoRef.current = lodash.cloneDeep(parsedData);
|
|
15220
15267
|
}
|
|
15221
15268
|
// setNewChatScreen(true);
|
|
15222
|
-
|
|
15269
|
+
if (previousActiveTab !== "navigation") {
|
|
15270
|
+
setIsStop(false);
|
|
15271
|
+
}
|
|
15223
15272
|
setCurrentMode(params?.name?.toLowerCase());
|
|
15224
15273
|
if (firstConversationId) {
|
|
15225
15274
|
setActiveConversationId(firstConversationId);
|
|
@@ -15288,6 +15337,9 @@ const SmartBot = (props) => {
|
|
|
15288
15337
|
// );
|
|
15289
15338
|
// return;
|
|
15290
15339
|
// } else {
|
|
15340
|
+
// Only reset transient state on a real tab change - the library
|
|
15341
|
+
// re-fires this initialClick handler on every render.
|
|
15342
|
+
const previousActiveTab = activeTab.current.activeTab;
|
|
15291
15343
|
setShowSavedFilters(false);
|
|
15292
15344
|
let currentModeValue = params?.name?.toLowerCase();
|
|
15293
15345
|
const modeConversations = chatDataInfoRef?.current[currentModeValue]?.conversations;
|
|
@@ -15311,7 +15363,9 @@ const SmartBot = (props) => {
|
|
|
15311
15363
|
chatDataInfoRef.current = lodash.cloneDeep(parsedData);
|
|
15312
15364
|
}
|
|
15313
15365
|
// setNewChatScreen(true);
|
|
15314
|
-
|
|
15366
|
+
if (previousActiveTab !== "navigation") {
|
|
15367
|
+
setIsStop(false);
|
|
15368
|
+
}
|
|
15315
15369
|
setCurrentMode(params?.name?.toLowerCase());
|
|
15316
15370
|
if (firstConversationId) {
|
|
15317
15371
|
setActiveConversationId(firstConversationId);
|
|
@@ -15342,6 +15396,9 @@ const SmartBot = (props) => {
|
|
|
15342
15396
|
// );
|
|
15343
15397
|
// return;
|
|
15344
15398
|
// } else {
|
|
15399
|
+
// Only reset transient state on a real tab change - the library
|
|
15400
|
+
// re-fires this initialClick handler on every render.
|
|
15401
|
+
const previousActiveTab = activeTab.current.activeTab;
|
|
15345
15402
|
setShowSavedFilters(false);
|
|
15346
15403
|
let currentModeValue = params?.name?.toLowerCase();
|
|
15347
15404
|
const modeConversations = chatDataInfoRef?.current[currentModeValue]?.conversations;
|
|
@@ -15365,7 +15422,9 @@ const SmartBot = (props) => {
|
|
|
15365
15422
|
chatDataInfoRef.current = lodash.cloneDeep(parsedData);
|
|
15366
15423
|
}
|
|
15367
15424
|
// setNewChatScreen(true);
|
|
15368
|
-
|
|
15425
|
+
if (previousActiveTab !== "navigation") {
|
|
15426
|
+
setIsStop(false);
|
|
15427
|
+
}
|
|
15369
15428
|
setCurrentMode(params?.name?.toLowerCase());
|
|
15370
15429
|
if (firstConversationId) {
|
|
15371
15430
|
setActiveConversationId(firstConversationId);
|