logo and architecture fixes
This commit is contained in:
BIN
frontend/public/igny8-logo-trnsp.png
Normal file
BIN
frontend/public/igny8-logo-trnsp.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
BIN
frontend/public/igny8-logo-w-orange.png
Normal file
BIN
frontend/public/igny8-logo-w-orange.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
@@ -182,6 +182,8 @@ export default function App() {
|
||||
<LoadingStateMonitor />
|
||||
<HelmetProvider>
|
||||
<ScrollToTop />
|
||||
{/* CRITICAL FIX: Move Suspense OUTSIDE Routes to prevent Router context loss during HMR */}
|
||||
<Suspense fallback={<div className="flex items-center justify-center min-h-screen"><div className="text-lg">Loading...</div></div>}>
|
||||
<Routes>
|
||||
{/* Auth Routes - Public */}
|
||||
<Route path="/signin" element={<SignIn />} />
|
||||
@@ -197,642 +199,253 @@ export default function App() {
|
||||
}
|
||||
>
|
||||
{/* Dashboard */}
|
||||
<Route index path="/" element={
|
||||
<Suspense fallback={null}>
|
||||
<Home />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route index path="/" element={<Home />} />
|
||||
|
||||
{/* Planner Module - Redirect dashboard to keywords */}
|
||||
<Route path="/planner" element={<Navigate to="/planner/keywords" replace />} />
|
||||
<Route path="/planner/keywords" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="planner">
|
||||
<Keywords />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="planner">
|
||||
<Keywords />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
<Route path="/planner/clusters" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="planner">
|
||||
<Clusters />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="planner">
|
||||
<Clusters />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
<Route path="/planner/clusters/:id" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="planner">
|
||||
<ClusterDetail />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="planner">
|
||||
<ClusterDetail />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
<Route path="/planner/ideas" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="planner">
|
||||
<Ideas />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="planner">
|
||||
<Ideas />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
|
||||
{/* Writer Module - Redirect dashboard to tasks */}
|
||||
<Route path="/writer" element={<Navigate to="/writer/tasks" replace />} />
|
||||
<Route path="/writer/tasks" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="writer">
|
||||
<Tasks />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="writer">
|
||||
<Tasks />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
{/* Writer Content Routes - Order matters: list route must come before detail route */}
|
||||
<Route path="/writer/content" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="writer">
|
||||
<Content />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="writer">
|
||||
<Content />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
{/* Content detail view - matches /writer/content/:id (e.g., /writer/content/10) */}
|
||||
<Route path="/writer/content/:id" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="writer">
|
||||
<ContentView />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="writer">
|
||||
<ContentView />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
<Route path="/writer/drafts" element={<Navigate to="/writer/content" replace />} />
|
||||
<Route path="/writer/images" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="writer">
|
||||
<Images />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="writer">
|
||||
<Images />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
<Route path="/writer/review" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="writer">
|
||||
<Review />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="writer">
|
||||
<Review />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
<Route path="/writer/published" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="writer">
|
||||
<Published />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="writer">
|
||||
<Published />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
|
||||
{/* Automation Module */}
|
||||
<Route path="/automation" element={
|
||||
<Suspense fallback={null}>
|
||||
<AutomationPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/automation" element={<AutomationPage />} />
|
||||
|
||||
{/* Linker Module - Redirect dashboard to content */}
|
||||
<Route path="/linker" element={<Navigate to="/linker/content" replace />} />
|
||||
<Route path="/linker/content" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="linker">
|
||||
<LinkerContentList />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="linker">
|
||||
<LinkerContentList />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
|
||||
{/* Optimizer Module - Redirect dashboard to content */}
|
||||
<Route path="/optimizer" element={<Navigate to="/optimizer/content" replace />} />
|
||||
<Route path="/optimizer/content" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="optimizer">
|
||||
<OptimizerContentSelector />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="optimizer">
|
||||
<OptimizerContentSelector />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
<Route path="/optimizer/analyze/:id" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="optimizer">
|
||||
<AnalysisPreview />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="optimizer">
|
||||
<AnalysisPreview />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
|
||||
{/* Thinker Module */}
|
||||
{/* Thinker Module - Redirect dashboard to prompts */}
|
||||
<Route path="/thinker" element={<Navigate to="/thinker/prompts" replace />} />
|
||||
<Route path="/thinker/prompts" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="thinker">
|
||||
<Prompts />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="thinker">
|
||||
<Prompts />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
<Route path="/thinker/author-profiles" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="thinker">
|
||||
<AuthorProfiles />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="thinker">
|
||||
<AuthorProfiles />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
<Route path="/thinker/profile" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="thinker">
|
||||
<ThinkerProfile />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="thinker">
|
||||
<ThinkerProfile />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
<Route path="/thinker/strategies" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="thinker">
|
||||
<Strategies />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="thinker">
|
||||
<Strategies />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
<Route path="/thinker/image-testing" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleGuard module="thinker">
|
||||
<ImageTesting />
|
||||
</ModuleGuard>
|
||||
</Suspense>
|
||||
<ModuleGuard module="thinker">
|
||||
<ImageTesting />
|
||||
</ModuleGuard>
|
||||
} />
|
||||
|
||||
{/* Billing Module */}
|
||||
<Route path="/billing" element={<Navigate to="/billing/overview" replace />} />
|
||||
<Route path="/billing/overview" element={
|
||||
<Suspense fallback={null}>
|
||||
<CreditsAndBilling />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/billing/credits" element={
|
||||
<Suspense fallback={null}>
|
||||
<Credits />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/billing/transactions" element={
|
||||
<Suspense fallback={null}>
|
||||
<Transactions />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/billing/usage" element={
|
||||
<Suspense fallback={null}>
|
||||
<Usage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/billing/overview" element={<CreditsAndBilling />} />
|
||||
<Route path="/billing/credits" element={<Credits />} />
|
||||
<Route path="/billing/transactions" element={<Transactions />} />
|
||||
<Route path="/billing/usage" element={<Usage />} />
|
||||
|
||||
{/* Account Section - Billing & Management Pages */}
|
||||
<Route path="/account/plans" element={
|
||||
<Suspense fallback={null}>
|
||||
<PlansAndBillingPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/account/purchase-credits" element={
|
||||
<Suspense fallback={null}>
|
||||
<PurchaseCreditsPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/account/settings" element={
|
||||
<Suspense fallback={null}>
|
||||
<AccountSettingsPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/account/team" element={
|
||||
<Suspense fallback={null}>
|
||||
<TeamManagementPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/account/usage" element={
|
||||
<Suspense fallback={null}>
|
||||
<UsageAnalyticsPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/account/plans" element={<PlansAndBillingPage />} />
|
||||
<Route path="/account/purchase-credits" element={<PurchaseCreditsPage />} />
|
||||
<Route path="/account/settings" element={<AccountSettingsPage />} />
|
||||
<Route path="/account/team" element={<TeamManagementPage />} />
|
||||
<Route path="/account/usage" element={<UsageAnalyticsPage />} />
|
||||
|
||||
{/* Admin Routes */}
|
||||
{/* Admin Dashboard */}
|
||||
<Route path="/admin/dashboard" element={
|
||||
<Suspense fallback={null}>
|
||||
<AdminSystemDashboard />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/admin/dashboard" element={<AdminSystemDashboard />} />
|
||||
|
||||
{/* Admin Account Management */}
|
||||
<Route path="/admin/accounts" element={
|
||||
<Suspense fallback={null}>
|
||||
<AdminAllAccountsPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/admin/subscriptions" element={
|
||||
<Suspense fallback={null}>
|
||||
<AdminSubscriptionsPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/admin/account-limits" element={
|
||||
<Suspense fallback={null}>
|
||||
<AdminAccountLimitsPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/admin/accounts" element={<AdminAllAccountsPage />} />
|
||||
<Route path="/admin/subscriptions" element={<AdminSubscriptionsPage />} />
|
||||
<Route path="/admin/account-limits" element={<AdminAccountLimitsPage />} />
|
||||
|
||||
{/* Admin Billing Administration */}
|
||||
<Route path="/admin/billing" element={
|
||||
<Suspense fallback={null}>
|
||||
<AdminBilling />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/admin/invoices" element={
|
||||
<Suspense fallback={null}>
|
||||
<AdminAllInvoicesPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/admin/payments" element={
|
||||
<Suspense fallback={null}>
|
||||
<AdminAllPaymentsPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/admin/payments/approvals" element={
|
||||
<Suspense fallback={null}>
|
||||
<PaymentApprovalPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/admin/credit-packages" element={
|
||||
<Suspense fallback={null}>
|
||||
<AdminCreditPackagesPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/admin/credit-costs" element={
|
||||
<Suspense fallback={null}>
|
||||
<AdminCreditCostsPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/admin/billing" element={<AdminBilling />} />
|
||||
<Route path="/admin/invoices" element={<AdminAllInvoicesPage />} />
|
||||
<Route path="/admin/payments" element={<AdminAllPaymentsPage />} />
|
||||
<Route path="/admin/payments/approvals" element={<PaymentApprovalPage />} />
|
||||
<Route path="/admin/credit-packages" element={<AdminCreditPackagesPage />} />
|
||||
<Route path="/admin/credit-costs" element={<AdminCreditCostsPage />} />
|
||||
|
||||
{/* Admin User Administration */}
|
||||
<Route path="/admin/users" element={
|
||||
<Suspense fallback={null}>
|
||||
<AdminAllUsersPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/admin/roles" element={
|
||||
<Suspense fallback={null}>
|
||||
<AdminRolesPermissionsPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/admin/activity-logs" element={
|
||||
<Suspense fallback={null}>
|
||||
<AdminActivityLogsPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/admin/users" element={<AdminAllUsersPage />} />
|
||||
<Route path="/admin/roles" element={<AdminRolesPermissionsPage />} />
|
||||
<Route path="/admin/activity-logs" element={<AdminActivityLogsPage />} />
|
||||
|
||||
{/* Admin System Configuration */}
|
||||
<Route path="/admin/settings/system" element={
|
||||
<Suspense fallback={null}>
|
||||
<AdminSystemSettingsPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/admin/settings/system" element={<AdminSystemSettingsPage />} />
|
||||
|
||||
{/* Admin Monitoring */}
|
||||
<Route path="/admin/monitoring/health" element={
|
||||
<Suspense fallback={null}>
|
||||
<AdminSystemHealthPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/admin/monitoring/api" element={
|
||||
<Suspense fallback={null}>
|
||||
<AdminAPIMonitorPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/admin/monitoring/health" element={<AdminSystemHealthPage />} />
|
||||
<Route path="/admin/monitoring/api" element={<AdminAPIMonitorPage />} />
|
||||
|
||||
{/* Reference Data */}
|
||||
<Route path="/reference/seed-keywords" element={
|
||||
<Suspense fallback={null}>
|
||||
<SeedKeywords />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/planner/keyword-opportunities" element={
|
||||
<Suspense fallback={null}>
|
||||
<KeywordOpportunities />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/reference/industries" element={
|
||||
<Suspense fallback={null}>
|
||||
<ReferenceIndustries />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/reference/seed-keywords" element={<SeedKeywords />} />
|
||||
<Route path="/planner/keyword-opportunities" element={<KeywordOpportunities />} />
|
||||
<Route path="/reference/industries" element={<ReferenceIndustries />} />
|
||||
|
||||
{/* Setup Pages */}
|
||||
<Route path="/setup/add-keywords" element={
|
||||
<Suspense fallback={null}>
|
||||
<IndustriesSectorsKeywords />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/setup/add-keywords" element={<IndustriesSectorsKeywords />} />
|
||||
{/* Legacy redirect */}
|
||||
<Route path="/setup/industries-sectors-keywords" element={<Navigate to="/setup/add-keywords" replace />} />
|
||||
|
||||
{/* Settings */}
|
||||
<Route path="/settings/profile" element={
|
||||
<Suspense fallback={null}>
|
||||
<ProfileSettingsPage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/settings" element={
|
||||
<Suspense fallback={null}>
|
||||
<GeneralSettings />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/settings/users" element={
|
||||
<Suspense fallback={null}>
|
||||
<Users />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/settings/subscriptions" element={
|
||||
<Suspense fallback={null}>
|
||||
<Subscriptions />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/settings/system" element={
|
||||
<Suspense fallback={null}>
|
||||
<SystemSettings />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/settings/account" element={
|
||||
<Suspense fallback={null}>
|
||||
<AccountSettings />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/settings/modules" element={
|
||||
<Suspense fallback={null}>
|
||||
<ModuleSettings />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/settings/ai" element={
|
||||
<Suspense fallback={null}>
|
||||
<AISettings />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/settings/plans" element={
|
||||
<Suspense fallback={null}>
|
||||
<Plans />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/settings/industries" element={
|
||||
<Suspense fallback={null}>
|
||||
<Industries />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/settings/status" element={
|
||||
<Suspense fallback={null}>
|
||||
<MasterStatus />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/settings/api-monitor" element={
|
||||
<Suspense fallback={null}>
|
||||
<ApiMonitor />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/settings/debug-status" element={
|
||||
<Suspense fallback={null}>
|
||||
<DebugStatus />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/settings/profile" element={<ProfileSettingsPage />} />
|
||||
<Route path="/settings" element={<GeneralSettings />} />
|
||||
<Route path="/settings/users" element={<Users />} />
|
||||
<Route path="/settings/subscriptions" element={<Subscriptions />} />
|
||||
<Route path="/settings/system" element={<SystemSettings />} />
|
||||
<Route path="/settings/account" element={<AccountSettings />} />
|
||||
<Route path="/settings/modules" element={<ModuleSettings />} />
|
||||
<Route path="/settings/ai" element={<AISettings />} />
|
||||
<Route path="/settings/plans" element={<Plans />} />
|
||||
<Route path="/settings/industries" element={<Industries />} />
|
||||
<Route path="/settings/status" element={<MasterStatus />} />
|
||||
<Route path="/settings/api-monitor" element={<ApiMonitor />} />
|
||||
<Route path="/settings/debug-status" element={<DebugStatus />} />
|
||||
<Route path="/settings/integration" element={
|
||||
<Suspense fallback={null}>
|
||||
<AdminGuard>
|
||||
<Integration />
|
||||
</AdminGuard>
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/settings/publishing" element={
|
||||
<Suspense fallback={null}>
|
||||
<Publishing />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/settings/sites" element={
|
||||
<Suspense fallback={null}>
|
||||
<Sites />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/settings/import-export" element={
|
||||
<Suspense fallback={null}>
|
||||
<ImportExport />
|
||||
</Suspense>
|
||||
<AdminGuard>
|
||||
<Integration />
|
||||
</AdminGuard>
|
||||
} />
|
||||
<Route path="/settings/publishing" element={<Publishing />} />
|
||||
<Route path="/settings/sites" element={<Sites />} />
|
||||
<Route path="/settings/import-export" element={<ImportExport />} />
|
||||
|
||||
{/* Sites Management */}
|
||||
<Route path="/sites" element={
|
||||
<Suspense fallback={null}>
|
||||
<SiteList />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/sites/manage" element={
|
||||
<Suspense fallback={null}>
|
||||
<SiteManage />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/sites/:id" element={
|
||||
<Suspense fallback={null}>
|
||||
<SiteDashboard />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/sites/:id/pages" element={
|
||||
<Suspense fallback={null}>
|
||||
<PageManager />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/sites/:id/pages/new" element={
|
||||
<Suspense fallback={null}>
|
||||
<PageManager />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/sites/:id/pages/:pageId/edit" element={
|
||||
<Suspense fallback={null}>
|
||||
<PageManager />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/sites/:id/content" element={
|
||||
<Suspense fallback={null}>
|
||||
<SiteContent />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/sites/:id/settings" element={
|
||||
<Suspense fallback={null}>
|
||||
<SiteSettings />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/sites/:id/sync" element={
|
||||
<Suspense fallback={null}>
|
||||
<SyncDashboard />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/sites/:id/deploy" element={
|
||||
<Suspense fallback={null}>
|
||||
<DeploymentPanel />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/sites/:id/posts/:postId" element={
|
||||
<Suspense fallback={null}>
|
||||
<PostEditor />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/sites/:id/posts/:postId/edit" element={
|
||||
<Suspense fallback={null}>
|
||||
<PostEditor />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/sites" element={<SiteList />} />
|
||||
<Route path="/sites/manage" element={<SiteManage />} />
|
||||
<Route path="/sites/:id" element={<SiteDashboard />} />
|
||||
<Route path="/sites/:id/pages" element={<PageManager />} />
|
||||
<Route path="/sites/:id/pages/new" element={<PageManager />} />
|
||||
<Route path="/sites/:id/pages/:pageId/edit" element={<PageManager />} />
|
||||
<Route path="/sites/:id/content" element={<SiteContent />} />
|
||||
<Route path="/sites/:id/settings" element={<SiteSettings />} />
|
||||
<Route path="/sites/:id/sync" element={<SyncDashboard />} />
|
||||
<Route path="/sites/:id/deploy" element={<DeploymentPanel />} />
|
||||
<Route path="/sites/:id/posts/:postId" element={<PostEditor />} />
|
||||
<Route path="/sites/:id/posts/:postId/edit" element={<PostEditor />} />
|
||||
|
||||
|
||||
{/* Help */}
|
||||
<Route path="/help" element={
|
||||
<Suspense fallback={null}>
|
||||
<Help />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/help/docs" element={
|
||||
<Suspense fallback={null}>
|
||||
<Docs />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/help/system-testing" element={
|
||||
<Suspense fallback={null}>
|
||||
<SystemTesting />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/help/function-testing" element={
|
||||
<Suspense fallback={null}>
|
||||
<FunctionTesting />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/help" element={<Help />} />
|
||||
<Route path="/help/docs" element={<Docs />} />
|
||||
<Route path="/help/system-testing" element={<SystemTesting />} />
|
||||
<Route path="/help/function-testing" element={<FunctionTesting />} />
|
||||
|
||||
{/* UI Elements */}
|
||||
<Route path="/ui-elements/alerts" element={
|
||||
<Suspense fallback={null}>
|
||||
<Alerts />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/avatars" element={
|
||||
<Suspense fallback={null}>
|
||||
<Avatars />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/badges" element={
|
||||
<Suspense fallback={null}>
|
||||
<Badges />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/breadcrumb" element={
|
||||
<Suspense fallback={null}>
|
||||
<Breadcrumb />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/buttons" element={
|
||||
<Suspense fallback={null}>
|
||||
<Buttons />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/buttons-group" element={
|
||||
<Suspense fallback={null}>
|
||||
<ButtonsGroup />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/cards" element={
|
||||
<Suspense fallback={null}>
|
||||
<Cards />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/carousel" element={
|
||||
<Suspense fallback={null}>
|
||||
<Carousel />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/dropdowns" element={
|
||||
<Suspense fallback={null}>
|
||||
<Dropdowns />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/images" element={
|
||||
<Suspense fallback={null}>
|
||||
<ImagesUI />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/links" element={
|
||||
<Suspense fallback={null}>
|
||||
<Links />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/list" element={
|
||||
<Suspense fallback={null}>
|
||||
<List />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/modals" element={
|
||||
<Suspense fallback={null}>
|
||||
<Modals />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/notifications" element={
|
||||
<Suspense fallback={null}>
|
||||
<Notifications />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/pagination" element={
|
||||
<Suspense fallback={null}>
|
||||
<Pagination />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/popovers" element={
|
||||
<Suspense fallback={null}>
|
||||
<Popovers />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/pricing-table" element={
|
||||
<Suspense fallback={null}>
|
||||
<PricingTable />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/progressbar" element={
|
||||
<Suspense fallback={null}>
|
||||
<Progressbar />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/ribbons" element={
|
||||
<Suspense fallback={null}>
|
||||
<Ribbons />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/spinners" element={
|
||||
<Suspense fallback={null}>
|
||||
<Spinners />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/tabs" element={
|
||||
<Suspense fallback={null}>
|
||||
<Tabs />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/tooltips" element={
|
||||
<Suspense fallback={null}>
|
||||
<Tooltips />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/videos" element={
|
||||
<Suspense fallback={null}>
|
||||
<Videos />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/ui-elements/alerts" element={<Alerts />} />
|
||||
<Route path="/ui-elements/avatars" element={<Avatars />} />
|
||||
<Route path="/ui-elements/badges" element={<Badges />} />
|
||||
<Route path="/ui-elements/breadcrumb" element={<Breadcrumb />} />
|
||||
<Route path="/ui-elements/buttons" element={<Buttons />} />
|
||||
<Route path="/ui-elements/buttons-group" element={<ButtonsGroup />} />
|
||||
<Route path="/ui-elements/cards" element={<Cards />} />
|
||||
<Route path="/ui-elements/carousel" element={<Carousel />} />
|
||||
<Route path="/ui-elements/dropdowns" element={<Dropdowns />} />
|
||||
<Route path="/ui-elements/images" element={<ImagesUI />} />
|
||||
<Route path="/ui-elements/links" element={<Links />} />
|
||||
<Route path="/ui-elements/list" element={<List />} />
|
||||
<Route path="/ui-elements/modals" element={<Modals />} />
|
||||
<Route path="/ui-elements/notifications" element={<Notifications />} />
|
||||
<Route path="/ui-elements/pagination" element={<Pagination />} />
|
||||
<Route path="/ui-elements/popovers" element={<Popovers />} />
|
||||
<Route path="/ui-elements/pricing-table" element={<PricingTable />} />
|
||||
<Route path="/ui-elements/progressbar" element={<Progressbar />} />
|
||||
<Route path="/ui-elements/ribbons" element={<Ribbons />} />
|
||||
<Route path="/ui-elements/spinners" element={<Spinners />} />
|
||||
<Route path="/ui-elements/tabs" element={<Tabs />} />
|
||||
<Route path="/ui-elements/tooltips" element={<Tooltips />} />
|
||||
<Route path="/ui-elements/videos" element={<Videos />} />
|
||||
|
||||
{/* Components (Showcase Page) */}
|
||||
<Route path="/components" element={
|
||||
<Suspense fallback={null}>
|
||||
<Components />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/components" element={<Components />} />
|
||||
|
||||
{/* Redirect old notification route */}
|
||||
<Route path="/notifications" element={
|
||||
<Suspense fallback={null}>
|
||||
<Notifications />
|
||||
</Suspense>
|
||||
} />
|
||||
<Route path="/notifications" element={<Notifications />} />
|
||||
</Route>
|
||||
|
||||
{/* Fallback Route */}
|
||||
<Route path="*" element={<NotFound />} />
|
||||
</Routes>
|
||||
</Suspense>
|
||||
</HelmetProvider>
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -312,7 +312,9 @@ export default function SignUpFormUnified({
|
||||
</div>
|
||||
|
||||
<div className="flex-1 overflow-y-auto no-scrollbar flex items-center">
|
||||
<div className="w-full max-w-md mx-auto p-6 sm:p-8">
|
||||
<div className={`w-full mx-auto p-6 sm:p-8 ${
|
||||
isPaidPlan ? 'max-w-2xl' : 'max-w-md'
|
||||
}`}>
|
||||
<Link
|
||||
to="/"
|
||||
className="inline-flex items-center text-sm text-gray-500 transition-colors hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300 mb-6"
|
||||
@@ -413,76 +415,79 @@ export default function SignUpFormUnified({
|
||||
|
||||
{isPaidPlan && (
|
||||
<div className="pt-4 border-t border-gray-200 dark:border-gray-700 space-y-4">
|
||||
<div>
|
||||
<Label>
|
||||
Country<span className="text-error-500">*</span>
|
||||
</Label>
|
||||
<SelectDropdown
|
||||
options={[
|
||||
{ value: 'US', label: '🇺🇸 United States' },
|
||||
{ value: 'GB', label: '🇬🇧 United Kingdom' },
|
||||
{ value: 'IN', label: '🇮🇳 India' },
|
||||
{ value: 'PK', label: '🇵🇰 Pakistan' },
|
||||
{ value: 'CA', label: '🇨🇦 Canada' },
|
||||
{ value: 'AU', label: '🇦🇺 Australia' },
|
||||
{ value: 'DE', label: '🇩🇪 Germany' },
|
||||
{ value: 'FR', label: '🇫🇷 France' },
|
||||
]}
|
||||
value={formData.billingCountry}
|
||||
onChange={(value) => setFormData((prev) => ({ ...prev, billingCountry: value }))}
|
||||
className="text-base"
|
||||
/>
|
||||
<p className="text-xs text-gray-500 dark:text-gray-400 mt-1">Payment methods will be filtered by your country</p>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
||||
<div>
|
||||
<Label>
|
||||
Country<span className="text-error-500">*</span>
|
||||
</Label>
|
||||
<SelectDropdown
|
||||
options={[
|
||||
{ value: 'US', label: '🇺🇸 United States' },
|
||||
{ value: 'GB', label: '🇬🇧 United Kingdom' },
|
||||
{ value: 'IN', label: '🇮🇳 India' },
|
||||
{ value: 'PK', label: '🇵🇰 Pakistan' },
|
||||
{ value: 'CA', label: '🇨🇦 Canada' },
|
||||
{ value: 'AU', label: '🇦🇺 Australia' },
|
||||
{ value: 'DE', label: '🇩🇪 Germany' },
|
||||
{ value: 'FR', label: '🇫🇷 France' },
|
||||
]}
|
||||
value={formData.billingCountry}
|
||||
onChange={(value) => setFormData((prev) => ({ ...prev, billingCountry: value }))}
|
||||
className="text-base"
|
||||
/>
|
||||
<p className="text-xs text-gray-500 dark:text-gray-400 mt-1">Payment methods filtered by country</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<Label>
|
||||
Payment Method<span className="text-error-500">*</span>
|
||||
</Label>
|
||||
{paymentMethodsLoading ? (
|
||||
<div className="flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-800 rounded-lg h-[52px]">
|
||||
<Loader2 className="w-4 h-4 animate-spin text-brand-500" />
|
||||
</div>
|
||||
) : paymentMethods.length === 0 ? (
|
||||
<div className="p-3 bg-amber-50 border border-amber-200 rounded-lg text-amber-800 dark:bg-amber-900/20 dark:border-amber-800 dark:text-amber-200">
|
||||
<p className="text-xs">No payment methods available</p>
|
||||
</div>
|
||||
) : (
|
||||
<SelectDropdown
|
||||
options={paymentMethods.map(m => ({
|
||||
value: m.payment_method,
|
||||
label: m.display_name
|
||||
}))}
|
||||
value={selectedPaymentMethod}
|
||||
onChange={(value) => setSelectedPaymentMethod(value)}
|
||||
className="text-base"
|
||||
/>
|
||||
)}
|
||||
<p className="text-xs text-gray-500 dark:text-gray-400 mt-1">How you'd like to pay</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<Label>
|
||||
Payment Method<span className="text-error-500">*</span>
|
||||
</Label>
|
||||
<p className="text-xs text-gray-500 dark:text-gray-400 mt-1 mb-2">Select how you'd like to pay for your subscription</p>
|
||||
|
||||
{paymentMethodsLoading ? (
|
||||
<div className="flex items-center justify-center p-6 bg-gray-50 dark:bg-gray-800 rounded-lg">
|
||||
<Loader2 className="w-5 h-5 animate-spin text-brand-500 mr-2" />
|
||||
<span className="text-sm text-gray-600 dark:text-gray-400">Loading payment options...</span>
|
||||
</div>
|
||||
) : paymentMethods.length === 0 ? (
|
||||
<div className="p-4 bg-amber-50 border border-amber-200 rounded-lg text-amber-800 dark:bg-amber-900/20 dark:border-amber-800 dark:text-amber-200">
|
||||
<p className="text-sm">No payment methods available. Please contact support.</p>
|
||||
</div>
|
||||
) : (
|
||||
<div className="space-y-2">
|
||||
{paymentMethods.map((method) => (
|
||||
{/* Payment Method Details - Full Width Below */}
|
||||
{selectedPaymentMethod && paymentMethods.length > 0 && (
|
||||
<div className="space-y-2">
|
||||
{paymentMethods.filter(m => m.payment_method === selectedPaymentMethod).map((method) => (
|
||||
method.instructions && (
|
||||
<div
|
||||
key={method.id}
|
||||
onClick={() => setSelectedPaymentMethod(method.payment_method)}
|
||||
className={`relative p-4 rounded-lg border-2 cursor-pointer transition-all ${
|
||||
selectedPaymentMethod === method.payment_method
|
||||
? 'border-brand-500 bg-brand-50 dark:bg-brand-900/20'
|
||||
: 'border-gray-200 hover:border-gray-300 dark:border-gray-700 dark:hover:border-gray-600'
|
||||
}`}
|
||||
className="p-4 rounded-lg border border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800/50"
|
||||
>
|
||||
<div className="flex items-start gap-3">
|
||||
<div
|
||||
className={`flex items-center justify-center w-10 h-10 rounded-lg ${
|
||||
selectedPaymentMethod === method.payment_method ? 'bg-brand-500 text-white' : 'bg-gray-100 text-gray-600 dark:bg-gray-800 dark:text-gray-400'
|
||||
}`}
|
||||
>
|
||||
<div className="flex items-center justify-center w-10 h-10 rounded-lg bg-brand-500 text-white flex-shrink-0">
|
||||
{getPaymentIcon(method.payment_method)}
|
||||
</div>
|
||||
<div className="flex-1">
|
||||
<div className="flex items-center justify-between">
|
||||
<h4 className="font-semibold text-gray-900 dark:text-white">{method.display_name}</h4>
|
||||
{selectedPaymentMethod === method.payment_method && <Check className="w-5 h-5 text-brand-500" />}
|
||||
</div>
|
||||
{method.instructions && <p className="text-xs text-gray-500 dark:text-gray-400 mt-1 whitespace-pre-line">{method.instructions}</p>}
|
||||
<h4 className="font-semibold text-gray-900 dark:text-white text-sm mb-1">{method.display_name}</h4>
|
||||
<p className="text-xs text-gray-600 dark:text-gray-400 whitespace-pre-line">{method.instructions}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
|
||||
@@ -32,14 +32,15 @@ export default function AuthLayout({
|
||||
<div className="flex flex-col items-center">
|
||||
<Link to="/" className="block mb-4">
|
||||
<img
|
||||
width={231}
|
||||
height={48}
|
||||
src="/images/logo/auth-logo.svg"
|
||||
alt="Logo"
|
||||
width={200}
|
||||
height={60}
|
||||
src="/igny8-logo-w-orange.png"
|
||||
alt="IGNY8"
|
||||
className="h-16 w-auto"
|
||||
/>
|
||||
</Link>
|
||||
<p className="text-center text-gray-400 dark:text-white/60">
|
||||
Free and Open-Source Tailwind CSS Admin Dashboard Template
|
||||
AI-powered content planning and automation platform. Build topical authority with strategic keyword clustering, content briefs, and seamless WordPress publishing.
|
||||
</p>
|
||||
</div>
|
||||
{plan && (
|
||||
|
||||
@@ -6,8 +6,8 @@ export default function SignIn() {
|
||||
return (
|
||||
<>
|
||||
<PageMeta
|
||||
title="React.js SignIn Dashboard | TailAdmin - Next.js Admin Dashboard Template"
|
||||
description="This is React.js SignIn Tables Dashboard page for TailAdmin - React.js Tailwind CSS Admin Dashboard Template"
|
||||
title="Sign In - IGNY8"
|
||||
description="Sign in to your IGNY8 account and manage your AI-powered content strategy"
|
||||
/>
|
||||
<AuthLayout>
|
||||
<SignInForm />
|
||||
|
||||
@@ -95,11 +95,12 @@ export default function SignUp() {
|
||||
{/* Right Side - Pricing Plans */}
|
||||
<div className="hidden lg:flex lg:w-1/2 bg-gradient-to-br from-blue-50 to-indigo-50 dark:from-gray-900 dark:to-gray-800 p-8 xl:p-12 items-start justify-center relative">
|
||||
{/* Logo - Top Right */}
|
||||
<Link to="/" className="absolute top-6 right-6 flex items-center gap-3">
|
||||
<div className="flex items-center justify-center w-10 h-10 bg-brand-600 dark:bg-brand-500 rounded-xl">
|
||||
<span className="text-xl font-bold text-white">I</span>
|
||||
</div>
|
||||
<span className="text-xl font-bold text-gray-900 dark:text-white">TailAdmin</span>
|
||||
<Link to="/" className="absolute top-6 right-6">
|
||||
<img
|
||||
src="/igny8-logo-trnsp.png"
|
||||
alt="IGNY8"
|
||||
className="h-12 w-auto"
|
||||
/>
|
||||
</Link>
|
||||
|
||||
<div className="w-full max-w-2xl mt-20">
|
||||
|
||||
Reference in New Issue
Block a user