diff --git a/frontend/src/pages/Writer/Content.tsx b/frontend/src/pages/Writer/Content.tsx
index 008e3e24..f2750d0b 100644
--- a/frontend/src/pages/Writer/Content.tsx
+++ b/frontend/src/pages/Writer/Content.tsx
@@ -16,14 +16,13 @@ import {
import { optimizerApi } from '../../api/optimizer.api';
import { useNavigate } from 'react-router-dom';
import { useToast } from '../../components/ui/toast/ToastContainer';
-import { FileIcon, TaskIcon, ImageIcon, CheckCircleIcon } from '../../icons';
+import { FileIcon, TaskIcon, CheckCircleIcon } from '../../icons';
import { createContentPageConfig } from '../../config/pages/content.config';
import { useSectorStore } from '../../store/sectorStore';
import { usePageSizeStore } from '../../store/pageSizeStore';
import ProgressModal from '../../components/common/ProgressModal';
import { useProgressModal } from '../../hooks/useProgressModal';
import PageHeader from '../../components/common/PageHeader';
-import ModuleNavigationTabs from '../../components/navigation/ModuleNavigationTabs';
import ModuleMetricsFooter, { MetricItem, ProgressMetric } from '../../components/dashboard/ModuleMetricsFooter';
import { WorkflowInsight } from '../../components/common/WorkflowInsights';
@@ -278,22 +277,13 @@ export default function Content() {
return result;
}, [loadContent]);
- // Writer navigation tabs
- const writerTabs = [
- { label: 'Queue', path: '/writer/tasks', icon:
},
- { label: 'Drafts', path: '/writer/content', icon:
},
- { label: 'Images', path: '/writer/images', icon:
},
- { label: 'Review', path: '/writer/review', icon:
},
- { label: 'Published', path: '/writer/published', icon:
},
- ];
-
return (
<>
, color: 'purple' }}
- navigation={
}
+ breadcrumb="Writer / Drafts"
workflowInsights={workflowInsights}
/>
},
- { label: 'Drafts', path: '/writer/content', icon:
},
- { label: 'Images', path: '/writer/images', icon:
},
- { label: 'Review', path: '/writer/review', icon:
},
- { label: 'Published', path: '/writer/published', icon:
},
- ];
-
return (
<>
, color: 'orange' }}
- navigation={
}
+ breadcrumb="Writer / Images"
/>
},
- { label: 'Drafts', path: '/writer/content', icon:
},
- { label: 'Images', path: '/writer/images', icon:
},
- { label: 'Review', path: '/writer/review', icon:
},
- { label: 'Published', path: '/writer/published', icon:
},
- ];
-
return (
<>
, color: 'green' }}
- navigation={
}
+ breadcrumb="Writer / Published"
/>
},
- { label: 'Drafts', path: '/writer/content', icon:
},
- { label: 'Images', path: '/writer/images', icon:
},
- { label: 'Review', path: '/writer/review', icon:
},
- { label: 'Published', path: '/writer/published', icon:
},
- ];
-
return (
<>
, color: 'blue' }}
- navigation={
}
+ breadcrumb="Writer / Review"
/>
},
- { label: 'Drafts', path: '/writer/content', icon:
},
- { label: 'Images', path: '/writer/images', icon:
},
- { label: 'Review', path: '/writer/review', icon:
},
- { label: 'Published', path: '/writer/published', icon:
},
- ];
-
return (
<>
, color: 'indigo' }}
- navigation={
}
+ breadcrumb="Writer / Queue"
workflowInsights={workflowInsights}
/>
('account');
+ // Derive active tab from URL path
+ const activeTab = getTabFromPath(location.pathname);
const [loading, setLoading] = useState(true);
const [saving, setSaving] = useState(false);
const [error, setError] = useState('');
@@ -271,37 +281,29 @@ export default function AccountSettingsPage() {
- {/* Page Header */}
+ {/* Page Header with Breadcrumb */}
-
Account Settings
+
+ Account Settings
+ ›
+
+ {activeTab === 'account' && 'Account'}
+ {activeTab === 'profile' && 'Profile'}
+ {activeTab === 'team' && 'Team'}
+
+
+
+ {activeTab === 'account' && 'Account Information'}
+ {activeTab === 'profile' && 'Profile Settings'}
+ {activeTab === 'team' && 'Team Management'}
+
- Manage your account information, profile settings, and team members
+ {activeTab === 'account' && 'Manage your organization and billing information'}
+ {activeTab === 'profile' && 'Update your personal information and preferences'}
+ {activeTab === 'team' && 'Invite and manage team members'}
- {/* Tabs */}
-
-
-
-
{/* Tab Content */}
{/* Account Tab */}
diff --git a/frontend/src/pages/account/ContentSettingsPage.tsx b/frontend/src/pages/account/ContentSettingsPage.tsx
index 3c69c8d7..bf913119 100644
--- a/frontend/src/pages/account/ContentSettingsPage.tsx
+++ b/frontend/src/pages/account/ContentSettingsPage.tsx
@@ -5,6 +5,7 @@
*/
import { useState, useEffect, useCallback } from 'react';
+import { useLocation } from 'react-router-dom';
import {
Save, Loader2, Image as ImageIcon, FileText, Send, Settings
} from 'lucide-react';
@@ -83,9 +84,17 @@ const getImageSizes = (provider: string, model: string) => {
return [{ value: '1024x1024', label: '1024×1024 pixels' }];
};
+// Get tab from URL path
+function getTabFromPath(pathname: string): TabType {
+ if (pathname.includes('/publishing')) return 'publishing';
+ if (pathname.includes('/images')) return 'images';
+ return 'content';
+}
+
export default function ContentSettingsPage() {
const toast = useToast();
- const [activeTab, setActiveTab] = useState
('content');
+ const location = useLocation();
+ const activeTab = getTabFromPath(location.pathname);
const [loading, setLoading] = useState(true);
const [saving, setSaving] = useState(false);
@@ -293,11 +302,11 @@ export default function ContentSettingsPage() {
}
};
- const tabs = [
- { id: 'content' as TabType, label: 'Content Generation', icon: },
- { id: 'publishing' as TabType, label: 'Publishing', icon: },
- { id: 'images' as TabType, label: 'Image Settings', icon: },
- ];
+ const tabTitles: Record = {
+ content: 'Content Generation',
+ publishing: 'Publishing',
+ images: 'Image Settings',
+ };
if (loading) {
return (
@@ -319,35 +328,17 @@ export default function ContentSettingsPage() {
{/* Page Header */}
-
Content Settings
+
+ Content Settings / {tabTitles[activeTab]}
+
+
{tabTitles[activeTab]}
- Configure how your content and images are generated
+ {activeTab === 'content' && 'Customize how your articles are written'}
+ {activeTab === 'publishing' && 'Configure automatic publishing settings'}
+ {activeTab === 'images' && 'Set up AI image generation preferences'}
- {/* Tabs */}
-
-
-
-
{/* Tab Content */}
{/* Content Generation Tab */}
diff --git a/frontend/src/pages/account/PlansAndBillingPage.tsx b/frontend/src/pages/account/PlansAndBillingPage.tsx
index 127b1177..45fbcfc5 100644
--- a/frontend/src/pages/account/PlansAndBillingPage.tsx
+++ b/frontend/src/pages/account/PlansAndBillingPage.tsx
@@ -1,12 +1,13 @@
/**
* Plans & Billing Page - Subscription & Payment Management
* Tabs: Current Plan, Upgrade Plan, Billing History
+ * Tab selection driven by URL path for sidebar navigation
*
* Note: Usage tracking is consolidated in UsageAnalyticsPage (/account/usage)
*/
import { useState, useEffect, useRef } from 'react';
-import { Link } from 'react-router-dom';
+import { Link, useLocation } from 'react-router-dom';
import {
CreditCard, Package, TrendingUp, FileText, Wallet, ArrowUpCircle,
Loader2, AlertCircle, CheckCircle, Download, Zap, Globe, Users, X
@@ -49,8 +50,17 @@ import { useAuthStore } from '../../store/authStore';
type TabType = 'plan' | 'upgrade' | 'invoices';
+// Map URL paths to tab types
+function getTabFromPath(pathname: string): TabType {
+ if (pathname.includes('/upgrade')) return 'upgrade';
+ if (pathname.includes('/history')) return 'invoices';
+ return 'plan';
+}
+
export default function PlansAndBillingPage() {
- const [activeTab, setActiveTab] = useState
('plan');
+ const location = useLocation();
+ // Derive active tab from URL path
+ const activeTab = getTabFromPath(location.pathname);
const [loading, setLoading] = useState(true);
const [error, setError] = useState('');
const [planLoadingId, setPlanLoadingId] = useState(null);
@@ -347,18 +357,25 @@ export default function PlansAndBillingPage() {
const subscriptionStatus = currentSubscription?.status || (hasActivePlan ? 'active' : 'none');
const hasPendingManualPayment = payments.some((p) => p.status === 'pending_approval');
- const tabs = [
- { id: 'plan' as TabType, label: 'Current Plan', icon: },
- { id: 'upgrade' as TabType, label: 'Upgrade Plan', icon: },
- { id: 'invoices' as TabType, label: 'History', icon: },
- ];
+ // Page titles based on active tab
+ const pageTitles = {
+ plan: { title: 'Current Plan', description: 'View your subscription details and features' },
+ upgrade: { title: 'Upgrade Plan', description: 'Compare plans and upgrade your subscription' },
+ invoices: { title: 'Billing History', description: 'View invoices and manage payment methods' },
+ };
return (
+ {/* Page Header with Breadcrumb */}
-
Your Subscription
+
+ Plans & Billing
+ ›
+ {pageTitles[activeTab].title}
+
+
{pageTitles[activeTab].title}
- Manage your plan and view usage
+ {pageTitles[activeTab].description}
@@ -367,7 +384,7 @@ export default function PlansAndBillingPage() {
No active plan. Choose a plan below to activate your account.
- )}
+ )}}
{hasPendingManualPayment && (
We received your manual payment. It’s pending admin approval; activation will complete once approved.
@@ -381,29 +398,6 @@ export default function PlansAndBillingPage() {
)}
- {/* Tabs */}
-
-
-
-
{/* Tab Content */}
{/* Current Plan Tab */}
@@ -476,7 +470,8 @@ export default function PlansAndBillingPage() {