Files
menassit/client/src/pages/SettingsPage.tsx
T
ghaddaditw 1a80211ae6 Improve overall user interface and fix reported functionality problems
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
2025-06-08 15:46:43 +00:00

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>
);
}