mirror of
https://github.com/FranP-code/create-better-t-stack.git
synced 2025-10-12 23:52:15 +00:00
feat: add clerk auth support with convex (#548)
This commit is contained in:
@@ -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>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -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)(.*)",
|
||||
],
|
||||
};
|
||||
@@ -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>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -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>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -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>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -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);
|
||||
});
|
||||
Reference in New Issue
Block a user