| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- "use client"
- import React, { useState } from 'react'
- import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
- import { Button } from '@/components/ui/button'
- import { Input } from '@/components/ui/input'
- import { Label } from '@/components/ui/label'
- import { Alert, AlertDescription } from '@/components/ui/alert'
- import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'
- import { ProtectedRoute } from '@/components/auth/protected-route'
- import { ApiKeyManager } from '@/components/auth/api-key-manager'
- import { UserManagement } from '@/components/auth/user-management'
- import { useAuth } from '@/lib/auth-context'
- import { authApi } from '@/lib/api'
- export default function SettingsPage() {
- const { user, logout } = useAuth()
- const [activeTab, setActiveTab] = useState('profile')
- const [error, setError] = useState<string | null>(null)
- const [success, setSuccess] = useState<string | null>(null)
- const [passwordData, setPasswordData] = useState({
- current_password: '',
- new_password: '',
- confirm_password: ''
- })
- const handlePasswordChange = async (e: React.FormEvent) => {
- e.preventDefault()
- if (passwordData.new_password !== passwordData.confirm_password) {
- setError('New passwords do not match')
- return
- }
- if (passwordData.new_password.length < 8) {
- setError('Password must be at least 8 characters long')
- return
- }
- try {
- await authApi.changePassword(passwordData.current_password, passwordData.new_password)
- setSuccess('Password changed successfully')
- setPasswordData({
- current_password: '',
- new_password: '',
- confirm_password: ''
- })
- setError(null)
- } catch (err) {
- setError(err instanceof Error ? err.message : 'Failed to change password')
- setSuccess(null)
- }
- }
- return (
- <ProtectedRoute>
- <div className="container mx-auto py-6 space-y-6">
- <div>
- <h1 className="text-3xl font-bold">Settings</h1>
- <p className="text-muted-foreground">Manage your account and application settings</p>
- </div>
- {error && (
- <Alert variant="destructive">
- <AlertDescription>{error}</AlertDescription>
- </Alert>
- )}
- {success && (
- <Alert>
- <AlertDescription>{success}</AlertDescription>
- </Alert>
- )}
- <Tabs value={activeTab} onValueChange={setActiveTab}>
- <TabsList className="grid w-full grid-cols-3">
- <TabsTrigger value="profile">Profile</TabsTrigger>
- <TabsTrigger value="api-keys">API Keys</TabsTrigger>
- {user?.role === 'admin' && (
- <TabsTrigger value="users">User Management</TabsTrigger>
- )}
- </TabsList>
- <TabsContent value="profile" className="space-y-6">
- <Card>
- <CardHeader>
- <CardTitle>Profile Information</CardTitle>
- <CardDescription>
- View and manage your account details
- </CardDescription>
- </CardHeader>
- <CardContent className="space-y-4">
- <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
- <div>
- <Label>Username</Label>
- <Input value={user?.username || ''} disabled />
- </div>
- <div>
- <Label>Role</Label>
- <Input value={user?.role || ''} disabled />
- </div>
- {user?.email && (
- <div>
- <Label>Email</Label>
- <Input value={user.email} disabled />
- </div>
- )}
- <div>
- <Label>Account Created</Label>
- <Input
- value={user?.createdAt ? new Date(user.createdAt).toLocaleDateString() : ''}
- disabled
- />
- </div>
- </div>
- </CardContent>
- </Card>
- <Card>
- <CardHeader>
- <CardTitle>Change Password</CardTitle>
- <CardDescription>
- Update your account password
- </CardDescription>
- </CardHeader>
- <CardContent>
- <form onSubmit={handlePasswordChange} className="space-y-4">
- <div>
- <Label htmlFor="current_password">Current Password</Label>
- <Input
- id="current_password"
- type="password"
- value={passwordData.current_password}
- onChange={(e) => setPasswordData(prev => ({ ...prev, current_password: e.target.value }))}
- required
- />
- </div>
- <div>
- <Label htmlFor="new_password">New Password</Label>
- <Input
- id="new_password"
- type="password"
- value={passwordData.new_password}
- onChange={(e) => setPasswordData(prev => ({ ...prev, new_password: e.target.value }))}
- required
- />
- </div>
- <div>
- <Label htmlFor="confirm_password">Confirm New Password</Label>
- <Input
- id="confirm_password"
- type="password"
- value={passwordData.confirm_password}
- onChange={(e) => setPasswordData(prev => ({ ...prev, confirm_password: e.target.value }))}
- required
- />
- </div>
- <Button type="submit">Change Password</Button>
- </form>
- </CardContent>
- </Card>
- <Card>
- <CardHeader>
- <CardTitle>Account Actions</CardTitle>
- <CardDescription>
- Manage your session
- </CardDescription>
- </CardHeader>
- <CardContent>
- <Button variant="destructive" onClick={logout}>
- Sign Out
- </Button>
- </CardContent>
- </Card>
- </TabsContent>
- <TabsContent value="api-keys">
- <ApiKeyManager />
- </TabsContent>
- {user?.role === 'admin' && (
- <TabsContent value="users">
- <UserManagement />
- </TabsContent>
- )}
- </Tabs>
- </div>
- </ProtectedRoute>
- )
- }
|