@rh-support/troubleshoot 2.6.107 → 2.6.118
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/lib/esm/components/AccountInfo/AccountSelector.js +1 -1
- package/lib/esm/components/AccountInfo/css/accountSelector.css +2 -3
- package/lib/esm/components/CaseEditView/Case.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/Case.js +1 -1
- package/lib/esm/components/CaseEditView/CaseOverview/CaseOwnerInfo.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/CaseOverview/CaseOwnerInfo.js +1 -1
- package/lib/esm/components/CaseEditView/CaseOverview/CaseType.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/CaseOverview/CaseType.js +4 -2
- package/lib/esm/components/CaseEditView/CaseOverview/index.js +1 -1
- package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseOpenshiftClusterId/CaseOpenShiftPopover.js +1 -1
- package/lib/esm/components/CaseEditView/Tabs/CaseDetails/ProductVersion.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/Tabs/CaseDetails/ProductVersion.js +2 -4
- package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment.d.ts.map +1 -1
- package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment.js +1 -2
- package/lib/esm/components/CaseEditView/Tabs/CaseHistory/Timeline.css +33 -13
- package/lib/esm/components/CaseEditView/Tabs/CaseSummary/CaseSummary.js +3 -3
- package/lib/esm/components/CaseEditView/Tabs/CaseSummary/CaseSummaryErrorMessage.js +1 -1
- package/lib/esm/components/CaseInformation/Description.d.ts.map +1 -1
- package/lib/esm/components/CaseInformation/Description.js +3 -1
- package/lib/esm/components/CaseInformation/Severity.d.ts.map +1 -1
- package/lib/esm/components/CaseInformation/Severity.js +1 -1
- package/lib/esm/components/CaseInformation/SupportLevel.d.ts.map +1 -1
- package/lib/esm/components/CaseInformation/SupportLevel.js +1 -1
- package/lib/esm/components/CaseManagement/OpenshiftDropdownV4.d.ts.map +1 -1
- package/lib/esm/components/CaseManagement/OpenshiftDropdownV4.js +6 -12
- package/lib/esm/components/OpenCase/OpenCase.d.ts.map +1 -1
- package/lib/esm/components/OpenCase/OpenCase.js +2 -8
- package/lib/esm/components/ProductSelector/AllProductsSelector.d.ts.map +1 -1
- package/lib/esm/components/ProductSelector/AllProductsSelector.js +6 -18
- package/lib/esm/components/ProductSelector/ProductSelector.d.ts.map +1 -1
- package/lib/esm/components/ProductSelector/ProductSelector.js +5 -12
- package/lib/esm/components/Recommendations/ClusterRecommendationItems.d.ts +0 -2
- package/lib/esm/components/Recommendations/ClusterRecommendationItems.d.ts.map +1 -1
- package/lib/esm/components/Recommendations/ClusterRecommendationItems.js +13 -16
- package/lib/esm/components/Recommendations/ClusterRecommendations.d.ts.map +1 -1
- package/lib/esm/components/Recommendations/ClusterRecommendations.js +4 -1
- package/lib/esm/components/Recommendations/Recommendations.d.ts.map +1 -1
- package/lib/esm/components/Recommendations/Recommendations.js +38 -38
- package/lib/esm/components/RemoteRider/RemoteRiderAcceptanceModal.d.ts.map +1 -1
- package/lib/esm/components/Review/Review.d.ts.map +1 -1
- package/lib/esm/components/Review/Review.js +1 -5
- package/lib/esm/components/Suggestions/TopContentSidebar.d.ts +3 -0
- package/lib/esm/components/Suggestions/TopContentSidebar.d.ts.map +1 -0
- package/lib/esm/components/Suggestions/TopContentSidebar.js +26 -0
- package/lib/esm/components/TroubleshootSection/AskRedHat.js +1 -1
- package/lib/esm/components/TroubleshootSection/TroubleshootSection.d.ts +9 -0
- package/lib/esm/components/TroubleshootSection/TroubleshootSection.d.ts.map +1 -1
- package/lib/esm/components/TroubleshootSection/TroubleshootSection.js +150 -44
- package/lib/esm/components/shared/useIsSectionValid.d.ts.map +1 -1
- package/lib/esm/components/shared/useIsSectionValid.js +26 -65
- package/lib/esm/components/wizardLayout/WizardAside.d.ts.map +1 -1
- package/lib/esm/components/wizardLayout/WizardAside.js +18 -9
- package/lib/esm/components/wizardLayout/WizardMain.d.ts.map +1 -1
- package/lib/esm/components/wizardLayout/WizardMain.js +110 -64
- package/lib/esm/components/wizardLayout/WizardNavigation.d.ts.map +1 -1
- package/lib/esm/components/wizardLayout/WizardNavigation.js +59 -53
- package/lib/esm/css/AskRedHat.css +9 -2
- package/lib/esm/css/app.css +1 -1
- package/lib/esm/hooks/useAB.d.ts +22 -0
- package/lib/esm/hooks/useAB.d.ts.map +1 -0
- package/lib/esm/hooks/useAB.js +37 -0
- package/lib/esm/hooks/useWizard.d.ts +4 -0
- package/lib/esm/hooks/useWizard.d.ts.map +1 -1
- package/lib/esm/hooks/useWizard.js +20 -6
- package/lib/esm/reducers/AIResponseConstNTypes.d.ts +17 -2
- package/lib/esm/reducers/AIResponseConstNTypes.d.ts.map +1 -1
- package/lib/esm/reducers/AIResponseConstNTypes.js +3 -0
- package/lib/esm/reducers/AIResponseReducer.d.ts +2 -0
- package/lib/esm/reducers/AIResponseReducer.d.ts.map +1 -1
- package/lib/esm/reducers/AIResponseReducer.js +17 -0
- package/lib/esm/reducers/CaseConstNTypes.js +3 -3
- package/lib/esm/reducers/CaseDiscussionTabReducer.js +1 -1
- package/lib/esm/reducers/CaseHelpers.d.ts +1 -2
- package/lib/esm/reducers/CaseHelpers.d.ts.map +1 -1
- package/lib/esm/reducers/CaseHelpers.js +1 -11
- package/lib/esm/reducers/RouteConstNTypes.d.ts.map +1 -1
- package/lib/esm/reducers/RouteConstNTypes.js +0 -1
- package/lib/esm/scss/_pf-overrides.scss +2 -23
- package/package.json +9 -7
|
@@ -17,10 +17,12 @@ import isEmpty from 'lodash/isEmpty';
|
|
|
17
17
|
import isEqual from 'lodash/isEqual';
|
|
18
18
|
import React, { useContext, useEffect, useRef, useState } from 'react';
|
|
19
19
|
import { Trans, useTranslation } from 'react-i18next';
|
|
20
|
+
import { useAIResponseState } from '../../context/AIResponseContext';
|
|
20
21
|
import { useCaseDispatch, useCaseSelector } from '../../context/CaseContext';
|
|
21
22
|
import { RecommendationStateContext } from '../../context/RecommendationContext';
|
|
22
23
|
import { RouteContext, RouteDispatchContext } from '../../context/RouteContext';
|
|
23
24
|
import { SessionRestoreStateContext } from '../../context/SessionRestoreContext';
|
|
25
|
+
import { useAB } from '../../hooks/useAB';
|
|
24
26
|
import { excludedCaseTypesforARH } from '../../reducers/CaseConstNTypes';
|
|
25
27
|
import { setCaseState } from '../../reducers/CaseReducer';
|
|
26
28
|
import { AppRouteSections } from '../../reducers/RouteConstNTypes';
|
|
@@ -32,22 +34,21 @@ const defaultProps = {};
|
|
|
32
34
|
function WizardNavigation(props) {
|
|
33
35
|
var _a, _b;
|
|
34
36
|
const { t } = useTranslation();
|
|
37
|
+
const { isVariationA } = useAB();
|
|
35
38
|
const canCreateCase = useCanCreateCase();
|
|
36
39
|
const { recommendationState } = useContext(RecommendationStateContext);
|
|
40
|
+
const aiResponseState = useAIResponseState();
|
|
37
41
|
const { routeState: { activeSection, isNextBtnClickedToShowValidationError, noValidEntitlement, isSearchIntent, isCaseCreate, }, } = useContext(RouteContext);
|
|
38
42
|
const { globalMetadataState: { loggedInUsersAccount, allProducts, navBarRef }, } = useContext(GlobalMetadataStateContext);
|
|
39
|
-
const { caseState,
|
|
43
|
+
const { caseState, issue, summary, product, version, caseType } = useCaseSelector((state) => ({
|
|
40
44
|
caseState: state,
|
|
41
45
|
issue: state.caseDetails.issue,
|
|
42
46
|
summary: state.caseDetails.summary,
|
|
43
|
-
ABTestVariation: state.ABTestVariation,
|
|
44
47
|
product: state.caseDetails.product,
|
|
45
48
|
version: state.caseDetails.version,
|
|
46
49
|
caseType: state.caseDetails.caseType,
|
|
47
50
|
manageSupportCases: state.selectedOwner.data.manageSupportCases,
|
|
48
51
|
}), isEqual);
|
|
49
|
-
const isATestvariation = ABTestVariation === 'A';
|
|
50
|
-
const isBTestvariation = ABTestVariation === 'B' || isEmpty(ABTestVariation);
|
|
51
52
|
// To check if the user is entitled or not
|
|
52
53
|
const isEntitledProduct = (_b = find((_a = allProducts === null || allProducts === void 0 ? void 0 : allProducts.data) === null || _a === void 0 ? void 0 : _a.productsResult, (p) => p.product === caseState.caseDetails.product)) === null || _b === void 0 ? void 0 : _b.isEntitledProduct;
|
|
53
54
|
const dispatchToRouteReducer = useContext(RouteDispatchContext);
|
|
@@ -78,18 +79,37 @@ function WizardNavigation(props) {
|
|
|
78
79
|
behavior: 'instant',
|
|
79
80
|
});
|
|
80
81
|
}
|
|
82
|
+
// Reset scroll state when navigating based on isVariationA
|
|
83
|
+
const resetScrollSection = isVariationA
|
|
84
|
+
? AppRouteSections.RESOURCES
|
|
85
|
+
: isCaseCreate
|
|
86
|
+
? AppRouteSections.SUMMARIZE
|
|
87
|
+
: AppRouteSections.TROUBLESHOOT;
|
|
88
|
+
if (props.activeStep.id === resetScrollSection) {
|
|
89
|
+
setHasUserScrolled(false);
|
|
90
|
+
}
|
|
81
91
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
82
92
|
}, [previousStep === null || previousStep === void 0 ? void 0 : previousStep.id, props.activeStep.id]);
|
|
83
93
|
const [hasUserScrolled, setHasUserScrolled] = useState(false);
|
|
94
|
+
const [shouldOpenChatbot, setShouldOpenChatbot] = useState(false);
|
|
84
95
|
useEffect(() => {
|
|
85
|
-
var _a;
|
|
96
|
+
var _a, _b;
|
|
86
97
|
if (activeSection !== AppRouteSections.RESOURCES && props.isAIChatMode) {
|
|
87
98
|
(_a = props.setIsAIChatMode) === null || _a === void 0 ? void 0 : _a.call(props, false);
|
|
88
99
|
}
|
|
100
|
+
if (activeSection === AppRouteSections.RESOURCES && shouldOpenChatbot) {
|
|
101
|
+
(_b = props.setIsAIChatMode) === null || _b === void 0 ? void 0 : _b.call(props, true);
|
|
102
|
+
setShouldOpenChatbot(false);
|
|
103
|
+
}
|
|
89
104
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
90
|
-
}, [activeSection]);
|
|
105
|
+
}, [activeSection, shouldOpenChatbot]);
|
|
91
106
|
useEffect(() => {
|
|
92
|
-
|
|
107
|
+
const validSteps = isVariationA
|
|
108
|
+
? [AppRouteSections.RESOURCES]
|
|
109
|
+
: isCaseCreate
|
|
110
|
+
? [AppRouteSections.SUMMARIZE]
|
|
111
|
+
: [AppRouteSections.TROUBLESHOOT];
|
|
112
|
+
if (!validSteps.includes(props.activeStep.id)) {
|
|
93
113
|
return;
|
|
94
114
|
}
|
|
95
115
|
const observer = new IntersectionObserver(([entry]) => {
|
|
@@ -147,13 +167,21 @@ function WizardNavigation(props) {
|
|
|
147
167
|
observer.unobserve(resultsRowElement);
|
|
148
168
|
}
|
|
149
169
|
};
|
|
150
|
-
}, [recommendationState.numFound, hasUserScrolled, props, isCaseCreate]);
|
|
170
|
+
}, [recommendationState.numFound, hasUserScrolled, props, isCaseCreate, isVariationA]);
|
|
151
171
|
const onNext = (e) => {
|
|
152
172
|
var _a;
|
|
153
173
|
updateisNextBtnClickedToShowValidationError(dispatchToRouteReducer, true);
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
174
|
+
if (isVariationA &&
|
|
175
|
+
activeSection === (isCaseCreate ? AppRouteSections.SUMMARIZE : AppRouteSections.TROUBLESHOOT)) {
|
|
176
|
+
setShouldOpenChatbot(true);
|
|
177
|
+
}
|
|
178
|
+
// Handle scroll behavior based on isVariationA
|
|
179
|
+
const scrollSection = isVariationA
|
|
180
|
+
? AppRouteSections.RESOURCES
|
|
181
|
+
: isCaseCreate
|
|
182
|
+
? AppRouteSections.SUMMARIZE
|
|
183
|
+
: AppRouteSections.TROUBLESHOOT;
|
|
184
|
+
if (props.activeStep.id === scrollSection && recommendationState.numFound > 2) {
|
|
157
185
|
if (!hasUserScrolled) {
|
|
158
186
|
scrollIntoView(props.resultsRowRef, {
|
|
159
187
|
navBarRef,
|
|
@@ -223,60 +251,38 @@ function WizardNavigation(props) {
|
|
|
223
251
|
const isLoadingARH = props.isLoadingARH &&
|
|
224
252
|
props.activeStep.id === AppRouteSections.RESOURCES &&
|
|
225
253
|
!excludedCaseTypesforARH.includes(caseType || '');
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
recommendationState.isLoadingRecommendations;
|
|
237
|
-
return value;
|
|
238
|
-
}
|
|
239
|
-
else if (isATestvariation) {
|
|
240
|
-
let value = isLoadingARH ||
|
|
241
|
-
((isEmpty(summary) || isEmpty(issue) || isEmpty(product) || isEmpty(version)) &&
|
|
242
|
-
props.activeStep.id ===
|
|
243
|
-
(isCaseCreate ? AppRouteSections.SUMMARIZE : AppRouteSections.TROUBLESHOOT)) ||
|
|
244
|
-
(!isEntitledProductLocal && props.activeStep.nextButtonLabel === 'Get support') ||
|
|
245
|
-
props.activeStep.nextButtonLabel === 'Troubleshoot' ||
|
|
246
|
-
(!isSectionValidFn(props.activeStep.id) && isNextBtnClickedToShowValidationError) ||
|
|
247
|
-
(noValidEntitlement && props.activeStep.id != AppRouteSections.TROUBLESHOOT) ||
|
|
248
|
-
(!manageSupportCases && props.activeStep.id === AppRouteSections.GET_SUPPORT) ||
|
|
249
|
-
recommendationState.isLoadingRecommendations;
|
|
250
|
-
return value;
|
|
251
|
-
}
|
|
252
|
-
else if (isATestvariation && !isCaseCreate) {
|
|
253
|
-
let value = isLoadingARH ||
|
|
254
|
-
isEmpty(summary) ||
|
|
255
|
-
isEmpty(issue) ||
|
|
256
|
-
(!isEntitledProductLocal && props.activeStep.nextButtonLabel === 'Get support') ||
|
|
257
|
-
(!isSectionValidFn(props.activeStep.id) && isNextBtnClickedToShowValidationError) ||
|
|
258
|
-
(noValidEntitlement && props.activeStep.id != AppRouteSections.TROUBLESHOOT) ||
|
|
259
|
-
(!manageSupportCases && props.activeStep.id === AppRouteSections.GET_SUPPORT) ||
|
|
260
|
-
recommendationState.isLoadingRecommendations;
|
|
261
|
-
return value;
|
|
262
|
-
}
|
|
254
|
+
const shouldCheckRecommendationsLoading = !isVariationA && recommendationState.isLoadingRecommendations;
|
|
255
|
+
let value = isLoadingARH ||
|
|
256
|
+
((isEmpty(summary) || isEmpty(issue) || isEmpty(product) || isEmpty(version)) &&
|
|
257
|
+
props.activeStep.id === (isCaseCreate ? AppRouteSections.SUMMARIZE : AppRouteSections.TROUBLESHOOT)) ||
|
|
258
|
+
(!isEntitledProductLocal && props.activeStep.nextButtonLabel === 'Get support') ||
|
|
259
|
+
props.activeStep.nextButtonLabel === 'Troubleshoot' ||
|
|
260
|
+
(isSectionValidFn && !isSectionValidFn(props.activeStep.id) && isNextBtnClickedToShowValidationError) ||
|
|
261
|
+
noValidEntitlement ||
|
|
262
|
+
shouldCheckRecommendationsLoading;
|
|
263
|
+
return value;
|
|
263
264
|
};
|
|
264
265
|
const isDisabledGoBack = () => {
|
|
265
|
-
if (
|
|
266
|
-
return false;
|
|
267
|
-
if (isATestvariation && props.activeStep.id === 'get-support') {
|
|
266
|
+
if (props.activeStep.id === 'get-support') {
|
|
268
267
|
return isEmpty(product) || isEmpty(version);
|
|
269
268
|
}
|
|
269
|
+
return false;
|
|
270
270
|
};
|
|
271
|
+
const shouldShowNewARHFlowFooterButtons = isVariationA && props.isAIChatMode && activeSection === AppRouteSections.RESOURCES;
|
|
272
|
+
const shouldShowBackToAIButton = isVariationA && !props.isAIChatMode && activeSection === AppRouteSections.RESOURCES;
|
|
271
273
|
// To handle entitled products
|
|
272
274
|
return (React.createElement(React.Fragment, null,
|
|
273
275
|
React.createElement(WizardFooterWrapper, null,
|
|
274
|
-
|
|
276
|
+
shouldShowNewARHFlowFooterButtons ? (React.createElement(React.Fragment, null,
|
|
277
|
+
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" }, t('Go back'))),
|
|
278
|
+
React.createElement("button", { onClick: () => { var _a; return (_a = props.setIsAIChatMode) === null || _a === void 0 ? void 0 : _a.call(props, false); }, className: "btn btn-app btn-primary main-nav-button", type: "button", disabled: !aiResponseState.hasChunkReceived }, t('See more resources')))) : props.isAIChatMode && activeSection === AppRouteSections.RESOURCES ? (isCaseCreate ? (React.createElement("span", null,
|
|
275
279
|
React.createElement(Trans, { i18nKey: "<span>Return to</span> <button>case creation</button>", components: {
|
|
276
280
|
span: React.createElement("span", { className: "return-to-case-text" }),
|
|
277
281
|
button: (React.createElement(Button, { className: "return-to-case-btn", variant: "link", component: "a", onClick: props.onReturnToCaseCreation })),
|
|
278
282
|
} }))) : (React.createElement(Button, { onClick: props.onReturnToCaseCreation, variant: "link", className: "return-to-resources-btn" }, t('Back to resources')))) : (React.createElement(React.Fragment, null,
|
|
279
|
-
props.activeStep.order !== 0 && (React.createElement("button", { onClick:
|
|
283
|
+
props.activeStep.order !== 0 && (React.createElement("button", { onClick: shouldShowBackToAIButton
|
|
284
|
+
? () => { var _a; return (_a = props.setIsAIChatMode) === null || _a === void 0 ? void 0 : _a.call(props, true); }
|
|
285
|
+
: () => onBack({}), className: "btn btn-app btn-open-white main-nav-button", "data-tracking-id": `prev-of-${activeSection}`, type: "button", disabled: !shouldShowBackToAIButton && isDisabledGoBack() }, shouldShowBackToAIButton ? t('Back to AI') : t('Go back'))),
|
|
280
286
|
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)),
|
|
281
287
|
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'))))),
|
|
282
288
|
React.createElement(RecommendationFeedbackModal, { isModalOpen: isRecsModalVisible, handleModalToggle: onRecsFeedbackModalToggle, modalContent: t(`Great, we're glad that resolved your issue`) }),
|
|
@@ -331,7 +331,7 @@
|
|
|
331
331
|
}
|
|
332
332
|
|
|
333
333
|
.pf-chatbot--fullscreen .pf-chatbot-container {
|
|
334
|
-
height: calc(100vh -
|
|
334
|
+
height: calc(100vh - 277px) !important;
|
|
335
335
|
}
|
|
336
336
|
|
|
337
337
|
.fullscreen-chat-footer {
|
|
@@ -339,7 +339,7 @@
|
|
|
339
339
|
bottom: 0 !important;
|
|
340
340
|
left: 0 !important;
|
|
341
341
|
right: 0 !important;
|
|
342
|
-
height:
|
|
342
|
+
height: 57px !important;
|
|
343
343
|
background: #f6f6f6 !important;
|
|
344
344
|
border-top: 1px solid #d1d1d1 !important;
|
|
345
345
|
align-items: center !important;
|
|
@@ -354,6 +354,13 @@ body:has(.pf-chatbot--fullscreen) .pf-v6-c-wizard__footer {
|
|
|
354
354
|
|
|
355
355
|
body:has(.pf-chatbot--fullscreen) .fullscreen-chat-footer {
|
|
356
356
|
display: flex !important;
|
|
357
|
+
gap: 10px;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
.fullscreen-chat-footer .btn.btn-app {
|
|
361
|
+
padding: 0.375rem 1rem;
|
|
362
|
+
border-radius: var(--global-border-radius-pill, 999px);
|
|
363
|
+
border: var(--global-border-width-regular, 1px) solid var(--global-border-color-brand-default, #06c);
|
|
357
364
|
}
|
|
358
365
|
|
|
359
366
|
body:has(.pf-chatbot--fullscreen) .main-section {
|
package/lib/esm/css/app.css
CHANGED
|
@@ -449,7 +449,7 @@ input[type='checkbox'] {
|
|
|
449
449
|
.comment-plaintext.reset-pre-text {
|
|
450
450
|
font-family: 'Red Hat Display', 'RedHatDisplay', 'Helvetica Neue', 'Arial', 'sans-serif';
|
|
451
451
|
text-rendering: auto;
|
|
452
|
-
font-weight:
|
|
452
|
+
font-weight: 500;
|
|
453
453
|
font-size: 1.12rem;
|
|
454
454
|
line-height: 1.5em;
|
|
455
455
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface IUseABOptions {
|
|
2
|
+
defaultVariation?: ABEnum;
|
|
3
|
+
}
|
|
4
|
+
export interface IUseABReturn {
|
|
5
|
+
variation: ABEnum;
|
|
6
|
+
isVariationA: boolean;
|
|
7
|
+
isVariationB: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface IUseABComponentOptions extends IUseABOptions {
|
|
10
|
+
A: JSX.Element | null;
|
|
11
|
+
B: JSX.Element | null;
|
|
12
|
+
}
|
|
13
|
+
export interface IUseABComponentReturn extends IUseABReturn {
|
|
14
|
+
component: JSX.Element | null;
|
|
15
|
+
}
|
|
16
|
+
export declare enum ABEnum {
|
|
17
|
+
A = "A",
|
|
18
|
+
B = "B"
|
|
19
|
+
}
|
|
20
|
+
export declare function useAB(options?: IUseABOptions): IUseABReturn;
|
|
21
|
+
export declare function useABComponent(options: IUseABComponentOptions): IUseABComponentReturn;
|
|
22
|
+
//# sourceMappingURL=useAB.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAB.d.ts","sourceRoot":"","sources":["../../../src/hooks/useAB.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IACzD,CAAC,EAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC,EAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,qBAAsB,SAAQ,YAAY;IACvD,SAAS,EAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;CACjC;AAED,oBAAY,MAAM;IACd,CAAC,MAAM;IACP,CAAC,MAAM;CACV;AAED,wBAAgB,KAAK,CAAC,OAAO,GAAE,aAAkB,GAAG,YAAY,CAkC/D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,sBAAsB,GAAG,qBAAqB,CAMrF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { GlobalMetadataStateContext } from '@rh-support/react-context';
|
|
2
|
+
import { getConfigField, PCM_CONFIG_FIELD_TYPE } from '@rh-support/utils';
|
|
3
|
+
import { useContext, useEffect, useState } from 'react';
|
|
4
|
+
export var ABEnum;
|
|
5
|
+
(function (ABEnum) {
|
|
6
|
+
ABEnum["A"] = "A";
|
|
7
|
+
ABEnum["B"] = "B";
|
|
8
|
+
})(ABEnum || (ABEnum = {}));
|
|
9
|
+
export function useAB(options = {}) {
|
|
10
|
+
const { globalMetadataState: { pcmConfig, loggedInUsersAccount }, } = useContext(GlobalMetadataStateContext);
|
|
11
|
+
const [testVariation, setTestVariation] = useState((options === null || options === void 0 ? void 0 : options.defaultVariation) || ABEnum.A);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (loggedInUsersAccount.data.hasConfirmedStatesideSupport || loggedInUsersAccount.data.secureSupport) {
|
|
14
|
+
setTestVariation(ABEnum.B);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const variantAAccountNumbers = getConfigField(pcmConfig.data, 'askRedHatAccountsA', PCM_CONFIG_FIELD_TYPE.STRING);
|
|
18
|
+
const userAccountNumber = loggedInUsersAccount.data.accountNumber;
|
|
19
|
+
const isUserInVariantAAccountNumbers = variantAAccountNumbers === null || variantAAccountNumbers === void 0 ? void 0 : variantAAccountNumbers.includes(userAccountNumber);
|
|
20
|
+
if ((variantAAccountNumbers === null || variantAAccountNumbers === void 0 ? void 0 : variantAAccountNumbers.length) && userAccountNumber && isUserInVariantAAccountNumbers) {
|
|
21
|
+
setTestVariation(ABEnum.A);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
setTestVariation(ABEnum.B);
|
|
25
|
+
}
|
|
26
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
27
|
+
}, [pcmConfig.data, loggedInUsersAccount.data.accountNumber]);
|
|
28
|
+
return {
|
|
29
|
+
variation: testVariation,
|
|
30
|
+
isVariationA: testVariation === ABEnum.A,
|
|
31
|
+
isVariationB: testVariation === ABEnum.B,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function useABComponent(options) {
|
|
35
|
+
const variationObject = useAB(options);
|
|
36
|
+
return Object.assign(Object.assign({}, variationObject), { component: variationObject.isVariationA ? options.A : options.B });
|
|
37
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
interface IProps {
|
|
2
3
|
userSeenRecommendationsfn?: any;
|
|
3
4
|
userSeenRecommendationsValue: boolean;
|
|
@@ -11,6 +12,9 @@ interface IProps {
|
|
|
11
12
|
aiServicesAvailable: boolean;
|
|
12
13
|
isSecureSupport?: boolean;
|
|
13
14
|
hasConfirmedStatesideSupport?: boolean;
|
|
15
|
+
onBack?: (e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
16
|
+
haveARHFieldsChanged?: boolean;
|
|
17
|
+
resetARHFieldsChanged?: () => void;
|
|
14
18
|
}
|
|
15
19
|
export declare function useWizard(routeProps: any, props?: IProps): {
|
|
16
20
|
getStepsSequece: (showRest?: boolean) => any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useWizard.d.ts","sourceRoot":"","sources":["../../../src/hooks/useWizard.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useWizard.d.ts","sourceRoot":"","sources":["../../../src/hooks/useWizard.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA+B,MAAM,OAAO,CAAC;AA4BpD,UAAU,MAAM;IACZ,yBAAyB,CAAC,EAAE,GAAG,CAAC;IAChC,4BAA4B,EAAE,OAAO,CAAC;IACtC,6BAA6B,EAAE,OAAO,CAAC;IACvC,qCAAqC,EAAE,OAAO,CAAC;IAC/C,aAAa,EAAE,GAAG,CAAC;IACnB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAC1D,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;CACtC;AAED,wBAAgB,SAAS,CAAC,UAAU,KAAA,EAAE,KAAK,CAAC,EAAE,MAAM;iCAwTb,OAAO;EAwC7C"}
|
|
@@ -20,7 +20,9 @@ import { RouteContext } from '../context/RouteContext';
|
|
|
20
20
|
import { TCStateContext } from '../context/TopContentContext';
|
|
21
21
|
import { AppRouteSections, openCaseNonTechnicalSequence, openCaseRouteSectionSequence, searchIntentRouteSectionSequence, troubleshootNonTechnicalSequence, troubleshootRouteSectionsSequence, } from '../reducers/RouteConstNTypes';
|
|
22
22
|
import RouteUtils from '../utils/routeUtils';
|
|
23
|
+
import { useAB } from './useAB';
|
|
23
24
|
export function useWizard(routeProps, props) {
|
|
25
|
+
const { isVariationA } = useAB();
|
|
24
26
|
const { routeState: { activeSection, isSearchIntent, isNextBtnClickedToShowValidationError }, } = useContext(RouteContext);
|
|
25
27
|
// state value was available later - reading dirctly from url
|
|
26
28
|
const isCaseCreate = RouteUtils.getQueryParams(routeProps).caseCreate === 'true';
|
|
@@ -69,17 +71,29 @@ export function useWizard(routeProps, props) {
|
|
|
69
71
|
alertMessage(),
|
|
70
72
|
!props.isSecureSupport && !props.hasConfirmedStatesideSupport && aiInformationAlert(),
|
|
71
73
|
React.createElement(ProductSelector, { routeProps: routeProps, userSeenRecommendations: props.userSeenRecommendationsfn, userClickedNextonRecommendations: props.userClickedNextonRecommendationsValue, resultsRowRef: props.resultsRowRef, isOnGetSupportPage: false, caseCreateExperience: isCaseCreate })))), canJumpTo: isSectionValidFn(isCaseCreate ? AppRouteSections.SUMMARIZE : AppRouteSections.TROUBLESHOOT) ||
|
|
72
|
-
activeSection === (isCaseCreate ? AppRouteSections.SUMMARIZE : AppRouteSections.TROUBLESHOOT), nextButtonLabel:
|
|
73
|
-
!isEmpty(issue)) ||
|
|
74
|
-
numFound === 0 // do this so that when user refreshes tab and state persists we don't cause edge 'continue' render
|
|
74
|
+
activeSection === (isCaseCreate ? AppRouteSections.SUMMARIZE : AppRouteSections.TROUBLESHOOT), nextButtonLabel: isVariationA
|
|
75
75
|
? t('Continue')
|
|
76
|
-
:
|
|
76
|
+
: ((summarizeNextButtonLabelLogic() || ((props === null || props === void 0 ? void 0 : props.userSeenRecommendationsValue) && numFound < 3)) &&
|
|
77
|
+
!isEmpty(issue)) ||
|
|
78
|
+
numFound === 0
|
|
79
|
+
? t('Continue')
|
|
80
|
+
: t('See more options') }),
|
|
77
81
|
[AppRouteSections.RESOURCES]: Object.assign(Object.assign({}, defaultRouteConfiguration), { id: AppRouteSections.RESOURCES, name: isCaseCreate ? t('Resources') : t('Resources'), component: (React.createElement(MainSection, { stepNumber: 3, totalSteps: 6, section: AppRouteSections.RESOURCES, title: t('Recommendations') },
|
|
78
82
|
React.createElement(Suspense, { fallback: React.createElement(LoadingIndicator, { size: "sm" }) },
|
|
79
83
|
alertMessage(),
|
|
80
|
-
React.createElement(TroubleshootSection, { isAIChatMode: props.isAIChatMode, setIsAIChatMode: props.setIsAIChatMode, onChatWithAIClick: props.onChatWithAIClick, aiServicesAvailable: props.aiServicesAvailable, isSecureSupport: props.isSecureSupport, hasConfirmedStatesideSupport: props.hasConfirmedStatesideSupport })))), canJumpTo: isSectionValidFn(AppRouteSections.RESOURCES || activeSection === AppRouteSections.RESOURCES) &&
|
|
84
|
+
React.createElement(TroubleshootSection, { isAIChatMode: props.isAIChatMode, setIsAIChatMode: props.setIsAIChatMode, onChatWithAIClick: props.onChatWithAIClick, aiServicesAvailable: props.aiServicesAvailable, isSecureSupport: props.isSecureSupport, hasConfirmedStatesideSupport: props.hasConfirmedStatesideSupport, onBack: props.onBack, routeProps: routeProps, userSeenRecommendations: props.userSeenRecommendationsfn, userClickedNextonRecommendations: props.userClickedNextonRecommendationsValue, resultsRowRef: props.resultsRowRef, haveARHFieldsChanged: props.haveARHFieldsChanged, resetARHFieldsChanged: props.resetARHFieldsChanged })))), canJumpTo: isSectionValidFn(AppRouteSections.RESOURCES || activeSection === AppRouteSections.RESOURCES) &&
|
|
81
85
|
(props === null || props === void 0 ? void 0 : props.userSeenRecommendationsValue) &&
|
|
82
|
-
(props === null || props === void 0 ? void 0 : props.userCanNavigateToTroubleshoot), nextButtonLabel:
|
|
86
|
+
(props === null || props === void 0 ? void 0 : props.userCanNavigateToTroubleshoot), nextButtonLabel: isVariationA
|
|
87
|
+
? ((summarizeNextButtonLabelLogic() || ((props === null || props === void 0 ? void 0 : props.userSeenRecommendationsValue) && numFound < 3)) &&
|
|
88
|
+
!isEmpty(issue)) ||
|
|
89
|
+
numFound === 0
|
|
90
|
+
? t('Continue')
|
|
91
|
+
: isCaseCreate
|
|
92
|
+
? t('See more options')
|
|
93
|
+
: t('Convert to case')
|
|
94
|
+
: isCaseCreate
|
|
95
|
+
? t('Continue')
|
|
96
|
+
: t('Convert to case') }),
|
|
83
97
|
[AppRouteSections.ADDITIONAL_INFORMATION]: Object.assign(Object.assign({}, defaultRouteConfiguration), { id: AppRouteSections.ADDITIONAL_INFORMATION, name: t('Additional information'), component: (React.createElement(MainSection, { stepNumber: 4, totalSteps: 6, section: AppRouteSections.ADDITIONAL_INFORMATION, title: React.createElement(React.Fragment, null,
|
|
84
98
|
t('Case information'),
|
|
85
99
|
isEmpty(RouteUtils.seBasePath) && isSelectedAccounntSecureSupport && (React.createElement("span", { className: "secured-support" },
|
|
@@ -13,6 +13,7 @@ export interface IAIResponseState {
|
|
|
13
13
|
submittedFeedbackTypes: string[];
|
|
14
14
|
isRateLimited?: boolean;
|
|
15
15
|
quotaLimit?: number;
|
|
16
|
+
hasChunkReceived?: boolean;
|
|
16
17
|
}
|
|
17
18
|
export declare const initialAIResponseState: IAIResponseState;
|
|
18
19
|
export declare enum AIResponseConstants {
|
|
@@ -23,7 +24,9 @@ export declare enum AIResponseConstants {
|
|
|
23
24
|
streamingError = "streamingError",
|
|
24
25
|
addSubmittedFeedbackType = "addSubmittedFeedbackType",
|
|
25
26
|
clearSubmittedFeedbackTypes = "clearSubmittedFeedbackTypes",
|
|
26
|
-
updateQuotaLimit = "updateQuotaLimit"
|
|
27
|
+
updateQuotaLimit = "updateQuotaLimit",
|
|
28
|
+
updateConversationId = "updateConversationId",
|
|
29
|
+
setHasChunkReceived = "setHasChunkReceived"
|
|
27
30
|
}
|
|
28
31
|
export interface IClearAIResponseAction extends IActionType {
|
|
29
32
|
type: AIResponseConstants.clearAIResponse;
|
|
@@ -66,5 +69,17 @@ export interface IUpdateQuotaLimitAction extends IActionType {
|
|
|
66
69
|
quotaLimit: number;
|
|
67
70
|
};
|
|
68
71
|
}
|
|
69
|
-
export
|
|
72
|
+
export interface IUpdateConversationIdAction extends IActionType {
|
|
73
|
+
type: AIResponseConstants.updateConversationId;
|
|
74
|
+
payload: {
|
|
75
|
+
conversationId: string;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export interface ISetHasChunkReceivedAction extends IActionType {
|
|
79
|
+
type: AIResponseConstants.setHasChunkReceived;
|
|
80
|
+
payload: {
|
|
81
|
+
hasChunkReceived: boolean;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export type IAIResponseActionType = IClearAIResponseAction | IStreamingStartedAction | IStreamingChunkReceivedAction | IStreamingCompletedAction | IStreamingErrorAction | IAddSubmittedFeedbackTypeAction | IClearSubmittedFeedbackTypesAction | IUpdateQuotaLimitAction | IUpdateConversationIdAction | ISetHasChunkReceivedAction;
|
|
70
85
|
//# sourceMappingURL=AIResponseConstNTypes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AIResponseConstNTypes.d.ts","sourceRoot":"","sources":["../../../src/reducers/AIResponseConstNTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,GAAG,CAAC;CACjB;AAGD,MAAM,WAAW,gBAAgB;IAC7B,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACzC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"AIResponseConstNTypes.d.ts","sourceRoot":"","sources":["../../../src/reducers/AIResponseConstNTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ export const initialAIResponseState = {
|
|
|
9
9
|
submittedFeedbackTypes: [],
|
|
10
10
|
isRateLimited: false,
|
|
11
11
|
quotaLimit: undefined,
|
|
12
|
+
hasChunkReceived: false,
|
|
12
13
|
};
|
|
13
14
|
// Action Constants
|
|
14
15
|
export var AIResponseConstants;
|
|
@@ -21,4 +22,6 @@ export var AIResponseConstants;
|
|
|
21
22
|
AIResponseConstants["addSubmittedFeedbackType"] = "addSubmittedFeedbackType";
|
|
22
23
|
AIResponseConstants["clearSubmittedFeedbackTypes"] = "clearSubmittedFeedbackTypes";
|
|
23
24
|
AIResponseConstants["updateQuotaLimit"] = "updateQuotaLimit";
|
|
25
|
+
AIResponseConstants["updateConversationId"] = "updateConversationId";
|
|
26
|
+
AIResponseConstants["setHasChunkReceived"] = "setHasChunkReceived";
|
|
24
27
|
})(AIResponseConstants || (AIResponseConstants = {}));
|
|
@@ -9,4 +9,6 @@ export declare const streamingError: (error: string, isRateLimited?: boolean) =>
|
|
|
9
9
|
export declare const addSubmittedFeedbackType: (feedbackType: string) => IAIResponseActionType;
|
|
10
10
|
export declare const clearSubmittedFeedbackTypes: () => IAIResponseActionType;
|
|
11
11
|
export declare const updateQuotaLimit: (quotaLimit: number) => IAIResponseActionType;
|
|
12
|
+
export declare const updateConversationId: (conversationId: string) => IAIResponseActionType;
|
|
13
|
+
export declare const setHasChunkReceived: (hasChunkReceived: boolean) => IAIResponseActionType;
|
|
12
14
|
//# sourceMappingURL=AIResponseReducer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AIResponseReducer.d.ts","sourceRoot":"","sources":["../../../src/reducers/AIResponseReducer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAEH,qBAAqB,EACrB,gBAAgB,EAEnB,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,iBAAiB,UACnB,gBAAgB,UACf,qBAAqB,KAC9B,
|
|
1
|
+
{"version":3,"file":"AIResponseReducer.d.ts","sourceRoot":"","sources":["../../../src/reducers/AIResponseReducer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAEH,qBAAqB,EACrB,gBAAgB,EAEnB,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,iBAAiB,UACnB,gBAAgB,UACf,qBAAqB,KAC9B,gBAwFF,CAAC;AAGF,eAAO,MAAM,eAAe,QAAO,qBAGJ,CAAC;AAEhC,eAAO,MAAM,gBAAgB,QAAO,qBAGL,CAAC;AAEhC,eAAO,MAAM,sBAAsB,UAAW,MAAM,uBAAuB,MAAM,KAAG,qBAIrD,CAAC;AAEhC,eAAO,MAAM,kBAAkB,kBAAmB,qBAAqB,KAAG,qBAI3C,CAAC;AAEhC,eAAO,MAAM,cAAc,UAAW,MAAM,kBAAiB,OAAO,KAAW,qBAIhD,CAAC;AAEhC,eAAO,MAAM,wBAAwB,iBAAkB,MAAM,KAAG,qBAIjC,CAAC;AAEhC,eAAO,MAAM,2BAA2B,QAAO,qBAGhB,CAAC;AAEhC,eAAO,MAAM,gBAAgB,eAAgB,MAAM,KAAG,qBAIvB,CAAC;AAEhC,eAAO,MAAM,oBAAoB,mBAAoB,MAAM,KAAG,qBAI/B,CAAC;AAEhC,eAAO,MAAM,mBAAmB,qBAAsB,OAAO,KAAG,qBAIjC,CAAC"}
|
|
@@ -26,6 +26,15 @@ export const aiResponseReducer = (state = initialAIResponseState, action) => {
|
|
|
26
26
|
case AIResponseConstants.updateQuotaLimit: {
|
|
27
27
|
return Object.assign(Object.assign({}, state), { quotaLimit: action.payload.quotaLimit });
|
|
28
28
|
}
|
|
29
|
+
case AIResponseConstants.updateConversationId: {
|
|
30
|
+
return Object.assign(Object.assign({}, state), { aiResponse: state.aiResponse
|
|
31
|
+
? Object.assign(Object.assign({}, state.aiResponse), { conversationId: action.payload.conversationId }) : {
|
|
32
|
+
conversationId: action.payload.conversationId,
|
|
33
|
+
} });
|
|
34
|
+
}
|
|
35
|
+
case AIResponseConstants.setHasChunkReceived: {
|
|
36
|
+
return Object.assign(Object.assign({}, state), { hasChunkReceived: action.payload.hasChunkReceived });
|
|
37
|
+
}
|
|
29
38
|
default: {
|
|
30
39
|
return state;
|
|
31
40
|
}
|
|
@@ -61,3 +70,11 @@ export const updateQuotaLimit = (quotaLimit) => ({
|
|
|
61
70
|
type: AIResponseConstants.updateQuotaLimit,
|
|
62
71
|
payload: { quotaLimit },
|
|
63
72
|
});
|
|
73
|
+
export const updateConversationId = (conversationId) => ({
|
|
74
|
+
type: AIResponseConstants.updateConversationId,
|
|
75
|
+
payload: { conversationId },
|
|
76
|
+
});
|
|
77
|
+
export const setHasChunkReceived = (hasChunkReceived) => ({
|
|
78
|
+
type: AIResponseConstants.setHasChunkReceived,
|
|
79
|
+
payload: { hasChunkReceived },
|
|
80
|
+
});
|
|
@@ -84,9 +84,9 @@ export const SeverityDescription = {
|
|
|
84
84
|
};
|
|
85
85
|
//updated description details
|
|
86
86
|
export const SeverityDescriptionDetails = {
|
|
87
|
-
["1 (Urgent)" /* SeverityLevelsInternal.SEV_1 */]: 'An issue with a Red Hat Product or Service that is
|
|
88
|
-
["2 (High)" /* SeverityLevelsInternal.SEV_2 */]: 'An issue with a Red Hat Product or Service that is
|
|
89
|
-
["3 (Normal)" /* SeverityLevelsInternal.SEV_3 */]: 'An issue with a Red Hat Product or Service that is
|
|
87
|
+
["1 (Urgent)" /* SeverityLevelsInternal.SEV_1 */]: 'An issue with a Red Hat Product or Service that is actively causing serious interruptions to your business critical operations. This is an issue requiring immediate attention as there is a significant risk to your business.',
|
|
88
|
+
["2 (High)" /* SeverityLevelsInternal.SEV_2 */]: 'An issue with a Red Hat Product or Service that is partially functional (such as degradation of a service but the service is still available) and actively impacting your business operations. This is an issue on a business critical system requiring accelerated attention.',
|
|
89
|
+
["3 (Normal)" /* SeverityLevelsInternal.SEV_3 */]: 'An issue with a Red Hat Product or Service that is currently functioning as expected but you either (1) recently experienced a degradation that you are monitoring or seeking a root cause for or (2) you are seeing indicators of a potential loss of functionality to a business critical system.',
|
|
90
90
|
["4 (Low)" /* SeverityLevelsInternal.SEV_4 */]: 'Typically, a query that does not involve any interruption to your business critical operations. ',
|
|
91
91
|
};
|
|
92
92
|
export const LargeDescriptionErrorMessage = 'Cumulative case description cannot be more than {{limit}} characters';
|
|
@@ -147,7 +147,7 @@ export const setDiscussions = (dispatch, comments, chats, attachments, feedbacks
|
|
|
147
147
|
}));
|
|
148
148
|
const allDiscussions = [...allComments, ...allChats, ...allAttachments, ...allExternalTrackers];
|
|
149
149
|
const sortedAllDiscussions = orderBy(allDiscussions, 'last_modified_date', 'desc');
|
|
150
|
-
//set filter dropdown state
|
|
150
|
+
// set filter dropdown state
|
|
151
151
|
// when we don't have any result for a discussion type, in filter options dropdown list, we make that type disable
|
|
152
152
|
discussionFiltersListState.forEach((filter) => {
|
|
153
153
|
if (filter.value === DiscussionType.ATTACHMENT) {
|
|
@@ -4,7 +4,6 @@ import { IEntitlement } from '@cee-eng/hydrajs/@types/api/public/entitlements';
|
|
|
4
4
|
import { IContact } from '@cee-eng/hydrajs/@types/models/contact';
|
|
5
5
|
import { ISolrRecommendation } from '@cee-eng/hydrajs/@types/models/solr/solr';
|
|
6
6
|
import { IPortalJwtToken } from '@rh-support/types/shared';
|
|
7
|
-
import React from 'react';
|
|
8
7
|
import { ICaseState } from './CaseConstNTypes';
|
|
9
8
|
export declare const getCaseRecommendations: (docs: ISolrRecommendation[], oldDocs: any) => any[];
|
|
10
9
|
export declare const getCepCommentFromCepDetails: (cepDetails: ICepDetails) => string;
|
|
@@ -12,7 +11,7 @@ export declare const getRecommendationObject: (doc: ISolrRecommendation, index:
|
|
|
12
11
|
export declare const getUpdatedDescription: (issue: string, environment?: string, periodicityOfIssue?: string, timeFramesAndUrgency?: string, v3ClusterName?: string, product?: string, version?: string) => string;
|
|
13
12
|
export declare const getDescriptionWOQues: (issue: string, environment?: string, periodicityOfIssue?: string, timeFramesAndUrgency?: string) => string;
|
|
14
13
|
export declare const getIrtForSLAAndSeverity: (slaProcessId: string, severity: string) => string;
|
|
15
|
-
export declare const getNewSeverityStringDef: (severity: string) => string
|
|
14
|
+
export declare const getNewSeverityStringDef: (severity: string) => string;
|
|
16
15
|
export declare const getOrtForSLAAndSeverity: (slaProcessId: string, severity: string) => string;
|
|
17
16
|
export declare const getSeverityDescription: (severity: string) => string;
|
|
18
17
|
export declare const isClusterIDValid: (caseState: any, allProducts: any) => boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CaseHelpers.d.ts","sourceRoot":"","sources":["../../../src/reducers/CaseHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,qDAAqD,CAAC;AACpG,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AACvG,OAAO,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"CaseHelpers.d.ts","sourceRoot":"","sources":["../../../src/reducers/CaseHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,qDAAqD,CAAC;AACpG,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AACvG,OAAO,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAmB3D,OAAO,EAOH,UAAU,EAkBb,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,sBAAsB,SAAU,mBAAmB,EAAE,wBAMjE,CAAC;AAEF,eAAO,MAAM,2BAA2B,eAAgB,WAAW,KAAG,MAOrE,CAAC;AAEF,eAAO,MAAM,uBAAuB,QAAS,mBAAmB,SAAS,MAAM,sBAyB9E,CAAC;AAIF,eAAO,MAAM,qBAAqB,UACvB,MAAM,gBACC,MAAM,uBACC,MAAM,yBACJ,MAAM,kBACb,MAAM,YACZ,MAAM,YACN,MAAM,KACjB,MAyBF,CAAC;AAIF,eAAO,MAAM,oBAAoB,UACtB,MAAM,gBACC,MAAM,uBACC,MAAM,yBACJ,MAAM,KAC9B,MAQF,CAAC;AAEF,eAAO,MAAM,uBAAuB,iBAAkB,MAAM,YAAY,MAAM,KAAG,MAQhF,CAAC;AAEF,eAAO,MAAM,uBAAuB,aAAc,MAAM,KAAG,MAM1D,CAAC;AAEF,eAAO,MAAM,uBAAuB,iBAAkB,MAAM,YAAY,MAAM,KAAG,MAQhF,CAAC;AAEF,eAAO,MAAM,sBAAsB,aAAc,MAAM,KAAG,MAKzD,CAAC;AAEF,eAAO,MAAM,gBAAgB,+CAsC5B,CAAC;AAIF,eAAO,MAAM,gBAAgB,cAAe,UAAU,wBAAwB,OAAO,CAAC,eAAe,CAAC,KAAG,OA6BxG,CAAC;AAEF,eAAO,MAAM,oBAAoB,cAClB,UAAU,wBACC,OAAO,CAAC,eAAe,CAAC,KAC/C,OA0BF,CAAC;AAEF,eAAO,MAAM,0BAA0B,cACxB,UAAU,wBACC,OAAO,CAAC,eAAe,CAAC,KAC/C,OAYF,CAAC;AAIF,eAAO,MAAM,6BAA6B,cAC3B,UAAU,wBACC,OAAO,CAAC,eAAe,CAAC,KAC/C,OAkBF,CAAC;AAEF,eAAO,MAAM,iBAAiB,cACf,UAAU,gBACP,YAAY,iBACZ,OAAO,KACtB,OAAO,CAAC,YAAY,CA6EtB,CAAC;AAEF,eAAO,MAAM,wBAAwB,qBAAsB,YAAY,EAAE,KAAG,YAAY,EAEvF,CAAC;AACF,eAAO,MAAM,yBAAyB,qBAAsB,YAAY,EAAE,KAAG,OAE5E,CAAC;AAEF,eAAO,MAAM,yBAAyB,gBACrB,YAAY,6BACE,MAAM,mBAChB,MAAM,KACxB,OAAO,CAAC,YAAY,CAiCtB,CAAC;AACF,eAAO,MAAM,yBAAyB,gBACrB,OAAO,CAAC,YAAY,CAAC,gCACJ,QAAQ,EAAE,KACzC,eAiDF,CAAC"}
|
|
@@ -6,7 +6,6 @@ import map from 'lodash/map';
|
|
|
6
6
|
import some from 'lodash/some';
|
|
7
7
|
import unionBy from 'lodash/unionBy';
|
|
8
8
|
import uniqBy from 'lodash/uniqBy';
|
|
9
|
-
import React from 'react';
|
|
10
9
|
import { isPhoneValid, trimAndReplacePlus } from '../components/shared/utils';
|
|
11
10
|
import { getIsClusterIdInvalid, isClusterIdEnabledForProduct } from '../utils/caseOpenshiftClusterIdUtils';
|
|
12
11
|
import { CASE_DETAILS_ISSUE_LIMIT, CASE_REFERENCE_NUMBER_LIMIT, CLUSTER_ID_LIMIT, CONTACT_INFO_24X7_LIMIT, DESCRIPTION_LENGTH_LIMIT, HOSTNAME_LENGTH_LIMIT, IDEA_SECOND_KTQUESTION_MAX_LIMIT, ITRForSLASeverity, KTQUESTION_MAX_LIMIT, KtQuestionConstant, SESSION_ENVIRONMENT_LIMIT, SESSION_ISSUE_LIMIT, SESSION_NO_CLUSTER_REASON_EXPLANATION_LENGTH_LIMIT, SESSION_NO_CLUSTER_REASON_LENGTH_LIMIT, SESSION_NOTIFIED_USERS_EXTERNAL_LIMIT, SESSION_NOTIFIED_USERS_INTERNAL_LIMIT, SESSION_PERIODICITY_OF_ISSUE_LIMIT, SESSION_PHONE_LENGTH_LIMIT, SESSION_TIME_FRAMES_URGENCY_LIMIT, SeverityDescription, SeverityDescriptionDetails, TITLE_SUMMARY_LENGTH_LIMIT, } from './CaseConstNTypes';
|
|
@@ -91,16 +90,7 @@ export const getNewSeverityStringDef = (severity) => {
|
|
|
91
90
|
if (isEmpty(severity)) {
|
|
92
91
|
return '';
|
|
93
92
|
}
|
|
94
|
-
|
|
95
|
-
if (!description) {
|
|
96
|
-
return '';
|
|
97
|
-
}
|
|
98
|
-
if (!description.includes('<')) {
|
|
99
|
-
return description;
|
|
100
|
-
}
|
|
101
|
-
return React.createElement('span', {
|
|
102
|
-
dangerouslySetInnerHTML: { __html: description },
|
|
103
|
-
});
|
|
93
|
+
return SeverityDescriptionDetails[severity];
|
|
104
94
|
};
|
|
105
95
|
export const getOrtForSLAAndSeverity = (slaProcessId, severity) => {
|
|
106
96
|
if (isEmpty(slaProcessId) || isEmpty(severity)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouteConstNTypes.d.ts","sourceRoot":"","sources":["../../../src/reducers/RouteConstNTypes.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAIxC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IAClC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IAGjB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,eAAe;CAAG;AACnC,oBAAY,gBAAgB;IACxB,WAAW,gBAAgB;IAC3B,SAAS,cAAc;IACvB,YAAY,iBAAiB;IAC7B,SAAS,cAAc;IACvB,sBAAsB,2BAA2B;IACjD,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;IAC/B,MAAM,WAAW;IACjB,WAAW,gBAAgB;IAC3B,KAAK,UAAU;CAClB;AAKD,eAAO,MAAM,4BAA4B,EAAE,gBAAgB,EAK1D,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,gBAAgB,EAM9D,CAAC;AAEF,eAAO,MAAM,iCAAiC,oBAQ7C,CAAC;AAEF,eAAO,MAAM,gCAAgC,oBAQ5C,CAAC;AAEF,eAAO,MAAM,4BAA4B,oBAQxC,CAAC;AAGF,eAAO,MAAM,0BAA0B,oBAAiC,CAAC;AAEzE,eAAO,MAAM,mCAAmC,oBAA+D,CAAC;AAEhH,eAAO,MAAM,kCAAkC,
|
|
1
|
+
{"version":3,"file":"RouteConstNTypes.d.ts","sourceRoot":"","sources":["../../../src/reducers/RouteConstNTypes.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAIxC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IAClC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IAGjB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,eAAe;CAAG;AACnC,oBAAY,gBAAgB;IACxB,WAAW,gBAAgB;IAC3B,SAAS,cAAc;IACvB,YAAY,iBAAiB;IAC7B,SAAS,cAAc;IACvB,sBAAsB,2BAA2B;IACjD,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;IAC/B,MAAM,WAAW;IACjB,WAAW,gBAAgB;IAC3B,KAAK,UAAU;CAClB;AAKD,eAAO,MAAM,4BAA4B,EAAE,gBAAgB,EAK1D,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,gBAAgB,EAM9D,CAAC;AAEF,eAAO,MAAM,iCAAiC,oBAQ7C,CAAC;AAEF,eAAO,MAAM,gCAAgC,oBAQ5C,CAAC;AAEF,eAAO,MAAM,4BAA4B,oBAQxC,CAAC;AAGF,eAAO,MAAM,0BAA0B,oBAAiC,CAAC;AAEzE,eAAO,MAAM,mCAAmC,oBAA+D,CAAC;AAEhH,eAAO,MAAM,kCAAkC,oBAM9C,CAAC;AAEF,eAAO,MAAM,+BAA+B,oBAO3C,CAAC;AAEF,eAAO,MAAM,0CAA0C,oBAStD,CAAC;AAEF,eAAO,MAAM,sCAAsC,oBAA4D,CAAC;AAEhH,eAAO,MAAM,qCAAqC,oBAGjD,CAAC;AAEF,eAAO,MAAM,6BAA6B,oBAAiC,CAAC;AAE5E,eAAO,MAAM,wBAAwB,EAAE,gBAAgB,EAKtD,CAAC"}
|
|
@@ -58,7 +58,6 @@ export const openCaseRouteSectionSequence = [
|
|
|
58
58
|
export const sessionRestoreCardSections = [AppRouteSections.GET_SUPPORT];
|
|
59
59
|
export const hideFileUploadSidebarWidgetSections = [AppRouteSections.GET_SUPPORT, AppRouteSections.SUBMIT_CASE];
|
|
60
60
|
export const showSidebarRecommendationsSections = [
|
|
61
|
-
AppRouteSections.RESOURCES,
|
|
62
61
|
AppRouteSections.ADDITIONAL_INFORMATION,
|
|
63
62
|
AppRouteSections.DESCRIBE_IDEA,
|
|
64
63
|
AppRouteSections.CONFIGURATION,
|