11"use client" ;
22
3- import { useEffect , useState } from "react" ;
4- import { useRouter } from "next/navigation" ;
5- import { createClientClientComponent } from "@/utils/supabase/client" ;
6- import { H1 } from "@/components/shared/dashboard" ;
7- import CustomBreadcrumb from "@/components/shared/dashboard/CustomBreadcrumb" ;
8-
9- import { Card , CardContent , CardFooter } from "@codevs/ui/card" ;
10- import { Separator } from "@codevs/ui/separator" ;
11-
12- import AccountSettings2FA from "./_components/AccountSettings2FA" ;
13- import AccountSettingsChangePassword from "./_components/AccountSettingsChangePassword" ;
14- import AccountSettingsDelete from "./_components/AccountSettingsDelete" ;
15- import AccountSettingsHeader from "./_components/AccountSettingsHeader" ;
16- import AccountSettingsUsername from "./_components/AccountSettingsUsername" ;
17-
183export const dynamic = "force-dynamic" ;
194
20- const items = [
21- { label : "Settings" , href : "/home/settings" } ,
22- { label : "Account Settings" } ,
23- ] ;
24-
25- interface User {
26- id : string ;
27- email ?: string ;
28- }
29-
30- export default function AccountSettingsPage ( { showBreadcrumb = true } : { showBreadcrumb ?: boolean } ) {
31- const [ user , setUser ] = useState < User | null > ( null ) ;
32- const [ loading , setLoading ] = useState ( true ) ;
33- const [ supabase , setSupabase ] = useState < any > ( null ) ;
34- const router = useRouter ( ) ;
35-
36- useEffect ( ( ) => {
37- const supabaseClient = createClientClientComponent ( ) ;
38- setSupabase ( supabaseClient ) ;
39- } , [ ] ) ;
40-
41- // Initialize Supabase client safely on the client side
42- /* useEffect(() => {
43- try {
44- const client = createClientClientComponent();
45- setSupabase(client);
46- } catch (error) {
47- console.error("Failed to initialize Supabase client:", error);
48- router.push("/auth/login");
49- }
50- }, [router]); */
51-
52- useEffect ( ( ) => {
53- if ( ! supabase ) return ;
54-
55- async function getUser ( ) {
56- try {
57- const {
58- data : { user : authUser } ,
59- error,
60- } = await supabase . auth . getUser ( ) ;
61-
62- if ( error || ! authUser ) {
63- router . push ( "/auth/login" ) ;
64- return ;
65- }
66-
67- setUser ( {
68- id : authUser . id ,
69- email : authUser . email ,
70- } ) ;
71- } catch ( error ) {
72- console . error ( "Error getting user:" , error ) ;
73- router . push ( "/auth/login" ) ;
74- } finally {
75- setLoading ( false ) ;
76- }
77- }
78-
79- getUser ( ) ;
80- } , [ router , supabase ] ) ;
81-
82- const LoadingContent = ( ) => (
83- < div className = "grid gap-6 lg:grid-cols-2 max-w-none" >
84- < Card className = "background-box text-dark100_light900 self-start" >
85- < CardContent className = "space-y-4 p-6" >
86- < div className = "animate-pulse space-y-4" >
87- < div className = "h-6 w-1/3 rounded bg-gray-200 dark:bg-gray-700" > </ div >
88- < div className = "h-4 w-2/3 rounded bg-gray-200 dark:bg-gray-700" > </ div >
89- < div className = "h-px w-full bg-gray-200 dark:bg-gray-700" > </ div >
90- < div className = "space-y-2" >
91- < div className = "h-4 w-1/4 rounded bg-gray-200 dark:bg-gray-700" > </ div >
92- < div className = "h-10 w-full rounded bg-gray-200 dark:bg-gray-700" > </ div >
93- </ div >
94- < div className = "h-px w-full bg-gray-200 dark:bg-gray-700" > </ div >
95- < div className = "space-y-2" >
96- < div className = "h-5 w-1/3 rounded bg-gray-200 dark:bg-gray-700" > </ div >
97- < div className = "h-10 w-full rounded bg-gray-200 dark:bg-gray-700" > </ div >
98- < div className = "h-10 w-full rounded bg-gray-200 dark:bg-gray-700" > </ div >
99- </ div >
100- < div className = "h-px w-full bg-gray-200 dark:bg-gray-700" > </ div >
101- < div className = "flex justify-between items-center" >
102- < div className = "space-y-1" >
103- < div className = "h-4 w-40 rounded bg-gray-200 dark:bg-gray-700" > </ div >
104- < div className = "h-3 w-56 rounded bg-gray-200 dark:bg-gray-700" > </ div >
105- </ div >
106- < div className = "h-9 w-24 rounded bg-gray-200 dark:bg-gray-700" > </ div >
107- </ div >
108- </ div >
109- </ CardContent >
110- </ Card >
111-
112- < Card className = "background-box text-dark100_light900 border border-red-600 self-start" >
113- < CardContent className = "space-y-4 p-6" >
114- < div className = "animate-pulse space-y-4" >
115- < div className = "flex justify-between items-center" >
116- < div className = "h-6 w-32 rounded bg-gray-200 dark:bg-gray-700" > </ div >
117- < div className = "h-4 w-4 rounded bg-gray-200 dark:bg-gray-700" > </ div >
118- </ div >
119- < div className = "h-4 w-3/4 rounded bg-gray-200 dark:bg-gray-700" > </ div >
120- < div className = "h-9 w-32 rounded bg-red-200 dark:bg-red-800" > </ div >
121- </ div >
122- </ CardContent >
123- </ Card >
124- </ div >
125- ) ;
126-
127- if ( ! user ) {
128- return null ; // Will redirect in useEffect
129- }
130-
131- return (
132- < div className = "mx-auto max-w-screen-xl" >
133- { showBreadcrumb && (
134- < CustomBreadcrumb items = { items } />
135- ) }
5+ import AccountSettingsContent from "./_components/AccountSettingsContent" ;
1366
137- < div className = "flex flex-col gap-4 pt-4" >
138- < H1 > Account Settings</ H1 >
139- < span className = "text-sm text-gray-400" >
140- Manage your account credentials and security settings.
141- </ span >
142-
143- { loading ? (
144- < LoadingContent />
145- ) : (
146- < div className = "grid gap-6 lg:grid-cols-2 p-2" >
147- < Card className = "background-box text-dark100_light900 h-fit" >
148- < CardContent className = "space-y-4 " >
149- < AccountSettingsHeader email = { user . email || "No email available" } />
150- < Separator />
151- < AccountSettingsChangePassword />
152- < Separator />
153- < AccountSettings2FA />
154- </ CardContent >
155- </ Card >
156-
157- < div className = "w-full h-fit space-y-2" >
158- < AccountSettingsDelete />
159-
160- < Card className = "background-box text-foreground h-fit" >
161- < CardContent className = "p-6" >
162- < AccountSettingsUsername userId = { user . id } />
163- </ CardContent >
164- </ Card >
165- </ div >
166-
167-
168- </ div >
169- ) }
170- </ div >
171- </ div >
172- ) ;
173- }
7+ export default function AccountSettingsPage ( ) {
8+ return < AccountSettingsContent showBreadcrumb = { false } /> ;
9+ }
0 commit comments