Fixes dark mode toggle, landing page layout, dashboard structure, and removes unused imports. Replit-Commit-Author: Agent Replit-Commit-Session-Id: d7e7c4e8-20cb-41c4-9d0e-79f48938fede Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/9777c70b-fc38-4831-8d6b-78dfffe041b0/d4eed189-5f49-4ca5-967b-42e14b879685.jpg
269 lines
11 KiB
TypeScript
269 lines
11 KiB
TypeScript
import { useState } from "react";
|
|
import { useAuth } from "@/context/AuthContext";
|
|
import { useTranslation } from "react-i18next";
|
|
import { useTheme } from "@/context/ThemeContext";
|
|
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 { Switch } from "@/components/ui/switch";
|
|
import { Separator } from "@/components/ui/separator";
|
|
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
|
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
|
|
import { LanguageSwitcher } from "@/components/LanguageSwitcher";
|
|
import { PageHeader } from "@/components/ui/page-header";
|
|
import { useToast } from "@/hooks/use-toast";
|
|
import Sidebar from "@/components/layout/Sidebar";
|
|
import { User, Bell, Shield, Palette, Moon, Sun, Globe, Download, Trash2 } from "lucide-react";
|
|
|
|
export default function SettingsPage() {
|
|
const { user, updateProfile } = useAuth();
|
|
const { toast } = useToast();
|
|
const { t, i18n } = useTranslation();
|
|
const { theme, toggleTheme } = useTheme();
|
|
const [loading, setLoading] = useState(false);
|
|
const [profile, setProfile] = useState({
|
|
username: user?.username || "",
|
|
email: user?.email || "",
|
|
fullName: user?.fullName || "",
|
|
});
|
|
const [notifications, setNotifications] = useState({
|
|
emailNotifications: true,
|
|
pushNotifications: true,
|
|
taskReminders: true,
|
|
financialAlerts: true,
|
|
});
|
|
|
|
const handleProfileUpdate = async (e: React.FormEvent) => {
|
|
e.preventDefault();
|
|
setLoading(true);
|
|
try {
|
|
await updateProfile(profile);
|
|
toast({
|
|
title: "Profile updated",
|
|
description: "Your profile has been successfully updated.",
|
|
});
|
|
} catch (error) {
|
|
toast({
|
|
title: "Error",
|
|
description: "Failed to update profile. Please try again.",
|
|
variant: "destructive",
|
|
});
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
return (
|
|
<div className="flex h-screen bg-gray-50 dark:bg-gray-900">
|
|
<Sidebar className="w-64 border-r" />
|
|
<div className="flex-1 overflow-auto">
|
|
<div className="p-6">
|
|
<PageHeader
|
|
title="Settings"
|
|
description="Manage your account settings and preferences"
|
|
/>
|
|
|
|
<Tabs defaultValue="profile" className="space-y-6">
|
|
<TabsList>
|
|
<TabsTrigger value="profile">
|
|
<User className="w-4 h-4 mr-2" />
|
|
Profile
|
|
</TabsTrigger>
|
|
<TabsTrigger value="notifications">
|
|
<Bell className="w-4 h-4 mr-2" />
|
|
Notifications
|
|
</TabsTrigger>
|
|
<TabsTrigger value="security">
|
|
<Shield className="w-4 h-4 mr-2" />
|
|
Security
|
|
</TabsTrigger>
|
|
<TabsTrigger value="appearance">
|
|
<Palette className="w-4 h-4 mr-2" />
|
|
Appearance
|
|
</TabsTrigger>
|
|
</TabsList>
|
|
|
|
<TabsContent value="profile">
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle>Profile Information</CardTitle>
|
|
<CardDescription>
|
|
Update your personal information and account details.
|
|
</CardDescription>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<form onSubmit={handleProfileUpdate} className="space-y-4">
|
|
<div className="grid grid-cols-2 gap-4">
|
|
<div className="space-y-2">
|
|
<Label htmlFor="username">Username</Label>
|
|
<Input
|
|
id="username"
|
|
value={profile.username}
|
|
onChange={(e) => setProfile({ ...profile, username: e.target.value })}
|
|
/>
|
|
</div>
|
|
<div className="space-y-2">
|
|
<Label htmlFor="email">Email</Label>
|
|
<Input
|
|
id="email"
|
|
type="email"
|
|
value={profile.email}
|
|
onChange={(e) => setProfile({ ...profile, email: e.target.value })}
|
|
/>
|
|
</div>
|
|
</div>
|
|
<div className="space-y-2">
|
|
<Label htmlFor="fullName">Full Name</Label>
|
|
<Input
|
|
id="fullName"
|
|
value={profile.fullName}
|
|
onChange={(e) => setProfile({ ...profile, fullName: e.target.value })}
|
|
/>
|
|
</div>
|
|
<Button type="submit" disabled={loading}>
|
|
{loading ? "Updating..." : "Update Profile"}
|
|
</Button>
|
|
</form>
|
|
</CardContent>
|
|
</Card>
|
|
</TabsContent>
|
|
|
|
<TabsContent value="notifications">
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle>Notification Preferences</CardTitle>
|
|
<CardDescription>
|
|
Choose what notifications you want to receive.
|
|
</CardDescription>
|
|
</CardHeader>
|
|
<CardContent className="space-y-6">
|
|
<div className="flex items-center justify-between">
|
|
<div className="space-y-0.5">
|
|
<Label>Email Notifications</Label>
|
|
<p className="text-sm text-gray-600 dark:text-gray-400">
|
|
Receive notifications via email
|
|
</p>
|
|
</div>
|
|
<Switch
|
|
checked={notifications.emailNotifications}
|
|
onCheckedChange={(checked) =>
|
|
setNotifications({ ...notifications, emailNotifications: checked })
|
|
}
|
|
/>
|
|
</div>
|
|
<Separator />
|
|
<div className="flex items-center justify-between">
|
|
<div className="space-y-0.5">
|
|
<Label>Push Notifications</Label>
|
|
<p className="text-sm text-gray-600 dark:text-gray-400">
|
|
Receive push notifications in your browser
|
|
</p>
|
|
</div>
|
|
<Switch
|
|
checked={notifications.pushNotifications}
|
|
onCheckedChange={(checked) =>
|
|
setNotifications({ ...notifications, pushNotifications: checked })
|
|
}
|
|
/>
|
|
</div>
|
|
<Separator />
|
|
<div className="flex items-center justify-between">
|
|
<div className="space-y-0.5">
|
|
<Label>Task Reminders</Label>
|
|
<p className="text-sm text-gray-600 dark:text-gray-400">
|
|
Get reminded about upcoming tasks and deadlines
|
|
</p>
|
|
</div>
|
|
<Switch
|
|
checked={notifications.taskReminders}
|
|
onCheckedChange={(checked) =>
|
|
setNotifications({ ...notifications, taskReminders: checked })
|
|
}
|
|
/>
|
|
</div>
|
|
<Separator />
|
|
<div className="flex items-center justify-between">
|
|
<div className="space-y-0.5">
|
|
<Label>Financial Alerts</Label>
|
|
<p className="text-sm text-gray-600 dark:text-gray-400">
|
|
Receive alerts about financial goals and budgets
|
|
</p>
|
|
</div>
|
|
<Switch
|
|
checked={notifications.financialAlerts}
|
|
onCheckedChange={(checked) =>
|
|
setNotifications({ ...notifications, financialAlerts: checked })
|
|
}
|
|
/>
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
</TabsContent>
|
|
|
|
<TabsContent value="security">
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle>Security Settings</CardTitle>
|
|
<CardDescription>
|
|
Manage your account security and privacy settings.
|
|
</CardDescription>
|
|
</CardHeader>
|
|
<CardContent className="space-y-4">
|
|
<div className="space-y-2">
|
|
<Label htmlFor="currentPassword">Current Password</Label>
|
|
<Input id="currentPassword" type="password" />
|
|
</div>
|
|
<div className="space-y-2">
|
|
<Label htmlFor="newPassword">New Password</Label>
|
|
<Input id="newPassword" type="password" />
|
|
</div>
|
|
<div className="space-y-2">
|
|
<Label htmlFor="confirmPassword">Confirm New Password</Label>
|
|
<Input id="confirmPassword" type="password" />
|
|
</div>
|
|
<Button>Update Password</Button>
|
|
</CardContent>
|
|
</Card>
|
|
</TabsContent>
|
|
|
|
<TabsContent value="appearance">
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle>Appearance Settings</CardTitle>
|
|
<CardDescription>
|
|
Customize the look and feel of your application.
|
|
</CardDescription>
|
|
</CardHeader>
|
|
<CardContent className="space-y-6">
|
|
<div className="flex items-center justify-between">
|
|
<div className="space-y-0.5">
|
|
<Label>Dark Mode</Label>
|
|
<p className="text-sm text-gray-600 dark:text-gray-400">
|
|
Switch between light and dark themes
|
|
</p>
|
|
</div>
|
|
<Switch
|
|
checked={theme === 'dark'}
|
|
onCheckedChange={toggleTheme}
|
|
/>
|
|
</div>
|
|
<Separator />
|
|
<div className="space-y-4">
|
|
<div>
|
|
<Label>Language</Label>
|
|
<p className="text-sm text-gray-600 dark:text-gray-400 mb-2">
|
|
Choose your preferred language
|
|
</p>
|
|
<LanguageSwitcher />
|
|
</div>
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
</TabsContent>
|
|
</Tabs>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
} |