From 04f2a48727e2da4f02678186ae2fb45d420000fa Mon Sep 17 00:00:00 2001 From: Gib Date: Wed, 9 Jul 2025 11:54:01 -0500 Subject: [PATCH] More stuff --- bun.lockb | Bin 373092 -> 379540 bytes package.json | 12 +-- public/favicon.png | Bin 0 -> 12962 bytes src/app/global-error.tsx | 51 ++++++++++ src/app/layout.tsx | 6 +- src/app/page.tsx | 13 +-- .../forms/client/profile/avatar-upload.tsx | 91 ++++++++++++++++-- .../default/layout/header/avatar-dropdown.tsx | 76 +++++++++++++++ .../default/layout/header/index.tsx | 71 ++++++++++++++ src/components/ui/based-avatar.tsx | 25 ++--- src/lib/hooks/context/use-auth.tsx | 56 +++++++---- src/lib/hooks/context/use-query.tsx | 1 + src/lib/hooks/context/use-theme.tsx | 17 ++-- src/lib/hooks/use-file-upload.ts | 2 +- src/lib/queries/auth.ts | 1 + src/utils/supabase/server.ts | 2 +- 16 files changed, 358 insertions(+), 66 deletions(-) create mode 100644 public/favicon.png create mode 100644 src/app/global-error.tsx create mode 100644 src/components/default/layout/header/avatar-dropdown.tsx create mode 100644 src/components/default/layout/header/index.tsx mode change 100644 => 100755 src/lib/hooks/context/use-auth.tsx diff --git a/bun.lockb b/bun.lockb index c069b26daa9d20807448aee95fb4436eafa651ef..4585b139f812553778c0faf0fd052365eb693d25 100755 GIT binary patch delta 63583 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 Ck>*AK delta 59646 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 diff --git a/package.json b/package.json index 5723eeb..de31850 100644 --- a/package.json +++ b/package.json @@ -48,10 +48,10 @@ "@radix-ui/react-toggle": "^1.1.9", "@radix-ui/react-toggle-group": "^1.1.10", "@radix-ui/react-tooltip": "^1.2.7", - "@sentry/nextjs": "^9.35.0", + "@sentry/nextjs": "^9.36.0", "@supabase-cache-helpers/postgrest-react-query": "^1.13.4", "@supabase/ssr": "^0.6.1", - "@supabase/supabase-js": "^2.50.3", + "@supabase/supabase-js": "^2.50.4", "@t3-oss/env-nextjs": "^0.12.0", "@tanstack/react-query": "^5.81.5", "@tanstack/react-table": "^8.21.3", @@ -74,18 +74,18 @@ "react-hook-form": "^7.60.0", "react-icons": "^5.5.0", "react-resizable-panels": "^3.0.3", - "recharts": "^3.0.2", + "recharts": "^3.1.0", "sonner": "^2.0.6", "tailwind-merge": "^3.3.1", "vaul": "^1.1.2", - "zod": "^3.25.75" + "zod": "^3.25.76" }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", "@tailwindcss/postcss": "^4.1.11", "@types/cors": "^2.8.19", "@types/express": "^5.0.3", - "@types/node": "^20.19.4", + "@types/node": "^20.19.6", "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", "drizzle-kit": "^0.30.6", @@ -100,7 +100,7 @@ "tailwindcss": "^4.1.11", "tw-animate-css": "^1.3.5", "typescript": "^5.8.3", - "typescript-eslint": "^8.35.1" + "typescript-eslint": "^8.36.0" }, "ct3aMetadata": { "initVersion": "7.39.3" diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..5ab4c75fbb1cf66e119aeaf726e3aaba024c3732 GIT binary patch literal 12962 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 void; +}; + +const GlobalError = ({ error, reset = undefined }: GlobalErrorProps) => { + useEffect(() => { Sentry.captureException(error) }, [error]); + return ( + + + + +
+ + {reset !== undefined && ( + + )} + +
+
+
+ + + ); +}; +export default GlobalError; diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 116eb1b..39e20f5 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -11,6 +11,7 @@ import { import PlausibleProvider from 'next-plausible'; import { Toaster } from '@/components/ui'; import * as Sentry from '@sentry/nextjs'; +import Header from '@/components/default/layout/header'; export const generateMetadata = (): Metadata => { return { @@ -208,7 +209,7 @@ export const generateMetadata = (): Metadata => { const fontSans = Inter({ subsets: ['latin'], variable: '--font-sans', -}) +}); export default function RootLayout({ children, @@ -235,6 +236,7 @@ export default function RootLayout({ selfHosted > +
{children} @@ -245,4 +247,4 @@ export default function RootLayout({ ); -} +}; diff --git a/src/app/page.tsx b/src/app/page.tsx index a7dc76a..860807f 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,18 +1,9 @@ import { SignInCard } from '@/components/default/auth/cards/client/sign-in'; -import { ForgotPasswordCard } from '@/components/default/auth/cards/client/forgot-password'; -import { ThemeToggle } from '@/lib/hooks/context'; export default function HomePage() { return ( -
-
-

- Create T3 App -

- - - -
+
+
); } diff --git a/src/components/default/auth/forms/client/profile/avatar-upload.tsx b/src/components/default/auth/forms/client/profile/avatar-upload.tsx index 7a0be69..6e7812b 100644 --- a/src/components/default/auth/forms/client/profile/avatar-upload.tsx +++ b/src/components/default/auth/forms/client/profile/avatar-upload.tsx @@ -10,13 +10,26 @@ import { import { Loader2, Pencil, Upload } from 'lucide-react'; import type { ComponentProps, ChangeEvent } from 'react'; import { toast } from 'sonner'; +import { cn } from '@/lib/utils'; type AvatarUploadProps = { onAvatarUploaded: (path: string) => Promise; + cardProps?: ComponentProps; + cardContentProps?: ComponentProps; + containerProps?: ComponentProps<'div'>; + basedAvatarProps?: ComponentProps; + iconProps?: ComponentProps; }; export const AvatarUpload = ({ onAvatarUploaded, + cardProps, + cardContentProps, + containerProps, + basedAvatarProps, + iconProps = { + size: 32, + }, }: AvatarUploadProps) => { const { profile, isAuthenticated } = useAuth(); const { isUploading, fileInputRef, uploadAvatarMutation } = useFileUpload(); @@ -39,8 +52,8 @@ export const AvatarUpload = ({ if (!file.type.startsWith('image/')) throw new Error('File is not an image!'); if (file.size > 8 * 1024 * 1024) throw new Error('File is too large!'); - const fileExt = file.name.split('.').pop(); - const avatarPath = profile?.avatar_url ?? profile?.id; + const avatarPath = profile?.avatar_url ?? + `${profile?.id}.${file.name.split('.').pop()}`; const avatarUrl = await uploadAvatarMutation.mutateAsync({ client, @@ -61,12 +74,78 @@ export const AvatarUpload = ({ }; return ( - - -
+ + +
+ +
+ +
+
+ +
+ + {isUploading && ( +
+ + Uploading... +
+ )} + {!isAuthenticated && ( +

+ Sign in to upload an avatar. +

+ )}
); - }; diff --git a/src/components/default/layout/header/avatar-dropdown.tsx b/src/components/default/layout/header/avatar-dropdown.tsx new file mode 100644 index 0000000..b36d493 --- /dev/null +++ b/src/components/default/layout/header/avatar-dropdown.tsx @@ -0,0 +1,76 @@ +'use client'; +import Link from 'next/link'; +import { + BasedAvatar, + Button, + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/ui'; +import { useAuth } from '@/lib/hooks/context'; +import { useRouter } from 'next/navigation'; +import { signOut } from '@/lib/queries'; +import { useSupabaseClient } from '@/utils/supabase'; + +export const AvatarDropdown = () => { + const { profile, avatar, refreshUser } = useAuth(); + const router = useRouter(); + const client = useSupabaseClient(); + + const handleSignOut = async () => { + try { + if (!client) throw new Error('Supabase client not found!'); + const { error } = await signOut(client); + if (error) throw new Error(error.message); + await refreshUser(); + router.push('/'); + } catch (error) { + console.error(error); + } + }; + + return ( + + + + + + {(profile?.full_name ?? profile?.email) && ( + <> + + {profile.full_name?.trim() ?? profile.email?.trim()} + + + + )} + + + Edit Profile + + + + + + + + + ); +}; diff --git a/src/components/default/layout/header/index.tsx b/src/components/default/layout/header/index.tsx new file mode 100644 index 0000000..02d51fa --- /dev/null +++ b/src/components/default/layout/header/index.tsx @@ -0,0 +1,71 @@ +'use client'; +import Image from 'next/image'; +import Link from 'next/link'; +import { ThemeToggle, useAuth } from '@/lib/hooks/context'; +import { cn } from '@/lib/utils'; +import { AvatarDropdown } from './avatar-dropdown'; + +const Header = () => { + const { isAuthenticated } = useAuth(); + + const Controls = () => ( +
+ + {isAuthenticated && ( )} +
+ ); + + return ( +
+
+
+ + {/* Left spacer for perfect centering */} +
+
+
+ + {/* Centered logo and title */} +
+ + Tech Tracker Logo +

+ Next Template +

+ +
+ + {/* Right-aligned controls */} +
+ +
+ +
+
+
+ ); + +}; +export default Header; diff --git a/src/components/ui/based-avatar.tsx b/src/components/ui/based-avatar.tsx index b5aced3..581489e 100644 --- a/src/components/ui/based-avatar.tsx +++ b/src/components/ui/based-avatar.tsx @@ -1,24 +1,26 @@ 'use client'; -import * as React from 'react'; import * as AvatarPrimitive from '@radix-ui/react-avatar'; import { User } from 'lucide-react'; import { cn } from '@/lib/utils'; import { AvatarImage } from '@/components/ui/avatar'; +import { type ComponentProps } from 'react'; -type BasedAvatarProps = React.ComponentProps & { +type BasedAvatarProps = ComponentProps & { src?: string | null; fullName?: string | null; - imageClassName?: string; - fallbackClassName?: string; - userIconSize?: number; + imageProps?: Omit, 'data-slot'>; + fallbackProps?: ComponentProps; + userIconProps?: ComponentProps; }; const BasedAvatar = ({ src = null, fullName = null, - imageClassName = '', - fallbackClassName = '', - userIconSize = 32, + imageProps, + fallbackProps, + userIconProps = { + size: 32, + }, className, ...props }: BasedAvatarProps) => { @@ -32,13 +34,14 @@ const BasedAvatar = ({ {...props} > {src ? ( - + ) : ( {fullName ? ( @@ -48,7 +51,7 @@ const BasedAvatar = ({ .join('') .toUpperCase() ) : ( - + )} )} diff --git a/src/lib/hooks/context/use-auth.tsx b/src/lib/hooks/context/use-auth.tsx old mode 100644 new mode 100755 index 6c76b24..0fd58cc --- a/src/lib/hooks/context/use-auth.tsx +++ b/src/lib/hooks/context/use-auth.tsx @@ -6,7 +6,10 @@ import React, { useEffect, } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; -import { useQuery as useSupabaseQuery } from '@supabase-cache-helpers/postgrest-react-query'; +import { + useQuery as useSupabaseQuery, + useUpdateMutation, +} from '@supabase-cache-helpers/postgrest-react-query'; import { QueryErrorCodes } from '@/lib/hooks/context'; import { type User, type Profile, useSupabaseClient } from '@/utils/supabase'; import { toast } from 'sonner'; @@ -27,7 +30,8 @@ type AuthContextType = { full_name?: string; email?: string; avatar_url?: string; - }) => Promise<{ data?: Profile; error?: unknown }>; + provider?: string; + }) => Promise<{ data?: Profile | null; error?: { message: string } | null }>; refreshUser: () => Promise; }; @@ -67,6 +71,7 @@ const AuthContextProvider = ({ children }: { children: ReactNode }) => { } ); + // Avatar query const { data: avatarData, @@ -83,20 +88,31 @@ const AuthContextProvider = ({ children }: { children: ReactNode }) => { }); // Update profile mutation - const updateProfileMutation = useMutation({ - mutationFn: async (updates: Partial) => { - if (!userData?.id) throw new Error('User ID is required!'); - const result = await updateProfileQuery(supabase, userData.id, updates); - if (result.error) throw result.error; - return result.data; + const updateProfileMutation = useUpdateMutation( + supabase.from('profiles'), + ['id'], + '*', + { + onSuccess: () => toast.success('Profile updated successfully!'), + onError: (error) => toast.error(`Failed to update profile: ${error.message}`), + meta: { errCode: QueryErrorCodes.UPDATE_PROFILE_FAILED }, }, - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ['auth'] }) - .catch((error) => console.error('Error invalidating auth queries:', error)); - toast.success('Profile updated successfully!'); - }, - meta: { errCode: QueryErrorCodes.UPDATE_PROFILE_FAILED }, - }); + ); + + //const updateProfileMutation = useMutation({ + //mutationFn: async (updates: Partial) => { + //if (!userData?.id) throw new Error('User ID is required!'); + //const result = await updateProfileQuery(supabase, userData.id, updates); + //if (result.error) throw result.error; + //return result.data; + //}, + //onSuccess: () => { + //queryClient.invalidateQueries({ queryKey: ['auth'] }) + //.catch((error) => console.error('Error invalidating auth queries:', error)); + //toast.success('Profile updated successfully!'); + //}, + //meta: { errCode: QueryErrorCodes.UPDATE_PROFILE_FAILED }, + //}); useEffect(() => { const { @@ -110,11 +126,15 @@ const AuthContextProvider = ({ children }: { children: ReactNode }) => { }, [supabase.auth, queryClient]); const handleUpdateProfile = async (data: Partial) => { + if (!userData?.id) throw new Error('User ID is required!'); try { - const result = await updateProfileMutation.mutateAsync(data); - return { data: result }; + const result = await updateProfileMutation.mutateAsync({ + ...data, + id: userData.id, + }); + return { data: result, error: null }; } catch (error) { - return { error }; + return { data: null, error }; } }; diff --git a/src/lib/hooks/context/use-query.tsx b/src/lib/hooks/context/use-query.tsx index 3b959ef..8226e47 100644 --- a/src/lib/hooks/context/use-query.tsx +++ b/src/lib/hooks/context/use-query.tsx @@ -65,6 +65,7 @@ const QueryClientProvider = ({ children }: { children: React.ReactNode }) => { }), defaultOptions: { queries: { + refetchOnWindowFocus: true, staleTime: 60 * 1000, }, }, diff --git a/src/lib/hooks/context/use-theme.tsx b/src/lib/hooks/context/use-theme.tsx index bca1983..1c32f58 100644 --- a/src/lib/hooks/context/use-theme.tsx +++ b/src/lib/hooks/context/use-theme.tsx @@ -25,17 +25,12 @@ const ThemeProvider = ({ type ThemeToggleProps = { size?: number; - buttonClassName?: ComponentProps['className']; - buttonProps?: Omit, 'className' | 'onClick'>; + buttonProps?: Omit, 'onClick'>; }; const ThemeToggle = ({ size = 1, - buttonClassName, - buttonProps = { - variant: 'outline', - size: 'icon', - }, + buttonProps, }: ThemeToggleProps) => { const { setTheme, resolvedTheme } = useTheme(); @@ -45,7 +40,7 @@ const ThemeToggle = ({ if (!mounted) { return ( - ); @@ -58,9 +53,11 @@ const ThemeToggle = ({ return (