From fd5c01b2d681bb417418c0857dd01b989358836b Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Wed, 26 Nov 2025 12:34:02 +0200 Subject: [PATCH 1/2] Auto-refresh the AI reviews ui if run is in progress --- .../components/AiReviewsTable/AiReviewsTable.tsx | 3 +-- .../src/lib/hooks/useFetchAiWorkflowRuns.ts | 15 ++++++++++++--- .../ReviewsContext/ReviewsContextProvider.tsx | 9 +-------- src/libs/ui/lib/components/tooltip/Tooltip.tsx | 4 ++-- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/apps/review/src/lib/components/AiReviewsTable/AiReviewsTable.tsx b/src/apps/review/src/lib/components/AiReviewsTable/AiReviewsTable.tsx index 863c984c2..9aa065deb 100644 --- a/src/apps/review/src/lib/components/AiReviewsTable/AiReviewsTable.tsx +++ b/src/apps/review/src/lib/components/AiReviewsTable/AiReviewsTable.tsx @@ -28,8 +28,7 @@ const stopPropagation = (ev: ReactMouseEvent): void } const AiReviewsTable: FC = props => { - const aiWorkflowIds = useMemo(() => props.reviewers.map(r => r.aiWorkflowId), [props.reviewers]) - const { runs, isLoading }: AiWorkflowRunsResponse = useFetchAiWorkflowsRuns(props.submission.id, aiWorkflowIds) + const { runs, isLoading }: AiWorkflowRunsResponse = useFetchAiWorkflowsRuns(props.submission.id) const windowSize: WindowSize = useWindowSize() const isTablet = useMemo( diff --git a/src/apps/review/src/lib/hooks/useFetchAiWorkflowRuns.ts b/src/apps/review/src/lib/hooks/useFetchAiWorkflowRuns.ts index 43c876ec3..b8c27728b 100644 --- a/src/apps/review/src/lib/hooks/useFetchAiWorkflowRuns.ts +++ b/src/apps/review/src/lib/hooks/useFetchAiWorkflowRuns.ts @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useState } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import useSWR, { SWRResponse } from 'swr' import { EnvironmentConfig } from '~/config' @@ -111,8 +111,8 @@ export const aiRunFailed = (aiRun: Pick): boolean => [ export function useFetchAiWorkflowsRuns( submissionId: string, - workflowIds: string[], ): AiWorkflowRunsResponse { + const hasInProgress = useRef(true) // Use swr hooks for challenge info fetching const { data: runs = [], @@ -121,10 +121,19 @@ export function useFetchAiWorkflowsRuns( }: SWRResponse = useSWR( `${TC_API_BASE_URL}/workflows/runs?submissionId=${submissionId}`, { - isPaused: () => !workflowIds?.length || !submissionId, + isPaused: () => !submissionId, + refreshInterval: hasInProgress.current ? 10 * 1000 : 0, }, ) + hasInProgress.current = !!runs.find(r => ( + ![ + AiWorkflowRunStatusEnum.SUCCESS, + AiWorkflowRunStatusEnum.CANCELLED, + AiWorkflowRunStatusEnum.COMPLETED, + ].includes(r.status) + )) + // Show backend error when fetching challenge info useEffect(() => { if (fetchError) { diff --git a/src/apps/review/src/pages/reviews/ReviewsContext/ReviewsContextProvider.tsx b/src/apps/review/src/pages/reviews/ReviewsContext/ReviewsContextProvider.tsx index bada3213a..60b5adc49 100644 --- a/src/apps/review/src/pages/reviews/ReviewsContext/ReviewsContextProvider.tsx +++ b/src/apps/review/src/pages/reviews/ReviewsContext/ReviewsContextProvider.tsx @@ -25,17 +25,10 @@ export const ReviewsContextProvider: FC = props => { const [actionButtons, setActionButtons] = useState() const challengeDetailsCtx = useContext(ChallengeDetailContext) - const { challengeInfo }: ChallengeDetailContextModel = challengeDetailsCtx - const [submissionInfo] = useFetchSubmissionInfo(submissionId) - const aiReviewers = useMemo(() => ( - (challengeInfo?.reviewers ?? []).filter(r => !!r.aiWorkflowId) - ), [challengeInfo?.reviewers]) - const aiWorkflowIds = useMemo(() => aiReviewers?.map(r => r.aiWorkflowId as string), [aiReviewers]) - const { runs: workflowRuns, isLoading: aiWorkflowRunsLoading }: AiWorkflowRunsResponse - = useFetchAiWorkflowsRuns(submissionId, aiWorkflowIds) + = useFetchAiWorkflowsRuns(submissionId) const isLoadingCtxData = challengeDetailsCtx.isLoadingChallengeInfo diff --git a/src/libs/ui/lib/components/tooltip/Tooltip.tsx b/src/libs/ui/lib/components/tooltip/Tooltip.tsx index 6a9f7dd75..78c2ed292 100644 --- a/src/libs/ui/lib/components/tooltip/Tooltip.tsx +++ b/src/libs/ui/lib/components/tooltip/Tooltip.tsx @@ -52,12 +52,12 @@ const Tooltip: FC = (props: TooltipProps) => { function renderTrigger(): ReactElement[] { return Children.toArray(props.children) - .map(child => cloneElement((wrapComponents(child, props.disableWrap) as ReactElement), { + .map((child, i) => cloneElement((wrapComponents(child, props.disableWrap) as ReactElement), { 'data-tooltip-delay-show': triggerOnClick ? '0' : '300', 'data-tooltip-id': tooltipId.current as string, 'data-tooltip-place': props.place ?? 'bottom', 'data-tooltip-strategy': props.strategy ?? 'absolute', - key: tooltipId.current as string, + key: `${tooltipId.current as string}-${i}`, } as any)) } From 614b230e25d70a260083d03ad38bcacf2a633236 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Wed, 26 Nov 2025 12:52:40 +0200 Subject: [PATCH 2/2] lint fix --- .../src/lib/components/AiReviewsTable/AiReviewsTable.tsx | 1 - .../CollapsibleAiReviewsRow/CollapsibleAiReviewsRow.tsx | 5 +---- .../SubmissionHistoryModal/SubmissionHistoryModal.tsx | 5 +---- .../pages/reviews/ReviewsContext/ReviewsContextProvider.tsx | 2 +- 4 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/apps/review/src/lib/components/AiReviewsTable/AiReviewsTable.tsx b/src/apps/review/src/lib/components/AiReviewsTable/AiReviewsTable.tsx index 9aa065deb..518e3cd3b 100644 --- a/src/apps/review/src/lib/components/AiReviewsTable/AiReviewsTable.tsx +++ b/src/apps/review/src/lib/components/AiReviewsTable/AiReviewsTable.tsx @@ -20,7 +20,6 @@ import styles from './AiReviewsTable.module.scss' interface AiReviewsTableProps { submission: Pick - reviewers: { aiWorkflowId: string }[] } const stopPropagation = (ev: ReactMouseEvent): void => { diff --git a/src/apps/review/src/lib/components/CollapsibleAiReviewsRow/CollapsibleAiReviewsRow.tsx b/src/apps/review/src/lib/components/CollapsibleAiReviewsRow/CollapsibleAiReviewsRow.tsx index aa89b63ca..98ccc3b57 100644 --- a/src/apps/review/src/lib/components/CollapsibleAiReviewsRow/CollapsibleAiReviewsRow.tsx +++ b/src/apps/review/src/lib/components/CollapsibleAiReviewsRow/CollapsibleAiReviewsRow.tsx @@ -35,10 +35,7 @@ const CollapsibleAiReviewsRow: FC = props => { {isOpen && (
- +
)} diff --git a/src/apps/review/src/lib/components/SubmissionHistoryModal/SubmissionHistoryModal.tsx b/src/apps/review/src/lib/components/SubmissionHistoryModal/SubmissionHistoryModal.tsx index d9e0057c2..25ef9bb15 100644 --- a/src/apps/review/src/lib/components/SubmissionHistoryModal/SubmissionHistoryModal.tsx +++ b/src/apps/review/src/lib/components/SubmissionHistoryModal/SubmissionHistoryModal.tsx @@ -279,10 +279,7 @@ export const SubmissionHistoryModal: FC = (props: S
- +
diff --git a/src/apps/review/src/pages/reviews/ReviewsContext/ReviewsContextProvider.tsx b/src/apps/review/src/pages/reviews/ReviewsContext/ReviewsContextProvider.tsx index 60b5adc49..ebbf778b6 100644 --- a/src/apps/review/src/pages/reviews/ReviewsContext/ReviewsContextProvider.tsx +++ b/src/apps/review/src/pages/reviews/ReviewsContext/ReviewsContextProvider.tsx @@ -5,7 +5,7 @@ import { Context, createContext, FC, PropsWithChildren, ReactNode, useContext, u import { useParams, useSearchParams } from 'react-router-dom' import { ChallengeDetailContext } from '../../../lib' -import { ChallengeDetailContextModel, ReviewCtxStatus, ReviewsContextModel } from '../../../lib/models' +import { ReviewCtxStatus, ReviewsContextModel } from '../../../lib/models' import { AiWorkflowRunsResponse, useFetchAiWorkflowsRuns, useFetchSubmissionInfo } from '../../../lib/hooks' export const ReviewsContext: Context