Your Wishlist is Empty
Explore products and click the heart icon to save items for later.
Browse Products{priceLabel}
{addedDate}
/** * @page Wishlist Page (`app/wishlist/page.tsx`) * @purpose TechShop-style wishlist list with row layout and View Products CTA linking to reusable PDP. */ 'use client'; import Link from 'next/link'; import { useEffect, useState } from 'react'; import { Heart, X } from 'lucide-react'; import { AnnouncementBar } from '@/layout/AnnouncementBar'; import { Header } from '@/layout/Header'; import { Navbar } from '@/layout/Navbar'; import { Footer } from '@/layout/Footer'; import { StickyHeaderSpacer } from '@/components/StickyHeaderSpacer'; import { FloatingButtons } from '@/components/FloatingButtons'; import { useCartStore } from '@/store/cartStore'; import { ProductResponse } from '@/services/api/catalogService'; import { formatCatalogPriceLabel, getImageUrl } from '@/lib/utils'; function getProductImage(product: ProductResponse): string { const fromProduct = product.images?.[0]?.image_url; const fromVariant = product.variants?.[0]?.images?.[0]?.image_url; return getImageUrl(fromProduct || fromVariant || ''); } function getPriceLabel(product: ProductResponse): string { return formatCatalogPriceLabel(product); } function getActionLabel(product: ProductResponse): string { const variantCount = product.variants?.length || 0; return variantCount > 1 ? 'Select Options' : 'View Products'; } function formatAddedDate(product: ProductResponse): string { const raw = product.created_at; if (!raw) { return new Date().toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric', }); } const date = new Date(raw); if (Number.isNaN(date.getTime())) { return new Date().toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric', }); } return date.toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric', }); } export default function WishlistPage() { const wishlist = useCartStore((state) => state.wishlist); const toggleWishlist = useCartStore((state) => state.toggleWishlist); const hasHydrated = useCartStore((state) => state._hasHydrated); const [ready, setReady] = useState(false); useEffect(() => { if (hasHydrated) { setReady(true); return; } // Fallback if persist rehydrate event is slow const t = setTimeout(() => setReady(true), 250); return () => clearTimeout(t); }, [hasHydrated]); return (
Explore products and click the heart icon to save items for later.
Browse Products{priceLabel}
{addedDate}