diff --git a/UX_TERMINAL_UX_REPORT.md b/UX_TERMINAL_UX_REPORT.md
index 34914ad..54b176c 100644
--- a/UX_TERMINAL_UX_REPORT.md
+++ b/UX_TERMINAL_UX_REPORT.md
@@ -324,3 +324,5 @@ Empfehlungen:
+
+
diff --git a/backend/app/api/drops.py b/backend/app/api/drops.py
index 05f1e02..2d48bdd 100644
--- a/backend/app/api/drops.py
+++ b/backend/app/api/drops.py
@@ -274,22 +274,49 @@ async def api_track_drop(
Domain.name == full_domain
)
)
- if existing.scalar_one_or_none():
- return {"status": "already_tracking", "domain": full_domain}
+ existing_domain = existing.scalar_one_or_none()
+ if existing_domain:
+ return {
+ "status": "already_tracking",
+ "domain": full_domain,
+ "message": f"{full_domain} is already in your Watchlist",
+ "domain_id": existing_domain.id
+ }
- # Add to watchlist with notification enabled
- domain = Domain(
- user_id=current_user.id,
- name=full_domain,
- status=DomainStatus.AVAILABLE if drop.availability_status == 'available' else DomainStatus.UNKNOWN,
- is_available=drop.availability_status == 'available',
- notify_on_available=True, # Enable notification!
- )
- db.add(domain)
- await db.commit()
-
- return {
- "status": "tracking",
- "domain": full_domain,
- "message": f"Added {full_domain} to your Watchlist. You'll be notified when available!"
- }
+ try:
+ # Add to watchlist with notification enabled
+ domain = Domain(
+ user_id=current_user.id,
+ name=full_domain,
+ status=DomainStatus.AVAILABLE if drop.availability_status == 'available' else DomainStatus.UNKNOWN,
+ is_available=drop.availability_status == 'available',
+ notify_on_available=True, # Enable notification!
+ )
+ db.add(domain)
+ await db.commit()
+ await db.refresh(domain)
+
+ return {
+ "status": "tracking",
+ "domain": full_domain,
+ "message": f"Added {full_domain} to your Watchlist. You'll be notified when available!",
+ "domain_id": domain.id
+ }
+ except Exception as e:
+ await db.rollback()
+ # If duplicate key error, try to find existing
+ existing = await db.execute(
+ select(Domain).where(
+ Domain.user_id == current_user.id,
+ Domain.name == full_domain
+ )
+ )
+ existing_domain = existing.scalar_one_or_none()
+ if existing_domain:
+ return {
+ "status": "already_tracking",
+ "domain": full_domain,
+ "message": f"{full_domain} is already in your Watchlist",
+ "domain_id": existing_domain.id
+ }
+ raise HTTPException(status_code=500, detail=str(e))
diff --git a/frontend/src/components/analyze/AnalyzePanel.tsx b/frontend/src/components/analyze/AnalyzePanel.tsx
index 54d8b53..962eab5 100644
--- a/frontend/src/components/analyze/AnalyzePanel.tsx
+++ b/frontend/src/components/analyze/AnalyzePanel.tsx
@@ -178,7 +178,8 @@ export function AnalyzePanel() {
fastMode,
setFastMode,
sectionVisibility,
- setSectionVisibility
+ setSectionVisibility,
+ dropStatus,
} = useAnalyzePanelStore()
const [loading, setLoading] = useState(false)
@@ -374,6 +375,61 @@ export function AnalyzePanel() {
)}
+ {/* Drop Status Banner */}
+ {dropStatus?.is_drop && (
+
+
+
+ {dropStatus.status === 'available' ? (
+
+ ) : dropStatus.status === 'dropping_soon' ? (
+
+ ) : dropStatus.status === 'taken' ? (
+
+ ) : (
+
+ )}
+
+
+ {dropStatus.status === 'available' ? 'Available Now' :
+ dropStatus.status === 'dropping_soon' ? 'In Transition' :
+ dropStatus.status === 'taken' ? 'Re-registered' :
+ 'Status Unknown'}
+
+ {dropStatus.status === 'dropping_soon' && dropStatus.deletion_date && (
+
+ Drops: {new Date(dropStatus.deletion_date).toLocaleDateString()}
+
+ )}
+
+
+ {dropStatus.status === 'available' && domain && (
+
+
+ Buy Now
+
+ )}
+
+
+ )}
+
{/* Controls */}