From 42e09b46ab2dec660d2957d4667ea47bc745b144 Mon Sep 17 00:00:00 2001 From: Yves Gugger Date: Thu, 18 Dec 2025 14:31:55 +0100 Subject: [PATCH] feat: Display tier limits with infinity symbol on all pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Listing: 1/10/∞ limits, fixed table column alignment - Watchlist: 5/50/∞ limits with display - Portfolio: 5/50/∞ limits with display in header - Sniper: Already had limits (2/10/50) - Yield: Tycoon-only, no limit needed Uses formatLimit() helper to show ∞ for Infinity values --- frontend/src/app/terminal/listing/page.tsx | 21 ++++++++++---------- frontend/src/app/terminal/portfolio/page.tsx | 6 ++++++ frontend/src/app/terminal/watchlist/page.tsx | 10 ++++++++-- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/frontend/src/app/terminal/listing/page.tsx b/frontend/src/app/terminal/listing/page.tsx index 440c7c9..0ff068f 100755 --- a/frontend/src/app/terminal/listing/page.tsx +++ b/frontend/src/app/terminal/listing/page.tsx @@ -75,11 +75,12 @@ export default function MyListingsPage() { const [menuOpen, setMenuOpen] = useState(false) const tier = subscription?.tier || 'scout' - const listingLimits: Record = { scout: 1, trader: 10, tycoon: 999999 } + const listingLimits: Record = { scout: 1, trader: 10, tycoon: Infinity } const maxListings = listingLimits[tier] || 1 const canAddMore = listings.length < maxListings const isTycoon = tier === 'tycoon' const isUnlimited = tier === 'tycoon' + const formatLimit = (limit: number) => limit === Infinity ? '∞' : String(limit) const activeListings = listings.filter(l => l.status === 'active').length const draftListings = listings.filter(l => l.status === 'draft').length @@ -164,7 +165,7 @@ export default function MyListingsPage() {
For Sale
- {listings.length}{isUnlimited ? '' : `/${maxListings}`} + {listings.length}/{formatLimit(maxListings)}
@@ -197,7 +198,7 @@ export default function MyListingsPage() {

For Sale - {listings.length}/{maxListings} + {listings.length}/{formatLimit(maxListings)}

List your domains for sale. 0% commission, verified ownership, direct buyer contact. @@ -260,13 +261,13 @@ export default function MyListingsPage() { ) : (

{/* Header */} -
+
Domain
Price
Status
-
Views
-
Leads
-
Actions
+
Views
+
Leads
+
Actions
{/* Table Body */} @@ -462,7 +463,7 @@ function ListingRow({
{/* Desktop */} -
+
{listing.domain}
@@ -478,8 +479,8 @@ function ListingRow({ "bg-white/5 text-white/40 border-white/10" )}>{listing.status}
-
{listing.view_count}
-
{listing.inquiry_count}
+
{listing.view_count}
+
{listing.inquiry_count}
{isDraft && needsVerification && (

My Portfolio + {stats.total}/{formatLimit(maxPortfolio)}

Track your domain investments. Add purchase details, monitor values, verify ownership, and list for sale. diff --git a/frontend/src/app/terminal/watchlist/page.tsx b/frontend/src/app/terminal/watchlist/page.tsx index d6e4362..f120a65 100755 --- a/frontend/src/app/terminal/watchlist/page.tsx +++ b/frontend/src/app/terminal/watchlist/page.tsx @@ -174,6 +174,12 @@ export default function WatchlistPage() { }, [checkAuth]) // Stats + // Tier limits + const tier = subscription?.tier || 'scout' + const watchlistLimits: Record = { scout: 5, trader: 50, tycoon: Infinity } + const maxWatchlist = watchlistLimits[tier] || 5 + const formatLimit = (limit: number) => limit === Infinity ? '∞' : String(limit) + const stats = useMemo(() => { const available = domains?.filter(d => d.is_available) || [] const expiringSoon = domains?.filter(d => { @@ -452,7 +458,7 @@ export default function WatchlistPage() { {/* Stats Grid */}

-
{stats.total}
+
{stats.total}/{formatLimit(maxWatchlist)}
Tracked
@@ -488,7 +494,7 @@ export default function WatchlistPage() {
-
{stats.total}
+
{stats.total}/{formatLimit(maxWatchlist)}
Tracked