From 4563b4e9438e83755fcf2e45453eac46a9f42954 Mon Sep 17 00:00:00 2001 From: Aidan McAlister Date: Tue, 3 Mar 2026 10:43:34 -0500 Subject: [PATCH] fix(claim-db-worker): make claim page SSR-safe and restore integration-token project check --- .../__tests__/callback-api.test.ts | 2 +- claim-db-worker/__tests__/claim.test.tsx | 4 +++- claim-db-worker/app/claim/page.tsx | 24 +++++++++++++------ claim-db-worker/lib/auth-utils.ts | 4 +++- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/claim-db-worker/__tests__/callback-api.test.ts b/claim-db-worker/__tests__/callback-api.test.ts index 7bcd007..3cdaeac 100644 --- a/claim-db-worker/__tests__/callback-api.test.ts +++ b/claim-db-worker/__tests__/callback-api.test.ts @@ -106,7 +106,7 @@ describe("auth callback API", () => { ); expect(mockFetch).toHaveBeenCalledWith( - expect.stringContaining("posthog.com"), + expect.stringContaining("proxyhog.prisma-data.net"), expect.objectContaining({ method: "POST", body: expect.stringContaining("create_db:claim_successful"), diff --git a/claim-db-worker/__tests__/claim.test.tsx b/claim-db-worker/__tests__/claim.test.tsx index 1a60e11..75ed59b 100644 --- a/claim-db-worker/__tests__/claim.test.tsx +++ b/claim-db-worker/__tests__/claim.test.tsx @@ -1,7 +1,7 @@ import React from "react"; import { describe, it, expect, vi, beforeEach } from "vitest"; import { render, screen, fireEvent, waitFor } from "@testing-library/react"; -import { useSearchParams, useRouter } from "next/navigation"; +import { useSearchParams, useRouter, usePathname } from "next/navigation"; import ClaimPage from "../app/claim/page"; // This test does not check the actual claim flow, but rather the claim page functionality and claim flow logic. @@ -20,6 +20,7 @@ Object.defineProperty(window, "open", { vi.mock("next/navigation", () => ({ useSearchParams: vi.fn(), useRouter: vi.fn(), + usePathname: vi.fn(), })); describe("claim page", () => { @@ -33,6 +34,7 @@ describe("claim page", () => { vi.mocked(useRouter).mockReturnValue({ push: mockPush, } as any); + vi.mocked(usePathname).mockReturnValue("/claim"); mockFetch.mockResolvedValue({ ok: true, diff --git a/claim-db-worker/app/claim/page.tsx b/claim-db-worker/app/claim/page.tsx index 1cb7c9b..4b28299 100644 --- a/claim-db-worker/app/claim/page.tsx +++ b/claim-db-worker/app/claim/page.tsx @@ -1,27 +1,37 @@ "use client"; import { PrismaPostgresLogo } from "@/components/PrismaPostgresLogo"; -import { useSearchParams, useRouter } from "next/navigation"; +import { useSearchParams, useRouter, usePathname } from "next/navigation"; import Image from "next/image"; -import { useState, Suspense } from "react"; +import { useEffect, useState, Suspense } from "react"; function ClaimContent() { const searchParams = useSearchParams(); const router = useRouter(); + const pathname = usePathname(); const projectID = searchParams.get("projectID"); const [isLoading, setIsLoading] = useState(false); - if (!projectID && !window.location.pathname.includes("/test/")) { - router.push("/"); + useEffect(() => { + if (!projectID && !pathname.includes("/test/")) { + router.push("/"); + } + }, [pathname, projectID, router]); + + if (!projectID && !pathname.includes("/test/")) { return null; } - const redirectUri = new URL("/api/auth/callback", window.location.origin); - redirectUri.searchParams.set("projectID", projectID!); - const handleClaimClick = async () => { try { + if (!projectID) { + throw new Error("Missing project ID"); + } + setIsLoading(true); + const redirectUri = new URL("/api/auth/callback", window.location.origin); + redirectUri.searchParams.set("projectID", projectID); + const response = await fetch("/api/auth/url", { method: "POST", headers: { diff --git a/claim-db-worker/lib/auth-utils.ts b/claim-db-worker/lib/auth-utils.ts index fa71404..9f1899c 100644 --- a/claim-db-worker/lib/auth-utils.ts +++ b/claim-db-worker/lib/auth-utils.ts @@ -32,7 +32,9 @@ export async function exchangeCodeForToken( return (await tokenResponse.json()) as TokenData; } -export async function validateProject(projectID: string): Promise { +export async function validateProject( + projectID: string +): Promise { const env = getEnv(); const projectCheckResponse = await fetch(