import { memo, useEffect } from "react"; import type { IssueInfo, PrInfo } from "@fusion/core"; import { useBadgeWebSocket } from "../hooks/useBadgeWebSocket"; import { GitHubBadge } from "./GitHubBadge"; export function pickPreferredBadge( liveValue: T | null | undefined, liveTimestamp: string | undefined, taskValue: T | undefined, taskTimestamp: string | undefined, ): T | undefined { if (liveValue === undefined || !liveTimestamp) { return taskValue; } if (!taskTimestamp || liveTimestamp >= taskTimestamp) { return liveValue ?? undefined; } return taskValue; } interface TaskCardBadgeProps { taskId: string; prInfo?: PrInfo; issueInfo?: IssueInfo; updatedAt: string; isInViewport: boolean; projectId?: string; } function TaskCardBadgeComponent({ taskId, prInfo, issueInfo, updatedAt, isInViewport, projectId }: TaskCardBadgeProps) { const { badgeUpdates, subscribeToBadge, unsubscribeFromBadge } = useBadgeWebSocket(projectId); const hasGitHubBadge = Boolean(prInfo || issueInfo); useEffect(() => { if (!hasGitHubBadge || !isInViewport) { unsubscribeFromBadge(taskId); return; } subscribeToBadge(taskId); return () => { unsubscribeFromBadge(taskId); }; }, [hasGitHubBadge, isInViewport, projectId, subscribeToBadge, taskId, unsubscribeFromBadge]); const liveBadgeData = badgeUpdates.get(`${projectId ?? "default"}:${taskId}`); const livePrInfo = pickPreferredBadge( liveBadgeData?.prInfo, liveBadgeData?.timestamp, prInfo, prInfo?.lastCheckedAt ?? updatedAt, ); const liveIssueInfo = pickPreferredBadge( liveBadgeData?.issueInfo, liveBadgeData?.timestamp, issueInfo, issueInfo?.lastCheckedAt ?? updatedAt, ); if (!livePrInfo && !liveIssueInfo) { return null; } return ; } export const TaskCardBadge = memo(TaskCardBadgeComponent); TaskCardBadge.displayName = "TaskCardBadge";