From fcffd8db63f225262f60ee96ac7be5e2dee3f031 Mon Sep 17 00:00:00 2001 From: platex-rehor-bot Date: Tue, 30 Jun 2026 13:09:59 +0000 Subject: [PATCH 1/4] fix(help-panel): use client-side navigation for internal links RHCLOUD-47951 Replace anchor tags with useNavigateKeepPanel hook in APIPanel and LearnPanel. Anchor tags trigger full page reloads which destroy the React tree, reset Jotai atoms, and close the help panel. The useNavigateKeepPanel hook performs SPA navigation via chromeHistory.push and re-asserts drawer state to keep the panel open. Co-Authored-By: Claude Opus 4.6 --- .../HelpPanel/HelpPanelTabs/APIPanel.test.tsx | 1 + .../HelpPanel/HelpPanelTabs/APIPanel.tsx | 25 ++++++++++++++----- .../HelpPanel/HelpPanelTabs/LearnPanel.tsx | 5 ++-- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/components/HelpPanel/HelpPanelTabs/APIPanel.test.tsx b/src/components/HelpPanel/HelpPanelTabs/APIPanel.test.tsx index 504a498f..c090b1b9 100644 --- a/src/components/HelpPanel/HelpPanelTabs/APIPanel.test.tsx +++ b/src/components/HelpPanel/HelpPanelTabs/APIPanel.test.tsx @@ -19,6 +19,7 @@ jest.mock('@redhat-cloud-services/frontend-components/useChrome', () => ({ getBundleData: () => ({ bundleId: 'insights' }), getAvailableBundles: () => [{ id: 'insights', title: 'RHEL' }], chromeHistory: { push: jest.fn(), replace: jest.fn() }, + drawerActions: { setDrawerPanelContent: jest.fn() }, getEnvironment: () => 'prod', }), })); diff --git a/src/components/HelpPanel/HelpPanelTabs/APIPanel.tsx b/src/components/HelpPanel/HelpPanelTabs/APIPanel.tsx index a2bffbeb..47964483 100644 --- a/src/components/HelpPanel/HelpPanelTabs/APIPanel.tsx +++ b/src/components/HelpPanel/HelpPanelTabs/APIPanel.tsx @@ -29,6 +29,7 @@ import { fetchBundles, } from '../../../utils/fetchBundleInfoAPI'; import { getBundleDisplayName } from '../../../utils/bundleUtils'; +import useNavigateKeepPanel from '../../../hooks/useNavigateKeepPanel'; interface APIDoc { name: string; @@ -233,10 +234,23 @@ const mapBundleInfoWithTitles = async (): Promise => { const APIResourceItem: React.FC<{ resource: APIDoc }> = ({ resource }) => { const chrome = useChrome(); + const navigateKeepPanel = useNavigateKeepPanel(); - const getConsoleDocsUrl = () => { + const handleClick = () => { const environment = chrome.getEnvironment(); - return convertToConsoleDocsUrl(resource.name, resource.url, environment); + const fullUrl = convertToConsoleDocsUrl( + resource.name, + resource.url, + environment + ); + // Extract the pathname for client-side navigation + try { + const url = new URL(fullUrl); + navigateKeepPanel(url.pathname); + } catch { + // Fallback for relative paths + navigateKeepPanel(fullUrl); + } }; return ( @@ -254,8 +268,7 @@ const APIResourceItem: React.FC<{ resource: APIDoc }> = ({ resource }) => {