@rh-support/troubleshoot 2.6.107 → 2.6.119
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/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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Button } from '@patternfly/react-core';
|
|
1
2
|
import { GlobalMetadataStateContext } from '@rh-support/react-context';
|
|
2
3
|
import isEqual from 'lodash/isEqual';
|
|
3
4
|
import React, { useContext } from 'react';
|
|
@@ -34,6 +35,8 @@ export default function ClusterRecommendations(props) {
|
|
|
34
35
|
React.createElement("h3", { className: "card-heading popular-solutions" },
|
|
35
36
|
React.createElement(Trans, null, "Cluster recommendations")),
|
|
36
37
|
React.createElement("div", null,
|
|
37
|
-
React.createElement(ClusterRecommendationItems, { clusterRecommendations: clusterRecommendations.data.slice(0, NUMBER_OF_RULES_TO_DISPLAY)
|
|
38
|
+
React.createElement(ClusterRecommendationItems, { clusterRecommendations: clusterRecommendations.data.slice(0, NUMBER_OF_RULES_TO_DISPLAY) }),
|
|
39
|
+
clusterRecommendations.data.length > NUMBER_OF_RULES_TO_DISPLAY && (React.createElement(Button, { className: "pf-v6-u-p-md", variant: "link", isBlock: true, onClick: onViewMoreRecommendation, "data-tracking-id": "cluster-recs-view-more" },
|
|
40
|
+
React.createElement(Trans, null, "View more recommendations")))))),
|
|
38
41
|
showClusterRecommendationsModal && React.createElement(ClusterRecommendationsModal, null)));
|
|
39
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Recommendations.d.ts","sourceRoot":"","sources":["../../../../src/components/Recommendations/Recommendations.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"Recommendations.d.ts","sourceRoot":"","sources":["../../../../src/components/Recommendations/Recommendations.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAgBvD,OAAO,EAAoB,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAapF,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjD,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACzE,qCAAqC,CAAC,EAAE,OAAO,CAAC;IAChD,aAAa,EAAE,GAAG,CAAC;CACtB;AAED,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,KAAK,EAAE,MAAM,qBA0XpD"}
|
|
@@ -2,7 +2,7 @@ import { pcm } from '@cee-eng/hydrajs';
|
|
|
2
2
|
import { Label, Pagination, PaginationVariant, Popover, Spinner } from '@patternfly/react-core';
|
|
3
3
|
import InfoCircleIcon from '@patternfly/react-icons/dist/js/icons/info-circle-icon';
|
|
4
4
|
import StarIcon from '@patternfly/react-icons/dist/js/icons/star-icon';
|
|
5
|
-
import {
|
|
5
|
+
import { useDebounce, usePrevious } from '@rh-support/components';
|
|
6
6
|
import { computeRecommendationAbstract, computeRecommendationTitle, dtmTrackEventContentListingItemClicked, formatDate, getRecommendationTitle, } from '@rh-support/utils';
|
|
7
7
|
import differenceBy from 'lodash/differenceBy';
|
|
8
8
|
import find from 'lodash/find';
|
|
@@ -15,6 +15,7 @@ import { useCaseDispatch, useCaseSelector } from '../../context/CaseContext';
|
|
|
15
15
|
import { RecommendationDispatchContext, RecommendationStateContext } from '../../context/RecommendationContext';
|
|
16
16
|
import { RouteContext } from '../../context/RouteContext';
|
|
17
17
|
import { SessionRestoreDispatchContext, SessionRestoreStateContext } from '../../context/SessionRestoreContext';
|
|
18
|
+
import { useAB } from '../../hooks/useAB';
|
|
18
19
|
import { getRecommendationObject } from '../../reducers/CaseHelpers';
|
|
19
20
|
import { setCaseRecommendations } from '../../reducers/CaseReducer';
|
|
20
21
|
import { fetchWatsonXRecommendations, RecommendationsConstants, setCurrentPage, setVisibleDocs, } from '../../reducers/RecommendationsReducer';
|
|
@@ -27,14 +28,14 @@ import { WatsonxAiIcon } from './WatsonxAiIcon';
|
|
|
27
28
|
const { SessionResourceSource, SessionResourceVisibility } = pcm.preCase.session;
|
|
28
29
|
export default function Recommendations(props) {
|
|
29
30
|
var _a, _b, _c;
|
|
30
|
-
const {
|
|
31
|
+
const { isVariationA } = useAB();
|
|
32
|
+
const { product, version, environment, summary, caseResourceLinks, issue, cveWorkflowRecommendation } = useCaseSelector((state) => ({
|
|
31
33
|
product: state.caseDetails.product,
|
|
32
34
|
version: state.caseDetails.version,
|
|
33
35
|
environment: state.caseDetails.environment,
|
|
34
36
|
summary: state.caseDetails.summary,
|
|
35
37
|
issue: state.caseDetails.issue,
|
|
36
38
|
caseResourceLinks: state.caseDetails.caseResourceLinks,
|
|
37
|
-
ABTestVariation: state.ABTestVariation,
|
|
38
39
|
cveWorkflowRecommendation: state.cveWorkflowRecommendation,
|
|
39
40
|
}), isEqual);
|
|
40
41
|
const caseDispatch = useCaseDispatch();
|
|
@@ -46,7 +47,7 @@ export default function Recommendations(props) {
|
|
|
46
47
|
const { recommendationState } = useContext(RecommendationStateContext);
|
|
47
48
|
const prevMainRecommendations = usePrevious((_a = recommendationState === null || recommendationState === void 0 ? void 0 : recommendationState.visibleDocs) !== null && _a !== void 0 ? _a : []);
|
|
48
49
|
const recommendationDispatch = useContext(RecommendationDispatchContext);
|
|
49
|
-
const DEFAULTPAGESIZE =
|
|
50
|
+
const DEFAULTPAGESIZE = 10;
|
|
50
51
|
const MAXROW = 24;
|
|
51
52
|
const recPageSize = pageSize !== null && pageSize !== void 0 ? pageSize : DEFAULTPAGESIZE;
|
|
52
53
|
const abortControllerRef = useRef(undefined);
|
|
@@ -56,16 +57,17 @@ export default function Recommendations(props) {
|
|
|
56
57
|
summary: summary,
|
|
57
58
|
description: issue, // we don't need to truncate to 20k as Watsonx max recs is 4000 done for us already
|
|
58
59
|
};
|
|
59
|
-
const isATestvariation = ABTestVariation === 'A';
|
|
60
|
-
const isBTestvariation = ABTestVariation === 'B' || isEmpty(ABTestVariation);
|
|
61
60
|
const isRecSearchPayloadSame = isEqual(payload, recommendationState.prevRecommendationsBody);
|
|
62
61
|
useEffect(() => {
|
|
63
62
|
// currently due to the debounce we use after the page load leads to some delay in the disbaling of next button
|
|
64
63
|
// since the state of the next button depends on the loading rec flag so we force the flag to be true every time the
|
|
65
64
|
// rec section is rendered for the first time except the case when we won't make a new search since there was no change in the rec payload.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
65
|
+
const validSections = isVariationA
|
|
66
|
+
? [AppRouteSections.RESOURCES]
|
|
67
|
+
: isCaseCreate
|
|
68
|
+
? [AppRouteSections.SUMMARIZE]
|
|
69
|
+
: [AppRouteSections.TROUBLESHOOT];
|
|
70
|
+
if (!validSections.includes(activeSection) || !summary || isRecSearchPayloadSame) {
|
|
69
71
|
return;
|
|
70
72
|
}
|
|
71
73
|
!isRecSearchPayloadSame &&
|
|
@@ -80,8 +82,12 @@ export default function Recommendations(props) {
|
|
|
80
82
|
* Also, log the newly presented resources on the session
|
|
81
83
|
*/
|
|
82
84
|
useDebounce(() => {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
+
const validSections = isVariationA
|
|
86
|
+
? [AppRouteSections.RESOURCES]
|
|
87
|
+
: isCaseCreate
|
|
88
|
+
? [AppRouteSections.SUMMARIZE]
|
|
89
|
+
: [AppRouteSections.TROUBLESHOOT];
|
|
90
|
+
if (!validSections.includes(activeSection) || isRecSearchPayloadSame) {
|
|
85
91
|
return;
|
|
86
92
|
}
|
|
87
93
|
setCurrentPage(recommendationDispatch, 1);
|
|
@@ -181,39 +187,33 @@ export default function Recommendations(props) {
|
|
|
181
187
|
t('Match')))));
|
|
182
188
|
};
|
|
183
189
|
return (React.createElement(React.Fragment, null,
|
|
184
|
-
isBTestvariation && (React.createElement(LoadingDots, { className: "recommendation-loading-dots", show: recommendationState.isLoadingRecommendations && !isEmpty(summary) })),
|
|
185
190
|
React.createElement("div", { className: "recommendation-list", ref: props.resultsRowRef },
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
recommendationState.isLoadingRecommendations
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
' '
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
' ')))
|
|
207
|
-
: recommendationState.visibleDocs.length !== 0 && (React.createElement(Label, { color: "purple", className: "pf-v6-u-mb-md" },
|
|
208
|
-
React.createElement(WatsonxAiIcon, { fillColor: "#6753ac", className: "pf-v6-u-mr-xs" }),
|
|
209
|
-
React.createElement(Trans, null, "Live search results powered by OpenShift AI"))),
|
|
210
|
-
isATestvariation && recommendationState.isLoadingRecommendations ? (React.createElement(RecommendationsLoader, null)) : (React.createElement("ul", { className: "list-flat" }, map(recommendationState.visibleDocs, (doc, i) => {
|
|
191
|
+
(recommendationState.visibleDocs.length !== 0 || recommendationState.isLoadingRecommendations) && (React.createElement("div", { className: `${recommendationState.isLoadingRecommendations ? 'gradient' : ''} label-container-icon` },
|
|
192
|
+
React.createElement("div", { id: "DeepPurpleColorAILabel" },
|
|
193
|
+
recommendationState.isLoadingRecommendations ? (React.createElement(React.Fragment, null,
|
|
194
|
+
React.createElement("span", { className: "loading-text" },
|
|
195
|
+
React.createElement(Spinner, { size: "sm", className: "pf-v6-u-mr-xs" }),
|
|
196
|
+
' ',
|
|
197
|
+
React.createElement(Trans, null, recommendationState.visibleDocs.length
|
|
198
|
+
? 'Updating recommendations '
|
|
199
|
+
: 'Recommending articles '),
|
|
200
|
+
' ',
|
|
201
|
+
React.createElement(InfoCircleIcon, { color: "#5E40BE" })))) : (React.createElement(React.Fragment, null,
|
|
202
|
+
React.createElement("span", { className: "ai-label-text" },
|
|
203
|
+
React.createElement(WatsonxAiIcon, { fillColor: "#FFFFFF", className: "pf-v6-u-mr-xs" }),
|
|
204
|
+
' ',
|
|
205
|
+
React.createElement("span", { className: "ai-label-text1" },
|
|
206
|
+
React.createElement(Trans, null, "Recommended search results"),
|
|
207
|
+
" ",
|
|
208
|
+
infoPopover)))),
|
|
209
|
+
' '))),
|
|
210
|
+
recommendationState.isLoadingRecommendations ? (React.createElement(RecommendationsLoader, null)) : (React.createElement("ul", { className: "list-flat" }, map(recommendationState.visibleDocs, (doc, i) => {
|
|
211
211
|
var _a, _b;
|
|
212
212
|
return (React.createElement("li", { className: "result", key: doc.id },
|
|
213
213
|
React.createElement("header", { className: "result-header" },
|
|
214
214
|
React.createElement("a", { href: `${doc.view_uri}?${RouteUtils.getSEResourceQueryParams(activeSessionId, (_b = (_a = sessionResourceTracking[SessionResourceSource.RECOMMENDATIONS]) === null || _a === void 0 ? void 0 : _a.resourceOriginId) !== null && _b !== void 0 ? _b : '', SessionResourceSource.RECOMMENDATIONS)}`, className: "se-recommended ts-result", "data-tracking-id": `se-recommended-main-recommendations-${i}`, rel: "noopener noreferrer", target: "_blank", onClick: onResourceClick(doc, i), dangerouslySetInnerHTML: computeRecommendationTitle(doc) }),
|
|
215
215
|
React.createElement("div", { className: "header-meta pf-v6-u-mt-xs" },
|
|
216
|
-
|
|
216
|
+
doc.rerank_score && computeLabel(doc),
|
|
217
217
|
doc.kcsState === 'verified' && (React.createElement(React.Fragment, null,
|
|
218
218
|
React.createElement("span", { className: "status-verified pf-v6-u-font-weight-bold pf-v6-u-success-color-100" }, "verified"),
|
|
219
219
|
React.createElement("span", { className: "list-separator" }, "\u2013"))),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteRiderAcceptanceModal.d.ts","sourceRoot":"","sources":["../../../../src/components/RemoteRider/RemoteRiderAcceptanceModal.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,OAAO,KAAqB,MAAM,OAAO,CAAC;AAG1C,UAAU,MAAM;IACZ,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;CACrD;AAED,MAAM,CAAC,OAAO,UAAU,0BAA0B,CAAC,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"RemoteRiderAcceptanceModal.d.ts","sourceRoot":"","sources":["../../../../src/components/RemoteRider/RemoteRiderAcceptanceModal.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,OAAO,KAAqB,MAAM,OAAO,CAAC;AAG1C,UAAU,MAAM;IACZ,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;CACrD;AAED,MAAM,CAAC,OAAO,UAAU,0BAA0B,CAAC,KAAK,EAAE,MAAM,qBAuD/D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Review.d.ts","sourceRoot":"","sources":["../../../../src/components/Review/Review.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAIvD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"Review.d.ts","sourceRoot":"","sources":["../../../../src/components/Review/Review.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAIvD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAoBlE,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;CACpD;AACD,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,KAAK,EAAE,MAAM,qBAuE3C"}
|
|
@@ -24,12 +24,10 @@ import CaseContactSelector from '../CaseManagement/SendNotifications/CaseContact
|
|
|
24
24
|
import { Hostname } from '../ImproveCase/Hostname';
|
|
25
25
|
import KtQuestions from '../ImproveCase/KtQuestions';
|
|
26
26
|
import { AllProductsSelector } from '../ProductSelector/AllProductsSelector';
|
|
27
|
-
import { EARuleWidget } from '../Recommendations/EARules/EARuleWidget';
|
|
28
27
|
export default function Review(props) {
|
|
29
28
|
const caseDispatch = useCaseDispatch();
|
|
30
|
-
const { contactInfo24x7,
|
|
29
|
+
const { contactInfo24x7, caseType } = useCaseSelector((state) => ({
|
|
31
30
|
contactInfo24x7: state.caseDetails.contactInfo24x7,
|
|
32
|
-
ABTestVariation: state.ABTestVariation,
|
|
33
31
|
caseType: state.caseDetails.caseType,
|
|
34
32
|
}), isEqual);
|
|
35
33
|
const ability = useContext(AbilityContext);
|
|
@@ -37,9 +35,7 @@ export default function Review(props) {
|
|
|
37
35
|
const onSeverityChange = (payload) => {
|
|
38
36
|
setCaseDetails(caseDispatch, payload);
|
|
39
37
|
};
|
|
40
|
-
const isBTestvariation = ABTestVariation === 'B' || isEmpty(ABTestVariation);
|
|
41
38
|
return (React.createElement(React.Fragment, null,
|
|
42
|
-
isBTestvariation && React.createElement(EARuleWidget, null),
|
|
43
39
|
React.createElement("form", { className: "review-form card card-light push-bottom" },
|
|
44
40
|
React.createElement(AccountSelector, null),
|
|
45
41
|
React.createElement(OwnerSelector, null),
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TopContentSidebar.d.ts","sourceRoot":"","sources":["../../../../src/components/Suggestions/TopContentSidebar.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAM1C,MAAM,CAAC,OAAO,UAAU,iBAAiB,sBA2CxC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Card, CardBody, CardHeader, Tooltip } from '@patternfly/react-core';
|
|
2
|
+
import InfoCircleIcon from '@patternfly/react-icons/dist/js/icons/info-circle-icon';
|
|
3
|
+
import isEqual from 'lodash/isEqual';
|
|
4
|
+
import React, { useContext } from 'react';
|
|
5
|
+
import { Trans, useTranslation } from 'react-i18next';
|
|
6
|
+
import { useCaseSelector } from '../../context/CaseContext';
|
|
7
|
+
import { TCStateContext } from '../../context/TopContentContext';
|
|
8
|
+
export default function TopContentSidebar() {
|
|
9
|
+
const { t } = useTranslation();
|
|
10
|
+
const { topContentState: { topContent }, } = useContext(TCStateContext);
|
|
11
|
+
const { version } = useCaseSelector((state) => ({
|
|
12
|
+
version: state.caseDetails.version,
|
|
13
|
+
}), isEqual);
|
|
14
|
+
// Only show if there's a version but no topContent data
|
|
15
|
+
if (!version || topContent.data.length > 0) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return (React.createElement(Card, { id: "card", className: "pf-v6-u-mt-md" },
|
|
19
|
+
React.createElement(CardHeader, { id: "card-title" },
|
|
20
|
+
React.createElement(Trans, { i18nKey: 'i18nKeyPopularSolutions' }, "Red Hat hand picked support articles"),
|
|
21
|
+
React.createElement(Tooltip, { content: React.createElement("div", null,
|
|
22
|
+
React.createElement(Trans, null, "Support articles are matched to the product and version details you selected, not the problem details you entered.")) },
|
|
23
|
+
React.createElement(InfoCircleIcon, { className: "pf-v6-u-ml-sm", "aria-label": "More info about how support articles are matched" }))),
|
|
24
|
+
React.createElement(CardBody, { "aria-label": t('No recommendations for this product'), className: "file-recs-no-recommendation" },
|
|
25
|
+
React.createElement(Trans, null, "No recommendations for this product"))));
|
|
26
|
+
}
|
|
@@ -140,7 +140,7 @@ export const AskRedHat = ({ onChatWithAIClick }) => {
|
|
|
140
140
|
// Use accumulated response if streaming, otherwise use the final response
|
|
141
141
|
const answer = aiResponseState.isStreaming && aiResponseState.accumulatedResponse
|
|
142
142
|
? aiResponseState.accumulatedResponse
|
|
143
|
-
: (aiResponse === null || aiResponse === void 0 ? void 0 : aiResponse.answer) || (aiResponse === null || aiResponse === void 0 ? void 0 : aiResponse.content)
|
|
143
|
+
: (aiResponse === null || aiResponse === void 0 ? void 0 : aiResponse.answer) || (aiResponse === null || aiResponse === void 0 ? void 0 : aiResponse.content);
|
|
144
144
|
const sources = React.useMemo(() => (aiResponse === null || aiResponse === void 0 ? void 0 : aiResponse.sources) || (aiResponse === null || aiResponse === void 0 ? void 0 : aiResponse.references) || [], [aiResponse]);
|
|
145
145
|
const sourcesCount = sources.length || 0;
|
|
146
146
|
// Show loading only when streaming has started but no content received yet
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import '@ifd-ui/ask-redhat-core/ask-redhat-core.css';
|
|
2
2
|
import React from 'react';
|
|
3
|
+
import { RouteComponentProps } from 'react-router-dom';
|
|
4
|
+
import { IRouteUrlParams } from '../../reducers/RouteConstNTypes';
|
|
3
5
|
interface IProps {
|
|
6
|
+
routeProps: RouteComponentProps<IRouteUrlParams>;
|
|
7
|
+
userSeenRecommendations?: (value: React.SetStateAction<boolean>) => void;
|
|
8
|
+
userClickedNextonRecommendations?: boolean;
|
|
9
|
+
resultsRowRef: React.MutableRefObject<HTMLDivElement | null>;
|
|
4
10
|
inlineEditable: boolean;
|
|
5
11
|
initialIsEditing?: boolean;
|
|
6
12
|
required?: boolean;
|
|
@@ -13,6 +19,9 @@ interface IProps {
|
|
|
13
19
|
aiServicesAvailable: boolean;
|
|
14
20
|
isSecureSupport?: boolean;
|
|
15
21
|
hasConfirmedStatesideSupport?: boolean;
|
|
22
|
+
onBack?: (e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
23
|
+
haveARHFieldsChanged?: boolean;
|
|
24
|
+
resetARHFieldsChanged?: () => void;
|
|
16
25
|
}
|
|
17
26
|
declare function TroubleshootSection(props: IProps): React.JSX.Element;
|
|
18
27
|
declare namespace TroubleshootSection {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TroubleshootSection.d.ts","sourceRoot":"","sources":["../../../../src/components/TroubleshootSection/TroubleshootSection.tsx"],"names":[],"mappings":"AAAA,OAAO,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"TroubleshootSection.d.ts","sourceRoot":"","sources":["../../../../src/components/TroubleshootSection/TroubleshootSection.tsx"],"names":[],"mappings":"AAAA,OAAO,6CAA6C,CAAC;AAkBrD,OAAO,KAAqD,MAAM,OAAO,CAAC;AAE1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAUvD,OAAO,EAAoB,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAyBpF,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACjD,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACzE,gCAAgC,CAAC,EAAE,OAAO,CAAC;IAC3C,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC7D,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,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;AAWD,iBAAS,mBAAmB,CAAC,KAAK,EAAE,MAAM,qBAmZzC;kBAnZQ,mBAAmB;;;AAsZ5B,eAAe,mBAAmB,CAAC"}
|
|
@@ -8,26 +8,46 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
import '@ifd-ui/ask-redhat-core/ask-redhat-core.css';
|
|
11
|
-
import { Env } from '@cee-eng/hydrajs';
|
|
12
|
-
import { AskRedHatChat, setAuthToken } from '@ifd-ui/ask-redhat-core';
|
|
11
|
+
import { Env, pcm } from '@cee-eng/hydrajs';
|
|
12
|
+
import { ARHEventName, AskRedHatChat, setAuthToken, } from '@ifd-ui/ask-redhat-core';
|
|
13
13
|
import { Button, Card, CardBody, CardHeader, Tooltip } from '@patternfly/react-core';
|
|
14
14
|
import InfoCircleIcon from '@patternfly/react-icons/dist/js/icons/info-circle-icon';
|
|
15
15
|
import { ErrorBoundary, LoadingDots } from '@rh-support/components';
|
|
16
16
|
import { PreviousCaseTypes } from '@rh-support/utils';
|
|
17
|
+
import i18next from 'i18next';
|
|
17
18
|
import isEmpty from 'lodash/isEmpty';
|
|
18
19
|
import isEqual from 'lodash/isEqual';
|
|
19
|
-
import React, { useContext, useRef } from 'react';
|
|
20
|
+
import React, { useCallback, useContext, useEffect, useRef } from 'react';
|
|
20
21
|
import { Trans, useTranslation } from 'react-i18next';
|
|
21
|
-
import { useAIResponseState } from '../../context/AIResponseContext';
|
|
22
|
+
import { useAIResponseDispatch, useAIResponseState } from '../../context/AIResponseContext';
|
|
22
23
|
import { useCaseSelector } from '../../context/CaseContext';
|
|
23
24
|
import { RouteContext } from '../../context/RouteContext';
|
|
25
|
+
import { SessionRestoreDispatchContext, SessionRestoreStateContext } from '../../context/SessionRestoreContext';
|
|
24
26
|
import { TCStateContext } from '../../context/TopContentContext';
|
|
27
|
+
import { useAB } from '../../hooks/useAB';
|
|
28
|
+
import { setHasChunkReceived, updateConversationId } from '../../reducers/AIResponseReducer';
|
|
25
29
|
import { appSourceId_ARH, excludedCaseTypesforARH } from '../../reducers/CaseConstNTypes';
|
|
30
|
+
import { AppRouteSections } from '../../reducers/RouteConstNTypes';
|
|
31
|
+
import { createOrUpdateSessionResources } from '../../reducers/SessionRestoreReducer';
|
|
26
32
|
import { OpenShiftClusterId } from '../CaseManagement/OpenShiftClusterId';
|
|
27
33
|
import ClusterRecommendations from '../Recommendations/ClusterRecommendations';
|
|
28
34
|
import InsightsResults from '../Recommendations/InsightsResults';
|
|
35
|
+
import Recommendations from '../Recommendations/Recommendations';
|
|
29
36
|
import Suggestions from '../Suggestions/Suggestions';
|
|
37
|
+
import { generateAIQuestion } from '../wizardLayout/WizardMain';
|
|
30
38
|
import { AskRedHat } from './AskRedHat';
|
|
39
|
+
const { SessionResourceSource, SessionResourceVisibility } = pcm.preCase.session;
|
|
40
|
+
const getSessResFromARHSource = (source, visibilityStatus, rank = 1) => ({
|
|
41
|
+
visibilityStatus,
|
|
42
|
+
resourceEntityId: source.link || source.url,
|
|
43
|
+
url: source.link || source.url,
|
|
44
|
+
rank,
|
|
45
|
+
});
|
|
46
|
+
const getSessResFromAISources = (sources, visibilityStatus) => {
|
|
47
|
+
if (!sources || sources.length === 0)
|
|
48
|
+
return;
|
|
49
|
+
return sources.map((source, index) => getSessResFromARHSource(source, visibilityStatus, index + 1));
|
|
50
|
+
};
|
|
31
51
|
const defaultProps = {
|
|
32
52
|
initialIsEditing: false,
|
|
33
53
|
required: false,
|
|
@@ -35,18 +55,28 @@ const defaultProps = {
|
|
|
35
55
|
autoFocus: false,
|
|
36
56
|
hideSaveCancel: false,
|
|
37
57
|
aiServicesAvailable: false,
|
|
58
|
+
haveARHFieldsChanged: false,
|
|
38
59
|
};
|
|
39
60
|
function TroubleshootSection(props) {
|
|
40
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
61
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
41
62
|
const { t } = useTranslation();
|
|
42
|
-
const {
|
|
43
|
-
const
|
|
63
|
+
const { isVariationA } = useAB();
|
|
64
|
+
const { isAIChatMode } = props;
|
|
65
|
+
const lastDispatchedConversationIdRef = useRef(null);
|
|
66
|
+
const sourcesRef = useRef(null);
|
|
67
|
+
const clickedSourcesRef = useRef(new Set());
|
|
68
|
+
const engagementTimerRef = useRef(null);
|
|
69
|
+
const hasInteractionHappenedRef = useRef(false);
|
|
44
70
|
const { topContentState: { topContent }, } = useContext(TCStateContext);
|
|
45
|
-
const { routeState: { isCaseCreate }, } = useContext(RouteContext);
|
|
71
|
+
const { routeState: { isCaseCreate, activeSection }, } = useContext(RouteContext);
|
|
72
|
+
const { caseDetails } = useCaseSelector((state) => ({
|
|
73
|
+
caseDetails: state.caseDetails,
|
|
74
|
+
}), isEqual);
|
|
46
75
|
const aiResponseState = useAIResponseState();
|
|
76
|
+
const aiResponseDispatch = useAIResponseDispatch();
|
|
47
77
|
const session = window === null || window === void 0 ? void 0 : window.sessionjs;
|
|
48
78
|
const keycloakSession = (_b = (_a = session === null || session === void 0 ? void 0 : session._state) === null || _a === void 0 ? void 0 : _a.keycloak) !== null && _b !== void 0 ? _b : null;
|
|
49
|
-
const { product, version, isCreatingCase, caseType } = useCaseSelector((state) => ({
|
|
79
|
+
const { product, version, summary, issue, isCreatingCase, caseType } = useCaseSelector((state) => ({
|
|
50
80
|
product: state.caseDetails.product,
|
|
51
81
|
version: state.caseDetails.version,
|
|
52
82
|
summary: state.caseDetails.summary,
|
|
@@ -54,35 +84,69 @@ function TroubleshootSection(props) {
|
|
|
54
84
|
caseType: state.caseDetails.caseType,
|
|
55
85
|
issue: state.caseDetails.issue,
|
|
56
86
|
}), isEqual);
|
|
87
|
+
const { sessionRestore: { activeSessionId, sessionResourceTracking }, } = useContext(SessionRestoreStateContext);
|
|
88
|
+
const sessionRestoreDispatch = useContext(SessionRestoreDispatchContext);
|
|
57
89
|
const canShowTopProducts = isEmpty(product);
|
|
58
90
|
const canShowTopContent = !canShowTopProducts && ((_c = topContent === null || topContent === void 0 ? void 0 : topContent.data) === null || _c === void 0 ? void 0 : _c.length) > 0;
|
|
59
91
|
const isNotAnIdea = caseType !== PreviousCaseTypes.FEATURE_ENHANCEMENT;
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
if (
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
92
|
+
const clearEngagementTimer = useCallback(() => {
|
|
93
|
+
if (engagementTimerRef.current) {
|
|
94
|
+
clearTimeout(engagementTimerRef.current);
|
|
95
|
+
engagementTimerRef.current = null;
|
|
96
|
+
}
|
|
97
|
+
}, []);
|
|
98
|
+
// Call resource API with sources if available, otherwise create resource origin with payload only
|
|
99
|
+
const callResourceAPI = useCallback((sources, visibilityStatus) => {
|
|
100
|
+
if (!activeSessionId)
|
|
101
|
+
return;
|
|
102
|
+
const payload = JSON.stringify({ product, version, summary, issue });
|
|
103
|
+
if (sources && sources.length > 0) {
|
|
104
|
+
const sessionResources = visibilityStatus === SessionResourceVisibility.VISITED
|
|
105
|
+
? sources.map((source, index) => getSessResFromARHSource(source, visibilityStatus, index + 1))
|
|
106
|
+
: getSessResFromAISources(sources, visibilityStatus);
|
|
107
|
+
createOrUpdateSessionResources(sessionRestoreDispatch, activeSessionId, sessionResourceTracking, SessionResourceSource.ASK_RED_HAT, sessionResources, payload);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
createOrUpdateSessionResources(sessionRestoreDispatch, activeSessionId, sessionResourceTracking, SessionResourceSource.ASK_RED_HAT, undefined, payload);
|
|
111
|
+
}
|
|
112
|
+
}, [activeSessionId, product, version, summary, issue, sessionRestoreDispatch, sessionResourceTracking]);
|
|
113
|
+
const handleARHEvent = useCallback((eventData) => {
|
|
114
|
+
// Enable "See more resources" button when first chunk iss received
|
|
115
|
+
if (eventData.eventName === ARHEventName.AnswerReceived) {
|
|
116
|
+
aiResponseDispatch(setHasChunkReceived(true));
|
|
117
|
+
}
|
|
118
|
+
// If message sent with conversationId, call API immediately (engagement happened)
|
|
119
|
+
if (eventData.eventName === ARHEventName.MessageSent && isVariationA) {
|
|
120
|
+
const { conversationId } = eventData.payload;
|
|
121
|
+
if (conversationId !== undefined && conversationId !== null && conversationId !== '') {
|
|
122
|
+
clearEngagementTimer();
|
|
123
|
+
if (!hasInteractionHappenedRef.current) {
|
|
124
|
+
hasInteractionHappenedRef.current = true;
|
|
125
|
+
callResourceAPI(sourcesRef.current, SessionResourceVisibility.PRESENTED);
|
|
76
126
|
}
|
|
77
127
|
}
|
|
78
|
-
|
|
79
|
-
|
|
128
|
+
}
|
|
129
|
+
if (eventData.eventName === ARHEventName.SourcePresented) {
|
|
130
|
+
const { conversationId, sources } = eventData.payload;
|
|
131
|
+
if (sources && Array.isArray(sources)) {
|
|
132
|
+
sourcesRef.current = sources.map((source) => (Object.assign(Object.assign({}, source), { url: source.sourceUrl || source.url, link: source.sourceUrl || source.link })));
|
|
133
|
+
}
|
|
134
|
+
if (conversationId && conversationId !== lastDispatchedConversationIdRef.current) {
|
|
135
|
+
lastDispatchedConversationIdRef.current = conversationId;
|
|
136
|
+
aiResponseDispatch(updateConversationId(conversationId));
|
|
80
137
|
}
|
|
81
138
|
}
|
|
82
|
-
|
|
83
|
-
|
|
139
|
+
if (eventData.eventName === ARHEventName.SourceClicked && isVariationA) {
|
|
140
|
+
const { sourceUrl, sourceText } = eventData.payload;
|
|
141
|
+
if (!sourceUrl || clickedSourcesRef.current.has(sourceUrl))
|
|
142
|
+
return;
|
|
143
|
+
clickedSourcesRef.current.add(sourceUrl);
|
|
144
|
+
hasInteractionHappenedRef.current = true;
|
|
145
|
+
clearEngagementTimer();
|
|
146
|
+
const source = { url: sourceUrl, link: sourceUrl, sourceUrl, sourceText };
|
|
147
|
+
callResourceAPI([source], SessionResourceVisibility.VISITED);
|
|
84
148
|
}
|
|
85
|
-
};
|
|
149
|
+
}, [aiResponseDispatch, callResourceAPI, clearEngagementTimer, isVariationA]);
|
|
86
150
|
const preprocessRequest = () => __awaiter(this, void 0, void 0, function* () {
|
|
87
151
|
var _a;
|
|
88
152
|
if (!keycloakSession) {
|
|
@@ -104,14 +168,42 @@ function TroubleshootSection(props) {
|
|
|
104
168
|
throw error;
|
|
105
169
|
}
|
|
106
170
|
});
|
|
171
|
+
const detailedQuestion = generateAIQuestion(activeSection || '', caseDetails.product, caseDetails.version, caseDetails.summary, caseDetails.issue, caseDetails.caseType || '', i18next.language || 'en');
|
|
172
|
+
const latestUserMessage = isVariationA && ((_d = aiResponseState.aiResponse) === null || _d === void 0 ? void 0 : _d.conversationId) && props.haveARHFieldsChanged
|
|
173
|
+
? detailedQuestion
|
|
174
|
+
: '';
|
|
175
|
+
const firstUserMessage = isVariationA && !((_e = aiResponseState.aiResponse) === null || _e === void 0 ? void 0 : _e.conversationId) ? detailedQuestion : '';
|
|
176
|
+
// Reset the flag when component unmounts
|
|
177
|
+
useEffect(() => {
|
|
178
|
+
return () => {
|
|
179
|
+
var _a;
|
|
180
|
+
(_a = props.resetARHFieldsChanged) === null || _a === void 0 ? void 0 : _a.call(props);
|
|
181
|
+
};
|
|
182
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
183
|
+
}, []);
|
|
184
|
+
// 10-second engagement timer - call API if no source clicked or message not sent by user
|
|
185
|
+
useEffect(() => {
|
|
186
|
+
if (aiResponseState.hasChunkReceived && isVariationA) {
|
|
187
|
+
engagementTimerRef.current = setTimeout(() => {
|
|
188
|
+
if (hasInteractionHappenedRef.current || clickedSourcesRef.current.size > 0) {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
callResourceAPI(sourcesRef.current, SessionResourceVisibility.PRESENTED);
|
|
192
|
+
engagementTimerRef.current = null;
|
|
193
|
+
}, 10000);
|
|
194
|
+
return clearEngagementTimer;
|
|
195
|
+
}
|
|
196
|
+
}, [aiResponseState.hasChunkReceived, isVariationA, callResourceAPI, clearEngagementTimer]);
|
|
107
197
|
const initConfig = {
|
|
108
|
-
packageVersion: (
|
|
198
|
+
packageVersion: (_f = window === null || window === void 0 ? void 0 : window.supportVersionInfo) === null || _f === void 0 ? void 0 : _f.packageVersion,
|
|
109
199
|
appSourceId: appSourceId_ARH,
|
|
110
200
|
enableDebugLogging: false,
|
|
111
201
|
headerTitle: isCaseCreate ? t('Resolve your issue now with AI insights') : t('Troubleshoot with AI insights'),
|
|
112
202
|
appEnv: Env.getEnvName(),
|
|
113
203
|
showWelcomeMessage: false,
|
|
114
|
-
|
|
204
|
+
firstUserMessage: firstUserMessage,
|
|
205
|
+
conversationId: (_h = (_g = aiResponseState.aiResponse) === null || _g === void 0 ? void 0 : _g.conversationId) !== null && _h !== void 0 ? _h : '',
|
|
206
|
+
latestUserMessage: latestUserMessage,
|
|
115
207
|
enableHeaderMenu: false,
|
|
116
208
|
enableTheme: false,
|
|
117
209
|
openLinkInNewTab: true,
|
|
@@ -122,8 +214,8 @@ function TroubleshootSection(props) {
|
|
|
122
214
|
} })),
|
|
123
215
|
tokenAuth: {
|
|
124
216
|
auth: {
|
|
125
|
-
userInfo: (
|
|
126
|
-
authToken: (
|
|
217
|
+
userInfo: (_l = (_k = (_j = window === null || window === void 0 ? void 0 : window.sessionjs) === null || _j === void 0 ? void 0 : _j.getToken) === null || _k === void 0 ? void 0 : _k.call(_j)) !== null && _l !== void 0 ? _l : {},
|
|
218
|
+
authToken: (_o = (_m = window === null || window === void 0 ? void 0 : window.sessionjs) === null || _m === void 0 ? void 0 : _m.getEncodedToken()) !== null && _o !== void 0 ? _o : '',
|
|
127
219
|
},
|
|
128
220
|
events: {
|
|
129
221
|
preprocessRequest,
|
|
@@ -133,31 +225,45 @@ function TroubleshootSection(props) {
|
|
|
133
225
|
},
|
|
134
226
|
},
|
|
135
227
|
},
|
|
136
|
-
|
|
228
|
+
onARHEvent: handleARHEvent,
|
|
137
229
|
onUnauthenticatedLogin: () => {
|
|
138
230
|
var _a, _b;
|
|
139
231
|
(_b = (_a = window === null || window === void 0 ? void 0 : window.sessionjs) === null || _a === void 0 ? void 0 : _a.login) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
140
232
|
},
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
233
|
+
};
|
|
234
|
+
const shouldShowARHUI = () => {
|
|
235
|
+
if (isVariationA) {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
// Check if the case type is allowed (not in the excluded list)
|
|
239
|
+
const isCaseTypeAllowed = !excludedCaseTypesforARH.includes(caseType !== null && caseType !== void 0 ? caseType : '');
|
|
240
|
+
// Check if user is not a secure support or confirmed stateside support user
|
|
241
|
+
const isNotSecureOrStatesideUser = !props.isSecureSupport && !props.hasConfirmedStatesideSupport;
|
|
242
|
+
// Check if AI services are available
|
|
243
|
+
const isAIServicesAvailable = props.aiServicesAvailable;
|
|
244
|
+
return isCaseTypeAllowed && isNotSecureOrStatesideUser && isAIServicesAvailable;
|
|
144
245
|
};
|
|
145
246
|
const handleChatWithAIClick = () => {
|
|
146
|
-
|
|
147
|
-
|
|
247
|
+
var _a;
|
|
248
|
+
props.setIsAIChatMode(true);
|
|
249
|
+
(_a = props.onChatWithAIClick) === null || _a === void 0 ? void 0 : _a.call(props);
|
|
148
250
|
};
|
|
149
251
|
return (React.createElement(React.Fragment, null, isAIChatMode ? (React.createElement(React.Fragment, null,
|
|
150
252
|
React.createElement(AskRedHatChat, { initConfig: initConfig }),
|
|
151
|
-
React.createElement("div", { className: "fullscreen-chat-footer" },
|
|
253
|
+
React.createElement("div", { className: "fullscreen-chat-footer" }, isVariationA && activeSection === AppRouteSections.RESOURCES ? (React.createElement(React.Fragment, null,
|
|
254
|
+
React.createElement("button", { onClick: props.onBack, className: "btn btn-app btn-open-white main-nav-button", type: "button" }, t('Go back')),
|
|
255
|
+
React.createElement("button", { onClick: () => props.setIsAIChatMode(false), className: "btn btn-app btn-primary main-nav-button", type: "button", disabled: !aiResponseState.hasChunkReceived }, t('See more resources')))) : isCaseCreate ? (React.createElement("span", null,
|
|
152
256
|
React.createElement(Trans, { i18nKey: "<span>Return to</span> <button>case creation</button>", components: {
|
|
153
257
|
span: React.createElement("span", { className: "return-to-case-text" }),
|
|
154
258
|
button: (React.createElement(Button, { className: "return-to-case-btn", variant: "link", component: "a", onClick: () => props.setIsAIChatMode(false) })),
|
|
155
259
|
} }))) : (React.createElement(Button, { onClick: () => props.setIsAIChatMode(false), variant: "link", className: "return-to-resources-btn" }, t('Back to resources')))))) : (React.createElement(React.Fragment, null,
|
|
156
260
|
React.createElement("section", null,
|
|
157
|
-
|
|
158
|
-
|
|
261
|
+
isVariationA ? (React.createElement("div", { className: "suggestions-result-section" },
|
|
262
|
+
React.createElement(ErrorBoundary, { errorMsgInfo: { message: t('There was an error loading recommendations') } }, !isEmpty(version) && (React.createElement("div", { className: "common-suggestions" },
|
|
263
|
+
React.createElement(Recommendations, { routeProps: props.routeProps, userSeenRecommendations: props.userSeenRecommendations, userClickedNextonRecommendationsValue: props.userClickedNextonRecommendations, resultsRowRef: props.resultsRowRef })))))) : (shouldShowARHUI() && React.createElement(AskRedHat, { onChatWithAIClick: handleChatWithAIClick })),
|
|
264
|
+
!isVariationA && !isCreatingCase && (React.createElement(OpenShiftClusterId, { className: "push-bottom", "data-tracking-id": "troubleshoot-section-openshift-cluster-id" })),
|
|
159
265
|
React.createElement(LoadingDots, { show: topContent.isFetching }),
|
|
160
|
-
topContent.data.length === 0 && (React.createElement(Card, { id: "card", className: "pf-v6-u-mb-md" },
|
|
266
|
+
!isVariationA && topContent.data.length === 0 && (React.createElement(Card, { id: "card", className: "pf-v6-u-mb-md" },
|
|
161
267
|
React.createElement(CardHeader, { id: "card-title" },
|
|
162
268
|
React.createElement(Trans, { i18nKey: 'i18nKeyPopularSolutions' }, "Red Hat hand picked support articles"),
|
|
163
269
|
React.createElement(Tooltip, { content: React.createElement("div", null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIsSectionValid.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/useIsSectionValid.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA0C,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useIsSectionValid.d.ts","sourceRoot":"","sources":["../../../../src/components/shared/useIsSectionValid.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAwB/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAMnE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,gBAAgB;;;;;EAgR9D"}
|