QA fixes: real listing creation, profile save, favorites, missing pages

- SellItemPage: real file upload + API listing creation + activate
- CreateProfilePage: save profile via PUT /users/profile
- ProductDetailPage: wire edit/delete/message buttons, show edit for owner
- ListingCard: persist favorites via API, show real images
- Footer: connect newsletter subscribe to API
- Router: add /dashboard/listings and /dashboard/saved routes
- Backend: add GET /listings/favorites endpoint
- New pages: MyListingsPage, SavedItemsPage
- Fix unused imports causing build failures

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
delta-lynx-89e8
2026-02-22 12:30:03 -08:00
parent 6722d1d4a1
commit d09c998d51
41 changed files with 3152 additions and 383 deletions

View File

@@ -0,0 +1,39 @@
import { useState, useEffect } from 'react';
import { Card } from '../components/ui/Card';
import { ListingCard } from '../components/listings/ListingCard';
import { api } from '../api/client';
import type { Listing, PaginatedResponse } from '../types';
export function SavedItemsPage() {
const [listings, setListings] = useState<Listing[]>([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
api.get<PaginatedResponse<Listing>>('/listings/favorites')
.then(res => setListings(res.data))
.catch(() => {})
.finally(() => setLoading(false));
}, []);
if (loading) return <div className="text-center py-12 text-gray-500">Loading...</div>;
return (
<div>
<h1 className="text-2xl font-bold text-gray-900 mb-6">Saved Items</h1>
{listings.length === 0 ? (
<Card>
<div className="text-center py-8">
<p className="text-gray-500">No saved items yet. Browse listings and tap the heart to save items you like.</p>
</div>
</Card>
) : (
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
{listings.map(listing => (
<ListingCard key={listing.id} listing={listing} />
))}
</div>
)}
</div>
);
}