From b280e2ddbb6938089b65be6e9ade801a30332bd8 Mon Sep 17 00:00:00 2001 From: Brendan Kellam Date: Tue, 6 May 2025 10:44:14 -0700 Subject: [PATCH] fix: Fix repo carousel thrashing (#294) --- CHANGELOG.md | 3 ++ .../components/repositorySnapshot.tsx | 50 +++++++++++++------ packages/web/src/app/[domain]/page.tsx | 9 +++- 3 files changed, 45 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ffeb76f..165c13ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed +- Fixes bug with repos not being visible in the homepage carousel when re-indexing. [#294](https://github.com/sourcebot-dev/sourcebot/pull/294) + ### Added - Added special `*` value for `rev:` to allow searching across all branches. [#281](https://github.com/sourcebot-dev/sourcebot/pull/281) diff --git a/packages/web/src/app/[domain]/components/repositorySnapshot.tsx b/packages/web/src/app/[domain]/components/repositorySnapshot.tsx index 486795ef..c205b2da 100644 --- a/packages/web/src/app/[domain]/components/repositorySnapshot.tsx +++ b/packages/web/src/app/[domain]/components/repositorySnapshot.tsx @@ -15,14 +15,24 @@ import { } from "@/components/ui/carousel"; import { RepoIndexingStatus } from "@sourcebot/db"; import { SymbolIcon } from "@radix-ui/react-icons"; +import { RepositoryQuery } from "@/lib/types"; -export function RepositorySnapshot({ authEnabled }: { authEnabled: boolean }) { +interface RepositorySnapshotProps { + authEnabled: boolean; + repos: RepositoryQuery[]; +} + +export function RepositorySnapshot({ + authEnabled, + repos: initialRepos, +}: RepositorySnapshotProps) { const domain = useDomain(); const { data: repos, isPending, isError } = useQuery({ queryKey: ['repos', domain], queryFn: () => unwrapServiceError(getRepos(domain)), refetchInterval: env.NEXT_PUBLIC_POLLING_INTERVAL_MS, + placeholderData: initialRepos, }); if (isPending || isError || !repos) { @@ -33,22 +43,30 @@ export function RepositorySnapshot({ authEnabled }: { authEnabled: boolean }) { ) } - const numIndexedRepos = repos.filter((repo) => repo.repoIndexingStatus === RepoIndexingStatus.INDEXED).length; - const numIndexingRepos = repos.filter((repo) => repo.repoIndexingStatus === RepoIndexingStatus.INDEXING || repo.repoIndexingStatus === RepoIndexingStatus.IN_INDEX_QUEUE).length; - if (numIndexedRepos === 0 && numIndexingRepos > 0) { - return ( -
- - indexing in progress... -
- ) - } else if (numIndexedRepos == 0) { - return ( - - ) + // Use `indexedAt` to determine if a repo has __ever__ been indexed. + // The repo indexing status only tells us the repo's current indexing status. + const indexedRepos = repos.filter((repo) => repo.indexedAt !== undefined); + + // If there are no indexed repos... + if (indexedRepos.length === 0) { + + // ... show a loading state if repos are being indexed now + if (repos.some((repo) => repo.repoIndexingStatus === RepoIndexingStatus.INDEXING || repo.repoIndexingStatus === RepoIndexingStatus.IN_INDEX_QUEUE)) { + return ( +
+ + indexing in progress... +
+ ) + + // ... otherwise, show the empty state. + } else { + return ( + + ) + } } - const indexedRepos = repos.filter((repo) => repo.repoIndexingStatus === RepoIndexingStatus.INDEXED); return (
@@ -57,7 +75,7 @@ export function RepositorySnapshot({ authEnabled }: { authEnabled: boolean }) { href={`${domain}/repos`} className="text-blue-500" > - {repos.length > 1 ? 'repositories' : 'repository'} + {indexedRepos.length > 1 ? 'repositories' : 'repository'} diff --git a/packages/web/src/app/[domain]/page.tsx b/packages/web/src/app/[domain]/page.tsx index 8f8d76aa..99ef681c 100644 --- a/packages/web/src/app/[domain]/page.tsx +++ b/packages/web/src/app/[domain]/page.tsx @@ -10,6 +10,8 @@ import { SourcebotLogo } from "../components/sourcebotLogo"; import { RepositorySnapshot } from "./components/repositorySnapshot"; import { SyntaxReferenceGuideHint } from "./components/syntaxReferenceGuideHint"; import { env } from '@/env.mjs'; +import { getRepos } from "@/actions"; +import { isServiceError } from "@/lib/utils"; export default async function Home({ params: { domain } }: { params: { domain: string } }) { const org = await getOrgFromDomain(domain); @@ -17,6 +19,8 @@ export default async function Home({ params: { domain } }: { params: { domain: s return } + const repos = await getRepos(domain); + return (
- +