diff --git a/app/api/callback/route.ts b/app/api/callback/route.ts
index 0d9dad0..2250e9f 100644
--- a/app/api/callback/route.ts
+++ b/app/api/callback/route.ts
@@ -1,16 +1,17 @@
-import { cookies } from "next/headers";
import { NextResponse } from "next/server";
-import { createRouteHandlerClient } from "@supabase/auth-helpers-nextjs";
+import { createClient } from "@/lib/supabase/server";
import type { NextRequest } from "next/server";
// Handles PKCE auth code exchange when Supabase redirects back with ?code=...
+// The cookie-backed client reads the code verifier set during sign-in and
+// writes the resulting session cookies onto the redirect response.
export async function GET(req: NextRequest) {
const { searchParams, origin } = new URL(req.url);
const code = searchParams.get("code");
const next = searchParams.get("next") ?? "/";
if (code) {
- const supabase = createRouteHandlerClient({ cookies });
+ const supabase = createClient();
const { error } = await supabase.auth.exchangeCodeForSession(code);
if (!error) {
return NextResponse.redirect(`${origin}${next}`);
@@ -21,18 +22,3 @@ export async function GET(req: NextRequest) {
`${origin}/auth/email-link-sign-in?error=auth_callback_failed`,
);
}
-
-// Syncs auth state changes (e.g. SIGNED_IN, SIGNED_OUT) sent from the client
-export async function POST(req: NextRequest) {
- const supabase = createRouteHandlerClient({ cookies });
-
- const { event, session } = await req.json();
-
- if (event === "SIGNED_IN" && session) {
- await supabase.auth.setSession(session);
- } else if (event === "SIGNED_OUT") {
- await supabase.auth.signOut();
- }
-
- return NextResponse.json({ status: "success" });
-}
diff --git a/app/api/email-sign-in/route.ts b/app/api/email-sign-in/route.ts
index 60d4c6a..d1207cb 100644
--- a/app/api/email-sign-in/route.ts
+++ b/app/api/email-sign-in/route.ts
@@ -1,12 +1,7 @@
-import { createClient } from "@supabase/supabase-js";
+import { createClient } from "@/lib/supabase/server";
import { NextRequest, NextResponse } from "next/server";
export async function POST(req: NextRequest) {
- const supabase = createClient(
- process.env.NEXT_PUBLIC_SUPABASE_URL || "",
- process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || "",
- );
-
const { email } = await req.json();
if (!email || !email.endsWith("@pointblank.club")) {
@@ -19,7 +14,12 @@ export async function POST(req: NextRequest) {
);
}
- const { data, error } = await supabase.auth.signInWithOtp({
+ // Cookie-backed client: signInWithOtp stores the PKCE code verifier in a
+ // cookie that travels back to the browser, so /api/callback can complete the
+ // exchange when the user clicks the email link.
+ const supabase = createClient();
+
+ const { error } = await supabase.auth.signInWithOtp({
email,
options: {
emailRedirectTo: `${process.env.NEXT_PUBLIC_DOMAIN || "https://careers.pointblank.club"}/api/callback`,
diff --git a/app/api/member/[type]/[id]/route.ts b/app/api/member/[type]/[id]/route.ts
index 45eea1b..32fc235 100644
--- a/app/api/member/[type]/[id]/route.ts
+++ b/app/api/member/[type]/[id]/route.ts
@@ -1,7 +1,6 @@
import { NextRequest, NextResponse } from 'next/server';
import { createClient } from '@supabase/supabase-js';
-import { cookies } from 'next/headers';
-import { createServerComponentClient } from '@supabase/auth-helpers-nextjs';
+import { createClient as createServerSupabaseClient } from '@/lib/supabase/server';
import {
AchievementService,
@@ -63,7 +62,7 @@ export async function DELETE(
return NextResponse.json({ error: 'DELETE not supported for this type' }, { status: 405 });
}
- const supabase = createServerComponentClient({ cookies });
+ const supabase = createServerSupabaseClient();
const { data: { user } } = await supabase.auth.getUser();
if (!user) {
diff --git a/app/directory/page.tsx b/app/directory/page.tsx
index 60566f7..ddbddc3 100644
--- a/app/directory/page.tsx
+++ b/app/directory/page.tsx
@@ -46,7 +46,8 @@ const getOrigin = (): string => {
if (typeof window !== "undefined") {
return window.location.origin;
}
- return process.env.NEXT_PUBLIC_SITE_URL || "https://career.pointblank.club";
+ return process.env.NEXT_PUBLIC_DOMAIN
+ || "https://careers.pointblank.club";
};
function DirectoryContent() {
diff --git a/app/page.tsx b/app/page.tsx
index 5e87097..33434f8 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,46 +1,8 @@
-"use client";
-import { useEffect, Suspense } from "react";
-import { supabase } from "@/lib/supabaseClient";
-import { useAuthStore } from "@/lib/authStore";
-import { useRouter, useSearchParams } from "next/navigation";
import { HeroSection } from "@/components/home/hero-section";
-import { FeaturesSection } from "@/components/home/features-section";
import { AnimatedGradientBackground } from '@/components/ui/animated-gradient-background';
import Domains from '@/components/home/domains'
-function AuthHandler() {
- const router = useRouter();
- const searchParams = useSearchParams();
-
- useEffect(() => {
- const code = searchParams.get("code");
- if (code) {
- supabase.auth
- .exchangeCodeForSession(code)
- .then(async ({ data, error }) => {
- if (error) {
- console.error("Exchange error:", error);
- }
- const { session } = data;
- if (session) {
- useAuthStore.getState().setUser(session.user);
- router.replace(window.location.pathname);
- }
- });
- } else {
-
- supabase.auth.getSession().then(({ data: { session } }) => {
- if (session) {
- useAuthStore.getState().setUser(session.user);
- }
- });
- }
- }, [router, searchParams]);
-
- return null;
-}
-
-function PageContent() {
+export default function UploadPage() {
return (
{/* Animated gradient background with reduced opacity */}
@@ -60,25 +22,3 @@ function PageContent() {
);
}
-
-function PageLoading() {
- return (
-
- );
-}
-
-export default function UploadPage() {
- return (
- <>
-
-
-
-
- >
- );
-}
\ No newline at end of file
diff --git a/app/profile/[id]/page.tsx b/app/profile/[id]/page.tsx
index 8db22ed..73b07c1 100644
--- a/app/profile/[id]/page.tsx
+++ b/app/profile/[id]/page.tsx
@@ -1,7 +1,6 @@
import { Metadata } from "next";
import { notFound, redirect } from "next/navigation";
-import { createServerComponentClient } from "@supabase/auth-helpers-nextjs";
-import { cookies } from "next/headers";
+import { createClient } from "@/lib/supabase/server";
import {
MemberService,
SkillService,
@@ -42,7 +41,7 @@ function formatResumeDisplayName(fullName: string, year: number): string {
export async function generateMetadata({ params }: ProfilePageProps): Promise {
const { id } = await params;
- const supabase = createServerComponentClient({ cookies });
+ const supabase = createClient();
let member = await MemberService.getMemberById(supabase, id);
@@ -70,7 +69,7 @@ export async function generateMetadata({ params }: ProfilePageProps): Promise
-
- {children}
-
-
-
+
+ {children}
+
+
);
}
diff --git a/app/upload/confirm/page.tsx b/app/upload/confirm/page.tsx
index 64f204b..cd8ee8a 100644
--- a/app/upload/confirm/page.tsx
+++ b/app/upload/confirm/page.tsx
@@ -11,7 +11,7 @@ import { v4 as uuidv4 } from 'uuid';
import { createClient } from '@supabase/supabase-js';
import { Checkbox } from "@/components/ui/checkbox";
import { Textarea } from "@/components/ui/textarea";
-import { createClientComponentClient } from '@supabase/auth-helpers-nextjs';
+import { supabase } from "@/lib/supabaseClient";
import {
Select,
SelectContent,
@@ -413,7 +413,6 @@ const handleSubmit = async (e: React.FormEvent) => {
setSaving(true);
try {
- const supabase = createClientComponentClient();
const { data: { session }, error } = await supabase.auth.getSession();
if (!session || !session.user) throw new Error("Not authenticated");
diff --git a/components/profile/resume-section.tsx b/components/profile/resume-section.tsx
index 433b553..079abdc 100644
--- a/components/profile/resume-section.tsx
+++ b/components/profile/resume-section.tsx
@@ -6,7 +6,7 @@ import { Button } from "@/components/ui/button";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
import { Dialog, DialogContent, DialogHeader, DialogTitle} from "@/components/ui/dialog";
-import { createClientComponentClient } from '@supabase/auth-helpers-nextjs';
+import { supabase } from "@/lib/supabaseClient";
import { useToast } from "@/hooks/use-toast";
import {
AlertDialog,
@@ -180,7 +180,6 @@ export function ResumeSection({ resumeUrl, isEditable, userId, displayFileName }
const [resumeFiles, setResumeFiles] = useState([]);
const [loading, setLoading] = useState(true);
const [uploading, setUploading] = useState(false);
- const supabase = createClientComponentClient();
const { toast } = useToast();
useEffect(() => {
diff --git a/components/upload/confirmation-form.tsx b/components/upload/confirmation-form.tsx
index 6f391df..612b9d6 100644
--- a/components/upload/confirmation-form.tsx
+++ b/components/upload/confirmation-form.tsx
@@ -8,7 +8,6 @@ import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Separator } from "@/components/ui/separator";
import { useAuthStore } from "@/lib/authStore";
-import { createClientComponentClient } from "@supabase/auth-helpers-nextjs";
import {
Card,
CardContent,
@@ -189,7 +188,6 @@ export function ConfirmationForm({ parsedData }: ConfirmationFormProps) {
setIsSubmitting(true);
try {
- const supabase = createClientComponentClient();
const { data: { session }, error } = await supabase.auth.getSession();
if (!session || !session.access_token) {
diff --git a/components/upload/resume-upload.tsx b/components/upload/resume-upload.tsx
index 7bc246a..84ffad3 100644
--- a/components/upload/resume-upload.tsx
+++ b/components/upload/resume-upload.tsx
@@ -17,14 +17,13 @@ import { Input } from "@/components/ui/input";
import { Separator } from "@/components/ui/separator";
import { Badge } from "@/components/ui/badge";
import { useToast } from "@/hooks/use-toast";
-import { createClientComponentClient } from '@supabase/auth-helpers-nextjs';
+import { supabase } from "@/lib/supabaseClient";
export function ResumeUpload() {
const router = useRouter();
const { toast } = useToast();
const fileInputRef = useRef(null);
- const supabase = createClientComponentClient();
-
+
const [file, setFile] = useState(null);
const [isDragging, setIsDragging] = useState(false);
const [uploading, setUploading] = useState(false);
diff --git a/lib/authStore.ts b/lib/authStore.ts
index 997ea59..0f1fec9 100644
--- a/lib/authStore.ts
+++ b/lib/authStore.ts
@@ -17,15 +17,10 @@ export const initAuthListener = () => {
useAuthStore.getState().setUser(session?.user ?? null);
});
- supabase.auth.onAuthStateChange(async (event, session) => {
+ // Cookies are now the single source of truth shared with the server, so no
+ // manual sync to /api/callback is needed — just mirror the user into the store
+ // so the UI reacts to auth changes.
+ supabase.auth.onAuthStateChange((_event, session) => {
useAuthStore.getState().setUser(session?.user ?? null);
-
- await fetch("/api/callback", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({ event, session }),
- });
});
};
diff --git a/lib/supabase/server.ts b/lib/supabase/server.ts
new file mode 100644
index 0000000..df98e6d
--- /dev/null
+++ b/lib/supabase/server.ts
@@ -0,0 +1,33 @@
+import { createServerClient } from "@supabase/ssr";
+import { cookies } from "next/headers";
+
+// Cookie-backed Supabase client for Route Handlers and Server Components.
+// In Route Handlers the cookie store is writable, so the PKCE code verifier
+// (and refreshed session) round-trips through the browser's cookies. In Server
+// Components writing is a no-op (the store is read-only) — the middleware
+// refreshes the session there instead.
+export const createClient = () => {
+ const cookieStore = cookies();
+
+ return createServerClient(
+ process.env.NEXT_PUBLIC_SUPABASE_URL!,
+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
+ {
+ cookies: {
+ getAll() {
+ return cookieStore.getAll();
+ },
+ setAll(cookiesToSet) {
+ try {
+ cookiesToSet.forEach(({ name, value, options }) =>
+ cookieStore.set(name, value, options),
+ );
+ } catch {
+ // Called from a Server Component — safe to ignore; the session is
+ // refreshed by middleware.
+ }
+ },
+ },
+ },
+ );
+};
diff --git a/lib/supabaseClient.ts b/lib/supabaseClient.ts
index 9d85fb9..0b0ac61 100644
--- a/lib/supabaseClient.ts
+++ b/lib/supabaseClient.ts
@@ -1,6 +1,9 @@
-import { createClient } from '@supabase/supabase-js';
+import { createBrowserClient } from "@supabase/ssr";
-export const supabase = createClient(
+// Cookie-backed browser client. Sharing the cookie store with the server
+// clients (middleware, route handlers, server components) gives the whole app a
+// single source of truth for the session.
+export const supabase = createBrowserClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
- process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
-);
\ No newline at end of file
+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
+);
diff --git a/middleware.ts b/middleware.ts
index 6d2752d..f6c087d 100644
--- a/middleware.ts
+++ b/middleware.ts
@@ -1,14 +1,34 @@
-import { createMiddlewareClient } from '@supabase/auth-helpers-nextjs';
+import { createServerClient } from '@supabase/ssr';
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export async function middleware(req: NextRequest) {
- const res = NextResponse.next();
- const supabase = createMiddlewareClient({ req, res });
+ let res = NextResponse.next({ request: req });
+ const supabase = createServerClient(
+ process.env.NEXT_PUBLIC_SUPABASE_URL!,
+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
+ {
+ cookies: {
+ getAll() {
+ return req.cookies.getAll();
+ },
+ setAll(cookiesToSet) {
+ cookiesToSet.forEach(({ name, value }) => req.cookies.set(name, value));
+ res = NextResponse.next({ request: req });
+ cookiesToSet.forEach(({ name, value, options }) =>
+ res.cookies.set(name, value, options)
+ );
+ },
+ },
+ }
+ );
+
+ // getUser() revalidates the token with the auth server (don't trust getSession
+ // in middleware) and refreshes cookies via setAll above.
const {
- data: { session },
- } = await supabase.auth.getSession();
+ data: { user },
+ } = await supabase.auth.getUser();
const protectedRoutes = [
'/api/profile/update',
@@ -30,14 +50,20 @@ export async function middleware(req: NextRequest) {
pathname.startsWith(route)
);
- if (isProtected && !session) {
+ // Carry any refreshed auth cookies onto a redirect response.
+ const withAuthCookies = (redirect: NextResponse) => {
+ res.cookies.getAll().forEach((cookie) => redirect.cookies.set(cookie));
+ return redirect;
+ };
+
+ if (isProtected && !user) {
const redirectUrl = new URL('/auth/email-link-sign-in', req.url);
redirectUrl.searchParams.set('redirect', pathname);
- return NextResponse.redirect(redirectUrl);
+ return withAuthCookies(NextResponse.redirect(redirectUrl));
}
- if (pathname.startsWith('/auth') && session) {
- return NextResponse.redirect(new URL('/', req.url));
+ if (pathname.startsWith('/auth') && user) {
+ return withAuthCookies(NextResponse.redirect(new URL('/', req.url)));
}
return res;
diff --git a/package-lock.json b/package-lock.json
index a57f1fc..b0f2b7b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -38,8 +38,6 @@
"@radix-ui/react-toggle": "^1.1.0",
"@radix-ui/react-toggle-group": "^1.1.0",
"@radix-ui/react-tooltip": "^1.1.2",
- "@supabase/auth-helpers-nextjs": "^0.9.0",
- "@supabase/auth-helpers-react": "^0.5.0",
"@supabase/ssr": "^0.6.1",
"@supabase/supabase-js": "^2.50.2",
"@types/node": "20.6.2",
@@ -241,7 +239,6 @@
"resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.13.1.tgz",
"integrity": "sha512-0O33PKrXLoIWkoOO5ByFaLjZehBctSYWnb+xJkIdx2SKP/K9l1UPFXPwASyrOIqyY3ws+7orF/1j7wI5EKzPYQ==",
"license": "Apache-2.0",
- "peer": true,
"dependencies": {
"@firebase/component": "0.6.17",
"@firebase/logger": "0.4.4",
@@ -308,7 +305,6 @@
"resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.4.1.tgz",
"integrity": "sha512-9VGjnY23Gc1XryoF/ABWtZVJYnaPOnjHM7dsqq9YALgKRtxI1FryvELUVkDaEIUf4In2bfkb9ZENF1S9M273Dw==",
"license": "Apache-2.0",
- "peer": true,
"dependencies": {
"@firebase/app": "0.13.1",
"@firebase/component": "0.6.17",
@@ -324,8 +320,7 @@
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz",
"integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==",
- "license": "Apache-2.0",
- "peer": true
+ "license": "Apache-2.0"
},
"node_modules/@firebase/auth-compat": {
"version": "0.5.27",
@@ -776,7 +771,6 @@
"integrity": "sha512-Z4rK23xBCwgKDqmzGVMef+Vb4xso2j5Q8OG0vVL4m4fA5ZjPMYQazu8OJJC3vtQRC3SQ/Pgx/6TPNVsCd70QRw==",
"hasInstallScript": true,
"license": "Apache-2.0",
- "peer": true,
"dependencies": {
"tslib": "^2.1.0"
},
@@ -1413,7 +1407,6 @@
"resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
"integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
"license": "MIT",
- "peer": true,
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
@@ -3064,43 +3057,6 @@
"resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz",
"integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA=="
},
- "node_modules/@supabase/auth-helpers-nextjs": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/@supabase/auth-helpers-nextjs/-/auth-helpers-nextjs-0.9.0.tgz",
- "integrity": "sha512-V+UKFngSCkzAucX3Zi5D4TRiJZUUx0RDme7W217nIkwhCTvJY7Ih2L1cgnAMihQost2YYgTzJ7DrUzz4mm8i8A==",
- "deprecated": "This package is now deprecated - please use the @supabase/ssr package instead.",
- "license": "MIT",
- "dependencies": {
- "@supabase/auth-helpers-shared": "0.6.3",
- "set-cookie-parser": "^2.6.0"
- },
- "peerDependencies": {
- "@supabase/supabase-js": "^2.19.0"
- }
- },
- "node_modules/@supabase/auth-helpers-react": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/@supabase/auth-helpers-react/-/auth-helpers-react-0.5.0.tgz",
- "integrity": "sha512-5QSaV2CGuhDhd7RlQCoviVEAYsP7XnrFMReOcBazDvVmqSIyjKcDwhLhWvnrxMOq5qjOaA44MHo7wXqDiF0puQ==",
- "deprecated": "This package is now deprecated - please use the @supabase/ssr package instead.",
- "license": "MIT",
- "peerDependencies": {
- "@supabase/supabase-js": "^2.39.8"
- }
- },
- "node_modules/@supabase/auth-helpers-shared": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/@supabase/auth-helpers-shared/-/auth-helpers-shared-0.6.3.tgz",
- "integrity": "sha512-xYQRLFeFkL4ZfwC7p9VKcarshj3FB2QJMgJPydvOY7J5czJe6xSG5/wM1z63RmAzGbCkKg+dzpq61oeSyWiGBQ==",
- "deprecated": "This package is now deprecated - please use the @supabase/ssr package instead.",
- "license": "MIT",
- "dependencies": {
- "jose": "^4.14.4"
- },
- "peerDependencies": {
- "@supabase/supabase-js": "^2.19.0"
- }
- },
"node_modules/@supabase/auth-js": {
"version": "2.70.0",
"resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.70.0.tgz",
@@ -3179,7 +3135,6 @@
"resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.50.3.tgz",
"integrity": "sha512-Ld42AbfSXKnbCE2ObRvrGC5wj9OrfTOzswQZg0OcGQGx+QqcWYN/IqsLqrt4gCFrD57URbNRfGESSWzchzKAuQ==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@supabase/auth-js": "2.70.0",
"@supabase/functions-js": "2.4.5",
@@ -3302,7 +3257,6 @@
"version": "18.2.22",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz",
"integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==",
- "peer": true,
"dependencies": {
"@types/prop-types": "*",
"@types/scheduler": "*",
@@ -3313,7 +3267,6 @@
"version": "18.2.7",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz",
"integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==",
- "peer": true,
"dependencies": {
"@types/react": "*"
}
@@ -3463,7 +3416,6 @@
"version": "8.12.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
"integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
- "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -3879,7 +3831,6 @@
"url": "https://github.com/sponsors/ai"
}
],
- "peer": true,
"dependencies": {
"caniuse-lite": "^1.0.30001663",
"electron-to-chromium": "^1.5.28",
@@ -3899,7 +3850,6 @@
"integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==",
"hasInstallScript": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"node-gyp-build": "^4.3.0"
},
@@ -4754,7 +4704,6 @@
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz",
"integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==",
- "peer": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/kossnocorp"
@@ -4940,8 +4889,7 @@
"node_modules/embla-carousel": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.3.0.tgz",
- "integrity": "sha512-Ve8dhI4w28qBqR8J+aMtv7rLK89r1ZA5HocwFz6uMB/i5EiC7bGI7y+AM80yAVUJw3qqaZYK7clmZMUR8kM3UA==",
- "peer": true
+ "integrity": "sha512-Ve8dhI4w28qBqR8J+aMtv7rLK89r1ZA5HocwFz6uMB/i5EiC7bGI7y+AM80yAVUJw3qqaZYK7clmZMUR8kM3UA=="
},
"node_modules/embla-carousel-react": {
"version": "8.3.0",
@@ -4973,7 +4921,6 @@
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
"integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
"license": "MIT",
- "peer": true,
"dependencies": {
"iconv-lite": "^0.6.2"
}
@@ -5184,7 +5131,6 @@
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz",
"integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==",
"deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
- "peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
@@ -5339,7 +5285,6 @@
"version": "2.31.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
"integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
- "peer": true,
"dependencies": {
"@rtsao/scc": "^1.1.0",
"array-includes": "^3.1.8",
@@ -6766,15 +6711,6 @@
"jiti": "bin/jiti.js"
}
},
- "node_modules/jose": {
- "version": "4.15.9",
- "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz",
- "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/panva"
- }
- },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -7544,7 +7480,6 @@
"resolved": "https://registry.npmjs.org/pg/-/pg-8.16.0.tgz",
"integrity": "sha512-7SKfdvP8CTNXjMUzfcVTaI+TDzBEeaUnVwiVGZQD1Hh33Kpev7liQba9uLd4CfN8r9mCVsD0JIpq03+Unpz+kg==",
"license": "MIT",
- "peer": true,
"dependencies": {
"pg-connection-string": "^2.9.0",
"pg-pool": "^3.10.0",
@@ -7755,7 +7690,6 @@
}
],
"license": "MIT",
- "peer": true,
"dependencies": {
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
@@ -8009,7 +7943,6 @@
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
"integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
- "peer": true,
"dependencies": {
"loose-envify": "^1.1.0"
},
@@ -8034,7 +7967,6 @@
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
"integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
- "peer": true,
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.0"
@@ -8047,7 +7979,6 @@
"version": "7.53.0",
"resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.0.tgz",
"integrity": "sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==",
- "peer": true,
"engines": {
"node": ">=18.0.0"
},
@@ -8430,12 +8361,6 @@
"node": ">=10"
}
},
- "node_modules/set-cookie-parser": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
- "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
- "license": "MIT"
- },
"node_modules/set-function-length": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
@@ -8929,7 +8854,6 @@
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
"integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==",
- "peer": true,
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",
@@ -9183,7 +9107,6 @@
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
"integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
- "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -9290,7 +9213,6 @@
"integrity": "sha512-EYZR+OpIXp9Y1eG1iueg8KRsY8TuT8VNgnanZ0uA3STqhHQTLwbl+WX76/9X5OY12yQubymBpaBSmMPkSTQcKA==",
"hasInstallScript": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"node-gyp-build": "^4.3.0"
},
@@ -9594,7 +9516,6 @@
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
"integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=10.0.0"
},
diff --git a/package.json b/package.json
index f2d95b9..9cc22e8 100644
--- a/package.json
+++ b/package.json
@@ -39,8 +39,6 @@
"@radix-ui/react-toggle": "^1.1.0",
"@radix-ui/react-toggle-group": "^1.1.0",
"@radix-ui/react-tooltip": "^1.1.2",
- "@supabase/auth-helpers-nextjs": "^0.9.0",
- "@supabase/auth-helpers-react": "^0.5.0",
"@supabase/ssr": "^0.6.1",
"@supabase/supabase-js": "^2.50.2",
"@types/node": "20.6.2",