-
{formatPrice(item.price)}
-
{item.price_type === 'bid' ? 'BID' : 'BUY NOW'}
+ {/* Price */}
+
+
+ {formatPrice(item.price)}
+
+
+ {item.price_type === 'bid' ? 'Current Bid' : 'Buy Now'}
+
+ {/* Time */}
{isPounce ? (
-
-
+
+
Instant
) : (
- {displayTime || 'N/A'}
+
+ {isUrgent && }
+ {displayTime || 'N/A'}
+
)}
-
+ {/* Actions */}
+
-
@@ -627,23 +717,23 @@ export function AuctionsTab({ showToast }: AuctionsTabProps) {
{/* Pagination */}
{totalPages > 1 && (
-
+
handlePageChange(page - 1)}
disabled={page === 1}
- className="w-10 h-10 flex items-center justify-center border border-white/10 text-white/50 hover:text-white hover:bg-white/5 disabled:opacity-20 disabled:cursor-not-allowed transition-all"
+ className="w-12 h-12 flex items-center justify-center border border-white/10 text-white/50 hover:text-white hover:bg-white/5 disabled:opacity-20 disabled:cursor-not-allowed transition-all"
>
-
-
- Page {page} / {totalPages}
+
+
+ Page {page} / {totalPages}
handlePageChange(page + 1)}
disabled={page === totalPages}
- className="w-10 h-10 flex items-center justify-center border border-white/10 text-white/50 hover:text-white hover:bg-white/5 disabled:opacity-20 disabled:cursor-not-allowed transition-all"
+ className="w-12 h-12 flex items-center justify-center border border-white/10 text-white/50 hover:text-white hover:bg-white/5 disabled:opacity-20 disabled:cursor-not-allowed transition-all"
>
diff --git a/frontend/src/components/hunt/DropsTab.tsx b/frontend/src/components/hunt/DropsTab.tsx
index a052633..9b4e2a5 100644
--- a/frontend/src/components/hunt/DropsTab.tsx
+++ b/frontend/src/components/hunt/DropsTab.tsx
@@ -21,6 +21,9 @@ import {
Filter,
Ban,
Hash,
+ CheckCircle2,
+ AlertCircle,
+ Clock,
} from 'lucide-react'
import clsx from 'clsx'
@@ -43,8 +46,7 @@ interface ZoneStats {
daily_drops: number
}
-// All supported TLDs
-type SupportedTld = 'ch' | 'li' | 'xyz' | 'org' | 'online' | 'info' | 'dev' | 'app'
+type SupportedTld = 'ch' | 'li' | 'xyz' | 'org' | 'online' | 'info' | 'dev' | 'app' | 'club' | 'biz'
const ALL_TLDS: { tld: SupportedTld; flag: string }[] = [
{ tld: 'ch', flag: 'đ¨đ' },
@@ -55,6 +57,8 @@ const ALL_TLDS: { tld: SupportedTld; flag: string }[] = [
{ tld: 'info', flag: 'âšī¸' },
{ tld: 'dev', flag: 'đ¨âđģ' },
{ tld: 'app', flag: 'đą' },
+ { tld: 'club', flag: 'đ¯' },
+ { tld: 'biz', flag: 'đŧ' },
]
// ============================================================================
@@ -107,7 +111,7 @@ export function DropsTab({ showToast }: DropsTabProps) {
}
}, [])
- // Load Drops (only last 24h)
+ // Load Drops
const loadDrops = useCallback(async (currentPage = 1, isRefresh = false) => {
if (isRefresh) setRefreshing(true)
else setLoading(true)
@@ -115,7 +119,7 @@ export function DropsTab({ showToast }: DropsTabProps) {
try {
const result = await api.getDrops({
tld: selectedTld || undefined,
- hours: 24, // Only last 24h - fresh drops only!
+ hours: 24,
min_length: minLength,
max_length: maxLength,
exclude_numeric: excludeNumeric,
@@ -139,7 +143,6 @@ export function DropsTab({ showToast }: DropsTabProps) {
}
}, [selectedTld, minLength, maxLength, excludeNumeric, excludeHyphen, searchQuery, showToast])
- // Initial Load
useEffect(() => {
loadStats()
}, [loadStats])
@@ -216,128 +219,137 @@ export function DropsTab({ showToast }: DropsTabProps) {
return `${diffH}h ago`
}
+ // Loading State
if (loading && items.length === 0) {
return (
-
-
+
+
+ Loading zone file drops...
)
}
return (
-
+
{/* Header Stats */}
-
-
-
+
+
+
-
+
{stats?.daily_drops?.toLocaleString() || total.toLocaleString()}
-
Fresh drops detected (24h)
+
Fresh drops in last 24h
-
+
{/* Search */}
{/* TLD Quick Filter */}
-
+
setSelectedTld(null)}
className={clsx(
- "px-3 py-1.5 text-[10px] font-mono uppercase border transition-colors",
- selectedTld === null ? "border-accent bg-accent/10 text-accent font-bold" : "border-white/[0.08] text-white/40"
+ "px-4 py-2.5 text-xs font-mono uppercase tracking-wider border transition-all",
+ selectedTld === null
+ ? "border-accent bg-accent/10 text-accent font-bold"
+ : "border-white/[0.08] text-white/40 hover:border-white/20 hover:text-white/60"
)}
>
- All
+ All TLDs
{ALL_TLDS.map(({ tld, flag }) => (
setSelectedTld(tld)}
className={clsx(
- "px-3 py-1.5 text-[10px] font-mono uppercase border transition-colors flex items-center gap-1.5",
- selectedTld === tld ? "border-accent bg-accent/10 text-accent font-bold" : "border-white/[0.08] text-white/40"
+ "px-4 py-2.5 text-xs font-mono uppercase tracking-wider border transition-all flex items-center gap-2",
+ selectedTld === tld
+ ? "border-accent bg-accent/10 text-accent font-bold"
+ : "border-white/[0.08] text-white/40 hover:border-white/20 hover:text-white/60"
)}
>
- {flag}.{tld}
+ {flag}
+ .{tld}
))}
- {/* Filter Toggle */}
+ {/* Advanced Filters */}
setFiltersOpen(!filtersOpen)}
className={clsx(
- "flex items-center justify-between w-full py-2.5 px-4 border transition-colors",
- filtersOpen ? "border-accent/30 bg-accent/[0.05]" : "border-white/[0.08] bg-white/[0.02]"
+ "flex items-center justify-between w-full py-3 px-5 border transition-all",
+ filtersOpen ? "border-accent/30 bg-accent/[0.03]" : "border-white/[0.08] bg-white/[0.02] hover:border-white/20"
)}
>
-
-
-
Advanced Filters
+
+
+
+ Advanced Filters
+
{activeFiltersCount > 0 && (
- {activeFiltersCount}
+ {activeFiltersCount}
)}
-
+
- {/* Filters Panel */}
{filtersOpen && (
-
+
{/* Length Filter */}
-
Domain Length
-
+
Domain Length
+
setMinLength(e.target.value ? Number(e.target.value) : undefined)}
placeholder="Min"
- className="w-20 bg-white/[0.02] border border-white/10 px-3 py-2 text-xs text-white placeholder:text-white/20 outline-none font-mono focus:border-accent/30"
+ className="w-24 bg-white/[0.02] border border-white/10 px-4 py-3 text-sm text-white placeholder:text-white/20 outline-none font-mono focus:border-accent/30 transition-colors"
min={1}
max={63}
/>
- TO
+ to
setMaxLength(e.target.value ? Number(e.target.value) : undefined)}
placeholder="Max"
- className="w-20 bg-white/[0.02] border border-white/10 px-3 py-2 text-xs text-white placeholder:text-white/20 outline-none font-mono focus:border-accent/30"
+ className="w-24 bg-white/[0.02] border border-white/10 px-4 py-3 text-sm text-white placeholder:text-white/20 outline-none font-mono focus:border-accent/30 transition-colors"
min={1}
max={63}
/>
@@ -345,205 +357,259 @@ export function DropsTab({ showToast }: DropsTabProps) {
{/* Quality Filters */}
-
+
setExcludeNumeric(!excludeNumeric)}
className={clsx(
- "flex-1 flex items-center justify-between py-2.5 px-4 border transition-colors",
- excludeNumeric ? "border-accent/30 bg-accent/5" : "border-white/[0.08]"
+ "flex items-center justify-between py-3 px-4 border transition-all",
+ excludeNumeric ? "border-accent/30 bg-accent/5" : "border-white/[0.08] hover:border-white/20"
)}
>
-
-
-
Exclude Numeric
+
+
+
+ No Numbers
+
-
- {excludeNumeric &&
â}
+
+ {excludeNumeric && }
setExcludeHyphen(!excludeHyphen)}
className={clsx(
- "flex-1 flex items-center justify-between py-2.5 px-4 border transition-colors",
- excludeHyphen ? "border-accent/30 bg-accent/5" : "border-white/[0.08]"
+ "flex items-center justify-between py-3 px-4 border transition-all",
+ excludeHyphen ? "border-accent/30 bg-accent/5" : "border-white/[0.08] hover:border-white/20"
)}
>
-
-
-
Exclude Hyphen
+
+
+
+ No Hyphens
+
-
- {excludeHyphen &&
â}
+
+ {excludeHyphen && }
)}
- {/* Results Header */}
-
-
-
-
{total.toLocaleString()} domains matching criteria
+ {/* Results Info */}
+
+
+
+
{total.toLocaleString()} domains detected
+
+ {totalPages > 1 && (
+
+ Page {page} of {totalPages}
+
+ )}
+
+
+ {/* Alert Banner */}
+
+
+
+
Zone File Analysis
+
+ Domains detected as dropped via zone file comparison. Some may have been re-registered. Click "Check" to verify live availability.
+
- {totalPages > 1 &&
Page {page} of {totalPages}}
{/* Results Table */}
{sortedItems.length === 0 ? (
-
-
No fresh drops detected
-
- The zone file comparison engine will update in the next 24h cycle
+
+
No drops found
+
+ Zone file comparison runs daily. Try adjusting your filters.
) : (
<>
-
- {/* Desktop Table Header */}
-
-
handleSort('domain')} className="flex items-center gap-2 hover:text-white transition-colors text-left group">
- Domain Name
+
+ {/* Table Header */}
+
+
handleSort('domain')}
+ className="flex items-center gap-2 hover:text-white transition-colors text-left"
+ >
+ Domain
{sortField === 'domain' && (sortDirection === 'asc' ? : )}
-
handleSort('length')} className="flex items-center gap-2 justify-center hover:text-white transition-colors group">
+ handleSort('length')}
+ className="flex items-center gap-2 justify-center hover:text-white transition-colors"
+ >
Length
{sortField === 'length' && (sortDirection === 'asc' ? : )}
- handleSort('date')} className="flex items-center gap-2 justify-center hover:text-white transition-colors group">
- Dropped
+ handleSort('date')}
+ className="flex items-center gap-2 justify-center hover:text-white transition-colors"
+ >
+ Detected
{sortField === 'date' && (sortDirection === 'asc' ? : )}
- Actions
+ Actions
+ {/* Table Body */}
- {sortedItems.map((item) => (
-
- {/* Mobile Row */}
-
-
-
-
openAnalyze(`${item.domain}.${item.tld}`)}
- className="text-base font-bold text-white font-mono truncate text-left tracking-tight"
- >
- {item.domain}.{item.tld}
-
-
-
- LEN: {item.length}
-
-
{formatTime(item.dropped_date)}
+ {sortedItems.map((item) => {
+ const fullDomain = `${item.domain}.${item.tld}`
+ const isTracking = tracking === fullDomain
+
+ return (
+
+ {/* Mobile Row */}
+
+
+
+
openAnalyze(fullDomain)}
+ className="text-lg font-bold text-white font-mono truncate block text-left hover:text-accent transition-colors"
+ >
+ {item.domain}.{item.tld}
+
+
+
+ {item.length} chars
+
+
+
+ {formatTime(item.dropped_date)}
+
+
+
+
+
track(fullDomain)}
+ disabled={isTracking}
+ className="flex-1 h-12 text-xs font-bold uppercase tracking-widest border border-white/10 text-white/50 flex items-center justify-center gap-2 hover:bg-white/5 active:scale-[0.98] transition-all"
+ >
+ {isTracking ? : }
+ Track
+
+
openAnalyze(fullDomain)}
+ className="w-14 h-12 border border-white/10 text-white/50 flex items-center justify-center hover:text-accent hover:border-accent/30 hover:bg-accent/5 transition-all"
+ >
+
+
+
+ Check & Buy
+
+
-
-
track(`${item.domain}.${item.tld}`)}
- disabled={tracking === `${item.domain}.${item.tld}`}
- className="flex-1 h-10 text-[10px] font-bold uppercase tracking-widest border border-white/10 text-white/40 flex items-center justify-center gap-2 hover:bg-white/5 active:scale-95 transition-all"
- >
- {tracking === `${item.domain}.${item.tld}` ? : }
- Track
-
-
openAnalyze(`${item.domain}.${item.tld}`)}
- className="w-12 h-10 border border-white/10 text-white/40 flex items-center justify-center hover:text-accent hover:border-accent/20 hover:bg-accent/5 transition-all"
- >
-
-
-
- Buy Now
-
+ {/* Desktop Row */}
+
+ {/* Domain */}
+
+ openAnalyze(fullDomain)}
+ className="text-sm font-bold text-white font-mono truncate group-hover:text-accent transition-colors text-left block"
+ >
+ {item.domain}.{item.tld}
+
+
+
+ {/* Length */}
+
+
+ {item.length}
+
+
+
+ {/* Time */}
+
+
+ {formatTime(item.dropped_date)}
+
+
+
+ {/* Actions */}
+
+
track(fullDomain)}
+ disabled={isTracking}
+ className="w-10 h-10 flex items-center justify-center border border-white/10 text-white/50 hover:text-white hover:bg-white/5 transition-all"
+ title="Add to Watchlist"
+ >
+ {isTracking ? : }
+
+
openAnalyze(fullDomain)}
+ className="w-10 h-10 flex items-center justify-center border border-white/10 text-white/50 hover:text-accent hover:border-accent/30 hover:bg-accent/5 transition-all"
+ title="Analyze Domain"
+ >
+
+
+
+ Check & Buy
+
+
+
-
- {/* Desktop Row */}
-
-
- openAnalyze(`${item.domain}.${item.tld}`)}
- className="text-sm font-bold text-white font-mono truncate group-hover:text-accent transition-colors text-left tracking-tight"
- >
- {item.domain}.{item.tld}
-
-
-
-
-
- {item.length}
-
-
-
-
- {formatTime(item.dropped_date)}
-
-
-
-
track(`${item.domain}.${item.tld}`)}
- disabled={tracking === `${item.domain}.${item.tld}`}
- className="w-8.5 h-8.5 flex items-center justify-center border border-white/10 text-white/30 hover:text-white hover:bg-white/5 transition-all"
- title="Add to Watchlist"
- >
- {tracking === `${item.domain}.${item.tld}` ? : }
-
-
openAnalyze(`${item.domain}.${item.tld}`)}
- className="w-8.5 h-8.5 flex items-center justify-center border border-white/10 text-white/30 hover:text-accent hover:border-accent/30 hover:bg-accent/5 transition-all"
- title="Deep Analysis"
- >
-
-
-
- Buy
-
-
-
-
- ))}
+ )
+ })}
{/* Pagination */}
{totalPages > 1 && (
-
+
handlePageChange(page - 1)}
disabled={page === 1}
- className="w-10 h-10 flex items-center justify-center border border-white/10 text-white/50 hover:text-white hover:bg-white/5 disabled:opacity-20 disabled:cursor-not-allowed transition-all"
+ className="w-12 h-12 flex items-center justify-center border border-white/10 text-white/50 hover:text-white hover:bg-white/5 disabled:opacity-20 disabled:cursor-not-allowed transition-all"
>
-
-
- Page {page} / {totalPages}
+
+
+ Page {page} / {totalPages}
handlePageChange(page + 1)}
disabled={page === totalPages}
- className="w-10 h-10 flex items-center justify-center border border-white/10 text-white/50 hover:text-white hover:bg-white/5 disabled:opacity-20 disabled:cursor-not-allowed transition-all"
+ className="w-12 h-12 flex items-center justify-center border border-white/10 text-white/50 hover:text-white hover:bg-white/5 disabled:opacity-20 disabled:cursor-not-allowed transition-all"
>