import { useState } from "react"; import { useLocation } from "wouter"; import { useAuth } from "@/hooks/use-auth"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { userApi, ordersApi } from "@/lib/api"; import Header from "@/components/layout/header"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Separator } from "@/components/ui/separator"; import { Skeleton } from "@/components/ui/skeleton"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Switch } from "@/components/ui/switch"; import { useToast } from "@/hooks/use-toast"; import { User, Package, MapPin, CreditCard, Settings, LogOut, Edit, Save, X, Plus, Trash2, Mail, Bell, Shield, Download, Eye, EyeOff } from "lucide-react"; export default function Profile() { const [, setLocation] = useLocation(); const { user, logout } = useAuth(); const [searchQuery, setSearchQuery] = useState(""); const [isEditing, setIsEditing] = useState(false); const [editForm, setEditForm] = useState({}); const [activeTab, setActiveTab] = useState("profile"); const [addresses, setAddresses] = useState([]); const [paymentMethods, setPaymentMethods] = useState([]); const [addressForm, setAddressForm] = useState({}); const [paymentForm, setPaymentForm] = useState({}); const [isAddingAddress, setIsAddingAddress] = useState(false); const [isAddingPayment, setIsAddingPayment] = useState(false); const [settings, setSettings] = useState({ emailNotifications: true, orderNotifications: true, promotionalEmails: false, twoFactorAuth: false, showProfile: true }); const [showPassword, setShowPassword] = useState(false); const [passwordForm, setPasswordForm] = useState({ current: '', new: '', confirm: '' }); const { toast } = useToast(); const queryClient = useQueryClient(); // Redirect if not authenticated if (!user) { setLocation('/auth'); return null; } const { data: profile, isLoading: profileLoading } = useQuery({ queryKey: ['/api/user/profile'], queryFn: async () => { const response = await userApi.getProfile(); return response.json(); }, }); const { data: orders = [], isLoading: ordersLoading } = useQuery({ queryKey: ['/api/orders'], queryFn: async () => { const response = await ordersApi.get(); return response.json(); }, }); const updateProfileMutation = useMutation({ mutationFn: (data: any) => userApi.updateProfile(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['/api/user/profile'] }); setIsEditing(false); toast({ title: "Profile updated", description: "Your profile has been successfully updated.", }); }, onError: () => { toast({ title: "Error", description: "Failed to update profile. Please try again.", variant: "destructive", }); }, }); const handleEditProfile = () => { setEditForm({ firstName: profile?.firstName || user.firstName || '', lastName: profile?.lastName || user.lastName || '', email: profile?.email || user.email || '', phone: profile?.phone || '', street: profile?.street || '', city: profile?.city || '', state: profile?.state || '', pinCode: profile?.pinCode || '', country: profile?.country || '', }); setIsEditing(true); }; const handleSaveProfile = () => { updateProfileMutation.mutate(editForm); }; const handleCancelEdit = () => { setIsEditing(false); setEditForm({}); }; const handleInputChange = (field: string, value: string) => { setEditForm(prev => ({ ...prev, [field]: value })); }; const handleTabNavigation = (section: string) => { setActiveTab(section); if (section === 'orders') { setLocation('/orders'); } }; const handleLogout = () => { logout(); setLocation('/'); }; // Address functions const handleAddAddress = () => { setAddressForm({ type: 'home', street: '', city: '', state: '', pinCode: '', country: '', isDefault: false }); setIsAddingAddress(true); }; const handleSaveAddress = () => { if (!addressForm.street || !addressForm.city || !addressForm.state || !addressForm.pinCode) { toast({ title: "Error", description: "Please fill in all required fields.", variant: "destructive" }); return; } const newAddress = { ...addressForm, id: Date.now().toString() }; setAddresses(prev => [...prev, newAddress]); setIsAddingAddress(false); setAddressForm({}); toast({ title: "Success", description: "Address added successfully." }); }; const handleDeleteAddress = (addressId: string) => { setAddresses(prev => prev.filter(addr => addr.id !== addressId)); toast({ title: "Success", description: "Address deleted successfully." }); }; // Payment functions const handleAddPayment = () => { setPaymentForm({ type: 'card', cardNumber: '', expiryDate: '', cvv: '', nameOnCard: '', isDefault: false }); setIsAddingPayment(true); }; const handleSavePayment = () => { if (!paymentForm.cardNumber || !paymentForm.expiryDate || !paymentForm.cvv || !paymentForm.nameOnCard) { toast({ title: "Error", description: "Please fill in all required fields.", variant: "destructive" }); return; } const newPayment = { ...paymentForm, id: Date.now().toString(), cardNumber: `****-****-****-${paymentForm.cardNumber.slice(-4)}` }; setPaymentMethods(prev => [...prev, newPayment]); setIsAddingPayment(false); setPaymentForm({}); toast({ title: "Success", description: "Payment method added successfully." }); }; const handleDeletePayment = (paymentId: string) => { setPaymentMethods(prev => prev.filter(payment => payment.id !== paymentId)); toast({ title: "Success", description: "Payment method deleted successfully." }); }; // Settings functions const handleSettingsChange = (key: string, value: boolean) => { setSettings(prev => ({ ...prev, [key]: value })); toast({ title: "Settings updated", description: "Your preferences have been saved." }); }; const handlePasswordChange = () => { if (!passwordForm.current || !passwordForm.new || !passwordForm.confirm) { toast({ title: "Error", description: "Please fill in all password fields.", variant: "destructive" }); return; } if (passwordForm.new !== passwordForm.confirm) { toast({ title: "Error", description: "New passwords do not match.", variant: "destructive" }); return; } if (passwordForm.new.length < 6) { toast({ title: "Error", description: "Password must be at least 6 characters long.", variant: "destructive" }); return; } setPasswordForm({ current: '', new: '', confirm: '' }); toast({ title: "Success", description: "Password changed successfully." }); }; const handleDataExport = () => { toast({ title: "Data Export", description: "Your data export will be emailed to you within 24 hours." }); }; const handleAccountDelete = () => { toast({ title: "Account Deletion", description: "Please contact support to delete your account.", variant: "destructive" }); }; const getStatusColor = (status: string) => { switch (status.toLowerCase()) { case 'delivered': return 'default'; case 'shipped': return 'secondary'; case 'pending': return 'outline'; case 'cancelled': return 'destructive'; default: return 'outline'; } }; return (

My Account

Manage your account and view your order history

{/* Account Navigation */}
{/* Account Content */}
Profile Information Order History Addresses Payment Methods Settings Profile Information {profileLoading ? (
) : (
{!isEditing ? ( <>
{profile?.firstName || user.firstName || 'Not provided'}
{profile?.lastName || user.lastName || 'Not provided'}
{profile?.email || user.email}
{profile?.username || user.username}
{profile?.phone || 'Not provided'}
{(profile?.street || profile?.city) ? `${profile.street || ''}, ${profile.city || ''}, ${profile.state || ''} ${profile.pinCode || ''}, ${profile.country || ''}`.replace(/^,\s*|,\s*$|,\s*,/g, '') : 'Not provided' }
) : ( <>
handleInputChange('firstName', e.target.value)} data-testid="edit-first-name" />
handleInputChange('lastName', e.target.value)} data-testid="edit-last-name" />
handleInputChange('email', e.target.value)} data-testid="edit-email" />
handleInputChange('phone', e.target.value)} data-testid="edit-phone" />

Address Information

handleInputChange('street', e.target.value)} data-testid="edit-street" />
handleInputChange('city', e.target.value)} data-testid="edit-city" />
handleInputChange('state', e.target.value)} data-testid="edit-state" />
handleInputChange('pinCode', e.target.value)} data-testid="edit-pin-code" />
handleInputChange('country', e.target.value)} data-testid="edit-country" />
)}
)}
Addresses Add New Address
setAddressForm(prev => ({ ...prev, street: e.target.value }))} placeholder="Enter street address" />
setAddressForm(prev => ({ ...prev, city: e.target.value }))} placeholder="Enter city" />
setAddressForm(prev => ({ ...prev, state: e.target.value }))} placeholder="Enter state" />
setAddressForm(prev => ({ ...prev, pinCode: e.target.value }))} placeholder="Enter PIN code" />
setAddressForm(prev => ({ ...prev, country: e.target.value }))} placeholder="Enter country" />
setAddressForm(prev => ({ ...prev, isDefault: checked }))} />
{addresses.length === 0 ? (

No saved addresses

Add addresses for faster checkout

) : (
{addresses.map((address: any) => (
{address.type.charAt(0).toUpperCase() + address.type.slice(1)} {address.isDefault && Default}

{address.street}

{address.city}, {address.state} {address.pinCode}

{address.country}

))}
)}
Payment Methods Add Payment Method
setPaymentForm(prev => ({ ...prev, nameOnCard: e.target.value }))} placeholder="Enter name on card" />
setPaymentForm(prev => ({ ...prev, cardNumber: e.target.value }))} placeholder="1234 5678 9012 3456" maxLength={19} />
setPaymentForm(prev => ({ ...prev, expiryDate: e.target.value }))} placeholder="MM/YY" maxLength={5} />
setPaymentForm(prev => ({ ...prev, cvv: e.target.value }))} placeholder="123" maxLength={4} />
setPaymentForm(prev => ({ ...prev, isDefault: checked }))} />
{paymentMethods.length === 0 ? (

No saved payment methods

Add payment methods for faster checkout

) : (
{paymentMethods.map((payment: any) => (
Credit Card {payment.isDefault && Default}

{payment.nameOnCard}

{payment.cardNumber}

Expires: {payment.expiryDate}

))}
)}
{/* Notifications */} Notifications

Receive order updates and promotions via email

handleSettingsChange('emailNotifications', checked)} data-testid="email-notifications" />

Get notified about order status changes

handleSettingsChange('orderNotifications', checked)} data-testid="order-notifications" />

Receive offers and deals via email

handleSettingsChange('promotionalEmails', checked)} data-testid="promotional-emails" />
{/* Security */} Security

Add an extra layer of security to your account

handleSettingsChange('twoFactorAuth', checked)} data-testid="two-factor-auth" />

Change Password

setPasswordForm(prev => ({ ...prev, current: e.target.value }))} placeholder="Enter current password" data-testid="current-password" />
setPasswordForm(prev => ({ ...prev, new: e.target.value }))} placeholder="Enter new password" data-testid="new-password" />
setPasswordForm(prev => ({ ...prev, confirm: e.target.value }))} placeholder="Confirm new password" data-testid="confirm-password" />
{/* Privacy */} Privacy

Make your profile visible to other users

handleSettingsChange('showProfile', checked)} data-testid="show-profile" />
{/* Data & Account */} Data & Account

Download all your account data

Permanently delete your account and all data

Order History {ordersLoading ? (
{[...Array(3)].map((_, i) => (
))}
) : orders.length > 0 ? (
{orders.map((order: any) => (

Order #{order.id.slice(0, 8)}

Placed on {new Date(order.createdAt).toLocaleDateString()}

{order.status}
{order.items && order.items.length > 0 && (
{order.items.map((item: any) => (
{item.product?.images && item.product.images.length > 0 ? ( {item.product.title} ) : (
No Image
)}

{item.product?.title || 'Unknown Product'}

{item.product?.store?.name || 'Unknown Seller'}

₹{parseFloat(item.price).toFixed(2)}

Qty: {item.quantity}

))}
)}
Total: ₹{parseFloat(order.total).toFixed(2)}
))}
) : (

You haven't placed any orders yet.

)}
); }