'use client'; import useCaptureEvent from "@/hooks/useCaptureEvent"; import { HoverCard, HoverCardContent, HoverCardTrigger } from "@/components/ui/hover-card" import { DisplayConnectionError } from "./connectionError" import { NotFoundWarning } from "./notFoundWarning" import { useDomain } from "@/hooks/useDomain"; import { useRouter } from "next/navigation"; import { useCallback } from "react"; import { useQuery } from "@tanstack/react-query"; import { flagConnectionForSync, getConnectionInfo } from "@/actions"; import { isServiceError, unwrapServiceError } from "@/lib/utils"; import { env } from "@/env.mjs"; import { ConnectionSyncStatus } from "@sourcebot/db"; import { FiLoader } from "react-icons/fi"; import { CircleCheckIcon, AlertTriangle, CircleXIcon } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { ReloadIcon } from "@radix-ui/react-icons"; import { toast } from "@/components/hooks/use-toast"; interface OverviewProps { connectionId: number; } export const Overview = ({ connectionId }: OverviewProps) => { const captureEvent = useCaptureEvent(); const domain = useDomain(); const router = useRouter(); const { data: connection, isPending, error, refetch } = useQuery({ queryKey: ['connection', domain, connectionId], queryFn: () => unwrapServiceError(getConnectionInfo(connectionId, domain)), refetchInterval: env.NEXT_PUBLIC_POLLING_INTERVAL_MS, }); const handleSecretsNavigation = useCallback(() => { captureEvent('wa_connection_secrets_navigation_pressed', {}); router.push(`/${domain}/secrets`); }, [captureEvent, domain, router]); const onRetrySync = useCallback(async () => { const result = await flagConnectionForSync(connectionId, domain); if (isServiceError(result)) { toast({ description: `❌ Failed to flag connection for sync.`, }); captureEvent('wa_connection_retry_sync_fail', { error: result.errorCode, }); } else { toast({ description: "✅ Connection flagged for sync.", }); captureEvent('wa_connection_retry_sync_success', {}); refetch(); } }, [connectionId, domain, captureEvent, refetch]); if (error) { return
{`Error loading connection. Reason: ${error.message}`}
} if (isPending) { return (
{Array.from({ length: 4 }).map((_, i) => (
))}
) } return (

Connection Type

{connection.connectionType}

Last Synced At

{connection.syncedAt ? new Date(connection.syncedAt).toLocaleDateString() : "never"}

Linked Repositories

{connection.numLinkedRepos}

Status

{connection.syncStatus === "FAILED" ? ( captureEvent('wa_connection_failed_status_hover', {})}> ) : ( )} {connection.syncStatus === "FAILED" && ( )}
) } const SyncStatusBadge = ({ status }: { status: ConnectionSyncStatus }) => { return ( {status === ConnectionSyncStatus.SYNC_NEEDED || status === ConnectionSyncStatus.IN_SYNC_QUEUE ? ( <> Sync queued ) : status === ConnectionSyncStatus.SYNCING ? ( <> Syncing ) : status === ConnectionSyncStatus.SYNCED ? ( Synced ) : status === ConnectionSyncStatus.SYNCED_WITH_WARNINGS ? ( Synced with warnings ) : status === ConnectionSyncStatus.FAILED ? ( <> Sync failed ) : null} ) }