- {/* Sidebar - Horizontal scroll on mobile, vertical on desktop */}
-
- {/* Mobile: Horizontal scroll tabs */}
-
-
- {/* Desktop: Vertical tabs */}
-
-
- {/* Plan info - hidden on mobile, shown in content area instead */}
-
-
- {isProOrHigher ? : }
- {tierName} Plan
-
-
- {subscription?.domains_used || 0} / {subscription?.domain_limit || 5} domains tracked
-
- {!isProOrHigher && (
-
- Upgrade
-
-
- )}
+ {/* Plan info */}
+
+
+ {isProOrHigher ? : }
+ {tierName} Plan
-
-
- {/* Content */}
-
- {/* Profile Tab */}
- {activeTab === 'profile' && (
-
-
Profile Information
-
-
-
- )}
-
- {/* Notifications Tab */}
- {activeTab === 'notifications' && (
-
-
-
Email Preferences
-
-
-
-
-
-
-
-
-
-
-
-
- {/* Active Price Alerts */}
-
-
Active Price Alerts
-
- {loadingAlerts ? (
-
-
-
- ) : priceAlerts.length === 0 ? (
-
-
-
No price alerts set
-
- Browse TLD prices →
-
-
- ) : (
-
- {priceAlerts.map((alert) => (
-
-
-
-
- {alert.is_active && (
-
- )}
-
-
-
- .{alert.tld}
-
-
- Alert on {alert.threshold_percent}% change
- {alert.target_price && ` or below $${alert.target_price}`}
-
-
-
-
-
- ))}
-
- )}
-
-
- )}
-
- {/* Billing Tab */}
- {activeTab === 'billing' && (
-
- {/* Current Plan */}
-
-
Your Current Plan
-
-
-
-
- {tierName === 'Tycoon' ? (
-
- ) : tierName === 'Trader' ? (
-
- ) : (
-
- )}
-
-
{tierName}
-
- {tierName === 'Scout' ? 'Free forever' : tierName === 'Trader' ? '$9/month' : '$29/month'}
-
-
-
-
- {isProOrHigher ? 'Active' : 'Free'}
-
-
-
- {/* Plan Stats */}
-
-
-
{subscription?.domain_limit || 5}
-
Domains
-
-
-
- {subscription?.check_frequency === 'realtime' ? '10m' :
- subscription?.check_frequency === 'hourly' ? '1h' : '24h'}
-
-
Check Interval
-
-
-
- {subscription?.portfolio_limit === -1 ? '∞' : subscription?.portfolio_limit || 0}
-
-
Portfolio
-
-
-
- {isProOrHigher ? (
-
- ) : (
-
-
- Upgrade Plan
-
- )}
-
-
- {/* Plan Features */}
-
Your Plan Includes
-
- -
-
- {subscription?.domain_limit || 5} Watchlist Domains
-
- -
-
-
- {subscription?.check_frequency === 'realtime' ? '10-minute' :
- subscription?.check_frequency === 'hourly' ? 'Hourly' : 'Daily'} Scans
-
-
- -
-
- Email Alerts
-
- -
-
- TLD Price Data
-
- {subscription?.features?.domain_valuation && (
- -
-
- Domain Valuation
-
- )}
- {(subscription?.portfolio_limit ?? 0) !== 0 && (
- -
-
-
- {subscription?.portfolio_limit === -1 ? 'Unlimited' : subscription?.portfolio_limit} Portfolio
-
-
- )}
- {subscription?.features?.expiration_tracking && (
- -
-
- Expiry Tracking
-
- )}
- {(subscription?.history_days ?? 0) !== 0 && (
- -
-
-
- {subscription?.history_days === -1 ? 'Full' : `${subscription?.history_days}-day`} History
-
-
- )}
-
-
-
- {/* Compare All Plans */}
-
-
Compare All Plans
-
-
-
-
-
- | Feature |
- Scout |
- Trader |
- Tycoon |
-
-
-
-
- | Price |
- Free |
- $9/mo |
- $29/mo |
-
-
- | Watchlist Domains |
- 5 |
- 50 |
- 500 |
-
-
- | Scan Frequency |
- Daily |
- Hourly |
- 10 min |
-
-
- | Portfolio |
- — |
- 25 |
- Unlimited |
-
-
- | Domain Valuation |
- — |
- |
- |
-
-
- | Price History |
- — |
- 90 days |
- Unlimited |
-
-
- | Expiry Tracking |
- — |
- |
- |
-
-
-
-
-
- {!isProOrHigher && (
-
-
-
- Upgrade Now
-
-
- )}
-
-
- )}
-
- {/* Security Tab */}
- {activeTab === 'security' && (
-
-
-
Password
-
- Change your password or reset it if you've forgotten it.
-
-
-
- Change Password
-
-
-
-
-
Account Security
-
-
-
-
-
Email Verified
-
Your email address has been verified
-
-
-
-
-
-
-
-
-
Two-Factor Authentication
-
Coming soon
-
-
Soon
-
-
-
-
-
-
Danger Zone
-
- Permanently delete your account and all associated data.
-
-
-
-
+
+ {subscription?.domains_used || 0} / {subscription?.domain_limit || 5} domains tracked
+
+ {!isProOrHigher && (
+
+ Upgrade
+
+
)}
+
+ {/* Content */}
+
+ {/* Profile Tab */}
+ {activeTab === 'profile' && (
+
+
Profile Information
+
+
+
+ )}
+
+ {/* Notifications Tab */}
+ {activeTab === 'notifications' && (
+
+
+
Email Preferences
+
+
+ {[
+ { key: 'domain_availability', label: 'Domain Availability', desc: 'Get notified when watched domains become available' },
+ { key: 'price_alerts', label: 'Price Alerts', desc: 'Get notified when TLD prices change' },
+ { key: 'weekly_digest', label: 'Weekly Digest', desc: 'Receive a weekly summary of your portfolio' },
+ ].map((item) => (
+
+ ))}
+
+
+
+
+
+ {/* Active Price Alerts */}
+
+
Active Price Alerts
+
+ {loadingAlerts ? (
+
+
+
+ ) : priceAlerts.length === 0 ? (
+
+
+
No price alerts set
+
+ Browse TLD prices →
+
+
+ ) : (
+
+ {priceAlerts.map((alert) => (
+
+
+
+
+ {alert.is_active && (
+
+ )}
+
+
+
+ .{alert.tld}
+
+
+ Alert on {alert.threshold_percent}% change
+ {alert.target_price && ` or below $${alert.target_price}`}
+
+
+
+
+
+ ))}
+
+ )}
+
+
+ )}
+
+ {/* Billing Tab */}
+ {activeTab === 'billing' && (
+
+ {/* Current Plan */}
+
+
Your Current Plan
+
+
+
+
+ {tierName === 'Tycoon' ?
: tierName === 'Trader' ?
:
}
+
+
{tierName}
+
+ {tierName === 'Scout' ? 'Free forever' : tierName === 'Trader' ? '$9/month' : '$29/month'}
+
+
+
+
+ {isProOrHigher ? 'Active' : 'Free'}
+
+
+
+ {/* Plan Stats */}
+
+
+
{subscription?.domain_limit || 5}
+
Domains
+
+
+
+ {subscription?.check_frequency === 'realtime' ? '10m' :
+ subscription?.check_frequency === 'hourly' ? '1h' : '24h'}
+
+
Check Interval
+
+
+
+ {subscription?.portfolio_limit === -1 ? '∞' : subscription?.portfolio_limit || 0}
+
+
Portfolio
+
+
+
+ {isProOrHigher ? (
+
+ ) : (
+
+
+ Upgrade Plan
+
+ )}
+
+
+ {/* Plan Features */}
+
Your Plan Includes
+
+ {[
+ `${subscription?.domain_limit || 5} Watchlist Domains`,
+ `${subscription?.check_frequency === 'realtime' ? '10-minute' : subscription?.check_frequency === 'hourly' ? 'Hourly' : 'Daily'} Scans`,
+ 'Email Alerts',
+ 'TLD Price Data',
+ ].map((feature) => (
+ -
+
+ {feature}
+
+ ))}
+
+
+
+ )}
+
+ {/* Security Tab */}
+ {activeTab === 'security' && (
+
+
+
Password
+
+ Change your password or reset it if you've forgotten it.
+
+
+
+ Change Password
+
+
+
+
+
Account Security
+
+
+
+
+
Email Verified
+
Your email address has been verified
+
+
+
+
+
+
+
+
+
Two-Factor Authentication
+
Coming soon
+
+
Soon
+
+
+
+
+
+
Danger Zone
+
+ Permanently delete your account and all associated data.
+
+
+
+
+ )}
+
-
+
)
}
-
diff --git a/frontend/src/app/watchlist/page.tsx b/frontend/src/app/watchlist/page.tsx
index bfb1172..14d4bd3 100644
--- a/frontend/src/app/watchlist/page.tsx
+++ b/frontend/src/app/watchlist/page.tsx
@@ -4,6 +4,7 @@ import { useEffect, useState } from 'react'
import { useStore } from '@/lib/store'
import { api } from '@/lib/api'
import { CommandCenterLayout } from '@/components/CommandCenterLayout'
+import { PremiumTable, Badge, StatCard, PageContainer, TableActionButton } from '@/components/PremiumTable'
import { Toast, useToast } from '@/components/Toast'
import {
Plus,
@@ -14,10 +15,11 @@ import {
BellOff,
History,
ExternalLink,
- MoreVertical,
Search,
- Filter,
+ Eye,
+ Sparkles,
ArrowUpRight,
+ X,
} from 'lucide-react'
import clsx from 'clsx'
import Link from 'next/link'
@@ -29,57 +31,6 @@ interface DomainHistory {
checked_at: string
}
-// Status indicator component with traffic light system
-function StatusIndicator({ domain }: { domain: any }) {
- // Determine status based on domain data
- let status: 'available' | 'watching' | 'stable' = 'stable'
- let label = 'Stable'
- let description = 'Domain is registered and active'
-
- if (domain.is_available) {
- status = 'available'
- label = 'Available'
- description = 'Domain is available for registration!'
- } else if (domain.status === 'checking' || domain.status === 'pending') {
- status = 'watching'
- label = 'Watching'
- description = 'Monitoring for changes'
- }
-
- const colors = {
- available: 'bg-accent text-accent',
- watching: 'bg-amber-400 text-amber-400',
- stable: 'bg-foreground-muted text-foreground-muted',
- }
-
- return (
-
-
-
- {status === 'available' && (
-
- )}
-
-
-
- {label}
-
-
{description}
-
-
- )
-}
-
export default function WatchlistPage() {
const { domains, addDomain, deleteDomain, refreshDomain, subscription } = useStore()
const { toast, showToast, hideToast } = useToast()
@@ -97,11 +48,9 @@ export default function WatchlistPage() {
// Filter domains
const filteredDomains = domains?.filter(domain => {
- // Search filter
if (searchQuery && !domain.name.toLowerCase().includes(searchQuery.toLowerCase())) {
return false
}
- // Status filter
if (filterStatus === 'available' && !domain.is_available) return false
if (filterStatus === 'watching' && domain.is_available) return false
return true
@@ -110,6 +59,9 @@ export default function WatchlistPage() {
// Stats
const availableCount = domains?.filter(d => d.is_available).length || 0
const watchingCount = domains?.filter(d => !d.is_available).length || 0
+ const domainsUsed = domains?.length || 0
+ const domainLimit = subscription?.domain_limit || 5
+ const canAddMore = domainsUsed < domainLimit
const handleAddDomain = async (e: React.FormEvent) => {
e.preventDefault()
@@ -168,29 +120,6 @@ export default function WatchlistPage() {
}
}
- const loadHistory = async (domainId: number) => {
- if (selectedDomainId === domainId) {
- setSelectedDomainId(null)
- setDomainHistory(null)
- return
- }
-
- setSelectedDomainId(domainId)
- setLoadingHistory(true)
- try {
- const history = await api.getDomainHistory(domainId)
- setDomainHistory(history)
- } catch (err) {
- setDomainHistory([])
- } finally {
- setLoadingHistory(false)
- }
- }
-
- const domainLimit = subscription?.domain_limit || 5
- const domainsUsed = domains?.length || 0
- const canAddMore = domainsUsed < domainLimit
-
return (
{toast && }
-
+
{/* Stats Cards */}
-
-
-
Total Watched
-
{domainsUsed}
-
-
-
-
-
Available
-
{availableCount}
-
-
-
-
Watching
-
{watchingCount}
-
-
-
Limit
-
{domainLimit === -1 ? '∞' : domainLimit}
-
+
+
+
+
+
{/* Add Domain Form */}
-