137 lines
5.7 KiB
React
137 lines
5.7 KiB
React
import React from 'react';
|
||
import { AppProvider, useApp } from './context/AppContext';
|
||
import { KotaUyarisi } from './components/KotaUyarisi';
|
||
import { Header } from './components/Header';
|
||
import { LiveStatsBar } from './components/LiveStatsBar';
|
||
import { TopNavigation } from './components/TopNavigation';
|
||
import { SummaryCards } from './components/SummaryCards';
|
||
import { LeftSidebar } from './components/LeftSidebar';
|
||
import { TenderList } from './components/TenderList';
|
||
import { RightSidebar } from './components/RightSidebar';
|
||
import { SmartFilterBuilder } from './components/SmartFilterBuilder';
|
||
import { DetailedSearchModal } from './components/DetailedSearchModal';
|
||
import { TenderDetailModal } from './components/TenderDetailModal';
|
||
import { CompanyScannerModal } from './components/CompanyScannerModal';
|
||
import { AiSpecAnalyzerModal } from './components/AiSpecAnalyzerModal';
|
||
import { UrunAramaModal } from './components/UrunAramaModal';
|
||
import { KanbanBoard } from './components/KanbanBoard';
|
||
|
||
import { DailyBulletin } from './components/tools/DailyBulletin';
|
||
import { ResultSearch } from './components/tools/ResultSearch';
|
||
import { TenderCalendar } from './components/tools/TenderCalendar';
|
||
import { ContractSearch } from './components/tools/ContractSearch';
|
||
import { VatCalculator } from './components/tools/VatCalculator';
|
||
import { SinirDeger } from './components/tools/SinirDeger';
|
||
import { KullanimKilavuzu } from './components/KullanimKilavuzu';
|
||
import { MobilFiltreCekmecesi } from './components/MobilFiltreCekmecesi';
|
||
import { PriceAnalysis } from './components/tools/PriceAnalysis';
|
||
import { CompetitorRadar } from './components/tools/CompetitorRadar';
|
||
import { DocumentVault } from './components/tools/DocumentVault';
|
||
import { AnalyticsDashboard } from './components/tools/AnalyticsDashboard';
|
||
import { RedFlags } from './components/tools/RedFlags';
|
||
import { TedTenders } from './components/tools/TedTenders';
|
||
import { Pricing } from './components/tools/Pricing';
|
||
import { KikDecisions } from './components/tools/KikDecisions';
|
||
import { ApiWebhooks } from './components/tools/ApiWebhooks';
|
||
import { PwaSettings } from './components/tools/PwaSettings';
|
||
import { AiModelSettings } from './components/tools/AiModelSettings';
|
||
import { LoginPage } from './components/LoginPage';
|
||
import { LandingPage } from './components/LandingPage';
|
||
|
||
const MainContent = () => {
|
||
const { activeTab, isAdmin, saveError, savingCount } = useApp();
|
||
|
||
return (
|
||
<main className="w-full min-w-0 max-w-[1600px] mx-auto px-4 pb-12">
|
||
{/* 3-Column Main View */}
|
||
<KotaUyarisi />
|
||
{savingCount > 0 && <p role="status" className="p-3 bg-blue-50 text-blue-900">Kaydediliyor…</p>}
|
||
{saveError && <p role="alert" className="p-3 bg-red-50 text-red-900 border border-red-200 rounded-lg">{saveError} Değişiklik kaydedilmedi; tekrar deneyin.</p>}
|
||
|
||
{activeTab === 'list' && (
|
||
<>
|
||
<SummaryCards />
|
||
<MobilFiltreCekmecesi />
|
||
<div className="flex flex-col lg:flex-row gap-5 items-start">
|
||
{/* Masaüstünde sabit panel; mobilde çekmece (yukarıda) */}
|
||
<div className="hidden lg:block shrink-0"><LeftSidebar /></div>
|
||
<TenderList />
|
||
{/* Sağ panel küçük ekranda listeyi uzatıyordu */}
|
||
<div className="hidden xl:block shrink-0"><RightSidebar /></div>
|
||
</div>
|
||
</>
|
||
)}
|
||
|
||
{/* Dedicated Tool Views */}
|
||
{activeTab === 'smart_filter_builder' && <SmartFilterBuilder />}
|
||
{activeTab === 'bulten' && <DailyBulletin />}
|
||
{activeTab === 'sonuc' && <ResultSearch />}
|
||
{activeTab === 'takvim' && <TenderCalendar />}
|
||
{activeTab === 'sozlesme' && <ContractSearch />}
|
||
{activeTab === 'kdv' && <VatCalculator />}
|
||
{activeTab === 'sinir' && <SinirDeger />}
|
||
{activeTab === 'fiyat' && <PriceAnalysis />}
|
||
{activeTab === 'kanban' && <KanbanBoard />}
|
||
{activeTab === 'rakip_radar' && <CompetitorRadar />}
|
||
{activeTab === 'dokuman_deposu' && <DocumentVault />}
|
||
{activeTab === 'analitik_dashboard' && <AnalyticsDashboard />}
|
||
{activeTab === 'kirmizi_bayrak' && <RedFlags />}
|
||
{activeTab === 'ted_eu' && <TedTenders />}
|
||
{activeTab === 'kik_kararlari' && <KikDecisions />}
|
||
{activeTab === 'planlar' && <Pricing />}
|
||
{activeTab === 'api_webhooks' && <ApiWebhooks />}
|
||
{activeTab === 'pwa_settings' && <PwaSettings />}
|
||
{activeTab === 'ai_ayarlari' && isAdmin && <AiModelSettings />}
|
||
|
||
{/* Global Modals */}
|
||
<DetailedSearchModal />
|
||
<TenderDetailModal />
|
||
<CompanyScannerModal />
|
||
<AiSpecAnalyzerModal />
|
||
<UrunAramaModal />
|
||
<KullanimKilavuzu />
|
||
</main>
|
||
);
|
||
};
|
||
|
||
const Gate = () => {
|
||
const { authReady, isAuthenticated, handleLogin } = useApp();
|
||
const [showLogin, setShowLogin] = React.useState(() => window.location.hash === '#giris');
|
||
|
||
React.useEffect(() => {
|
||
const onHash = () => setShowLogin(window.location.hash === '#giris');
|
||
window.addEventListener('hashchange', onHash);
|
||
return () => window.removeEventListener('hashchange', onHash);
|
||
}, []);
|
||
|
||
if (!authReady) {
|
||
return (
|
||
<div className="min-h-screen bg-[#0f172a] flex items-center justify-center text-white/70">
|
||
Yükleniyor…
|
||
</div>
|
||
);
|
||
}
|
||
if (!isAuthenticated) {
|
||
if (!showLogin) {
|
||
return <LandingPage onGiris={() => { window.location.hash = '#giris'; setShowLogin(true); }} />;
|
||
}
|
||
return <LoginPage onLogin={handleLogin} />;
|
||
}
|
||
return (
|
||
<div className="min-h-screen bg-[#f3f5f8] text-slate-800 flex flex-col font-['Inter',sans-serif]">
|
||
<Header />
|
||
<LiveStatsBar />
|
||
<TopNavigation />
|
||
<MainContent />
|
||
</div>
|
||
);
|
||
};
|
||
|
||
export default function App() {
|
||
return (
|
||
<AppProvider>
|
||
<Gate />
|
||
</AppProvider>
|
||
);
|
||
}
|