fix(settings): wait for import preview before setup callout

This commit is contained in:
Mohamed Boudra
2026-07-17 16:22:10 +02:00
parent 28cac5859a
commit 2f0e3451de
4 changed files with 35 additions and 8 deletions

View File

@@ -53,6 +53,9 @@ export function WorktreeSetupCalloutSource() {
if (!activeProject || !shouldShowWorktreeSetupCallout(readQuery.data)) {
return null;
}
if (importAvailability.status === "loading") {
return null;
}
if (importAvailability.status === "one" && importAvailability.source) {
return buildProjectConfigImportCalloutPolicy(activeProject, {
status: "one",

View File

@@ -0,0 +1,14 @@
export type ProjectConfigImportAvailabilityStatus = "loading" | "none" | "one" | "many";
export function projectConfigImportAvailabilityStatus(input: {
availableCount: number;
isLoading: boolean;
}): ProjectConfigImportAvailabilityStatus {
if (input.isLoading) {
return "loading";
}
if (input.availableCount === 0) {
return "none";
}
return input.availableCount === 1 ? "one" : "many";
}

View File

@@ -18,6 +18,7 @@ import {
stripProjectConfigImportSearchParams,
} from "./route";
import { projectConfigImportApplyFailureRetryAction } from "./retry";
import { projectConfigImportAvailabilityStatus } from "./availability";
import {
createProjectConfigImportSourceRegistry,
type ProjectConfigImportSourceDescriptor,
@@ -290,3 +291,14 @@ describe("project config import preview cache keys", () => {
expect(calls).toEqual([protocolSource, protocolSource]);
});
});
describe("project config import availability", () => {
it("waits for advertised source previews before reporting no imports", () => {
expect(projectConfigImportAvailabilityStatus({ availableCount: 0, isLoading: true })).toBe(
"loading",
);
expect(projectConfigImportAvailabilityStatus({ availableCount: 0, isLoading: false })).toBe(
"none",
);
});
});

View File

@@ -33,6 +33,7 @@ import {
projectConfigImportApplyFailureRetryAction,
type ProjectConfigImportRetryAction,
} from "./retry";
import { projectConfigImportAvailabilityStatus } from "./availability";
const EMPTY_IMPORT_SOURCES: readonly ProjectConfigImportAdvertisedSource[] = [];
type ProjectConfigImportPreviewSuccess = Extract<ProjectConfigImportPreviewResult, { ok: true }>;
@@ -309,9 +310,13 @@ export function useProjectConfigImportAvailability(input: {
const availableSourceKeys = new Set(
availableSources.map((source) => stableProjectConfigImportSourceKey(source.source)),
);
const isLoading = previews.some((preview) => preview.isLoading || preview.isPending);
return {
status: projectConfigImportAvailabilityStatus(availableSources.length),
status: projectConfigImportAvailabilityStatus({
availableCount: availableSources.length,
isLoading,
}),
source: availableSources.length === 1 ? availableSources[0] : null,
sources: availableSources,
availableKinds,
@@ -319,13 +324,6 @@ export function useProjectConfigImportAvailability(input: {
};
}
function projectConfigImportAvailabilityStatus(count: number): "none" | "one" | "many" {
if (count === 0) {
return "none";
}
return count === 1 ? "one" : "many";
}
function isRouteIntentCapabilityMissing(input: {
intent: ProjectConfigImportIntent | null;
routeIntent: ProjectConfigImportIntent | null;