diff --git a/TERMINAL_REBUILD_PLAN.md b/TERMINAL_REBUILD_PLAN.md index bae24a2..26ebae0 100644 --- a/TERMINAL_REBUILD_PLAN.md +++ b/TERMINAL_REBUILD_PLAN.md @@ -40,12 +40,12 @@ ## ✅ Master-Checkliste -### Phase 1: Umbenennung & Routing -- [ ] 1.1 Route `/command` → `/terminal` umbenennen -- [ ] 1.2 `CommandCenterLayout` → `TerminalLayout` umbenennen -- [ ] 1.3 Alle internen Links aktualisieren -- [ ] 1.4 Redirect von `/command/*` → `/terminal/*` einrichten -- [ ] 1.5 Sidebar-Navigation aktualisieren +### Phase 1: Umbenennung & Routing ✅ ABGESCHLOSSEN +- [x] 1.1 Route `/command` → `/terminal` umbenennen +- [x] 1.2 `CommandCenterLayout` → `TerminalLayout` umbenennen +- [x] 1.3 Alle internen Links aktualisieren +- [x] 1.4 Redirect von `/command/*` → `/terminal/*` einrichten +- [x] 1.5 Sidebar-Navigation aktualisieren ### Phase 2: Module neu strukturieren - [ ] 2.1 **RADAR** Module (Dashboard) diff --git a/frontend/next.config.js b/frontend/next.config.js index 5f11810..9f0df75 100644 --- a/frontend/next.config.js +++ b/frontend/next.config.js @@ -3,6 +3,22 @@ const nextConfig = { reactStrictMode: true, // output: 'standalone', // Only needed for Docker deployment + // Redirects from old /command/* to new /terminal/* + async redirects() { + return [ + { + source: '/command', + destination: '/terminal/dashboard', + permanent: true, + }, + { + source: '/command/:path*', + destination: '/terminal/:path*', + permanent: true, + }, + ] + }, + // Proxy API requests to backend // This ensures /api/v1/* works regardless of how the server is accessed async rewrites() { diff --git a/frontend/src/app/buy/page.tsx b/frontend/src/app/buy/page.tsx index b331311..6359da8 100644 --- a/frontend/src/app/buy/page.tsx +++ b/frontend/src/app/buy/page.tsx @@ -216,7 +216,7 @@ export default function BrowseListingsPage() { : 'Be the first to list your domain!'}

@@ -288,7 +288,7 @@ export default function BrowseListingsPage() { DNS verification ensures only real owners can list.

List Your Domain diff --git a/frontend/src/app/login/page.tsx b/frontend/src/app/login/page.tsx index c803cf3..8b8dbf2 100644 --- a/frontend/src/app/login/page.tsx +++ b/frontend/src/app/login/page.tsx @@ -56,7 +56,7 @@ function LoginForm() { // Get redirect URL from query params or localStorage (set during registration) const paramRedirect = searchParams.get('redirect') - const [redirectTo, setRedirectTo] = useState(paramRedirect || '/command/dashboard') + const [redirectTo, setRedirectTo] = useState(paramRedirect || '/terminal/dashboard') // Check localStorage for redirect (set during registration before email verification) useEffect(() => { @@ -125,7 +125,7 @@ function LoginForm() { } // Generate register link with redirect preserved - const registerLink = redirectTo !== '/command/dashboard' + const registerLink = redirectTo !== '/terminal/dashboard' ? `/register?redirect=${encodeURIComponent(redirectTo)}` : '/register' diff --git a/frontend/src/app/market/page.tsx b/frontend/src/app/market/page.tsx index 8a4a8ea..2823dc2 100644 --- a/frontend/src/app/market/page.tsx +++ b/frontend/src/app/market/page.tsx @@ -4,7 +4,7 @@ import { useEffect, useState } from 'react' import { useRouter } from 'next/navigation' import { useStore } from '@/lib/store' import { api } from '@/lib/api' -import { CommandCenterLayout } from '@/components/CommandCenterLayout' +import { TerminalLayout } from '@/components/TerminalLayout' import { Search, Filter, @@ -97,7 +97,7 @@ export default function MarketPage() { ] return ( - @@ -247,7 +247,7 @@ export default function MarketPage() { )} - + ) } diff --git a/frontend/src/app/oauth/callback/page.tsx b/frontend/src/app/oauth/callback/page.tsx index c5d39d0..c3f81c8 100644 --- a/frontend/src/app/oauth/callback/page.tsx +++ b/frontend/src/app/oauth/callback/page.tsx @@ -12,7 +12,7 @@ function OAuthCallbackContent() { useEffect(() => { const token = searchParams.get('token') - const redirect = searchParams.get('redirect') || '/command/dashboard' + const redirect = searchParams.get('redirect') || '/terminal/dashboard' const isNew = searchParams.get('new') === 'true' const error = searchParams.get('error') diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx index b2bd36b..d090701 100644 --- a/frontend/src/app/page.tsx +++ b/frontend/src/app/page.tsx @@ -489,7 +489,7 @@ export default function HomePage() { Set Up @@ -536,7 +536,7 @@ export default function HomePage() { Manage @@ -772,7 +772,7 @@ export default function HomePage() { {isAuthenticated ? "Go to Dashboard" : "Start Free"} @@ -793,7 +793,7 @@ export default function HomePage() { Track your first domain in under a minute. Free forever, no credit card.

{isAuthenticated ? "Command Center" : "Join the Hunt"} diff --git a/frontend/src/app/register/page.tsx b/frontend/src/app/register/page.tsx index 298afdb..a0dcdff 100644 --- a/frontend/src/app/register/page.tsx +++ b/frontend/src/app/register/page.tsx @@ -62,7 +62,7 @@ function RegisterForm() { const [registered, setRegistered] = useState(false) // Get redirect URL from query params - const redirectTo = searchParams.get('redirect') || '/command/dashboard' + const redirectTo = searchParams.get('redirect') || '/terminal/dashboard' // Load OAuth providers useEffect(() => { @@ -79,7 +79,7 @@ function RegisterForm() { // Store redirect URL for after email verification // This will be picked up by the login page after verification - if (redirectTo !== '/command/dashboard') { + if (redirectTo !== '/terminal/dashboard') { localStorage.setItem('pounce_redirect_after_login', redirectTo) } @@ -93,7 +93,7 @@ function RegisterForm() { } // Generate login link with redirect preserved - const loginLink = redirectTo !== '/command/dashboard' + const loginLink = redirectTo !== '/terminal/dashboard' ? `/login?redirect=${encodeURIComponent(redirectTo)}` : '/login' diff --git a/frontend/src/app/command/alerts/page.tsx b/frontend/src/app/terminal/alerts/page.tsx similarity index 99% rename from frontend/src/app/command/alerts/page.tsx rename to frontend/src/app/terminal/alerts/page.tsx index f72098d..4e658c7 100644 --- a/frontend/src/app/command/alerts/page.tsx +++ b/frontend/src/app/terminal/alerts/page.tsx @@ -3,7 +3,7 @@ import { useEffect, useState, useMemo, useCallback, memo } from 'react' import { useStore } from '@/lib/store' import { api } from '@/lib/api' -import { CommandCenterLayout } from '@/components/CommandCenterLayout' +import { TerminalLayout } from '@/components/TerminalLayout' import { PageContainer, StatCard, Badge, ActionButton } from '@/components/PremiumTable' import { Plus, @@ -205,7 +205,7 @@ export default function SniperAlertsPage() { const maxAlerts = limits[tier as keyof typeof limits] || 2 return ( - )} - + ) } diff --git a/frontend/src/app/command/auctions/page.tsx b/frontend/src/app/terminal/auctions/page.tsx similarity index 99% rename from frontend/src/app/command/auctions/page.tsx rename to frontend/src/app/terminal/auctions/page.tsx index 807f9c8..3dd1a91 100644 --- a/frontend/src/app/command/auctions/page.tsx +++ b/frontend/src/app/terminal/auctions/page.tsx @@ -3,7 +3,7 @@ import { useEffect, useState, useMemo, useCallback, memo } from 'react' import { useStore } from '@/lib/store' import { api } from '@/lib/api' -import { CommandCenterLayout } from '@/components/CommandCenterLayout' +import { TerminalLayout } from '@/components/TerminalLayout' import { PremiumTable, Badge, @@ -465,7 +465,7 @@ export default function AuctionsPage() { ], [activeTab, isPaidUser, trackedDomains, trackingInProgress, handleTrackDomain, getOpportunityData]) return ( - - + ) } diff --git a/frontend/src/app/command/dashboard/page.tsx b/frontend/src/app/terminal/dashboard/page.tsx similarity index 95% rename from frontend/src/app/command/dashboard/page.tsx rename to frontend/src/app/terminal/dashboard/page.tsx index 8b2837f..c273cc5 100644 --- a/frontend/src/app/command/dashboard/page.tsx +++ b/frontend/src/app/terminal/dashboard/page.tsx @@ -4,7 +4,7 @@ import { useEffect, useState, useMemo, useCallback } from 'react' import { useSearchParams } from 'next/navigation' import { useStore } from '@/lib/store' import { api } from '@/lib/api' -import { CommandCenterLayout } from '@/components/CommandCenterLayout' +import { TerminalLayout } from '@/components/TerminalLayout' import { PremiumTable, StatCard, PageContainer, Badge, SectionHeader, SearchInput, ActionButton } from '@/components/PremiumTable' import { Toast, useToast } from '@/components/Toast' import { @@ -64,7 +64,7 @@ export default function DashboardPage() { useEffect(() => { if (searchParams.get('upgraded') === 'true') { showToast('Welcome to your upgraded plan! 🎉', 'success') - window.history.replaceState({}, '', '/command/dashboard') + window.history.replaceState({}, '', '/terminal/dashboard') } }, [searchParams]) @@ -139,7 +139,7 @@ export default function DashboardPage() { } return ( - @@ -185,14 +185,14 @@ export default function DashboardPage() { {/* Stats Overview */}
- + - + 0} /> - + + View all → } @@ -291,7 +291,7 @@ export default function DashboardPage() { icon={Gavel} compact action={ - + View all → } @@ -349,7 +349,7 @@ export default function DashboardPage() { icon={TrendingUp} compact action={ - + View all → } @@ -398,6 +398,6 @@ export default function DashboardPage() {
-
+ ) } diff --git a/frontend/src/app/command/listings/page.tsx b/frontend/src/app/terminal/listings/page.tsx similarity index 99% rename from frontend/src/app/command/listings/page.tsx rename to frontend/src/app/terminal/listings/page.tsx index 0eeb563..deb53b6 100755 --- a/frontend/src/app/command/listings/page.tsx +++ b/frontend/src/app/terminal/listings/page.tsx @@ -4,7 +4,7 @@ import { useEffect, useState, useMemo, useCallback } from 'react' import { useSearchParams } from 'next/navigation' import { useStore } from '@/lib/store' import { api } from '@/lib/api' -import { CommandCenterLayout } from '@/components/CommandCenterLayout' +import { TerminalLayout } from '@/components/TerminalLayout' import { PageContainer, StatCard, Badge, ActionButton } from '@/components/PremiumTable' import { Plus, @@ -232,7 +232,7 @@ export default function MyListingsPage() { const maxListings = limits[tier as keyof typeof limits] || 2 return ( - )} - + ) } diff --git a/frontend/src/app/command/marketplace/page.tsx b/frontend/src/app/terminal/marketplace/page.tsx similarity index 98% rename from frontend/src/app/command/marketplace/page.tsx rename to frontend/src/app/terminal/marketplace/page.tsx index 97af871..15f9e9b 100644 --- a/frontend/src/app/command/marketplace/page.tsx +++ b/frontend/src/app/terminal/marketplace/page.tsx @@ -2,7 +2,7 @@ import { useEffect, useState, useMemo, useCallback } from 'react' import { api } from '@/lib/api' -import { CommandCenterLayout } from '@/components/CommandCenterLayout' +import { TerminalLayout } from '@/components/TerminalLayout' import { PageContainer, StatCard, @@ -114,11 +114,11 @@ export default function CommandMarketplacePage() { }, [listings]) return ( - + My Listings } @@ -233,7 +233,7 @@ export default function CommandMarketplacePage() { : 'No domains are currently listed for sale'}

@@ -296,7 +296,7 @@ export default function CommandMarketplacePage() { )} -
+ ) } diff --git a/frontend/src/app/command/page.tsx b/frontend/src/app/terminal/page.tsx similarity index 90% rename from frontend/src/app/command/page.tsx rename to frontend/src/app/terminal/page.tsx index a4b01b0..acbff9b 100644 --- a/frontend/src/app/command/page.tsx +++ b/frontend/src/app/terminal/page.tsx @@ -7,7 +7,7 @@ export default function CommandPage() { const router = useRouter() useEffect(() => { - router.replace('/command/dashboard') + router.replace('/terminal/dashboard') }, [router]) return ( diff --git a/frontend/src/app/command/portfolio/page.tsx b/frontend/src/app/terminal/portfolio/page.tsx similarity index 99% rename from frontend/src/app/command/portfolio/page.tsx rename to frontend/src/app/terminal/portfolio/page.tsx index b5109ba..ae0b0e8 100644 --- a/frontend/src/app/command/portfolio/page.tsx +++ b/frontend/src/app/terminal/portfolio/page.tsx @@ -3,7 +3,7 @@ import { useEffect, useState, useMemo, useCallback, memo } from 'react' import { useStore } from '@/lib/store' import { api, PortfolioDomain, PortfolioSummary, DomainValuation, DomainHealthReport, HealthStatus } from '@/lib/api' -import { CommandCenterLayout } from '@/components/CommandCenterLayout' +import { TerminalLayout } from '@/components/TerminalLayout' import { PremiumTable, StatCard, PageContainer, ActionButton } from '@/components/PremiumTable' import { Toast, useToast } from '@/components/Toast' import { @@ -277,7 +277,7 @@ export default function PortfolioPage() { }, [portfolio, loading]) return ( -
setOpenMenuId(null)} className="w-full flex items-center gap-3 px-4 py-2.5 text-sm text-accent hover:bg-accent/5 transition-colors" > @@ -721,7 +721,7 @@ export default function PortfolioPage() { onClose={() => setSelectedHealthDomain(null)} /> )} - + ) } diff --git a/frontend/src/app/command/pricing/[tld]/page.tsx b/frontend/src/app/terminal/pricing/[tld]/page.tsx similarity index 98% rename from frontend/src/app/command/pricing/[tld]/page.tsx rename to frontend/src/app/terminal/pricing/[tld]/page.tsx index f2bb738..dd0c6fa 100644 --- a/frontend/src/app/command/pricing/[tld]/page.tsx +++ b/frontend/src/app/terminal/pricing/[tld]/page.tsx @@ -2,7 +2,7 @@ import { useEffect, useState, useMemo, useRef } from 'react' import { useParams } from 'next/navigation' -import { CommandCenterLayout } from '@/components/CommandCenterLayout' +import { TerminalLayout } from '@/components/TerminalLayout' import { PageContainer, StatCard } from '@/components/PremiumTable' import { useStore } from '@/lib/store' import { api } from '@/lib/api' @@ -356,19 +356,19 @@ export default function CommandTldDetailPage() { if (loading) { return ( - +
-
+ ) } if (error || !details) { return ( - +
@@ -377,7 +377,7 @@ export default function CommandTldDetailPage() {

TLD Not Found

{error || `The TLD .${tld} could not be found.`}

@@ -385,19 +385,19 @@ export default function CommandTldDetailPage() {
- + ) } return ( - {/* Breadcrumb */}
-
+ ) } diff --git a/frontend/src/app/command/pricing/page.tsx b/frontend/src/app/terminal/pricing/page.tsx similarity index 98% rename from frontend/src/app/command/pricing/page.tsx rename to frontend/src/app/terminal/pricing/page.tsx index 88476d6..b73930a 100755 --- a/frontend/src/app/command/pricing/page.tsx +++ b/frontend/src/app/terminal/pricing/page.tsx @@ -3,7 +3,7 @@ import { useEffect, useState, useMemo, useCallback, memo } from 'react' import { useStore } from '@/lib/store' import { api } from '@/lib/api' -import { CommandCenterLayout } from '@/components/CommandCenterLayout' +import { TerminalLayout } from '@/components/TerminalLayout' import { PremiumTable, StatCard, @@ -303,7 +303,7 @@ export default function TLDPricingPage() { ], []) return ( - tld.tld} loading={loading} - onRowClick={(tld) => window.location.href = `/command/pricing/${tld.tld}`} + onRowClick={(tld) => window.location.href = `/terminal/pricing/${tld.tld}`} emptyIcon={} emptyTitle="No TLDs found" emptyDescription={searchQuery ? `No TLDs matching "${searchQuery}"` : "Check back later for TLD data"} @@ -382,6 +382,6 @@ export default function TLDPricingPage() { )} - + ) } diff --git a/frontend/src/app/command/seo/page.tsx b/frontend/src/app/terminal/seo/page.tsx similarity index 99% rename from frontend/src/app/command/seo/page.tsx rename to frontend/src/app/terminal/seo/page.tsx index ba4161e..4f96841 100644 --- a/frontend/src/app/command/seo/page.tsx +++ b/frontend/src/app/terminal/seo/page.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from 'react' import { useStore } from '@/lib/store' import { api } from '@/lib/api' -import { CommandCenterLayout } from '@/components/CommandCenterLayout' +import { TerminalLayout } from '@/components/TerminalLayout' import { PageContainer, StatCard, Badge } from '@/components/PremiumTable' import { Search, @@ -154,7 +154,7 @@ export default function SEOPage() { // Show upgrade prompt for non-Tycoon users if (!isTycoon) { return ( - @@ -197,12 +197,12 @@ export default function SEOPage() { - + ) } return ( - @@ -502,7 +502,7 @@ export default function SEOPage() { )} - + ) } diff --git a/frontend/src/app/command/settings/page.tsx b/frontend/src/app/terminal/settings/page.tsx similarity index 99% rename from frontend/src/app/command/settings/page.tsx rename to frontend/src/app/terminal/settings/page.tsx index 00d7818..50ff1c2 100644 --- a/frontend/src/app/command/settings/page.tsx +++ b/frontend/src/app/terminal/settings/page.tsx @@ -2,7 +2,7 @@ import { useEffect, useState, useCallback, useMemo } from 'react' import { useRouter } from 'next/navigation' -import { CommandCenterLayout } from '@/components/CommandCenterLayout' +import { TerminalLayout } from '@/components/TerminalLayout' import { PageContainer, TabBar } from '@/components/PremiumTable' import { useStore } from '@/lib/store' import { api, PriceAlert } from '@/lib/api' @@ -178,7 +178,7 @@ export default function SettingsPage() { ] return ( - @@ -360,7 +360,7 @@ export default function SettingsPage() {

No price alerts set

- + Browse TLD prices →
@@ -558,6 +558,6 @@ export default function SettingsPage() { -
+ ) } diff --git a/frontend/src/app/command/watchlist/page.tsx b/frontend/src/app/terminal/watchlist/page.tsx similarity index 99% rename from frontend/src/app/command/watchlist/page.tsx rename to frontend/src/app/terminal/watchlist/page.tsx index db8201f..ba4fba8 100755 --- a/frontend/src/app/command/watchlist/page.tsx +++ b/frontend/src/app/terminal/watchlist/page.tsx @@ -3,7 +3,7 @@ import { useEffect, useState, useMemo, useCallback, memo } from 'react' import { useStore } from '@/lib/store' import { api, DomainHealthReport, HealthStatus } from '@/lib/api' -import { CommandCenterLayout } from '@/components/CommandCenterLayout' +import { TerminalLayout } from '@/components/TerminalLayout' import { PremiumTable, Badge, @@ -335,7 +335,7 @@ export default function WatchlistPage() { ], [healthReports, togglingNotifyId, loadingHealth, refreshingId, deletingId, handleToggleNotify, handleHealthCheck, handleRefresh, handleDelete]) return ( - + {toast && } @@ -411,7 +411,7 @@ export default function WatchlistPage() { /> )} - + ) } diff --git a/frontend/src/app/command/welcome/page.tsx b/frontend/src/app/terminal/welcome/page.tsx similarity index 90% rename from frontend/src/app/command/welcome/page.tsx rename to frontend/src/app/terminal/welcome/page.tsx index 3b46849..bd26256 100644 --- a/frontend/src/app/command/welcome/page.tsx +++ b/frontend/src/app/terminal/welcome/page.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react' import { useRouter, useSearchParams } from 'next/navigation' -import { CommandCenterLayout } from '@/components/CommandCenterLayout' +import { TerminalLayout } from '@/components/TerminalLayout' import { PageContainer } from '@/components/PremiumTable' import { useStore } from '@/lib/store' import { @@ -34,9 +34,9 @@ const planDetails = { { icon: BarChart3, text: 'Deal scores & valuations', description: 'Know what domains are worth' }, ], nextSteps: [ - { href: '/command/watchlist', label: 'Add domains to watchlist', icon: Eye }, - { href: '/command/alerts', label: 'Set up Sniper Alerts', icon: Bell }, - { href: '/command/portfolio', label: 'Track your portfolio', icon: BarChart3 }, + { href: '/terminal/watchlist', label: 'Add domains to watchlist', icon: Eye }, + { href: '/terminal/alerts', label: 'Set up Sniper Alerts', icon: Bell }, + { href: '/terminal/portfolio', label: 'Track your portfolio', icon: BarChart3 }, ], }, tycoon: { @@ -52,9 +52,9 @@ const planDetails = { { icon: Sparkles, text: 'SEO Juice Detector', description: 'Find domains with backlinks' }, ], nextSteps: [ - { href: '/command/watchlist', label: 'Add domains to watchlist', icon: Eye }, - { href: '/command/seo', label: 'Analyze SEO metrics', icon: Sparkles }, - { href: '/command/alerts', label: 'Create Sniper Alerts', icon: Bell }, + { href: '/terminal/watchlist', label: 'Add domains to watchlist', icon: Eye }, + { href: '/terminal/seo', label: 'Analyze SEO metrics', icon: Sparkles }, + { href: '/terminal/alerts', label: 'Create Sniper Alerts', icon: Bell }, ], }, } @@ -84,18 +84,18 @@ export default function WelcomePage() { if (loading) { return ( - +
- + ) } return ( - + {/* Confetti Effect */} {showConfetti && ( @@ -188,7 +188,7 @@ export default function WelcomePage() { {/* Go to Dashboard */}
@@ -215,7 +215,7 @@ export default function WelcomePage() { } } `} - + ) } diff --git a/frontend/src/app/tld-pricing/[tld]/page.tsx b/frontend/src/app/tld-pricing/[tld]/page.tsx index f228f5a..a058154 100644 --- a/frontend/src/app/tld-pricing/[tld]/page.tsx +++ b/frontend/src/app/tld-pricing/[tld]/page.tsx @@ -1170,7 +1170,7 @@ export default function TldDetailPage() { Monitor specific domains and get instant notifications when they become available.

{isAuthenticated ? 'Go to Command Center' : 'Start Monitoring Free'} diff --git a/frontend/src/components/AdminLayout.tsx b/frontend/src/components/AdminLayout.tsx index d376cd6..e3b6a69 100644 --- a/frontend/src/components/AdminLayout.tsx +++ b/frontend/src/components/AdminLayout.tsx @@ -91,7 +91,7 @@ export function AdminLayout({

Access Denied

Admin privileges required