@rh-support/troubleshoot 2.6.22 → 2.6.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/lib/esm/components/CaseEditView/ActiveCustomerEscalation/ActiveCustomerEscalation.d.ts +1 -0
  2. package/lib/esm/components/CaseEditView/ActiveCustomerEscalation/ActiveCustomerEscalation.d.ts.map +1 -1
  3. package/lib/esm/components/CaseEditView/ActiveCustomerEscalation/ActiveCustomerEscalation.js +31 -5
  4. package/lib/esm/components/CaseEditView/ActiveCustomerEscalation/RequestEscalationModal.d.ts.map +1 -1
  5. package/lib/esm/components/CaseEditView/ActiveCustomerEscalation/RequestEscalationModal.js +33 -34
  6. package/lib/esm/components/CaseEditView/CaseDetailsAside.d.ts.map +1 -1
  7. package/lib/esm/components/CaseEditView/CaseDetailsAside.js +2 -1
  8. package/lib/esm/components/CaseEditView/CaseDetailsTabs.d.ts.map +1 -1
  9. package/lib/esm/components/CaseEditView/CaseDetailsTabs.js +1 -0
  10. package/lib/esm/components/CaseEditView/ConfirmationModals/ReopenCaseModal.d.ts.map +1 -1
  11. package/lib/esm/components/CaseEditView/ConfirmationModals/ReopenCaseModal.js +16 -22
  12. package/lib/esm/components/CaseEditView/RequestRemoteSession/NewEssTermsModal.d.ts.map +1 -1
  13. package/lib/esm/components/CaseEditView/RequestRemoteSession/NewEssTermsModal.js +52 -96
  14. package/lib/esm/components/CaseEditView/RequestRemoteSession/RemoteSessionAgreementModal.d.ts.map +1 -1
  15. package/lib/esm/components/CaseEditView/RequestRemoteSession/RemoteSessionAgreementModal.js +24 -21
  16. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseHostname.js +4 -2
  17. package/lib/esm/components/CaseEditView/Tabs/CaseHistory/Timeline.css +0 -8
  18. package/lib/esm/components/CaseInformation/Fts.d.ts.map +1 -1
  19. package/lib/esm/components/CaseInformation/Fts.js +6 -2
  20. package/lib/esm/components/CaseInformation/Severity.js +1 -1
  21. package/lib/esm/components/CaseInformation/SupportLevel.d.ts.map +1 -1
  22. package/lib/esm/components/CaseInformation/SupportLevel.js +1 -1
  23. package/lib/esm/components/CaseManagement/OpenshiftDropdownV4.d.ts.map +1 -1
  24. package/lib/esm/components/CaseManagement/OpenshiftDropdownV4.js +1 -13
  25. package/lib/esm/components/CaseManagement/RHAssociatesSelector.d.ts.map +1 -1
  26. package/lib/esm/components/CaseManagement/RHAssociatesSelector.js +5 -8
  27. package/lib/esm/components/CaseManagement/SendNotifications/CaseContactSelector.d.ts.map +1 -1
  28. package/lib/esm/components/CaseManagement/SendNotifications/CaseContactSelector.js +7 -7
  29. package/lib/esm/components/CaseManagement/SendNotifications/NonOrgCaseNotifyeesSelector.d.ts.map +1 -1
  30. package/lib/esm/components/CaseManagement/SendNotifications/NonOrgCaseNotifyeesSelector.js +1 -1
  31. package/lib/esm/components/Cve/CveModal.d.ts.map +1 -1
  32. package/lib/esm/components/Cve/CveModal.js +2 -3
  33. package/lib/esm/components/ProductSelector/NewProductDropdownSelector.d.ts.map +1 -1
  34. package/lib/esm/components/ProductSelector/NewProductDropdownSelector.js +1 -10
  35. package/lib/esm/components/Recommendations/AsideResults.js +1 -1
  36. package/lib/esm/components/Recommendations/ClusterRecommendationsModal.d.ts.map +1 -1
  37. package/lib/esm/components/Recommendations/ClusterRecommendationsModal.js +4 -7
  38. package/lib/esm/components/Recommendations/EARules/EARuleInfoAccordion.d.ts.map +1 -1
  39. package/lib/esm/components/Recommendations/EARules/EARuleInfoAccordion.js +1 -3
  40. package/lib/esm/components/Recommendations/InsightsRuleInfo.d.ts.map +1 -1
  41. package/lib/esm/components/Recommendations/InsightsRuleInfo.js +2 -9
  42. package/lib/esm/components/Recommendations/RecommendationFeedbackModal.d.ts.map +1 -1
  43. package/lib/esm/components/Recommendations/RecommendationFeedbackModal.js +4 -4
  44. package/lib/esm/components/Recommendations/RulesModal.d.ts.map +1 -1
  45. package/lib/esm/components/Recommendations/RulesModal.js +4 -7
  46. package/lib/esm/components/Recommendations/WatsonxAiIcon.js +1 -1
  47. package/lib/esm/components/Suggestions/Suggestions.d.ts.map +1 -1
  48. package/lib/esm/components/Suggestions/Suggestions.js +12 -17
  49. package/lib/esm/components/Suggestions/TopContent.d.ts.map +1 -1
  50. package/lib/esm/components/Suggestions/TopContent.js +13 -13
  51. package/lib/esm/components/TroubleshootSection/AskRedHat.d.ts +7 -0
  52. package/lib/esm/components/TroubleshootSection/AskRedHat.d.ts.map +1 -0
  53. package/lib/esm/components/TroubleshootSection/AskRedHat.js +73 -0
  54. package/lib/esm/components/TroubleshootSection/TroubleshootSection.d.ts +5 -0
  55. package/lib/esm/components/TroubleshootSection/TroubleshootSection.d.ts.map +1 -1
  56. package/lib/esm/components/TroubleshootSection/TroubleshootSection.js +86 -13
  57. package/lib/esm/components/TroubleshootSection/icons/CollapseIcon.d.ts +9 -0
  58. package/lib/esm/components/TroubleshootSection/icons/CollapseIcon.d.ts.map +1 -0
  59. package/lib/esm/components/TroubleshootSection/icons/CollapseIcon.js +9 -0
  60. package/lib/esm/components/TroubleshootSection/icons/StarIcon.d.ts +9 -0
  61. package/lib/esm/components/TroubleshootSection/icons/StarIcon.d.ts.map +1 -0
  62. package/lib/esm/components/TroubleshootSection/icons/StarIcon.js +17 -0
  63. package/lib/esm/components/shared/input/ContactSelectorInternal.d.ts +0 -1
  64. package/lib/esm/components/shared/input/ContactSelectorInternal.d.ts.map +1 -1
  65. package/lib/esm/components/shared/input/ContactSelectorInternal.js +1 -6
  66. package/lib/esm/components/wizardLayout/GlobalTroubleshootEffects.d.ts.map +1 -1
  67. package/lib/esm/components/wizardLayout/GlobalTroubleshootEffects.js +1 -3
  68. package/lib/esm/components/wizardLayout/WizardLayout.d.ts.map +1 -1
  69. package/lib/esm/components/wizardLayout/WizardLayout.js +5 -4
  70. package/lib/esm/components/wizardLayout/WizardMain.d.ts +3 -1
  71. package/lib/esm/components/wizardLayout/WizardMain.d.ts.map +1 -1
  72. package/lib/esm/components/wizardLayout/WizardMain.js +127 -19
  73. package/lib/esm/components/wizardLayout/WizardNavigation.d.ts +4 -2
  74. package/lib/esm/components/wizardLayout/WizardNavigation.d.ts.map +1 -1
  75. package/lib/esm/components/wizardLayout/WizardNavigation.js +13 -16
  76. package/lib/esm/components/wizardLayout/index.d.ts +1 -0
  77. package/lib/esm/components/wizardLayout/index.d.ts.map +1 -1
  78. package/lib/esm/components/wizardLayout/index.js +1 -0
  79. package/lib/esm/context/AIResponseContext.d.ts +10 -0
  80. package/lib/esm/context/AIResponseContext.d.ts.map +1 -0
  81. package/lib/esm/context/AIResponseContext.js +26 -0
  82. package/lib/esm/context/RootTroubleshootProvider.d.ts.map +1 -1
  83. package/lib/esm/context/RootTroubleshootProvider.js +8 -6
  84. package/lib/esm/css/AskRedHat.css +333 -0
  85. package/lib/esm/css/app.css +4 -5
  86. package/lib/esm/css/case.css +0 -12
  87. package/lib/esm/hooks/useWizard.d.ts +4 -0
  88. package/lib/esm/hooks/useWizard.d.ts.map +1 -1
  89. package/lib/esm/hooks/useWizard.js +1 -1
  90. package/lib/esm/reducers/AIResponseConstNTypes.d.ts +48 -0
  91. package/lib/esm/reducers/AIResponseConstNTypes.d.ts.map +1 -0
  92. package/lib/esm/reducers/AIResponseConstNTypes.js +16 -0
  93. package/lib/esm/reducers/AIResponseReducer.d.ts +9 -0
  94. package/lib/esm/reducers/AIResponseReducer.d.ts.map +1 -0
  95. package/lib/esm/reducers/AIResponseReducer.js +43 -0
  96. package/lib/esm/reducers/CaseConstNTypes.d.ts +2 -0
  97. package/lib/esm/reducers/CaseConstNTypes.d.ts.map +1 -1
  98. package/lib/esm/reducers/CaseConstNTypes.js +2 -0
  99. package/lib/esm/scss/_main.scss +0 -13
  100. package/lib/esm/scss/_pf-overrides.scss +0 -10
  101. package/package.json +7 -6
@@ -1,3 +1,12 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
1
10
  var __rest = (this && this.__rest) || function (s, e) {
2
11
  var t = {};
3
12
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
@@ -9,16 +18,20 @@ var __rest = (this && this.__rest) || function (s, e) {
9
18
  }
10
19
  return t;
11
20
  };
12
- import { Wizard, WizardNav, WizardNavItem, WizardStep, } from '@patternfly/react-core';
21
+ import { askRHDirectAIResponse, getRHDirectStatusCheck, } from '@ifd-ui/ask-redhat-core';
22
+ import { useWizardContext, Wizard, WizardNav, WizardNavItem, WizardStep } from '@patternfly/react-core';
13
23
  import { LoadingIndicator } from '@rh-support/components';
14
24
  import isEqual from 'lodash/isEqual';
15
25
  import React, { Suspense, useContext, useEffect, useRef, useState } from 'react';
16
26
  import { useTranslation } from 'react-i18next';
17
27
  import { Route } from 'react-router-dom';
28
+ import { useAIResponseDispatch } from '../../context/AIResponseContext';
18
29
  import { useCaseSelector } from '../../context/CaseContext';
19
30
  import { RecommendationDispatchContext } from '../../context/RecommendationContext';
20
31
  import { RouteContext, RouteDispatchContext } from '../../context/RouteContext';
21
32
  import { useWizard } from '../../hooks/useWizard';
33
+ import { receivedAIResponse, receivedAIResponseError, requestAIResponse } from '../../reducers/AIResponseReducer';
34
+ import { appSourceId_ARH, excludedCaseTypesforARH } from '../../reducers/CaseConstNTypes';
22
35
  import { RecommendationsConstants } from '../../reducers/RecommendationsReducer';
23
36
  import { AppRouteSections } from '../../reducers/RouteConstNTypes';
24
37
  import { setActiveSectionChanged, updateisNextBtnClickedToShowValidationError } from '../../reducers/RouteReducer';
@@ -27,22 +40,54 @@ import SubmitCase from '../SubmitCase/SubmitCase';
27
40
  import MainSection from './MainSection';
28
41
  import NewFeatureModal from './NewFeatureModal';
29
42
  import WizardNavigation from './WizardNavigation';
43
+ // Mapping for case type display text in AI questions
44
+ const CASE_TYPE_AI_TEXT_MAP = {
45
+ Other: 'Something',
46
+ };
47
+ const getCaseTypeAIText = (caseType) => {
48
+ return CASE_TYPE_AI_TEXT_MAP[caseType] || caseType;
49
+ };
50
+ const generateCaseTypePrefix = (activeSection, caseType) => {
51
+ if (activeSection === AppRouteSections.TROUBLESHOOT) {
52
+ return '';
53
+ }
54
+ const helpWith = getCaseTypeAIText(caseType);
55
+ return `I want help with ${helpWith}. `;
56
+ };
57
+ //generate AI question based on case details
58
+ const generateAIQuestion = (activeSection, product, version, summary, issue, caseType) => {
59
+ const baseMessage = `My issue is primarily related to ${product} ${version}. I would title my problem: ${summary}. More details are as follows: ${issue}.`;
60
+ const prefix = generateCaseTypePrefix(activeSection, caseType);
61
+ return `${prefix}${baseMessage}`;
62
+ };
30
63
  function WizardMain(props) {
31
64
  const [showRestFlag, setShowRestFlag] = useState(false);
65
+ const [aiServicesAvailable, setAIServicesAvailable] = useState(false); // default to false until services are confirmed available
32
66
  const recommendationDispatch = useContext(RecommendationDispatchContext);
33
- const { isCreatingCase } = useCaseSelector((state) => ({
67
+ const { isCreatingCase, product, version, summary, issue, caseType } = useCaseSelector((state) => ({
34
68
  isCreatingCase: state.isCreatingCase,
69
+ product: state.caseDetails.product,
70
+ version: state.caseDetails.version,
71
+ summary: state.caseDetails.summary,
72
+ issue: state.caseDetails.issue,
73
+ caseType: state.caseDetails.caseType,
35
74
  }), isEqual);
36
- const { routeState: { isCaseCreate }, } = useContext(RouteContext);
75
+ const { routeState: { isCaseCreate, activeSection }, } = useContext(RouteContext);
76
+ const aiResponseDispatch = useAIResponseDispatch();
77
+ const isTroubleshootSection = activeSection === AppRouteSections.TROUBLESHOOT;
78
+ const isResourcesSection = activeSection === AppRouteSections.RESOURCES;
79
+ const isSummarizeSection = activeSection === AppRouteSections.SUMMARIZE;
37
80
  const [userSeenRecommendations, setUserSeenRecommendations] = useState(false);
38
81
  const [userClickedNextonRecommendations, setUserClickedNextonRecommendations] = useState(false);
39
82
  const [userScrolledLabel, setUserScrolledLabel] = useState(false);
40
83
  const [userCanNavigateToTroubleshoot, setUserCanNavigateToTroubleshoot] = useState(false);
41
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
42
- const [_, setIsNextButtonClicked] = useState(false);
84
+ const [isNextButtonClicked, setIsNextButtonClicked] = useState(false);
43
85
  const isNextButtonClickedRef = useRef(false);
44
86
  const isBackButtonClickedRef = useRef(false);
45
87
  const resultsRowRef = useRef(null);
88
+ const handleChatWithAIClick = () => {
89
+ props.setIsAIChatMode(true);
90
+ };
46
91
  const { getStepsSequece } = useWizard(props.routeProps, {
47
92
  userSeenRecommendationsfn: setUserSeenRecommendations,
48
93
  userSeenRecommendationsValue: userSeenRecommendations,
@@ -50,12 +95,48 @@ function WizardMain(props) {
50
95
  userClickedNextonRecommendationsValue: userClickedNextonRecommendations,
51
96
  resultsRowRef: resultsRowRef,
52
97
  userScrolledLabel: userScrolledLabel,
98
+ isAIChatMode: props.isAIChatMode,
99
+ setIsAIChatMode: props.setIsAIChatMode,
100
+ onChatWithAIClick: handleChatWithAIClick,
101
+ aiServicesAvailable: aiServicesAvailable,
53
102
  });
54
103
  const dispatchToRouteReducer = useContext(RouteDispatchContext);
55
104
  const { t } = useTranslation();
56
105
  useEffect(() => {
57
106
  setActiveSectionChanged(dispatchToRouteReducer, isCaseCreate ? AppRouteSections.GET_SUPPORT : AppRouteSections.TROUBLESHOOT, '');
58
107
  }, [isCaseCreate, dispatchToRouteReducer]);
108
+ useEffect(() => {
109
+ if (!activeSection) {
110
+ return;
111
+ }
112
+ const isRelevantSection = isTroubleshootSection || isSummarizeSection || isResourcesSection;
113
+ const isAllowedCaseType = !excludedCaseTypesforARH.includes(caseType || '');
114
+ if (!isRelevantSection || !isAllowedCaseType) {
115
+ if (aiServicesAvailable) {
116
+ setAIServicesAvailable(false);
117
+ }
118
+ return;
119
+ }
120
+ // check if ARH services are available
121
+ if (!aiServicesAvailable) {
122
+ const checkAIServices = () => __awaiter(this, void 0, void 0, function* () {
123
+ var _a, _b;
124
+ const config = {
125
+ appSourceId: appSourceId_ARH,
126
+ authToken: (_b = (_a = window === null || window === void 0 ? void 0 : window.sessionjs) === null || _a === void 0 ? void 0 : _a.getEncodedToken()) !== null && _b !== void 0 ? _b : '',
127
+ };
128
+ try {
129
+ yield getRHDirectStatusCheck(config);
130
+ setAIServicesAvailable(true);
131
+ }
132
+ catch (error) {
133
+ setAIServicesAvailable(false);
134
+ }
135
+ });
136
+ checkAIServices();
137
+ }
138
+ // eslint-disable-next-line react-hooks/exhaustive-deps
139
+ }, [activeSection, caseType, isCaseCreate, aiServicesAvailable]);
59
140
  const renderSubmitCasePage = () => (React.createElement(MainSection, { section: AppRouteSections.SUBMIT_CASE, title: t('Case has been submitted'), isLoading: isCreatingCase, description: t("We'll be in contact with you shortly. Look for updates on this case."), className: "case-submit-page" },
60
141
  React.createElement(Suspense, { fallback: React.createElement(LoadingIndicator, { size: "sm" }) },
61
142
  React.createElement(SubmitCase, { routeProps: props.routeProps }))));
@@ -100,25 +181,52 @@ function WizardMain(props) {
100
181
  isBackButtonClickedRef.current = false;
101
182
  setIsNextButtonClicked(false);
102
183
  };
184
+ const handleReturnToCaseCreation = () => {
185
+ props.setIsAIChatMode(false);
186
+ };
103
187
  const customNav = (isExpanded, steps, activeStep, goToStepByIndex) => (React.createElement(WizardNav, { isExpanded: isExpanded }, steps.map((step) => {
104
188
  return (React.createElement(WizardNavItem, { key: step.id, id: step.id, content: step.name, isCurrent: activeStep.id === step.id, isDisabled: !step.canJumpTo, stepIndex: step.index, onClick: () => goToStepByIndex(step.index) }));
105
189
  })));
106
- // const { activeStep, steps: wizardContextSteps, goToStepByIndex } = useWizardContext(); // Correctly using the context
107
- // useEffect(() => {
108
- // if (wizardContextSteps?.length > 2 && activeStep?.index === 2 && isNextButtonClicked) {
109
- // goToStepByIndex(3);
110
- // }
111
- // }, [activeStep, wizardContextSteps?.length, goToStepByIndex, isNextButtonClicked]);
112
- const CustomFooter = (activeStep, goToNextStep, goToPrevStep) => (React.createElement(WizardNavigation, { routeProps: props.routeProps, onNext: (e) => {
190
+ const CustomFooter = () => {
191
+ var _a, _b;
192
+ const { activeStep, goToNextStep, goToPrevStep, steps, goToStepByIndex } = useWizardContext(); // Correctly using the context
193
+ const config = {
194
+ appSourceId: appSourceId_ARH,
195
+ authToken: (_b = (_a = window === null || window === void 0 ? void 0 : window.sessionjs) === null || _a === void 0 ? void 0 : _a.getEncodedToken()) !== null && _b !== void 0 ? _b : '',
196
+ };
197
+ useEffect(() => {
198
+ if (steps.length > 2 && activeStep.index === 2 && isNextButtonClicked) {
199
+ goToStepByIndex(3);
200
+ }
201
+ }, [activeStep, steps.length, goToStepByIndex]);
202
+ const handleContinueClick = () => __awaiter(this, void 0, void 0, function* () {
203
+ const shouldCallAPI = (isTroubleshootSection || isSummarizeSection) && !excludedCaseTypesforARH.includes(caseType || '');
204
+ // Navigate to next step first
113
205
  isNextButtonClickedRef.current = true;
114
206
  setIsNextButtonClicked(true);
115
- goToNextStep(e);
116
- focusWizardMainPanel();
117
- }, onBack: (e) => {
118
- isBackButtonClickedRef.current = true;
119
- goToPrevStep(e);
207
+ goToNextStep();
120
208
  focusWizardMainPanel();
121
- }, activeStep: activeStep, onSubmit: onSubmit, confirmSupportModal: props.confirmSupportModal, onShowRestUpdate: (flag) => setShowRestFlag(flag), userSeenRecommendations: userSeenRecommendations, setUserSeenRecommendations: setUserSeenRecommendations, userClickedNextonRecommendationsFn: setUserClickedNextonRecommendations, userClickedNextonRecommendationsValue: userClickedNextonRecommendations, setUserCanNavigateToTroubleshoot: setUserCanNavigateToTroubleshoot, resultsRowRef: resultsRowRef, setUserScrolledLabel: setUserScrolledLabel }));
209
+ if (shouldCallAPI) {
210
+ const detailedQuestion = generateAIQuestion(activeSection, product, version, summary, issue, caseType || '');
211
+ const useAIServices = aiServicesAvailable;
212
+ if (useAIServices) {
213
+ aiResponseDispatch(requestAIResponse(detailedQuestion));
214
+ try {
215
+ const response = yield askRHDirectAIResponse(detailedQuestion, config);
216
+ aiResponseDispatch(receivedAIResponse(response));
217
+ }
218
+ catch (error) {
219
+ aiResponseDispatch(receivedAIResponseError((error === null || error === void 0 ? void 0 : error.message) || 'Failed to get AI response'));
220
+ }
221
+ }
222
+ }
223
+ });
224
+ return (React.createElement(WizardNavigation, { routeProps: props.routeProps, onNext: handleContinueClick, onBack: () => {
225
+ isBackButtonClickedRef.current = true;
226
+ goToPrevStep();
227
+ focusWizardMainPanel();
228
+ }, activeStep: activeStep, onSubmit: onSubmit, confirmSupportModal: props.confirmSupportModal, onShowRestUpdate: (flag) => setShowRestFlag(flag), userSeenRecommendations: userSeenRecommendations, setUserSeenRecommendations: setUserSeenRecommendations, userClickedNextonRecommendationsFn: setUserClickedNextonRecommendations, userClickedNextonRecommendationsValue: userClickedNextonRecommendations, setUserCanNavigateToTroubleshoot: setUserCanNavigateToTroubleshoot, resultsRowRef: resultsRowRef, setUserScrolledLabel: setUserScrolledLabel, isAIChatMode: props.isAIChatMode, onReturnToCaseCreation: handleReturnToCaseCreation }));
229
+ };
122
230
  const steps = getStepsSequece(showRestFlag);
123
231
  const wizardSteps = steps.map((step) => {
124
232
  const { component } = step, rest = __rest(step, ["component"]);
@@ -128,7 +236,7 @@ function WizardMain(props) {
128
236
  // in useWizard file then add it to step squences in RouteConstNTypes
129
237
  return (React.createElement(React.Fragment, null,
130
238
  React.createElement(NewFeatureModal, null),
131
- steps.length !== 0 && (React.createElement(Route, { path: `${RouteUtils.seBasePath}/(${steps[0].id}|describe-issue|open-case)`, render: () => (React.createElement(Wizard, { isVisitRequired: true, nav: customNav, navAriaLabel: ` navAriaLabel steps `, footer: CustomFooter, onStepChange: onCurrentStepChanged }, wizardSteps)) })),
239
+ steps.length !== 0 && (React.createElement(Route, { path: `${RouteUtils.seBasePath}/(${steps[0].id}|describe-issue|open-case)`, render: () => (React.createElement(Wizard, { isVisitRequired: true, nav: customNav, navAriaLabel: ` navAriaLabel steps `, footer: React.createElement(CustomFooter, null), onStepChange: onCurrentStepChanged }, wizardSteps)) })),
132
240
  React.createElement(Route, { exact: true, path: `${RouteUtils.seBasePath}/${AppRouteSections.SUBMIT_CASE}`, render: () => renderSubmitCasePage() })));
133
241
  }
134
242
  export default WizardMain;
@@ -3,8 +3,8 @@ import { RouteComponentProps } from 'react-router-dom';
3
3
  import { IRouteUrlParams, ISectionConfiguration } from '../../reducers/RouteConstNTypes';
4
4
  interface IProps {
5
5
  routeProps: RouteComponentProps<IRouteUrlParams>;
6
- onNext: (e: React.MouseEvent<HTMLButtonElement>) => void;
7
- onBack: (e: React.MouseEvent<HTMLButtonElement>) => void;
6
+ onNext: () => void;
7
+ onBack: () => void;
8
8
  activeStep: Partial<ISectionConfiguration>;
9
9
  onSubmit: () => void;
10
10
  confirmSupportModal: (hasPreferredSecureSupportAccount: boolean) => void;
@@ -16,6 +16,8 @@ interface IProps {
16
16
  setUserCanNavigateToTroubleshoot: (value: React.SetStateAction<boolean>) => void;
17
17
  resultsRowRef?: any;
18
18
  setUserScrolledLabel: (value: React.SetStateAction<boolean>) => void;
19
+ isAIChatMode?: boolean;
20
+ onReturnToCaseCreation?: () => void;
19
21
  }
20
22
  declare function WizardNavigation(props: IProps): React.JSX.Element;
21
23
  declare namespace WizardNavigation {
@@ -1 +1 @@
1
- {"version":3,"file":"WizardNavigation.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/WizardNavigation.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAOvD,OAAO,EAAoB,eAAe,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAM3G,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACzD,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACzD,UAAU,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC3C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,mBAAmB,EAAE,CAAC,gCAAgC,EAAE,OAAO,KAAK,IAAI,CAAC;IACzE,gBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,0BAA0B,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IAC5E,kCAAkC,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACpF,qCAAqC,CAAC,EAAE,OAAO,CAAC;IAChD,gCAAgC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACjF,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,oBAAoB,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;CACxE;AAGD,iBAAS,gBAAgB,CAAC,KAAK,EAAE,MAAM,qBA8UtC;kBA9UQ,gBAAgB;;;AAgVzB,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"WizardNavigation.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/WizardNavigation.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAOvD,OAAO,EAAoB,eAAe,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAM3G,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjD,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC3C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,mBAAmB,EAAE,CAAC,gCAAgC,EAAE,OAAO,KAAK,IAAI,CAAC;IACzE,gBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,0BAA0B,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IAC5E,kCAAkC,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACpF,qCAAqC,CAAC,EAAE,OAAO,CAAC;IAChD,gCAAgC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACjF,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,oBAAoB,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACrE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sBAAsB,CAAC,EAAE,MAAM,IAAI,CAAC;CACvC;AAGD,iBAAS,gBAAgB,CAAC,KAAK,EAAE,MAAM,qBAiVtC;kBAjVQ,gBAAgB;;;AAmVzB,eAAe,gBAAgB,CAAC"}
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import { pcm } from '@cee-eng/hydrajs';
11
11
  import { Button, ButtonVariant, WizardFooterWrapper } from '@patternfly/react-core';
12
- import { useFetch, usePrevious } from '@rh-support/components';
12
+ import { useFetch } from '@rh-support/components';
13
13
  import { GlobalMetadataStateContext, useCanCreateCase } from '@rh-support/react-context';
14
14
  import { dtmTrackEventCaseCreationStepEncountered, getResTypeFromUrl, PreviousToNewCaseTypeMap, scrollIntoView, } from '@rh-support/utils';
15
15
  import find from 'lodash/find';
@@ -51,7 +51,6 @@ function WizardNavigation(props) {
51
51
  const { activeSectionError, isSectionValidFn } = useIsSectionValid(activeSection);
52
52
  const [isRecsModalVisible, setIsRecsModalVisible] = useState(false);
53
53
  const previousRecommendationTop = useRef(0);
54
- const previousStep = usePrevious(props.activeStep);
55
54
  const { request: resolveSessionRequest } = useFetch(pcm.preCase.session.resolveSession);
56
55
  const { sessionRestore: { activeSessionId, sessionResourceTracking }, } = useContext(SessionRestoreStateContext);
57
56
  const { SessionResourceSource } = pcm.preCase.session;
@@ -60,15 +59,12 @@ function WizardNavigation(props) {
60
59
  }), isEqual);
61
60
  const caseDispatch = useCaseDispatch();
62
61
  useEffect(() => {
63
- var _a, _b;
64
- if ((previousStep === null || previousStep === void 0 ? void 0 : previousStep.id) === ((_a = props.activeStep) === null || _a === void 0 ? void 0 : _a.id)) {
65
- return;
66
- }
62
+ var _a;
67
63
  const isCreatingCase = RouteUtils.getQueryParams(props.routeProps).caseCreate === 'true';
68
64
  dtmTrackEventCaseCreationStepEncountered(isCreatingCase,
69
65
  // @ts-ignore
70
66
  props.activeStep.name, props.activeStep.id === AppRouteSections.GET_SUPPORT ||
71
- props.activeStep.id === AppRouteSections.TROUBLESHOOT, (_b = caseState.caseDetails) === null || _b === void 0 ? void 0 : _b.caseNumber, PreviousToNewCaseTypeMap[caseState.caseDetails.caseType], caseState.caseDetails.summary, caseState.caseDetails.product, caseState.caseDetails.version);
67
+ props.activeStep.id === AppRouteSections.TROUBLESHOOT, (_a = caseState.caseDetails) === null || _a === void 0 ? void 0 : _a.caseNumber, PreviousToNewCaseTypeMap[caseState.caseDetails.caseType], caseState.caseDetails.summary, caseState.caseDetails.product, caseState.caseDetails.version);
72
68
  if (props.activeStep.id === AppRouteSections.RESOURCES) {
73
69
  window.scrollTo({
74
70
  top: 0,
@@ -76,7 +72,7 @@ function WizardNavigation(props) {
76
72
  });
77
73
  }
78
74
  // eslint-disable-next-line react-hooks/exhaustive-deps
79
- }, [previousStep === null || previousStep === void 0 ? void 0 : previousStep.id, props.activeStep.id]);
75
+ }, [props.activeStep.id]);
80
76
  const [hasUserScrolled, setHasUserScrolled] = useState(false);
81
77
  useEffect(() => {
82
78
  if (props.activeStep.id !== (isCaseCreate ? AppRouteSections.SUMMARIZE : AppRouteSections.TROUBLESHOOT) ||
@@ -139,7 +135,7 @@ function WizardNavigation(props) {
139
135
  }
140
136
  };
141
137
  }, [recommendationState.numFound, hasUserScrolled, props, isCaseCreate]);
142
- const onNext = (e) => {
138
+ const onNext = () => {
143
139
  var _a;
144
140
  updateisNextBtnClickedToShowValidationError(dispatchToRouteReducer, true);
145
141
  //handle the new changes for 13406:
@@ -175,19 +171,19 @@ function WizardNavigation(props) {
175
171
  // to show all steps, a delay needed in order to steps array
176
172
  // to be updated
177
173
  window.setTimeout(() => {
178
- props.onNext && props.onNext(e);
174
+ props.onNext && props.onNext();
179
175
  }, 10);
180
176
  }
181
177
  else {
182
- props.onNext && props.onNext(e);
178
+ props.onNext && props.onNext();
183
179
  }
184
180
  }
185
181
  return;
186
182
  };
187
- const onBack = (e) => {
183
+ const onBack = () => {
188
184
  if (props.activeStep.hidRestOnBack)
189
185
  props.onShowRestUpdate(false);
190
- props.onBack(e);
186
+ props.onBack();
191
187
  };
192
188
  const onRecsFeedbackModalToggle = () => {
193
189
  setIsRecsModalVisible((visible) => !visible);
@@ -253,9 +249,10 @@ function WizardNavigation(props) {
253
249
  // To handle entitled products
254
250
  return (React.createElement(React.Fragment, null,
255
251
  React.createElement(WizardFooterWrapper, null,
256
- props.activeStep.order !== 0 && (React.createElement("button", { onClick: onBack, className: "btn btn-app btn-open-white main-nav-button", "data-tracking-id": `prev-of-${activeSection}`, type: "button", disabled: isDisabledGoBack() }, t('Go back'))),
257
- React.createElement("button", { disabled: nextButtonDisabledLogic(), onClick: onNext, className: "btn btn-app btn-primary main-nav-button", "data-tracking-id": `next-of-${activeSection}`, type: "button" }, t(props.activeStep.nextButtonLabel)),
258
- activeSection === AppRouteSections.RESOURCES && isFileRecommendationsTriggered && (React.createElement(Button, { onClick: handleFileRecsSelfSolved, variant: ButtonVariant.secondary, className: "issue-solved-button solved-issue-button", "data-tracking-id": "troubleshoot-self-solved-issue" }, t('I solved my issue'))),
252
+ props.isAIChatMode ? (React.createElement(Button, { onClick: props.onReturnToCaseCreation, variant: "link", className: "return-to-case-btn" }, t('Return to case creation'))) : (React.createElement(React.Fragment, null,
253
+ props.activeStep.order !== 0 && (React.createElement("button", { onClick: () => onBack(), className: "btn btn-app btn-open-white main-nav-button", "data-tracking-id": `prev-of-${activeSection}`, type: "button", disabled: isDisabledGoBack() }, t('Go back'))),
254
+ React.createElement("button", { disabled: nextButtonDisabledLogic(), onClick: onNext, className: "btn btn-app btn-primary main-nav-button", "data-tracking-id": `next-of-${activeSection}`, type: "button" }, t(props.activeStep.nextButtonLabel)),
255
+ activeSection === AppRouteSections.RESOURCES && isFileRecommendationsTriggered && (React.createElement(Button, { onClick: handleFileRecsSelfSolved, variant: ButtonVariant.secondary, className: "issue-solved-button solved-issue-button", "data-tracking-id": "troubleshoot-self-solved-issue" }, t('I solved my issue'))))),
259
256
  React.createElement(RecommendationFeedbackModal, { isModalOpen: isRecsModalVisible, handleModalToggle: onRecsFeedbackModalToggle, modalContent: t(`Great, we're glad that resolved your issue`) }),
260
257
  activeSectionError ? (React.createElement("small", { className: "pf-v6-u-align-self-center pf-v6-u-ml-md text-red" }, activeSectionError)) : null)));
261
258
  }
@@ -2,6 +2,7 @@ import 'react-bootstrap-typeahead/css/Typeahead.css';
2
2
  import '../../css/app.css';
3
3
  import '../../css/pagination.css';
4
4
  import '../../css/productSelector.css';
5
+ import '../../css/AskRedHat.css';
5
6
  import '../../css/results.css';
6
7
  import '../shared/fileUpload/css/fileSelector.css';
7
8
  import React from 'react';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/index.tsx"],"names":[],"mappings":"AAAA,OAAO,6CAA6C,CAAC;AACrD,OAAO,mBAAmB,CAAC;AAC3B,OAAO,0BAA0B,CAAC;AAClC,OAAO,+BAA+B,CAAC;AACvC,OAAO,uBAAuB,CAAC;AAC/B,OAAO,2CAA2C,CAAC;AAGnD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAIvD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAGlE,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,MAAM;QACZ,SAAS,EAAE,GAAG,CAAC;QACf,oBAAoB,EAAE,GAAG,CAAC;QAC1B,MAAM,EAAE,GAAG,CAAC;QACZ,KAAK,EAAE,GAAG,CAAC;QACX,aAAa,EAAE;YACX,cAAc,EAAE,MAAM,CAAC;YACvB,OAAO,EAAE,MAAM,CAAC;SACnB,CAAC;KACL;IAED,UAAU,QAAQ;QACd,YAAY,EAAE,GAAG,CAAC;KACrB;CACJ;AAED,eAAO,MAAM,YAAY,UAAW,MAAM,sBAYzC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/wizardLayout/index.tsx"],"names":[],"mappings":"AAAA,OAAO,6CAA6C,CAAC;AACrD,OAAO,mBAAmB,CAAC;AAC3B,OAAO,0BAA0B,CAAC;AAClC,OAAO,+BAA+B,CAAC;AACvC,OAAO,yBAAyB,CAAC;AACjC,OAAO,uBAAuB,CAAC;AAC/B,OAAO,2CAA2C,CAAC;AAGnD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAIvD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAGlE,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,MAAM;QACZ,SAAS,EAAE,GAAG,CAAC;QACf,oBAAoB,EAAE,GAAG,CAAC;QAC1B,MAAM,EAAE,GAAG,CAAC;QACZ,KAAK,EAAE,GAAG,CAAC;QACX,aAAa,EAAE;YACX,cAAc,EAAE,MAAM,CAAC;YACvB,OAAO,EAAE,MAAM,CAAC;SACnB,CAAC;KACL;IAED,UAAU,QAAQ;QACd,YAAY,EAAE,GAAG,CAAC;KACrB;CACJ;AAED,eAAO,MAAM,YAAY,UAAW,MAAM,sBAYzC,CAAC"}
@@ -2,6 +2,7 @@ import 'react-bootstrap-typeahead/css/Typeahead.css';
2
2
  import '../../css/app.css';
3
3
  import '../../css/pagination.css';
4
4
  import '../../css/productSelector.css';
5
+ import '../../css/AskRedHat.css';
5
6
  import '../../css/results.css';
6
7
  import '../shared/fileUpload/css/fileSelector.css';
7
8
  import { useDocumentTitle } from '@rh-support/components';
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { IAIResponseActionType, IAIResponseState } from '../reducers/AIResponseConstNTypes';
3
+ export declare const AIResponseStateContext: React.Context<IAIResponseState>;
4
+ export declare const AIResponseDispatchContext: React.Context<React.Dispatch<IAIResponseActionType>>;
5
+ export declare function AIResponseContextProvider({ children }: {
6
+ children: React.ReactNode;
7
+ }): React.JSX.Element;
8
+ export declare const useAIResponseState: () => IAIResponseState;
9
+ export declare const useAIResponseDispatch: () => React.Dispatch<IAIResponseActionType>;
10
+ //# sourceMappingURL=AIResponseContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIResponseContext.d.ts","sourceRoot":"","sources":["../../../src/context/AIResponseContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAA0B,MAAM,mCAAmC,CAAC;AAKpH,eAAO,MAAM,sBAAsB,iCAAgE,CAAC;AACpG,eAAO,MAAM,yBAAyB,sDACgD,CAAC;AAEvF,wBAAgB,yBAAyB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAUpF;AAGD,eAAO,MAAM,kBAAkB,wBAM9B,CAAC;AAEF,eAAO,MAAM,qBAAqB,6CAMjC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import React, { useReducer } from 'react';
2
+ import { initialAIResponseState } from '../reducers/AIResponseConstNTypes';
3
+ import { aiResponseReducer } from '../reducers/AIResponseReducer';
4
+ const initialDispatchContext = () => { };
5
+ export const AIResponseStateContext = React.createContext(initialAIResponseState);
6
+ export const AIResponseDispatchContext = React.createContext(initialDispatchContext);
7
+ export function AIResponseContextProvider({ children }) {
8
+ const [aiResponseState, aiResponseDispatch] = useReducer(aiResponseReducer, initialAIResponseState);
9
+ return (React.createElement(AIResponseStateContext.Provider, { value: aiResponseState },
10
+ React.createElement(AIResponseDispatchContext.Provider, { value: aiResponseDispatch }, children)));
11
+ }
12
+ // Custom hooks for easy access
13
+ export const useAIResponseState = () => {
14
+ const context = React.useContext(AIResponseStateContext);
15
+ if (context === undefined) {
16
+ throw new Error('useAIResponseState must be used within a AIResponseContextProvider');
17
+ }
18
+ return context;
19
+ };
20
+ export const useAIResponseDispatch = () => {
21
+ const context = React.useContext(AIResponseDispatchContext);
22
+ if (context === undefined) {
23
+ throw new Error('useAIResponseDispatch must be used within a AIResponseContextProvider');
24
+ }
25
+ return context;
26
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"RootTroubleshootProvider.d.ts","sourceRoot":"","sources":["../../../src/context/RootTroubleshootProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAW1B,UAAU,MAAM;IACZ,QAAQ,EAAE,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;CACzC;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,qBAkBrD"}
1
+ {"version":3,"file":"RootTroubleshootProvider.d.ts","sourceRoot":"","sources":["../../../src/context/RootTroubleshootProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,UAAU,MAAM;IACZ,QAAQ,EAAE,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;CACzC;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,qBAoBrD"}
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { AttachmentContextProvider } from '../components/shared/fileUpload/reducer/AttachmentReducerContext';
3
+ import { AIResponseContextProvider } from './AIResponseContext';
3
4
  import { CaseContextProvider } from './CaseContext';
4
5
  import { ClusterRecommendationsContextProvider } from './ClusterRecommendationsContext';
5
6
  import { RecommendationContextProvider } from './RecommendationContext';
@@ -10,10 +11,11 @@ import { TCContextProvider } from './TopContentContext';
10
11
  export function RootTroubleshootProvider(props) {
11
12
  return (React.createElement(RouteContextProvider, null,
12
13
  React.createElement(CaseContextProvider, null,
13
- React.createElement(RecommendationContextProvider, null,
14
- React.createElement(AttachmentContextProvider, null,
15
- React.createElement(RulesContextProvider, null,
16
- React.createElement(ClusterRecommendationsContextProvider, null,
17
- React.createElement(TCContextProvider, null,
18
- React.createElement(SessionRestoreContextProvider, null, props.children)))))))));
14
+ React.createElement(AIResponseContextProvider, null,
15
+ React.createElement(RecommendationContextProvider, null,
16
+ React.createElement(AttachmentContextProvider, null,
17
+ React.createElement(RulesContextProvider, null,
18
+ React.createElement(ClusterRecommendationsContextProvider, null,
19
+ React.createElement(TCContextProvider, null,
20
+ React.createElement(SessionRestoreContextProvider, null, props.children))))))))));
19
21
  }