HamzaAri's picture
🚀 Deploy ScanMenu - Production-ready SaaS web app for digital restaurant menus & QR ordering
e1ef9fc verified
'use client';
import { DashboardLayout } from '@/components/layout/dashboard-layout';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Badge } from '@/components/ui/badge';
import { User, Bell, Shield, Key, Globe, Trash2, Save, UserPlus, Mail } from 'lucide-react';
import { demoUser } from '@/lib/demo-data';
export default function SettingsPage() {
return (
<DashboardLayout>
<div className="space-y-6">
<div>
<h1 className="text-2xl font-bold tracking-tight text-zinc-900 dark:text-white sm:text-3xl">Settings</h1>
<p className="mt-1 text-sm text-zinc-500">Manage your account, notifications, and security.</p>
</div>
<div className="grid gap-6 lg:grid-cols-3">
<div className="space-y-6 lg:col-span-2">
{/* Profile */}
<Card>
<CardHeader>
<CardTitle className="flex items-center gap-2"><User className="h-4 w-4" /> Profile</CardTitle>
</CardHeader>
<CardContent className="space-y-4">
<div className="flex items-center gap-4">
<div className="flex h-16 w-16 items-center justify-center rounded-xl bg-gradient-to-br from-violet-500 to-fuchsia-500 text-lg font-bold text-white">
AR
</div>
<div>
<Button variant="outline" size="sm">Change Avatar</Button>
<p className="mt-1 text-xs text-zinc-400">JPG, PNG. Max 2MB</p>
</div>
</div>
<div className="grid grid-cols-2 gap-4">
<div className="space-y-2">
<label className="text-sm font-medium text-zinc-700">Full Name</label>
<Input defaultValue={demoUser.full_name} />
</div>
<div className="space-y-2">
<label className="text-sm font-medium text-zinc-700">Email</label>
<Input defaultValue={demoUser.email} type="email" />
</div>
</div>
<div className="flex justify-end">
<Button variant="primary" size="sm"><Save className="h-4 w-4" /> Save</Button>
</div>
</CardContent>
</Card>
{/* Security */}
<Card>
<CardHeader>
<CardTitle className="flex items-center gap-2"><Shield className="h-4 w-4" /> Security</CardTitle>
</CardHeader>
<CardContent className="space-y-4">
<div className="space-y-2">
<label className="text-sm font-medium text-zinc-700">Current Password</label>
<Input type="password" placeholder="••••••••" />
</div>
<div className="grid grid-cols-2 gap-4">
<div className="space-y-2">
<label className="text-sm font-medium text-zinc-700">New Password</label>
<Input type="password" placeholder="Min. 8 characters" />
</div>
<div className="space-y-2">
<label className="text-sm font-medium text-zinc-700">Confirm Password</label>
<Input type="password" placeholder="Confirm new password" />
</div>
</div>
<div className="flex justify-end">
<Button variant="primary" size="sm"><Key className="h-4 w-4" /> Update Password</Button>
</div>
</CardContent>
</Card>
{/* Notifications */}
<Card>
<CardHeader>
<CardTitle className="flex items-center gap-2"><Bell className="h-4 w-4" /> Notifications</CardTitle>
</CardHeader>
<CardContent>
<div className="space-y-4">
{[
{ label: 'New orders', description: 'Get notified when a new order is placed', enabled: true },
{ label: 'Order status updates', description: 'Notifications when order status changes', enabled: true },
{ label: 'Daily summary', description: 'Receive a daily summary of your sales', enabled: false },
{ label: 'Weekly reports', description: 'Weekly analytics and performance report', enabled: true },
{ label: 'Marketing emails', description: 'Tips, product updates, and promotions', enabled: false },
].map((setting) => (
<div key={setting.label} className="flex items-center justify-between rounded-xl border border-zinc-100 p-3 dark:border-zinc-800">
<div>
<p className="text-sm font-medium text-zinc-900 dark:text-zinc-100">{setting.label}</p>
<p className="text-xs text-zinc-500">{setting.description}</p>
</div>
<button className={`relative h-6 w-11 rounded-full transition-colors ${setting.enabled ? 'bg-emerald-500' : 'bg-zinc-300 dark:bg-zinc-600'}`}>
<span className={`absolute left-0.5 top-0.5 h-5 w-5 rounded-full bg-white shadow transition-transform ${setting.enabled ? 'translate-x-5' : ''}`} />
</button>
</div>
))}
</div>
</CardContent>
</Card>
</div>
{/* Sidebar */}
<div className="space-y-6">
{/* Team */}
<Card>
<CardHeader className="flex flex-row items-center justify-between">
<CardTitle className="text-base">Team Members</CardTitle>
<Button variant="outline" size="sm"><UserPlus className="h-3.5 w-3.5" /> Invite</Button>
</CardHeader>
<CardContent>
<div className="space-y-3">
{[
{ name: 'Alex Rivera', email: 'alex@scanmenu.app', role: 'Owner' },
{ name: 'Jordan Kim', email: 'jordan@scanmenu.app', role: 'Staff' },
{ name: 'Sam Patel', email: 'sam@scanmenu.app', role: 'Staff' },
].map((member) => (
<div key={member.email} className="flex items-center gap-3">
<div className="flex h-8 w-8 items-center justify-center rounded-lg bg-zinc-100 text-xs font-bold text-zinc-600 dark:bg-zinc-800">
{member.name.split(' ').map(n => n[0]).join('')}
</div>
<div className="flex-1 min-w-0">
<p className="text-sm font-medium truncate">{member.name}</p>
<p className="text-xs text-zinc-500 truncate">{member.email}</p>
</div>
<Badge variant={member.role === 'Owner' ? 'success' : 'secondary'} className="text-[10px]">
{member.role}
</Badge>
</div>
))}
</div>
</CardContent>
</Card>
{/* API Keys */}
<Card>
<CardHeader>
<CardTitle className="text-base flex items-center gap-2"><Key className="h-4 w-4" /> API Keys</CardTitle>
</CardHeader>
<CardContent className="space-y-3">
<div className="rounded-xl bg-zinc-50 p-3 dark:bg-zinc-800/50">
<p className="text-xs font-medium text-zinc-500">Live Key</p>
<p className="mt-1 font-mono text-xs text-zinc-700 dark:text-zinc-300">sk_live_•••••••••••4xK2</p>
</div>
<Button variant="outline" size="sm" className="w-full">Generate New Key</Button>
</CardContent>
</Card>
{/* Danger Zone */}
<Card className="border-red-200 dark:border-red-900/50">
<CardHeader>
<CardTitle className="text-base text-red-600">Danger Zone</CardTitle>
</CardHeader>
<CardContent className="space-y-3">
<p className="text-xs text-zinc-500">Permanently delete your restaurant and all associated data.</p>
<Button variant="destructive" size="sm" className="w-full">
<Trash2 className="h-4 w-4" /> Delete Restaurant
</Button>
</CardContent>
</Card>
</div>
</div>
</div>
</DashboardLayout>
);
}