From 4db8a67e2683bc312cdc3325513a779fd608c731 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 16 Jan 2026 04:50:03 +0000 Subject: [PATCH 1/3] Initial plan From 5d8a972a27b69d75ab3eea05d23c3c216a3f1c02 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 16 Jan 2026 04:55:58 +0000 Subject: [PATCH 2/3] fix: resolve ESLint errors in CI workflow - Remove unused eslint-disable comment in ResponsiveDataTable.test.tsx - Replace `any` with `unknown` type cast in routing.test.ts - Convert && expression patterns to if statements in workerfy.ts - Simplify Hidden component to remove problematic forwardRef usage - Convert && expression pattern to if statement in CatalogDesignTable.tsx - Refactor ChallengesSection to use useMemo instead of setState in useEffect - Refactor ContentClassInfo to remove component defined during render - Refactor LearningSection to use useMemo instead of setState in useEffect - Refactor CatalogCardDesignLogo to use render function instead of component - Convert && expression patterns to if statements in FlipCard.tsx Co-authored-by: fitzergerald <182300328+fitzergerald@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 | 6 +-- .../CatalogDesignTable/CatalogDesignTable.tsx | 4 +- .../CatalogDetail/ChallengesSection.tsx | 19 ++++---- src/custom/CatalogDetail/ContentClassInfo.tsx | 43 ++++++++++--------- src/custom/CatalogDetail/LearningSection.tsx | 19 ++++---- .../CustomCatalog/CatalogCardDesignLogo.tsx | 6 +-- src/custom/FlipCard/FlipCard.tsx | 4 +- 10 files changed, 54 insertions(+), 54 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..0e6b5e2ef 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(); + if (snapshotSubscription?.unsubscribe) snapshotSubscription.unsubscribe(); + if (actorRef?.stop) 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..82b598135 100644 --- a/src/base/Hidden/Hidden.tsx +++ b/src/base/Hidden/Hidden.tsx @@ -1,8 +1,8 @@ import { Hidden as MuiHidden, HiddenProps as MuiHiddenProps } from '@mui/material'; import React from 'react'; -export const Hidden = React.forwardRef((props, ref) => { - return React.cloneElement(, { ref }); -}); +export const Hidden: React.FC = (props) => { + return ; +}; export default Hidden; diff --git a/src/custom/CatalogDesignTable/CatalogDesignTable.tsx b/src/custom/CatalogDesignTable/CatalogDesignTable.tsx index ade6a4521..a4d37d8d0 100644 --- a/src/custom/CatalogDesignTable/CatalogDesignTable.tsx +++ b/src/custom/CatalogDesignTable/CatalogDesignTable.tsx @@ -72,7 +72,9 @@ export const CatalogDesignsTable: React.FC = ({ setPageSize(tableState.rowsPerPage); break; case 'search': - setSearch && setSearch(tableState.searchText !== null ? tableState.searchText : ''); + if (setSearch) { + 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..62790977b 100644 --- a/src/custom/CatalogDetail/ChallengesSection.tsx +++ b/src/custom/CatalogDetail/ChallengesSection.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { useMemo, useState } from 'react'; import { Link, ListItemIcon } from '../../base'; import { MESHERY_CLOUD_PROD } from '../../constants/constants'; import { ChallengesIcon } from '../../icons'; @@ -14,18 +14,17 @@ interface ChallengesSectionProps { const ChallengesSection: React.FC = ({ filteredAcademyData }) => { const theme = useTheme(); - const [openChallenges, setOpenChallenges] = useState(false); - const [autoUpdate, setAutoUpdate] = useState(true); + const [manualOverride, setManualOverride] = useState(null); - useEffect(() => { - if (autoUpdate) { - setOpenChallenges((filteredAcademyData?.['challenges'] ?? []).length > 0); - } - }, [filteredAcademyData, autoUpdate]); + const hasChallenges = useMemo( + () => (filteredAcademyData?.['challenges'] ?? []).length > 0, + [filteredAcademyData] + ); + + const openChallenges = manualOverride !== null ? manualOverride : hasChallenges; const toggleOpenChallenges = () => { - setOpenChallenges((prev) => !prev); - setAutoUpdate(false); + setManualOverride((prev) => (prev !== null ? !prev : !hasChallenges)); }; const renderChallengeItem = (item: string, index: number) => ( diff --git a/src/custom/CatalogDetail/ContentClassInfo.tsx b/src/custom/CatalogDetail/ContentClassInfo.tsx index effd24378..9f19ab6f3 100644 --- a/src/custom/CatalogDetail/ContentClassInfo.tsx +++ b/src/custom/CatalogDetail/ContentClassInfo.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useMemo } from 'react'; import { Box } from '../../base'; import { CommunityClassIcon, OfficialClassIcon, VerificationClassIcon } from '../../icons'; import { KEPPEL, useTheme } from '../../theme'; @@ -20,26 +20,27 @@ const ContentClassInfo: React.FC = ({ contentClass, class const theme = useTheme(); - const CONTENT_CLASS: ContentClassType = { - community: { - icon: CommunityClassIcon, - color: theme.palette.icon.secondary - }, - official: { - icon: OfficialClassIcon, - color: '#EBC017' - }, - verified: { - icon: VerificationClassIcon, - color: theme.palette.primary.brand?.default || KEPPEL - } - } as const; + const CONTENT_CLASS: ContentClassType = useMemo( + () => ({ + community: { + icon: CommunityClassIcon, + color: theme.palette.icon.secondary + }, + official: { + icon: OfficialClassIcon, + color: '#EBC017' + }, + verified: { + icon: VerificationClassIcon, + color: theme.palette.primary.brand?.default || KEPPEL + } + }), + [theme.palette.icon.secondary, theme.palette.primary.brand?.default] + ); - const ClassIcon: React.FC<{ className: string }> = ({ className }) => { - const Icon = CONTENT_CLASS[className]?.icon; - const fill = CONTENT_CLASS[className]?.color; - return Icon ? : null; - }; + const classConfig = CONTENT_CLASS[contentClass]; + const Icon = classConfig?.icon; + const fill = classConfig?.color; return (
@@ -61,7 +62,7 @@ const ContentClassInfo: React.FC = ({ contentClass, class fontFamily: 'inherit' }} > - + {Icon && } {formatToTitleCase(contentClass)}
diff --git a/src/custom/CatalogDetail/LearningSection.tsx b/src/custom/CatalogDetail/LearningSection.tsx index 674b5757e..84577c5f3 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, { useMemo, useState } from 'react'; import { Link, ListItemIcon } from '../../base'; import { MESHERY_CLOUD_PROD } from '../../constants/constants'; import { LearningIcon } from '../../icons'; @@ -14,18 +14,17 @@ interface LearningSectionProps { const LearningSection: React.FC = ({ filteredAcademyData }) => { const theme = useTheme(); - const [openLearning, setOpenLearning] = useState(false); - const [autoUpdate, setAutoUpdate] = useState(true); + const [manualOverride, setManualOverride] = useState(null); - useEffect(() => { - if (autoUpdate) { - setOpenLearning(Boolean((filteredAcademyData?.['learning-path'] ?? []).length > 0)); - } - }, [filteredAcademyData, autoUpdate]); + const hasLearningPaths = useMemo( + () => (filteredAcademyData?.['learning-path'] ?? []).length > 0, + [filteredAcademyData] + ); + + const openLearning = manualOverride !== null ? manualOverride : hasLearningPaths; const toggleOpenLearning = (): void => { - setOpenLearning((prev) => !prev); - setAutoUpdate(false); + setManualOverride((prev) => (prev !== null ? !prev : !hasLearningPaths)); }; const renderLearningItem = (item: string, index: number) => ( diff --git a/src/custom/CustomCatalog/CatalogCardDesignLogo.tsx b/src/custom/CustomCatalog/CatalogCardDesignLogo.tsx index 30e3473f4..8a95be64c 100644 --- a/src/custom/CustomCatalog/CatalogCardDesignLogo.tsx +++ b/src/custom/CustomCatalog/CatalogCardDesignLogo.tsx @@ -32,7 +32,7 @@ const CatalogCardDesignLogo: React.FC = ({ setIsZoomed(false); }; - const SvgComponent: React.FC<{ type: { type: string } }> = ({ type }) => { + const renderSvgComponent = () => { return type.type === 'filter' ? ( ) : ( @@ -82,11 +82,11 @@ const CatalogCardDesignLogo: React.FC = ({ ) : ( - + renderSvgComponent() )} ) : ( - + renderSvgComponent() )} ); diff --git a/src/custom/FlipCard/FlipCard.tsx b/src/custom/FlipCard/FlipCard.tsx index 895964773..e6e1b2ff1 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(); + if (onClick) onClick(); + if (onShow) onShow(); }} > Date: Mon, 19 Jan 2026 19:18:43 -0600 Subject: [PATCH 3/3] Update src/custom/CatalogDetail/ChallengesSection.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Lee Calcote --- src/custom/CatalogDetail/ChallengesSection.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/custom/CatalogDetail/ChallengesSection.tsx b/src/custom/CatalogDetail/ChallengesSection.tsx index 62790977b..8da14f46b 100644 --- a/src/custom/CatalogDetail/ChallengesSection.tsx +++ b/src/custom/CatalogDetail/ChallengesSection.tsx @@ -17,7 +17,7 @@ const ChallengesSection: React.FC = ({ filteredAcademyDa const [manualOverride, setManualOverride] = useState(null); const hasChallenges = useMemo( - () => (filteredAcademyData?.['challenges'] ?? []).length > 0, + () => (filteredAcademyData?.['challenge'] ?? []).length > 0, [filteredAcademyData] );