@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.
Files changed (78) hide show
  1. package/lib/esm/components/AccountInfo/css/accountSelector.css +2 -3
  2. package/lib/esm/components/CaseEditView/Case.d.ts.map +1 -1
  3. package/lib/esm/components/CaseEditView/Case.js +1 -1
  4. package/lib/esm/components/CaseEditView/CaseOverview/CaseOwnerInfo.d.ts.map +1 -1
  5. package/lib/esm/components/CaseEditView/CaseOverview/CaseOwnerInfo.js +1 -1
  6. package/lib/esm/components/CaseEditView/CaseOverview/CaseType.d.ts.map +1 -1
  7. package/lib/esm/components/CaseEditView/CaseOverview/CaseType.js +4 -2
  8. package/lib/esm/components/CaseEditView/CaseOverview/index.js +1 -1
  9. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/CaseOpenshiftClusterId/CaseOpenShiftPopover.js +1 -1
  10. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/ProductVersion.d.ts.map +1 -1
  11. package/lib/esm/components/CaseEditView/Tabs/CaseDetails/ProductVersion.js +2 -4
  12. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment.d.ts.map +1 -1
  13. package/lib/esm/components/CaseEditView/Tabs/CaseDiscussion/PostComment.js +1 -2
  14. package/lib/esm/components/CaseEditView/Tabs/CaseHistory/Timeline.css +33 -13
  15. package/lib/esm/components/CaseEditView/Tabs/CaseSummary/CaseSummary.js +3 -3
  16. package/lib/esm/components/CaseEditView/Tabs/CaseSummary/CaseSummaryErrorMessage.js +1 -1
  17. package/lib/esm/components/CaseInformation/Description.d.ts.map +1 -1
  18. package/lib/esm/components/CaseInformation/Description.js +3 -1
  19. package/lib/esm/components/CaseInformation/Severity.d.ts.map +1 -1
  20. package/lib/esm/components/CaseInformation/Severity.js +1 -1
  21. package/lib/esm/components/CaseInformation/SupportLevel.d.ts.map +1 -1
  22. package/lib/esm/components/CaseInformation/SupportLevel.js +1 -1
  23. package/lib/esm/components/CaseManagement/OpenshiftDropdownV4.d.ts.map +1 -1
  24. package/lib/esm/components/CaseManagement/OpenshiftDropdownV4.js +6 -12
  25. package/lib/esm/components/OpenCase/OpenCase.d.ts.map +1 -1
  26. package/lib/esm/components/OpenCase/OpenCase.js +2 -8
  27. package/lib/esm/components/ProductSelector/AllProductsSelector.d.ts.map +1 -1
  28. package/lib/esm/components/ProductSelector/AllProductsSelector.js +6 -18
  29. package/lib/esm/components/ProductSelector/ProductSelector.d.ts.map +1 -1
  30. package/lib/esm/components/ProductSelector/ProductSelector.js +5 -12
  31. package/lib/esm/components/Recommendations/ClusterRecommendationItems.d.ts +0 -2
  32. package/lib/esm/components/Recommendations/ClusterRecommendationItems.d.ts.map +1 -1
  33. package/lib/esm/components/Recommendations/ClusterRecommendationItems.js +13 -16
  34. package/lib/esm/components/Recommendations/ClusterRecommendations.d.ts.map +1 -1
  35. package/lib/esm/components/Recommendations/ClusterRecommendations.js +4 -1
  36. package/lib/esm/components/Recommendations/Recommendations.d.ts.map +1 -1
  37. package/lib/esm/components/Recommendations/Recommendations.js +38 -38
  38. package/lib/esm/components/RemoteRider/RemoteRiderAcceptanceModal.d.ts.map +1 -1
  39. package/lib/esm/components/Review/Review.d.ts.map +1 -1
  40. package/lib/esm/components/Review/Review.js +1 -5
  41. package/lib/esm/components/Suggestions/TopContentSidebar.d.ts +3 -0
  42. package/lib/esm/components/Suggestions/TopContentSidebar.d.ts.map +1 -0
  43. package/lib/esm/components/Suggestions/TopContentSidebar.js +26 -0
  44. package/lib/esm/components/TroubleshootSection/AskRedHat.js +1 -1
  45. package/lib/esm/components/TroubleshootSection/TroubleshootSection.d.ts +9 -0
  46. package/lib/esm/components/TroubleshootSection/TroubleshootSection.d.ts.map +1 -1
  47. package/lib/esm/components/TroubleshootSection/TroubleshootSection.js +150 -44
  48. package/lib/esm/components/shared/useIsSectionValid.d.ts.map +1 -1
  49. package/lib/esm/components/shared/useIsSectionValid.js +26 -65
  50. package/lib/esm/components/wizardLayout/WizardAside.d.ts.map +1 -1
  51. package/lib/esm/components/wizardLayout/WizardAside.js +18 -9
  52. package/lib/esm/components/wizardLayout/WizardMain.d.ts.map +1 -1
  53. package/lib/esm/components/wizardLayout/WizardMain.js +110 -64
  54. package/lib/esm/components/wizardLayout/WizardNavigation.d.ts.map +1 -1
  55. package/lib/esm/components/wizardLayout/WizardNavigation.js +59 -53
  56. package/lib/esm/css/AskRedHat.css +9 -2
  57. package/lib/esm/css/app.css +1 -1
  58. package/lib/esm/hooks/useAB.d.ts +22 -0
  59. package/lib/esm/hooks/useAB.d.ts.map +1 -0
  60. package/lib/esm/hooks/useAB.js +37 -0
  61. package/lib/esm/hooks/useWizard.d.ts +4 -0
  62. package/lib/esm/hooks/useWizard.d.ts.map +1 -1
  63. package/lib/esm/hooks/useWizard.js +20 -6
  64. package/lib/esm/reducers/AIResponseConstNTypes.d.ts +17 -2
  65. package/lib/esm/reducers/AIResponseConstNTypes.d.ts.map +1 -1
  66. package/lib/esm/reducers/AIResponseConstNTypes.js +3 -0
  67. package/lib/esm/reducers/AIResponseReducer.d.ts +2 -0
  68. package/lib/esm/reducers/AIResponseReducer.d.ts.map +1 -1
  69. package/lib/esm/reducers/AIResponseReducer.js +17 -0
  70. package/lib/esm/reducers/CaseConstNTypes.js +3 -3
  71. package/lib/esm/reducers/CaseDiscussionTabReducer.js +1 -1
  72. package/lib/esm/reducers/CaseHelpers.d.ts +1 -2
  73. package/lib/esm/reducers/CaseHelpers.d.ts.map +1 -1
  74. package/lib/esm/reducers/CaseHelpers.js +1 -11
  75. package/lib/esm/reducers/RouteConstNTypes.d.ts.map +1 -1
  76. package/lib/esm/reducers/RouteConstNTypes.js +0 -1
  77. package/lib/esm/scss/_pf-overrides.scss +2 -23
  78. 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), onViewMoreRecommendation: onViewMoreRecommendation, displayVeiwMoreBtn: clusterRecommendations.data.length > 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;AAevD,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,qBA+YpD"}
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 { LoadingDots, useDebounce, usePrevious } from '@rh-support/components';
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 { product, version, environment, summary, caseResourceLinks, issue, ABTestVariation, cveWorkflowRecommendation, } = useCaseSelector((state) => ({
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 = 8;
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
- if (activeSection !== (isCaseCreate ? AppRouteSections.SUMMARIZE : AppRouteSections.TROUBLESHOOT) ||
67
- !summary ||
68
- isRecSearchPayloadSame) {
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
- if (activeSection !== (isCaseCreate ? AppRouteSections.SUMMARIZE : AppRouteSections.TROUBLESHOOT) ||
84
- isRecSearchPayloadSame) {
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
- isATestvariation
187
- ? (recommendationState.visibleDocs.length !== 0 ||
188
- recommendationState.isLoadingRecommendations) && (React.createElement("div", { className: `${recommendationState.isLoadingRecommendations ? 'gradient' : ''} label-container-icon` },
189
- React.createElement("div", { id: "DeepPurpleColorAILabel" },
190
- recommendationState.isLoadingRecommendations ? (React.createElement(React.Fragment, null,
191
- React.createElement("span", { className: "loading-text" },
192
- React.createElement(Spinner, { size: "sm", className: "pf-v6-u-mr-xs" }),
193
- ' ',
194
- React.createElement(Trans, null, recommendationState.visibleDocs.length
195
- ? 'Updating recommendations '
196
- : 'Recommending articles '),
197
- ' ',
198
- React.createElement(InfoCircleIcon, { color: "#5E40BE" })))) : (React.createElement(React.Fragment, null,
199
- React.createElement("span", { className: "ai-label-text" },
200
- React.createElement(WatsonxAiIcon, { fillColor: "#FFFFFF", className: "pf-v6-u-mr-xs" }),
201
- ' ',
202
- React.createElement("span", { className: "ai-label-text1" },
203
- React.createElement(Trans, null, "Recommended search results"),
204
- " ",
205
- infoPopover)))),
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
- isATestvariation && doc.rerank_score && computeLabel(doc),
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,qBAwD/D"}
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;AAqBlE,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;CACpD;AACD,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,KAAK,EAAE,MAAM,qBA2E3C"}
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, ABTestVariation, caseType } = useCaseSelector((state) => ({
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,3 @@
1
+ import React from 'react';
2
+ export default function TopContentSidebar(): React.JSX.Element;
3
+ //# sourceMappingURL=TopContentSidebar.d.ts.map
@@ -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) || t('No AI response available yet.');
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;AAUrD,OAAO,KAA6B,MAAM,OAAO,CAAC;AAclD,UAAU,MAAM;IACZ,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;CAC1C;AAUD,iBAAS,mBAAmB,CAAC,KAAK,EAAE,MAAM,qBAgOzC;kBAhOQ,mBAAmB;;;AAmO5B,eAAe,mBAAmB,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 { aiServicesAvailable, isAIChatMode, setIsAIChatMode, onChatWithAIClick } = props;
43
- const refetchControlReady = useRef(null);
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 shouldShowARHUI = () => {
61
- // Check if the case type is allowed (not in the excluded list)
62
- const isCaseTypeAllowed = !excludedCaseTypesforARH.includes(caseType !== null && caseType !== void 0 ? caseType : '');
63
- // Check if user is not a secure support or confirmed stateside support user
64
- const isNotSecureOrStatesideUser = !props.isSecureSupport && !props.hasConfirmedStatesideSupport;
65
- // Check if AI services are available
66
- const isAIServicesAvailable = aiServicesAvailable;
67
- return isCaseTypeAllowed && isNotSecureOrStatesideUser && isAIServicesAvailable;
68
- };
69
- const handleInitialized = (success, error) => {
70
- var _a, _b;
71
- if (success) {
72
- console.log('Chat initialized successfully');
73
- try {
74
- if (!isEmpty((_a = aiResponseState.aiResponse) === null || _a === void 0 ? void 0 : _a.conversationId)) {
75
- (_b = refetchControlReady.current) === null || _b === void 0 ? void 0 : _b.refetch();
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
- catch (error) {
79
- console.error('Failed to refetch conversation:', error);
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
- else {
83
- console.error('Chat initialization failed:', error);
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: (_d = window === null || window === void 0 ? void 0 : window.supportVersionInfo) === null || _d === void 0 ? void 0 : _d.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
- conversationId: ((_e = aiResponseState.aiResponse) === null || _e === void 0 ? void 0 : _e.conversationId) || undefined,
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: (_h = (_g = (_f = window === null || window === void 0 ? void 0 : window.sessionjs) === null || _f === void 0 ? void 0 : _f.getToken) === null || _g === void 0 ? void 0 : _g.call(_f)) !== null && _h !== void 0 ? _h : {},
126
- authToken: (_k = (_j = window === null || window === void 0 ? void 0 : window.sessionjs) === null || _j === void 0 ? void 0 : _j.getEncodedToken()) !== null && _k !== void 0 ? _k : '',
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
- onInitialized: handleInitialized,
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
- onForceRefetchConversation: (refetchControl) => {
142
- refetchControlReady.current = refetchControl;
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
- setIsAIChatMode(true);
147
- onChatWithAIClick === null || onChatWithAIClick === void 0 ? void 0 : onChatWithAIClick();
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" }, isCaseCreate ? (React.createElement("span", null,
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
- shouldShowARHUI() && React.createElement(AskRedHat, { onChatWithAIClick: handleChatWithAIClick }),
158
- !isCreatingCase && (React.createElement(OpenShiftClusterId, { className: "push-bottom", "data-tracking-id": "troubleshoot-section-openshift-cluster-id" })),
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;AAuB/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAMnE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,gBAAgB;;;;;EAmU9D"}
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"}