Add new pages to access key features and fix page navigation

Adds Tasks, Finances, Voice, AI, Analytics, and Settings pages with routing in App.tsx.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 10e60398-05df-4c0e-8698-578a1494e818
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/81470e0d-8ae8-4335-9301-cd9a69e670fa/29a30ac5-78e2-49a4-b73b-7a3f9967ce79.jpg
This commit is contained in:
ghaddaditw
2025-05-30 17:59:27 +00:00
parent 07fc4fe199
commit 7dcd2117d3
7 changed files with 1661 additions and 0 deletions
+251
View File
@@ -0,0 +1,251 @@
import { useState } from "react";
import { useAuth } from "@/context/AuthContext";
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 { useToast } from "@/hooks/use-toast";
import Sidebar from "@/components/layout/Sidebar";
import { User, Bell, Shield, Palette } from "lucide-react";
export default function SettingsPage() {
const { user, updateProfile } = useAuth();
const { toast } = useToast();
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">
<div className="mb-6">
<h1 className="text-2xl font-bold text-gray-900 dark:text-white">Settings</h1>
<p className="text-gray-600 dark:text-gray-300">
Manage your account settings and preferences
</p>
</div>
<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 />
</div>
</CardContent>
</Card>
</TabsContent>
</Tabs>
</div>
</div>
</div>
);
}