diff --git a/bun.lockb b/bun.lockb
index fdccb78..c3abeae 100755
Binary files a/bun.lockb and b/bun.lockb differ
diff --git a/package.json b/package.json
index 4738558..4e3dfcd 100644
--- a/package.json
+++ b/package.json
@@ -52,7 +52,7 @@
"@supabase-cache-helpers/postgrest-react-query": "^1.13.4",
"@supabase-cache-helpers/storage-react-query": "^1.3.5",
"@supabase/ssr": "^0.6.1",
- "@supabase/supabase-js": "^2.51.0",
+ "@supabase/supabase-js": "^2.52.0",
"@t3-oss/env-nextjs": "^0.12.0",
"@tanstack/react-query": "^5.83.0",
"@tanstack/react-table": "^8.21.3",
@@ -65,7 +65,7 @@
"import-in-the-middle": "^1.14.2",
"input-otp": "^1.4.2",
"lucide-react": "^0.522.0",
- "next": "^15.4.1",
+ "next": "^15.4.2",
"next-plausible": "^3.12.4",
"next-themes": "^0.4.6",
"postgres": "^3.4.7",
@@ -86,22 +86,22 @@
"@tailwindcss/postcss": "^4.1.11",
"@types/cors": "^2.8.19",
"@types/express": "^5.0.3",
- "@types/node": "^20.19.8",
+ "@types/node": "^20.19.9",
"@types/react": "^19.1.8",
"@types/react-dom": "^19.1.6",
"drizzle-kit": "^0.30.6",
"eslint": "^9.31.0",
- "eslint-config-next": "^15.4.1",
- "eslint-config-prettier": "^10.1.5",
+ "eslint-config-next": "^15.4.2",
+ "eslint-config-prettier": "^10.1.8",
"eslint-plugin-drizzle": "^0.2.3",
- "eslint-plugin-prettier": "^5.5.1",
+ "eslint-plugin-prettier": "^5.5.3",
"postcss": "^8.5.6",
"prettier": "^3.6.2",
"prettier-plugin-tailwindcss": "^0.6.14",
"tailwindcss": "^4.1.11",
"tw-animate-css": "^1.3.5",
"typescript": "^5.8.3",
- "typescript-eslint": "^8.37.0"
+ "typescript-eslint": "^8.38.0"
},
"ct3aMetadata": {
"initVersion": "7.39.3"
diff --git a/src/app/(auth)/auth/success/page.tsx b/src/app/(auth)/auth/success/page.tsx
index a18dad1..b361ae3 100644
--- a/src/app/(auth)/auth/success/page.tsx
+++ b/src/app/(auth)/auth/success/page.tsx
@@ -15,8 +15,9 @@ const AuthSuccessPage = () => {
// Small delay to ensure state is updated
setTimeout(() => router.push('/'), 100);
};
- handleAuthSuccess()
- .catch(error => console.error(`Error handling auth success: ${error}`));
+ handleAuthSuccess().catch((error) =>
+ console.error(`Error handling auth success: ${error}`),
+ );
}, [refreshUser, router]);
return (
diff --git a/src/app/(auth)/forgot-password/page.tsx b/src/app/(auth)/forgot-password/page.tsx
index 35d1646..9dcbc7a 100644
--- a/src/app/(auth)/forgot-password/page.tsx
+++ b/src/app/(auth)/forgot-password/page.tsx
@@ -4,7 +4,7 @@ import { ForgotPasswordCard } from '@/components/default/auth/cards/client';
const ForgotPasswordPage = () => {
return (
-
+
);
};
diff --git a/src/app/(auth)/profile/page.tsx b/src/app/(auth)/profile/page.tsx
index c80e708..3c73822 100644
--- a/src/app/(auth)/profile/page.tsx
+++ b/src/app/(auth)/profile/page.tsx
@@ -1,9 +1,6 @@
'use client';
const ProfilePage = () => {
- return (
-
-
- );
+ return ;
};
export default ProfilePage;
diff --git a/src/app/global-error.tsx b/src/app/global-error.tsx
index b3fe17f..c4e10ef 100644
--- a/src/app/global-error.tsx
+++ b/src/app/global-error.tsx
@@ -20,9 +20,11 @@ type GlobalErrorProps = {
};
const GlobalError = ({ error, reset = undefined }: GlobalErrorProps) => {
- useEffect(() => { Sentry.captureException(error) }, [error]);
+ useEffect(() => {
+ Sentry.captureException(error);
+ }, [error]);
return (
- {
template: '%s | Next Template',
default: 'Next Template',
},
- description: 'Gib\'s Next Template',
+ description: "Gib's Next Template",
applicationName: 'Next Template',
keywords: 'Next.js, Supabase, Tailwind, Tanstack, React, Query, T3, Gib',
authors: [{ name: 'Gib', url: 'https://gbrown.org' }],
@@ -217,7 +217,9 @@ const RootLayout = async ({
children,
}: Readonly<{ children: React.ReactNode }>) => {
const client = await SupabaseServer();
- const { data: { user } } = await getCurrentUser(client);
+ const {
+ data: { user },
+ } = await getCurrentUser(client);
return (
-
- {children}
-
+ {children}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index b354cf8..80efd7c 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -3,7 +3,7 @@ import { SignInCard } from '@/components/default/auth/cards/client';
const HomePage = () => {
return (
-
+
);
};
diff --git a/src/components/default/auth/buttons/client/index.tsx b/src/components/default/auth/buttons/client/index.tsx
index 2adf938..4d2631b 100644
--- a/src/components/default/auth/buttons/client/index.tsx
+++ b/src/components/default/auth/buttons/client/index.tsx
@@ -1,3 +1,9 @@
-export { SignInWithApple, type SignInWithAppleProps } from './sign-in-with-apple';
-export { SignInWithMicrosoft, type SignInWithMicrosoftProps } from './sign-in-with-microsoft';
+export {
+ SignInWithApple,
+ type SignInWithAppleProps,
+} from './sign-in-with-apple';
+export {
+ SignInWithMicrosoft,
+ type SignInWithMicrosoftProps,
+} from './sign-in-with-microsoft';
export { SignInLinkButton } from './sign-in-link';
diff --git a/src/components/default/auth/buttons/client/sign-in-with-apple.tsx b/src/components/default/auth/buttons/client/sign-in-with-apple.tsx
index b99dff7..1dc0c97 100644
--- a/src/components/default/auth/buttons/client/sign-in-with-apple.tsx
+++ b/src/components/default/auth/buttons/client/sign-in-with-apple.tsx
@@ -25,11 +25,11 @@ export const SignInWithApple = ({
formProps,
textProps,
iconProps,
-} : SignInWithAppleProps) => {
+}: SignInWithAppleProps) => {
const router = useRouter();
const { loading, refreshUser } = useAuth();
const [statusMessage, setStatusMessage] = useState('');
- const [ isLoading, setIsLoading ] = useState(false);
+ const [isLoading, setIsLoading] = useState(false);
const supabase = SupabaseClient()!;
const handleSignInWithApple = async (e: React.FormEvent) => {
@@ -63,12 +63,18 @@ export const SignInWithApple = ({
className={cn('w-full', submitButtonProps?.className)}
>
-
-
+
+
Sign In with Apple
-
+
{statusMessage && }
);
diff --git a/src/components/default/auth/buttons/client/sign-in-with-microsoft.tsx b/src/components/default/auth/buttons/client/sign-in-with-microsoft.tsx
index 7fab135..1929e9e 100644
--- a/src/components/default/auth/buttons/client/sign-in-with-microsoft.tsx
+++ b/src/components/default/auth/buttons/client/sign-in-with-microsoft.tsx
@@ -25,11 +25,11 @@ export const SignInWithMicrosoft = ({
formProps,
textProps,
iconProps,
-} : SignInWithMicrosoftProps) => {
+}: SignInWithMicrosoftProps) => {
const router = useRouter();
const { loading, refreshUser } = useAuth();
const [statusMessage, setStatusMessage] = useState('');
- const [ isLoading, setIsLoading ] = useState(false);
+ const [isLoading, setIsLoading] = useState(false);
const supabase = SupabaseClient()!;
const handleSignInWithMicrosoft = async (e: React.FormEvent) => {
@@ -63,12 +63,18 @@ export const SignInWithMicrosoft = ({
className={cn('w-full', submitButtonProps?.className)}
>
-
-
+
+
Sign In with Microsoft
-
+
{statusMessage && }
);
diff --git a/src/components/default/auth/buttons/client/sign-out.tsx b/src/components/default/auth/buttons/client/sign-out.tsx
index 802b525..8cf3082 100644
--- a/src/components/default/auth/buttons/client/sign-out.tsx
+++ b/src/components/default/auth/buttons/client/sign-out.tsx
@@ -1,12 +1,15 @@
'use client';
-import { SubmitButton, type SubmitButtonProps } from '@/components/default/forms';
+import {
+ SubmitButton,
+ type SubmitButtonProps,
+} from '@/components/default/forms';
import { useRouter } from 'next/navigation';
import { useAuth } from '@/lib/hooks/context';
import { signOut } from '@/lib/queries';
import { SupabaseClient } from '@/utils/supabase';
import { cn } from '@/lib/utils';
-type SignOutProps = Omit
+type SignOutProps = Omit;
export const SignOut = ({
className,
@@ -38,7 +41,7 @@ export const SignOut = ({
className={cn(
'text-[1.0rem] font-semibold \
hover:bg-red-700/60 dark:hover:bg-red-300/80',
- className
+ className,
)}
>
Sign Out
diff --git a/src/components/default/auth/buttons/server/sign-in-with-apple.tsx b/src/components/default/auth/buttons/server/sign-in-with-apple.tsx
index 8fcb06c..76d5fdd 100644
--- a/src/components/default/auth/buttons/server/sign-in-with-apple.tsx
+++ b/src/components/default/auth/buttons/server/sign-in-with-apple.tsx
@@ -21,7 +21,7 @@ export const SignInWithApple = async ({
formProps,
textProps,
iconProps,
-} : SignInWithAppleProps) => {
+}: SignInWithAppleProps) => {
const supabase = await SupabaseServer();
const handleSignInWithApple = async () => {
@@ -29,7 +29,9 @@ export const SignInWithApple = async ({
if (!supabase) throw new Error('Supabase client not found');
const result = await signInWithApple(supabase);
if (result.error)
- throw new Error(`Error signing in with Microsoft: ${result.error.message}`);
+ throw new Error(
+ `Error signing in with Microsoft: ${result.error.message}`,
+ );
else if (result.data.url) window.location.href = result.data.url;
} catch (error) {
console.error(error);
@@ -48,8 +50,14 @@ export const SignInWithApple = async ({
className={cn('w-full', submitButtonProps?.className)}
>
-
-
+
+
Sign In with Apple
diff --git a/src/components/default/auth/buttons/server/sign-in-with-microsoft.tsx b/src/components/default/auth/buttons/server/sign-in-with-microsoft.tsx
index a3a013e..90b0c40 100644
--- a/src/components/default/auth/buttons/server/sign-in-with-microsoft.tsx
+++ b/src/components/default/auth/buttons/server/sign-in-with-microsoft.tsx
@@ -21,7 +21,7 @@ export const SignInWithMicrosoft = async ({
formProps,
textProps,
iconProps,
-} : SignInWithMicrosoftProps) => {
+}: SignInWithMicrosoftProps) => {
const supabase = await SupabaseServer();
const handleSignInWithMicrosoft = async () => {
@@ -29,7 +29,9 @@ export const SignInWithMicrosoft = async ({
if (!supabase) throw new Error('Supabase client not found');
const result = await signInWithMicrosoft(supabase);
if (result.error)
- throw new Error(`Error signing in with Microsoft: ${result.error.message}`);
+ throw new Error(
+ `Error signing in with Microsoft: ${result.error.message}`,
+ );
else if (result.data.url) window.location.href = result.data.url;
} catch (error) {
console.error(error);
@@ -48,8 +50,14 @@ export const SignInWithMicrosoft = async ({
className={cn('w-full', submitButtonProps?.className)}
>
-
-
+
+
Sign In with Microsoft
diff --git a/src/components/default/auth/buttons/server/sign-out.tsx b/src/components/default/auth/buttons/server/sign-out.tsx
index 0802e1e..430aa2c 100644
--- a/src/components/default/auth/buttons/server/sign-out.tsx
+++ b/src/components/default/auth/buttons/server/sign-out.tsx
@@ -1,12 +1,18 @@
'use server';
import 'server-only';
import { redirect } from 'next/navigation';
-import { SubmitButton, type SubmitButtonProps } from '@/components/default/forms';
+import {
+ SubmitButton,
+ type SubmitButtonProps,
+} from '@/components/default/forms';
import { signOut } from '@/lib/queries';
import { SupabaseServer } from '@/utils/supabase';
import { cn } from '@/lib/utils';
-type SignOutProps = Omit
+type SignOutProps = Omit<
+ SubmitButtonProps,
+ 'disabled' | 'onClick' | 'formAction'
+>;
export const SignOut = async ({
className,
@@ -35,7 +41,7 @@ export const SignOut = async ({
className={cn(
'text-[1.0rem] font-semibold \
hover:bg-red-700/60 dark:hover:bg-red-300/80',
- className
+ className,
)}
>
Sign Out
diff --git a/src/components/default/auth/cards/client/forgot-password.tsx b/src/components/default/auth/cards/client/forgot-password.tsx
index 3c8e4df..de335c7 100644
--- a/src/components/default/auth/cards/client/forgot-password.tsx
+++ b/src/components/default/auth/cards/client/forgot-password.tsx
@@ -27,7 +27,7 @@ import { cn } from '@/lib/utils';
const forgotPasswordFormSchema = z.object({
email: z.string().email({
- message: 'Please enter a valid email address.'
+ message: 'Please enter a valid email address.',
}),
});
@@ -65,10 +65,12 @@ export const ForgotPasswordCard = ({
});
useEffect(() => {
- if (isAuthenticated) router.push('/')
+ if (isAuthenticated) router.push('/');
}, [isAuthenticated, router]);
- const handleForgotPassword = async (values: z.infer) => {
+ const handleForgotPassword = async (
+ values: z.infer,
+ ) => {
try {
setStatusMessage('');
const formData = new FormData();
@@ -100,7 +102,10 @@ export const ForgotPasswordCard = ({
Don't have an account?{' '}
)}
/>
-
+
Reset Password
{statusMessage &&
diff --git a/src/components/default/auth/cards/client/sign-in.tsx b/src/components/default/auth/cards/client/sign-in.tsx
index 8a60317..02f130b 100755
--- a/src/components/default/auth/cards/client/sign-in.tsx
+++ b/src/components/default/auth/cards/client/sign-in.tsx
@@ -36,10 +36,10 @@ import { cn } from '@/lib/utils';
const signInFormSchema = z.object({
email: z.string().email({
- message: 'Please enter a valid email address.'
+ message: 'Please enter a valid email address.',
}),
password: z.string().min(8, {
- message: 'Password must be at least 8 characters.'
+ message: 'Password must be at least 8 characters.',
}),
});
@@ -71,8 +71,10 @@ type SignInCardProps = {
cardProps?: ComponentProps;
formProps?: Omit, 'onSubmit'>;
formLabelProps?: ComponentProps;
- submitButtonProps?: Omit,
- 'pendingText' | 'disabled'>;
+ submitButtonProps?: Omit<
+ ComponentProps,
+ 'pendingText' | 'disabled'
+ >;
signInWithAppleProps?: SignInWithAppleProps;
signInWithMicrosoftProps?: SignInWithMicrosoftProps;
};
@@ -89,7 +91,6 @@ export const SignInCard = ({
signInWithAppleProps,
signInWithMicrosoftProps,
}: SignInCardProps) => {
-
const router = useRouter();
const { isAuthenticated, loading, refreshUser } = useAuth();
const [statusMessage, setStatusMessage] = useState('');
@@ -154,10 +155,7 @@ export const SignInCard = ({
{...containerProps}
className={cn('p-4 bg-card/25 min-h-[720px]', containerProps?.className)}
>
-
+
Sign In
@@ -196,7 +194,10 @@ export const SignInCard = ({