Spaces:
Configuration error
Configuration error
import { useState } from 'react' | |
import { useAuthStore } from '@/store/authStore' | |
import { Button } from '@/components/ui/button' | |
import { Input } from '@/components/ui/input' | |
import { Label } from '@/components/ui/label' | |
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' | |
import { Textarea } from '@/components/ui/textarea' | |
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar' | |
import { getInitials } from '@/lib/utils' | |
import { User, Settings } from 'lucide-react' | |
export default function ProfilePage() { | |
const { user, updateUser } = useAuthStore() | |
const [isEditing, setIsEditing] = useState(false) | |
const [formData, setFormData] = useState({ | |
displayName: user?.displayName || '', | |
bio: user?.bio || '', | |
}) | |
const handleSave = () => { | |
if (user) { | |
updateUser(formData) | |
setIsEditing(false) | |
} | |
} | |
const handleCancel = () => { | |
setFormData({ | |
displayName: user?.displayName || '', | |
bio: user?.bio || '', | |
}) | |
setIsEditing(false) | |
} | |
if (!user) return null | |
return ( | |
<div className="min-h-screen bg-background p-6"> | |
<div className="max-w-2xl mx-auto space-y-6"> | |
<div className="flex items-center space-x-4"> | |
<Button variant="ghost" size="icon"> | |
<User className="w-5 h-5" /> | |
</Button> | |
<h1 className="text-3xl font-bold">Profile</h1> | |
</div> | |
<Card> | |
<CardHeader> | |
<CardTitle>Personal Information</CardTitle> | |
<CardDescription> | |
Manage your account details and preferences | |
</CardDescription> | |
</CardHeader> | |
<CardContent className="space-y-6"> | |
<div className="flex items-center space-x-4"> | |
<Avatar className="w-20 h-20"> | |
<AvatarImage src={user.avatar} /> | |
<AvatarFallback className="text-lg"> | |
{getInitials(user.displayName)} | |
</AvatarFallback> | |
</Avatar> | |
<div> | |
<Button variant="outline" size="sm"> | |
Change Avatar | |
</Button> | |
<p className="text-sm text-muted-foreground mt-1"> | |
JPG, PNG or GIF. Max size 2MB. | |
</p> | |
</div> | |
</div> | |
<div className="grid grid-cols-2 gap-4"> | |
<div className="space-y-2"> | |
<Label>Email</Label> | |
<Input value={user.email} disabled /> | |
</div> | |
<div className="space-y-2"> | |
<Label>Username</Label> | |
<Input value={user.username} disabled /> | |
</div> | |
</div> | |
<div className="space-y-2"> | |
<Label htmlFor="displayName">Display Name</Label> | |
<Input | |
id="displayName" | |
value={formData.displayName} | |
onChange={(e) => setFormData(prev => ({ ...prev, displayName: e.target.value }))} | |
disabled={!isEditing} | |
/> | |
</div> | |
<div className="space-y-2"> | |
<Label htmlFor="bio">Bio</Label> | |
<Textarea | |
id="bio" | |
placeholder="Tell us about yourself..." | |
value={formData.bio} | |
onChange={(e) => setFormData(prev => ({ ...prev, bio: e.target.value }))} | |
disabled={!isEditing} | |
rows={3} | |
/> | |
</div> | |
<div className="flex justify-end space-x-2"> | |
{isEditing ? ( | |
<> | |
<Button variant="outline" onClick={handleCancel}> | |
Cancel | |
</Button> | |
<Button onClick={handleSave}> | |
Save Changes | |
</Button> | |
</> | |
) : ( | |
<Button onClick={() => setIsEditing(true)}> | |
Edit Profile | |
</Button> | |
)} | |
</div> | |
</CardContent> | |
</Card> | |
<Card> | |
<CardHeader> | |
<CardTitle>Account Settings</CardTitle> | |
<CardDescription> | |
Security and privacy settings | |
</CardDescription> | |
</CardHeader> | |
<CardContent className="space-y-4"> | |
<div className="flex items-center justify-between"> | |
<div> | |
<h4 className="font-medium">Change Password</h4> | |
<p className="text-sm text-muted-foreground"> | |
Update your password to keep your account secure | |
</p> | |
</div> | |
<Button variant="outline"> | |
Change Password | |
</Button> | |
</div> | |
<div className="flex items-center justify-between"> | |
<div> | |
<h4 className="font-medium">Two-Factor Authentication</h4> | |
<p className="text-sm text-muted-foreground"> | |
Add an extra layer of security to your account | |
</p> | |
</div> | |
<Button variant="outline"> | |
Enable 2FA | |
</Button> | |
</div> | |
<div className="flex items-center justify-between"> | |
<div> | |
<h4 className="font-medium">Privacy Settings</h4> | |
<p className="text-sm text-muted-foreground"> | |
Control who can see your information | |
</p> | |
</div> | |
<Button variant="outline"> | |
<Settings className="w-4 h-4 mr-2" /> | |
Manage | |
</Button> | |
</div> | |
</CardContent> | |
</Card> | |
</div> | |
</div> | |
) | |
} | |