mirror of
https://github.com/getpaseo/paseo.git
synced 2026-07-29 12:01:31 +00:00
fix(settings): wait for import preview before setup callout
This commit is contained in:
@@ -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",
|
||||
|
||||
14
packages/app/src/project-config-import/availability.ts
Normal file
14
packages/app/src/project-config-import/availability.ts
Normal 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";
|
||||
}
|
||||
@@ -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",
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user