From fadd824d12554eb9c14adbbab5ca7feecd729983 Mon Sep 17 00:00:00 2001 From: sean-brydon <55134778+sean-brydon@users.noreply.github.com> Date: Mon, 8 Dec 2025 11:35:44 +0000 Subject: [PATCH] feat: onboarding v3 QA final roast (#25667) * remove leading none * remove back button if coming from teams/org onboarding * add skip now --- .../onboarding/personal/settings/page.tsx | 6 ++++-- .../organizations/payment-redirect/route.ts | 1 + .../modules/onboarding/hooks/useCreateTeam.ts | 4 ++-- .../brand/organization-brand-view.tsx | 16 +++++++++++--- .../_components/InstallableAppCard.tsx | 4 +--- .../settings/personal-settings-view.tsx | 21 ++++++++++++------- .../invite/email/team-invite-email-view.tsx | 8 +++---- 7 files changed, 39 insertions(+), 21 deletions(-) diff --git a/apps/web/app/(use-page-wrapper)/onboarding/personal/settings/page.tsx b/apps/web/app/(use-page-wrapper)/onboarding/personal/settings/page.tsx index 114be2a853..20c267d0a6 100644 --- a/apps/web/app/(use-page-wrapper)/onboarding/personal/settings/page.tsx +++ b/apps/web/app/(use-page-wrapper)/onboarding/personal/settings/page.tsx @@ -19,7 +19,7 @@ export const generateMetadata = async () => { ); }; -const ServerPage = async () => { +const ServerPage = async (props: { searchParams: Promise<{ fromTeamOnboarding?: string }> }) => { const session = await getServerSession({ req: buildLegacyRequest(await headers(), await cookies()) }); if (!session?.user?.id) { @@ -28,8 +28,10 @@ const ServerPage = async () => { const userEmail = session.user.email || ""; const userName = session.user.name || ""; + const searchParams = await props.searchParams; + const fromTeamOnboarding = searchParams?.fromTeamOnboarding === "true"; - return ; + return ; }; export default ServerPage; diff --git a/apps/web/app/api/organizations/payment-redirect/route.ts b/apps/web/app/api/organizations/payment-redirect/route.ts index fadadc5a47..884cee42ce 100644 --- a/apps/web/app/api/organizations/payment-redirect/route.ts +++ b/apps/web/app/api/organizations/payment-redirect/route.ts @@ -43,6 +43,7 @@ async function getHandler(req: NextRequest) { // If onboarding-v3 is enabled AND organizationOnboardingId exists, redirect to onboarding flow if (isOnboardingV3Enabled && organizationOnboardingId) { + params.append("fromTeamOnboarding", "true"); const redirectUrl = new URL( `/onboarding/personal/settings?${params.toString()}`, WEBAPP_URL diff --git a/apps/web/modules/onboarding/hooks/useCreateTeam.ts b/apps/web/modules/onboarding/hooks/useCreateTeam.ts index bc7f09bb6a..a65971c254 100644 --- a/apps/web/modules/onboarding/hooks/useCreateTeam.ts +++ b/apps/web/modules/onboarding/hooks/useCreateTeam.ts @@ -105,9 +105,9 @@ export function useCreateTeam() { // Redirect to personal settings after successful invite const gettingStartedPath = flags["onboarding-v3"] - ? "/onboarding/personal/settings" + ? "/onboarding/personal/settings?fromTeamOnboarding=true" : "/getting-started"; - router.push(gettingStartedPath); + router.replace(gettingStartedPath); } catch (error) { console.error("Failed to invite members:", error); // Extract error message from TRPC error diff --git a/apps/web/modules/onboarding/organization/brand/organization-brand-view.tsx b/apps/web/modules/onboarding/organization/brand/organization-brand-view.tsx index d0c7744635..fc95555faa 100644 --- a/apps/web/modules/onboarding/organization/brand/organization-brand-view.tsx +++ b/apps/web/modules/onboarding/organization/brand/organization-brand-view.tsx @@ -81,6 +81,11 @@ export const OrganizationBrandView = ({ userEmail }: OrganizationBrandViewProps) router.push("/onboarding/organization/teams"); }; + const handleSkip = () => { + // Skip brand customization and go to teams + router.push("/onboarding/organization/teams"); + }; + return ( {/* Left column - Main content */} @@ -95,9 +100,14 @@ export const OrganizationBrandView = ({ userEmail }: OrganizationBrandViewProps) onClick={() => router.push("/onboarding/organization/details")}> {t("back")} - - {t("continue")} - + + + {t("onboarding_skip_for_now")} + + + {t("continue")} + + }> {/* Form */} diff --git a/apps/web/modules/onboarding/personal/_components/InstallableAppCard.tsx b/apps/web/modules/onboarding/personal/_components/InstallableAppCard.tsx index 9681faade5..40d444bf76 100644 --- a/apps/web/modules/onboarding/personal/_components/InstallableAppCard.tsx +++ b/apps/web/modules/onboarding/personal/_components/InstallableAppCard.tsx @@ -37,9 +37,7 @@ export const InstallableAppCard = ({ )} {app.logo && } - + {app.name} { +export const PersonalSettingsView = ({ + userEmail, + userName, + fromTeamOnboarding = false, +}: PersonalSettingsViewProps) => { const router = useRouter(); const { t } = useLocale(); const { data: user } = trpc.viewer.me.get.useQuery(); @@ -117,12 +122,14 @@ export const PersonalSettingsView = ({ userEmail, userName }: PersonalSettingsVi subtitle={t("personal_details_subtitle")} footer={ - router.push("/onboarding/getting-started")}> - {t("back")} - + {!fromTeamOnboarding && ( + router.push("/onboarding/getting-started")}> + {t("back")} + + )} } } else { // No invites, skip to personal settings - const gettingStartedPath = "/onboarding/personal/settings"; - router.push(gettingStartedPath); + const gettingStartedPath = "/onboarding/personal/settings?fromTeamOnboarding=true"; + router.replace(gettingStartedPath); } }; const handleSkip = async () => { setTeamInvites([]); // Skip inviting members and go to personal settings - const gettingStartedPath = "/onboarding/personal/settings"; - router.push(gettingStartedPath); + const gettingStartedPath = "/onboarding/personal/settings?fromTeamOnboarding=true"; + router.replace(gettingStartedPath); }; const hasValidInvites = fields.some((_, index) => {
+
{app.name}