Files
calendar/packages/features/auth/signup/lib/fetchSignup.ts
T
Amit SharmaGitHubunknown <>Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
f9d40e083f feat: store utm tags in stripe on signup (#26838)
* feat: store utm params in stripe on signup

* fix: fallback to cookie when query params don't contain valid UTM data

Changed from else-if to separate if statement so that when query
params exist but don't contain valid UTM data, the cookie fallback
is still tried. Previously, any request with non-UTM query params
would skip the stored cookie data entirely.

Co-Authored-By: unknown <>

* fix: e2e

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-01-22 08:13:47 -03:00

94 lines
2.2 KiB
TypeScript

import { SIGNUP_ERROR_CODES } from "../constants";
type SignupData = {
username?: string;
email: string;
password: string;
language: string;
token?: string;
};
type SignupSuccessResponse = {
message: string;
stripeCustomerId?: string;
};
type SignupErrorResponse = {
message: string;
checkoutSessionId?: string;
};
type SignupResponse = SignupSuccessResponse | SignupErrorResponse;
export type SignupResult =
| { ok: true; data: SignupSuccessResponse }
| { ok: false; status: number; error: SignupErrorResponse };
export async function fetchSignup(data: SignupData, cfToken?: string): Promise<SignupResult> {
const allParams = new URLSearchParams(window.location.search);
const utmParams = new URLSearchParams();
const utmKeys = [
"utm_source",
"utm_medium",
"utm_campaign",
"utm_term",
"utm_content",
"utm_id",
"utm_referral",
"landing_page",
];
utmKeys.forEach((key) => {
const value = allParams.get(key);
if (value) utmParams.set(key, value);
});
const url = utmParams.toString() ? `/api/auth/signup?${utmParams.toString()}` : "/api/auth/signup";
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
"cf-access-token": cfToken ?? "invalid-token",
},
body: JSON.stringify(data),
});
const contentType = response.headers.get("content-type");
if (!contentType?.includes("application/json")) {
return {
ok: false,
status: response.status,
error: { message: SIGNUP_ERROR_CODES.INVALID_SERVER_RESPONSE },
};
}
const json = (await response.json()) as SignupResponse;
if (!response.ok) {
return {
ok: false,
status: response.status,
error: json as SignupErrorResponse,
};
}
return {
ok: true,
data: json as SignupSuccessResponse,
};
}
export function isUserAlreadyExistsError(result: SignupResult): boolean {
return (
!result.ok && result.status === 409 && result.error.message === SIGNUP_ERROR_CODES.USER_ALREADY_EXISTS
);
}
export function hasCheckoutSession(
result: SignupResult
): result is { ok: false; status: number; error: SignupErrorResponse & { checkoutSessionId: string } } {
return !result.ok && !!result.error.checkoutSessionId;
}