From 8a8954146b90fc9cefd284943864acb5b9b4c2b7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 20 Jan 2026 03:54:45 +0000 Subject: [PATCH 1/3] Initial plan From 51c6da632a646e975fed1e5d29611780bb4f832c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 20 Jan 2026 03:59:49 +0000 Subject: [PATCH 2/3] fix: resolve lint errors Co-authored-by: hortison <160366376+hortison@users.noreply.github.com> --- src/__testing__/ResponsiveDataTable.test.tsx | 1 - src/__testing__/routing.test.ts | 2 +- src/actors/worker/workerfy.ts | 4 ++-- src/base/Hidden/Hidden.tsx | 2 +- .../CatalogDesignTable/CatalogDesignTable.tsx | 2 +- src/custom/CatalogDetail/ChallengesSection.tsx | 16 ++++++---------- src/custom/CatalogDetail/ContentClassInfo.tsx | 9 +++------ src/custom/CatalogDetail/LearningSection.tsx | 16 ++++++---------- .../CustomCatalog/CatalogCardDesignLogo.tsx | 9 ++++----- src/custom/FlipCard/FlipCard.tsx | 4 ++-- 10 files changed, 26 insertions(+), 39 deletions(-) diff --git a/src/__testing__/ResponsiveDataTable.test.tsx b/src/__testing__/ResponsiveDataTable.test.tsx index 6a1039c18..0d519b39e 100644 --- a/src/__testing__/ResponsiveDataTable.test.tsx +++ b/src/__testing__/ResponsiveDataTable.test.tsx @@ -50,7 +50,6 @@ jest.mock('@sistent/mui-datatables', () => { }; }); -// eslint-disable-next-line import/first import ResponsiveDataTable from '../custom/ResponsiveDataTable'; const mockColumns = [ diff --git a/src/__testing__/routing.test.ts b/src/__testing__/routing.test.ts index c64d26990..0d556ac7f 100644 --- a/src/__testing__/routing.test.ts +++ b/src/__testing__/routing.test.ts @@ -43,7 +43,7 @@ describe('routing utilities', () => { expect(getShareableResourceRoute(RESOURCE_TYPE.DESIGN, 'd2', 'design')).toBe( 'http://localhost/workspace?mode=design&design=d2' ); - expect(() => getShareableResourceRoute('filter' as any, 'f1', 'filter')).toThrow( + expect(() => getShareableResourceRoute('filter' as unknown as RESOURCE_TYPE, 'f1', 'filter')).toThrow( 'Unknown resource type filter' ); }); diff --git a/src/actors/worker/workerfy.ts b/src/actors/worker/workerfy.ts index 3e58b0f4a..41075e7e6 100644 --- a/src/actors/worker/workerfy.ts +++ b/src/actors/worker/workerfy.ts @@ -71,8 +71,8 @@ export const workerfyActor = (actor: AnyActorLogic) => { } if (event.data.type === WORKER_COMMANDS.STOP_ACTOR) { - snapshotSubscription?.unsubscribe && snapshotSubscription.unsubscribe(); - actorRef?.stop && actorRef.stop(); + snapshotSubscription?.unsubscribe?.(); + actorRef?.stop?.(); } if (event.data.type === WORKER_COMMANDS.SEND_EVENT) { diff --git a/src/base/Hidden/Hidden.tsx b/src/base/Hidden/Hidden.tsx index 22f258115..e3ea39e0f 100644 --- a/src/base/Hidden/Hidden.tsx +++ b/src/base/Hidden/Hidden.tsx @@ -2,7 +2,7 @@ import { Hidden as MuiHidden, HiddenProps as MuiHiddenProps } from '@mui/materia import React from 'react'; export const Hidden = React.forwardRef((props, ref) => { - return React.cloneElement(, { ref }); + return ; }); export default Hidden; diff --git a/src/custom/CatalogDesignTable/CatalogDesignTable.tsx b/src/custom/CatalogDesignTable/CatalogDesignTable.tsx index ade6a4521..199b67fea 100644 --- a/src/custom/CatalogDesignTable/CatalogDesignTable.tsx +++ b/src/custom/CatalogDesignTable/CatalogDesignTable.tsx @@ -72,7 +72,7 @@ export const CatalogDesignsTable: React.FC = ({ setPageSize(tableState.rowsPerPage); break; case 'search': - setSearch && setSearch(tableState.searchText !== null ? tableState.searchText : ''); + setSearch?.(tableState.searchText !== null ? tableState.searchText : ''); break; case 'sort': if ( diff --git a/src/custom/CatalogDetail/ChallengesSection.tsx b/src/custom/CatalogDetail/ChallengesSection.tsx index 1c0a026f9..373c940cc 100644 --- a/src/custom/CatalogDetail/ChallengesSection.tsx +++ b/src/custom/CatalogDetail/ChallengesSection.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import { Link, ListItemIcon } from '../../base'; import { MESHERY_CLOUD_PROD } from '../../constants/constants'; import { ChallengesIcon } from '../../icons'; @@ -14,18 +14,14 @@ interface ChallengesSectionProps { const ChallengesSection: React.FC = ({ filteredAcademyData }) => { const theme = useTheme(); - const [openChallenges, setOpenChallenges] = useState(false); + const hasChallenges = (filteredAcademyData?.['challenges'] ?? []).length > 0; + const [openChallenges, setOpenChallenges] = useState(hasChallenges); const [autoUpdate, setAutoUpdate] = useState(true); - - useEffect(() => { - if (autoUpdate) { - setOpenChallenges((filteredAcademyData?.['challenges'] ?? []).length > 0); - } - }, [filteredAcademyData, autoUpdate]); + const isOpen = autoUpdate ? hasChallenges : openChallenges; const toggleOpenChallenges = () => { - setOpenChallenges((prev) => !prev); setAutoUpdate(false); + setOpenChallenges(!isOpen); }; const renderChallengeItem = (item: string, index: number) => ( @@ -61,7 +57,7 @@ const ChallengesSection: React.FC = ({ filteredAcademyDa /> = ({ contentClass, class } } as const; - const ClassIcon: React.FC<{ className: string }> = ({ className }) => { - const Icon = CONTENT_CLASS[className]?.icon; - const fill = CONTENT_CLASS[className]?.color; - return Icon ? : null; - }; + const Icon = CONTENT_CLASS[contentClass]?.icon; + const fill = CONTENT_CLASS[contentClass]?.color; return (
@@ -61,7 +58,7 @@ const ContentClassInfo: React.FC = ({ contentClass, class fontFamily: 'inherit' }} > - + {Icon ? : null} {formatToTitleCase(contentClass)}
diff --git a/src/custom/CatalogDetail/LearningSection.tsx b/src/custom/CatalogDetail/LearningSection.tsx index 674b5757e..70e4d6a86 100644 --- a/src/custom/CatalogDetail/LearningSection.tsx +++ b/src/custom/CatalogDetail/LearningSection.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useState } from 'react'; import { Link, ListItemIcon } from '../../base'; import { MESHERY_CLOUD_PROD } from '../../constants/constants'; import { LearningIcon } from '../../icons'; @@ -14,18 +14,14 @@ interface LearningSectionProps { const LearningSection: React.FC = ({ filteredAcademyData }) => { const theme = useTheme(); - const [openLearning, setOpenLearning] = useState(false); + const hasLearning = Boolean((filteredAcademyData?.['learning-path'] ?? []).length > 0); + const [openLearning, setOpenLearning] = useState(hasLearning); const [autoUpdate, setAutoUpdate] = useState(true); - - useEffect(() => { - if (autoUpdate) { - setOpenLearning(Boolean((filteredAcademyData?.['learning-path'] ?? []).length > 0)); - } - }, [filteredAcademyData, autoUpdate]); + const isOpen = autoUpdate ? hasLearning : openLearning; const toggleOpenLearning = (): void => { - setOpenLearning((prev) => !prev); setAutoUpdate(false); + setOpenLearning(!isOpen); }; const renderLearningItem = (item: string, index: number) => ( @@ -60,7 +56,7 @@ const LearningSection: React.FC = ({ filteredAcademyData } /> = ({ setIsZoomed(false); }; - const SvgComponent: React.FC<{ type: { type: string } }> = ({ type }) => { - return type.type === 'filter' ? ( + const renderSvg = + type.type === 'filter' ? ( ) : ( ); - }; return ( <> @@ -82,11 +81,11 @@ const CatalogCardDesignLogo: React.FC = ({ ) : ( - + renderSvg )} ) : ( - + renderSvg )} ); diff --git a/src/custom/FlipCard/FlipCard.tsx b/src/custom/FlipCard/FlipCard.tsx index 895964773..a6b320d27 100644 --- a/src/custom/FlipCard/FlipCard.tsx +++ b/src/custom/FlipCard/FlipCard.tsx @@ -108,8 +108,8 @@ export function FlipCard({ onClick={() => { if (disableFlip) return; setFlipped((flipped) => !flipped); - onClick && onClick(); - onShow && onShow(); + onClick?.(); + onShow?.(); }} > Date: Tue, 20 Jan 2026 04:01:12 +0000 Subject: [PATCH 3/3] chore: align challenges data usage Co-authored-by: hortison <160366376+hortison@users.noreply.github.com> --- src/custom/CatalogDetail/ChallengesSection.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/custom/CatalogDetail/ChallengesSection.tsx b/src/custom/CatalogDetail/ChallengesSection.tsx index 373c940cc..614291977 100644 --- a/src/custom/CatalogDetail/ChallengesSection.tsx +++ b/src/custom/CatalogDetail/ChallengesSection.tsx @@ -14,7 +14,9 @@ interface ChallengesSectionProps { const ChallengesSection: React.FC = ({ filteredAcademyData }) => { const theme = useTheme(); - const hasChallenges = (filteredAcademyData?.['challenges'] ?? []).length > 0; + const challenges = + filteredAcademyData?.['challenges'] ?? filteredAcademyData?.['challenge'] ?? []; + const hasChallenges = challenges.length > 0; const [openChallenges, setOpenChallenges] = useState(hasChallenges); const [autoUpdate, setAutoUpdate] = useState(true); const isOpen = autoUpdate ? hasChallenges : openChallenges; @@ -59,7 +61,7 @@ const ChallengesSection: React.FC = ({ filteredAcademyDa title="Challenges" isOpen={isOpen} onToggle={toggleOpenChallenges} - items={filteredAcademyData['challenge'] ?? []} + items={challenges} renderItem={renderChallengeItem} tooltip="Learn CNCF projects by taking and completing time-based, hands-on labs. [Browse all challenges](/academy/challenges)" emptyState="No active challenges for this technology"