Skip to content

Commit e6b25ce

Browse files
committed
feat(vercel): Add onboarding completion state to Vercel integration and update related components
1 parent ee80442 commit e6b25ce

File tree

4 files changed

+28
-6
lines changed

4 files changed

+28
-6
lines changed

apps/webapp/app/components/integrations/VercelOnboardingModal.tsx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -219,9 +219,11 @@ export function VercelOnboardingModal({
219219
const [expandedEnvVars, setExpandedEnvVars] = useState(false);
220220
const [expandedSecretEnvVars, setExpandedSecretEnvVars] = useState(false);
221221
const [projectSelectionError, setProjectSelectionError] = useState<string | null>(null);
222+
const [isRedirecting, setIsRedirecting] = useState(false);
222223

223224
const gitHubAppInstallations = onboardingData?.gitHubAppInstallations ?? [];
224225
const isGitHubConnectedForOnboarding = onboardingData?.isGitHubConnected ?? false;
226+
const isOnboardingComplete = onboardingData?.isOnboardingComplete ?? false;
225227

226228
const hasTriggeredMarketplaceRedirectRef = useRef(false);
227229

@@ -235,19 +237,20 @@ export function VercelOnboardingModal({
235237
isOpen &&
236238
fromMarketplaceContext &&
237239
nextUrl &&
238-
hasProjectSelected &&
240+
isOnboardingComplete &&
239241
isGitHubConnectedForOnboarding
240242
) {
241243
hasTriggeredMarketplaceRedirectRef.current = true;
242244
setTimeout(() => {
243245
window.location.href = nextUrl;
244246
}, 100);
245247
}
246-
}, [isOpen, fromMarketplaceContext, nextUrl, hasProjectSelected, isGitHubConnectedForOnboarding]);
248+
}, [isOpen, fromMarketplaceContext, nextUrl, isOnboardingComplete, isGitHubConnectedForOnboarding]);
247249

248250
useEffect(() => {
249251
if (!isOpen) {
250252
hasTriggeredMarketplaceRedirectRef.current = false;
253+
setIsRedirecting(false);
251254
}
252255
}, [isOpen]);
253256

@@ -454,6 +457,10 @@ export function VercelOnboardingModal({
454457
}, [vercelStagingEnvironment, envMappingFetcher, actionUrl]);
455458

456459
const handleBuildSettingsNext = useCallback(() => {
460+
if (nextUrl && fromMarketplaceContext && isGitHubConnectedForOnboarding) {
461+
setIsRedirecting(true);
462+
}
463+
457464
const formData = new FormData();
458465
formData.append("action", "complete-onboarding");
459466
formData.append("vercelStagingEnvironment", vercelStagingEnvironment ? JSON.stringify(vercelStagingEnvironment) : "");
@@ -873,8 +880,8 @@ export function VercelOnboardingModal({
873880
setState("build-settings");
874881
}
875882
}}
876-
disabled={fromMarketplaceContext && completeOnboardingFetcher.state !== "idle"}
877-
LeadingIcon={fromMarketplaceContext && completeOnboardingFetcher.state !== "idle" ? SpinnerWhite : undefined}
883+
disabled={fromMarketplaceContext && (completeOnboardingFetcher.state !== "idle" || isRedirecting)}
884+
LeadingIcon={fromMarketplaceContext && (completeOnboardingFetcher.state !== "idle" || isRedirecting) ? SpinnerWhite : undefined}
878885
>
879886
{fromMarketplaceContext ? (isGitHubConnectedForOnboarding ? "Finish" : "Next") : "Next"}
880887
</Button>
@@ -923,8 +930,8 @@ export function VercelOnboardingModal({
923930
<Button
924931
variant="primary/medium"
925932
onClick={handleBuildSettingsNext}
926-
disabled={completeOnboardingFetcher.state !== "idle"}
927-
LeadingIcon={completeOnboardingFetcher.state !== "idle" ? SpinnerWhite : undefined}
933+
disabled={completeOnboardingFetcher.state !== "idle" || isRedirecting}
934+
LeadingIcon={completeOnboardingFetcher.state !== "idle" || isRedirecting ? SpinnerWhite : undefined}
928935
>
929936
{isGitHubConnectedForOnboarding ? "Finish" : "Next"}
930937
</Button>

apps/webapp/app/presenters/v3/VercelSettingsPresenter.server.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ export type VercelOnboardingData = {
5555
existingVariables: Record<string, { environments: string[] }>; // Environment slugs (non-archived only)
5656
gitHubAppInstallations: GitHubAppInstallation[];
5757
isGitHubConnected: boolean;
58+
isOnboardingComplete: boolean;
5859
};
5960

6061
export class VercelSettingsPresenter extends BasePresenter {
@@ -384,6 +385,7 @@ export class VercelSettingsPresenter extends BasePresenter {
384385
existingVariables: {},
385386
gitHubAppInstallations,
386387
isGitHubConnected,
388+
isOnboardingComplete: false,
387389
};
388390
}
389391

@@ -398,6 +400,7 @@ export class VercelSettingsPresenter extends BasePresenter {
398400
existingVariables: {},
399401
gitHubAppInstallations,
400402
isGitHubConnected,
403+
isOnboardingComplete: false,
401404
};
402405
}
403406
const client = clientResult.value;
@@ -426,6 +429,7 @@ export class VercelSettingsPresenter extends BasePresenter {
426429
existingVariables: {},
427430
gitHubAppInstallations,
428431
isGitHubConnected,
432+
isOnboardingComplete: false,
429433
};
430434
}
431435

@@ -438,6 +442,7 @@ export class VercelSettingsPresenter extends BasePresenter {
438442
existingVariables: {},
439443
gitHubAppInstallations,
440444
isGitHubConnected,
445+
isOnboardingComplete: false,
441446
};
442447
}
443448

@@ -476,6 +481,7 @@ export class VercelSettingsPresenter extends BasePresenter {
476481
existingVariables: {},
477482
gitHubAppInstallations,
478483
isGitHubConnected,
484+
isOnboardingComplete: false,
479485
};
480486
}
481487

@@ -547,6 +553,10 @@ export class VercelSettingsPresenter extends BasePresenter {
547553
}
548554
}
549555

556+
const parsedIntegrationData = VercelProjectIntegrationDataSchema.safeParse(
557+
projectIntegration.integrationData
558+
);
559+
550560
return {
551561
customEnvironments,
552562
environmentVariables: sortedEnvVars,
@@ -555,6 +565,9 @@ export class VercelSettingsPresenter extends BasePresenter {
555565
existingVariables: existingVariablesRecord,
556566
gitHubAppInstallations,
557567
isGitHubConnected,
568+
isOnboardingComplete: parsedIntegrationData.success
569+
? (parsedIntegrationData.data.onboardingCompleted ?? false)
570+
: false,
558571
};
559572
})(),
560573
(error) => error

apps/webapp/app/services/vercelIntegration.server.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,7 @@ export class VercelIntegrationService {
416416
vercelStagingEnvironment: params.vercelStagingEnvironment ?? null,
417417
},
418418
syncEnvVarsMapping: params.syncEnvVarsMapping ?? existing.parsedIntegrationData.syncEnvVarsMapping,
419+
onboardingCompleted: true,
419420
};
420421

421422
const updated = await this.#prismaClient.organizationProjectIntegration.update({

apps/webapp/app/v3/vercel/vercelProjectIntegrationSchema.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ export const VercelProjectIntegrationDataSchema = z.object({
5454
vercelProjectName: z.string(),
5555
vercelTeamId: z.string().nullable(),
5656
vercelProjectId: z.string(),
57+
onboardingCompleted: z.boolean().optional(),
5758
});
5859

5960
export type VercelProjectIntegrationData = z.infer<typeof VercelProjectIntegrationDataSchema>;

0 commit comments

Comments
 (0)