From c519ee69a700417b55dcce6b2e8b8e458a2ba793 Mon Sep 17 00:00:00 2001
From: Nayan Sawyer <33187059+GShadow5@users.noreply.github.com>
Date: Tue, 17 Jun 2025 12:07:13 -0400
Subject: [PATCH] add clerk as convex auth provider
---
convex/auth.config.ts | 8 ++++++++
src/app/layout.tsx | 20 +++++++++++++-------
src/middleware.ts | 18 ++++++++++++++++++
src/providors/ConvexClientProvider.tsx | 22 ++++++++++++++++++++++
4 files changed, 61 insertions(+), 7 deletions(-)
create mode 100644 convex/auth.config.ts
create mode 100644 src/middleware.ts
create mode 100644 src/providors/ConvexClientProvider.tsx
diff --git a/convex/auth.config.ts b/convex/auth.config.ts
new file mode 100644
index 0000000..5dfead8
--- /dev/null
+++ b/convex/auth.config.ts
@@ -0,0 +1,8 @@
+export default {
+ providors: [
+ {
+ domain: process.env.NEXT_PUBLIC_CLERK_FRONTEND_API_URL,
+ applicationId: process.env.NEXTAUTH_ID,
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index f7fa87e..8850714 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,6 +1,8 @@
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
+import { ClerkProvider } from "@clerk/nextjs";
+import ConvexClientProvider from "@/providors/ConvexClientProvider";
const geistSans = Geist({
variable: "--font-geist-sans",
@@ -23,12 +25,16 @@ export default function RootLayout({
children: React.ReactNode;
}>) {
return (
-
-
- {children}
-
-
+
+
+
+
+ {children}
+
+
+
+
);
}
diff --git a/src/middleware.ts b/src/middleware.ts
new file mode 100644
index 0000000..6811139
--- /dev/null
+++ b/src/middleware.ts
@@ -0,0 +1,18 @@
+import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'
+
+const isPublicRoute = createRouteMatcher(['/'])
+
+export default clerkMiddleware(async ( auth, req ) => {
+ if (!isPublicRoute(req)) {
+ await auth.protect()
+ }
+})
+
+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)(.*)',
+ ],
+}
\ No newline at end of file
diff --git a/src/providors/ConvexClientProvider.tsx b/src/providors/ConvexClientProvider.tsx
new file mode 100644
index 0000000..98dc7b2
--- /dev/null
+++ b/src/providors/ConvexClientProvider.tsx
@@ -0,0 +1,22 @@
+"use client"
+
+'use client'
+
+import { ReactNode } from 'react'
+import { ConvexReactClient } from 'convex/react'
+import { ConvexProviderWithClerk } from 'convex/react-clerk'
+import { useAuth } from '@clerk/nextjs'
+
+if (!process.env.NEXT_PUBLIC_CONVEX_URL) {
+ throw new Error('Missing NEXT_PUBLIC_CONVEX_URL in your .env file')
+}
+
+const convex = new ConvexReactClient(process.env.NEXT_PUBLIC_CONVEX_URL)
+
+export default function ConvexClientProvider({ children }: { children: ReactNode }) {
+ return (
+
+ {children}
+
+ )
+}
\ No newline at end of file