feat: add clerk auth support with convex (#548)

This commit is contained in:
Aman Varshney
2025-08-29 00:21:08 +05:30
committed by GitHub
parent 8d48ae0359
commit 54bcdf1cbc
153 changed files with 1954 additions and 771 deletions

View File

@@ -0,0 +1,29 @@
"use client";
import { api } from "@{{projectName}}/backend/convex/_generated/api";
import { SignInButton, UserButton, useUser } from "@clerk/nextjs";
import { Authenticated, AuthLoading, Unauthenticated, useQuery } from "convex/react";
export default function Dashboard() {
const user = useUser();
const privateData = useQuery(api.privateData.get);
return (
<>
<Authenticated>
<div>
<h1>Dashboard</h1>
<p>Welcome {user.user?.fullName}</p>
<p>privateData: {privateData?.message}</p>
<UserButton />
</div>
</Authenticated>
<Unauthenticated>
<SignInButton />
</Unauthenticated>
<AuthLoading>
<div>Loading...</div>
</AuthLoading>
</>
);
}

View File

@@ -0,0 +1,12 @@
import { clerkMiddleware } from "@clerk/nextjs/server";
export default clerkMiddleware();
export const config = {
matcher: [
// Skip Next.js internals and all static files, unless found in search params
"/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)",
// Always run for API routes
"/(api|trpc)(.*)",
],
};

View File

@@ -0,0 +1,32 @@
import { SignInButton, UserButton, useUser } from "@clerk/clerk-react";
import { api } from "@{{projectName}}/backend/convex/_generated/api";
import {
Authenticated,
AuthLoading,
Unauthenticated,
useQuery,
} from "convex/react";
export default function Dashboard() {
const privateData = useQuery(api.privateData.get);
const user = useUser();
return (
<>
<Authenticated>
<div>
<h1>Dashboard</h1>
<p>Welcome {user.user?.fullName}</p>
<p>privateData: {privateData?.message}</p>
<UserButton />
</div>
</Authenticated>
<Unauthenticated>
<SignInButton />
</Unauthenticated>
<AuthLoading>
<div>Loading...</div>
</AuthLoading>
</>
);
}

View File

@@ -0,0 +1,37 @@
import { SignInButton, UserButton, useUser } from "@clerk/clerk-react";
import { api } from "@{{projectName}}/backend/convex/_generated/api";
import { createFileRoute } from "@tanstack/react-router";
import {
Authenticated,
AuthLoading,
Unauthenticated,
useQuery,
} from "convex/react";
export const Route = createFileRoute("/dashboard")({
component: RouteComponent,
});
function RouteComponent() {
const privateData = useQuery(api.privateData.get);
const user = useUser()
return (
<>
<Authenticated>
<div>
<h1>Dashboard</h1>
<p>Welcome {user.user?.fullName}</p>
<p>privateData: {privateData?.message}</p>
<UserButton />
</div>
</Authenticated>
<Unauthenticated>
<SignInButton />
</Unauthenticated>
<AuthLoading>
<div>Loading...</div>
</AuthLoading>
</>
);
}

View File

@@ -0,0 +1,37 @@
import { SignInButton, UserButton, useUser } from "@clerk/tanstack-react-start";
import { api } from "@{{projectName}}/backend/convex/_generated/api";
import { createFileRoute } from "@tanstack/react-router";
import {
Authenticated,
AuthLoading,
Unauthenticated,
useQuery,
} from "convex/react";
export const Route = createFileRoute("/dashboard")({
component: RouteComponent,
});
function RouteComponent() {
const privateData = useQuery(api.privateData.get);
const user = useUser();
return (
<>
<Authenticated>
<div>
<h1>Dashboard</h1>
<p>Welcome {user.user?.fullName}</p>
<p>privateData: {privateData?.message}</p>
<UserButton />
</div>
</Authenticated>
<Unauthenticated>
<SignInButton />
</Unauthenticated>
<AuthLoading>
<div>Loading...</div>
</AuthLoading>
</>
);
}

View File

@@ -0,0 +1,18 @@
import { createClerkHandler } from "@clerk/tanstack-react-start/server";
import {
createStartHandler,
defaultStreamHandler,
defineHandlerCallback,
} from "@tanstack/react-start/server";
import { createRouter } from "./router";
const handlerFactory = createClerkHandler(
createStartHandler({
createRouter,
}),
);
export default defineHandlerCallback(async (event) => {
const startHandler = await handlerFactory(defaultStreamHandler);
return startHandler(event);
});