'use client'; import { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; import { dataStore, type SliderItem, type LiveStreamConfig, type Message, type SiteSettings, type FAQ, type Camera } from '@/lib/dataStore'; import type { NewsItem } from '@/data/news'; import type { MediaItem } from '@/data/media'; import type { Document } from '@/data/documents'; import type { MetroStation } from '@/data/metroStations'; export default function Dashboard() { const router = useRouter(); const [activeSection, setActiveSection] = useState('overview'); const [menuOpen, setMenuOpen] = useState(false); // Gerçek veriler için state'ler const [sliderItems, setSliderItems] = useState([]); const [newsItems, setNewsItems] = useState([]); const [mediaItems, setMediaItems] = useState([]); const [documents, setDocuments] = useState([]); const [metroStations, setMetroStations] = useState([]); const [liveStreamConfig, setLiveStreamConfig] = useState(null); const [messages, setMessages] = useState([]); const [siteSettings, setSiteSettings] = useState(null); const [faqs, setFaqs] = useState([]); const [cameras, setCameras] = useState([]); useEffect(() => { const token = localStorage.getItem('admin_token'); if (!token) { router.push('/yonetim-paneli-a2m-secure'); return; } // Verileri yükle loadData(); }, [router]); const loadData = () => { setSliderItems(dataStore.getSlider()); setNewsItems(dataStore.getNews()); setMediaItems(dataStore.getMedia()); setDocuments(dataStore.getDocuments()); setMetroStations(dataStore.getMetroStations()); setLiveStreamConfig(dataStore.getLiveStream()); setMessages(dataStore.getMessages()); setSiteSettings(dataStore.getSiteSettings()); setFaqs(dataStore.getFAQs().sort((a, b) => a.order - b.order)); setCameras(dataStore.getCameras().sort((a, b) => a.order - b.order)); }; const handleLogout = () => { localStorage.removeItem('admin_token'); router.push('/yonetim-paneli-a2m-secure'); }; const stats = [ { title: 'Aktif Slider', value: sliderItems.filter(s => s.active).length.toString(), icon: '🎬', color: 'from-[#004B87] to-[#00B4D8]', change: '+1' }, { title: 'Toplam Haberler', value: newsItems.length.toString(), icon: '📰', color: 'from-[#00B4D8] to-[#0096C7]', change: '+2' }, { title: 'Medya İçeriği', value: mediaItems.length.toString(), icon: '📸', color: 'from-[#0096C7] to-[#48CAE4]', change: '+3' }, { title: 'Gelen Mesajlar', value: messages.filter(m => !m.read).length.toString(), icon: '✉️', color: 'from-[#48CAE4] to-[#90E0EF]', change: `+${messages.filter(m => !m.read).length}` }, ]; const menuItems = [ { id: 'overview', label: 'Genel Bakış', icon: '📊' }, { id: 'slider', label: 'Slider Yönetimi', icon: '🎬' }, { id: 'news', label: 'Haberler', icon: '📰' }, { id: 'media', label: 'Medya', icon: '📸' }, { id: 'documents', label: 'Belgeler', icon: '📄' }, { id: 'metro-line', label: 'Metro Hattı', icon: '🚇' }, { id: 'live-stream', label: 'Canlı Yayın', icon: '📺' }, { id: 'cameras', label: 'Kameralar', icon: '📹' }, { id: 'faqs', label: 'SSS Yönetimi', icon: '❓' }, { id: 'messages', label: 'Gelen Mesajlar', icon: '✉️', badge: messages.filter(m => !m.read).length || undefined }, { id: 'site-settings', label: 'Site Ayarları', icon: '⚙️' }, ]; // Slider management functions const toggleSlideActive = (id: number) => { const updated = sliderItems.map(item => item.id === id ? { ...item, active: !item.active } : item ); setSliderItems(updated); dataStore.setSlider(updated); }; const updateSlide = (id: number, updates: Partial) => { const updated = sliderItems.map(item => item.id === id ? { ...item, ...updates } : item ); setSliderItems(updated); dataStore.setSlider(updated); }; // News management functions const handleDeleteNews = (id: number) => { if (confirm('Bu haberi silmek istediğinizden emin misiniz?')) { dataStore.deleteNews(id); loadData(); } }; const handleToggleFeatured = (id: number) => { const news = newsItems.find(n => n.id === id); if (news) { dataStore.updateNews(id, { featured: !news.featured }); loadData(); } }; // Media management functions const handleDeleteMedia = (id: number) => { if (confirm('Bu medya içeriğini silmek istediğinizden emin misiniz?')) { dataStore.deleteMedia(id); loadData(); } }; // Document management functions const handleDeleteDocument = (id: number) => { if (confirm('Bu belgeyi silmek istediğinizden emin misiniz?')) { dataStore.deleteDocument(id); loadData(); } }; // Metro station update function (used in modal) // const handleUpdateStation = (id: number, updates: Partial) => { // dataStore.updateStation(id, updates); // loadData(); // }; // Categories const categories = [ { id: 'all', name: 'Tümü', icon: '📋' }, { id: 'construction', name: 'İnşaat', icon: '🏗️' }, { id: 'announcement', name: 'Duyuru', icon: '📢' }, { id: 'event', name: 'Etkinlik', icon: '🎉' }, ]; const documentCategories = [ { id: 'all', name: 'Tümü', icon: '📋' }, { id: 'technical', name: 'Teknik', icon: '⚙️' }, { id: 'administrative', name: 'İdari', icon: '📊' }, { id: 'legal', name: 'Hukuki', icon: '⚖️' }, { id: 'financial', name: 'Mali', icon: '💰' }, ]; // Form states const [selectedNewsCategory, setSelectedNewsCategory] = useState('all'); // const [editingNews, setEditingNews] = useState(null); // const [showNewsForm, setShowNewsForm] = useState(false); const [selectedMediaType, setSelectedMediaType] = useState<'all' | 'video' | 'photo'>('all'); const [selectedDocCategory, setSelectedDocCategory] = useState('all'); // Filtered lists const filteredNewsList = selectedNewsCategory === 'all' ? newsItems : newsItems.filter(news => news.category === selectedNewsCategory); const filteredMediaList = selectedMediaType === 'all' ? mediaItems : mediaItems.filter(media => media.type === selectedMediaType); const filteredDocsList = selectedDocCategory === 'all' ? documents : documents.filter(doc => doc.category === selectedDocCategory); // Station filtering and selection const [selectedStationStatus, setSelectedStationStatus] = useState<'all' | 'completed' | 'in-progress' | 'planned'>('all'); const [selectedStationId, setSelectedStationId] = useState(null); // Edit modals const [editingSlide, setEditingSlide] = useState(null); const [showSlideModal, setShowSlideModal] = useState(false); const [editingNewsItem, setEditingNewsItem] = useState(null); const [showNewsModal, setShowNewsModal] = useState(false); const [editingMediaItem, setEditingMediaItem] = useState(null); const [showMediaModal, setShowMediaModal] = useState(false); const [editingDocument, setEditingDocument] = useState(null); const [showDocumentModal, setShowDocumentModal] = useState(false); const [editingStation, setEditingStation] = useState(null); const [showStationModal, setShowStationModal] = useState(false); const filteredStationsList = selectedStationStatus === 'all' ? metroStations : metroStations.filter(station => station.status === selectedStationStatus); const handleStationClick = (stationId: number) => { const newSelectedId = stationId === selectedStationId ? null : stationId; setSelectedStationId(newSelectedId); // Ana sayfadaki metro animasyonu için seçili istasyonu kaydet if (newSelectedId !== null) { localStorage.setItem('metro_selected_station', newSelectedId.toString()); } else { localStorage.removeItem('metro_selected_station'); } }; // Slider edit handlers const handleEditSlide = (slide: SliderItem) => { setEditingSlide(slide); setShowSlideModal(true); }; const handleSaveSlide = (e: React.FormEvent) => { e.preventDefault(); if (editingSlide) { const isNew = !sliderItems.find(s => s.id === editingSlide.id); if (isNew) { // Yeni slider ekle const updated = [...sliderItems, editingSlide]; setSliderItems(updated); dataStore.setSlider(updated); } else { // Mevcut slider'ı güncelle updateSlide(editingSlide.id, editingSlide); } setShowSlideModal(false); setEditingSlide(null); } }; const handleAddSlide = () => { const newSlide: SliderItem = { id: Math.max(...sliderItems.map(s => s.id), 0) + 1, title: '', description: '', buttonText: 'Detaylı Bilgi', buttonLink: '#', active: false }; setEditingSlide(newSlide); setShowSlideModal(true); }; const handleDeleteSlide = (id: number) => { if (confirm('Bu slider\'ı silmek istediğinizden emin misiniz?')) { const updated = sliderItems.filter(s => s.id !== id); setSliderItems(updated); dataStore.setSlider(updated); } }; // News edit handlers const handleAddNews = () => { const newNews: NewsItem = { id: Math.max(...newsItems.map(n => n.id), 0) + 1, title: '', summary: '', content: '', date: new Date().toLocaleDateString('tr-TR'), image: '', category: 'announcements', author: 'Admin', tags: [], featured: false }; setEditingNewsItem(newNews); setShowNewsModal(true); }; const handleEditNews = (news: NewsItem) => { setEditingNewsItem(news); setShowNewsModal(true); }; const handleSaveNews = (e: React.FormEvent) => { e.preventDefault(); if (editingNewsItem) { const isNew = !newsItems.find(n => n.id === editingNewsItem.id); if (isNew) { dataStore.addNews(editingNewsItem); } else { dataStore.updateNews(editingNewsItem.id, editingNewsItem); } loadData(); setShowNewsModal(false); setEditingNewsItem(null); } }; // Media edit handlers const handleAddMedia = () => { const newMedia: MediaItem = { id: Math.max(...mediaItems.map(m => m.id), 0) + 1, title: '', description: '', type: 'photo', thumbnail: '', date: new Date().toLocaleDateString('tr-TR'), category: 'construction' }; setEditingMediaItem(newMedia); setShowMediaModal(true); }; const handleEditMedia = (media: MediaItem) => { setEditingMediaItem(media); setShowMediaModal(true); }; const handleSaveMedia = (e: React.FormEvent) => { e.preventDefault(); if (editingMediaItem) { const isNew = !mediaItems.find(m => m.id === editingMediaItem.id); if (isNew) { dataStore.addMedia(editingMediaItem); } else { dataStore.updateMedia(editingMediaItem.id, editingMediaItem); } loadData(); setShowMediaModal(false); setEditingMediaItem(null); } }; // Document edit handlers const handleAddDocument = () => { const newDoc: Document = { id: Math.max(...documents.map(d => d.id), 0) + 1, title: '', description: '', type: 'PDF', size: '', date: new Date().toLocaleDateString('tr-TR'), category: 'teknik', downloadUrl: '#' }; setEditingDocument(newDoc); setShowDocumentModal(true); }; const handleEditDocument = (doc: Document) => { setEditingDocument(doc); setShowDocumentModal(true); }; const handleSaveDocument = (e: React.FormEvent) => { e.preventDefault(); if (editingDocument) { const isNew = !documents.find(d => d.id === editingDocument.id); if (isNew) { dataStore.addDocument(editingDocument); } else { dataStore.updateDocument(editingDocument.id, editingDocument); } loadData(); setShowDocumentModal(false); setEditingDocument(null); } }; // Station edit handlers const handleEditStation = (station: MetroStation) => { setEditingStation(station); setShowStationModal(true); }; const handleSaveStation = (e: React.FormEvent) => { e.preventDefault(); if (editingStation) { dataStore.updateStation(editingStation.id, editingStation); loadData(); setShowStationModal(false); setEditingStation(null); } }; // Helper function for file icons const getFileIcon = (type: string) => { switch (type) { case 'pdf': return '📄'; case 'doc': return '📝'; case 'xls': return '📊'; case 'image': return '🖼️'; default: return '📁'; } }; // Helper functions for station status const getStatusColor = (status: string) => { switch (status) { case 'completed': return 'bg-green-500'; case 'in-progress': return 'bg-yellow-500'; case 'planned': return 'bg-blue-500'; default: return 'bg-gray-500'; } }; const getStatusText = (status: string) => { switch (status) { case 'completed': return 'Tamamlandı'; case 'in-progress': return 'Devam Ediyor'; case 'planned': return 'Planlandı'; default: return status; } }; return (
{/* Sidebar */} {/* Main Content */}
{/* Header */}

{menuItems.find(item => item.id === activeSection)?.label || 'Dashboard'}

A
{/* Dashboard Content */}
{activeSection === 'overview' && ( <> {/* Stats Grid */}
{stats.map((stat, index) => (
{stat.icon}
{stat.change}

{stat.title}

{stat.value}

))}
{/* Charts Section */}

İnşaat İlerleme Durumu

{[ { name: 'Temeller', progress: 100, color: 'bg-green-500' }, { name: 'Yapı İnşaatı', progress: 75, color: 'bg-[#00B4D8]' }, { name: 'Elektrik', progress: 60, color: 'bg-[#0096C7]' }, { name: 'Ray Döşeme', progress: 40, color: 'bg-yellow-500' }, { name: 'İç Mekan', progress: 25, color: 'bg-orange-500' }, ].map((item, index) => (
{item.name} {item.progress}%
))}

Son Aktiviteler

{[ { action: 'Yeni haber eklendi', time: '5 dakika önce', icon: '📰', color: 'bg-blue-100 text-blue-600' }, { action: 'Medya içeriği güncellendi', time: '1 saat önce', icon: '📸', color: 'bg-purple-100 text-purple-600' }, { action: 'Belge yüklendi', time: '2 saat önce', icon: '📄', color: 'bg-green-100 text-green-600' }, { action: 'İstasyon durumu güncellendi', time: '3 saat önce', icon: '🚇', color: 'bg-yellow-100 text-yellow-600' }, ].map((activity, index) => (
{activity.icon}

{activity.action}

{activity.time}

))}
{/* Quick Actions */}

Hızlı İşlemler

{[ { label: 'Haber Ekle', icon: '➕', color: 'from-[#004B87] to-[#00B4D8]' }, { label: 'Medya Yükle', icon: '📤', color: 'from-[#00B4D8] to-[#0096C7]' }, { label: 'Belge Yükle', icon: '📁', color: 'from-[#0096C7] to-[#48CAE4]' }, { label: 'Rapor Oluştur', icon: '📊', color: 'from-[#48CAE4] to-[#90E0EF]' }, ].map((action, index) => ( ))}
)} {/* Slider Management Section */} {activeSection === 'slider' && (
{/* Header */}

Slider Yönetimi

Ana sayfa hero slider içeriklerini yönetin

{/* Slider Items Grid */}
{sliderItems.map((slide, index) => (
{index + 1}

Slide #{slide.id}

{slide.title}

{slide.description}

{slide.buttonText}

))}
{/* Info Box */}
ℹ️

Slider Kullanım Bilgisi

  • • Slider otomatik olarak 5 saniyede bir değişir
  • • Maksimum 4 slide önerilir (mevcut: {sliderItems.length}/4)
  • • Başlık 80 karakter, açıklama 200 karakter ile sınırlıdır
  • • Değişiklikler anında ana sayfaya yansır
)} {/* News Management Section */} {activeSection === 'news' && (
{/* Header */}

Haberler Yönetimi

Haberler ve duyuruları yönetin, düzenleyin

{/* Category Filter */}
{categories.map((category) => ( ))}
{/* News Table */}
{filteredNewsList.map((news) => ( ))}
Haber Kategori Tarih Yazar Durum İşlemler
{news.title}

{news.title}

{news.summary}

{categories.find(c => c.id === news.category)?.name} {news.date} {news.author} {news.featured ? ( ⭐ Ana Sayfa ) : ( Yayında )}
{/* Stats */}

Toplam Haber

{newsItems.length}

📰

Ana Sayfada

{newsItems.filter(n => n.featured).length}

İnşaat Haberleri

{newsItems.filter(n => n.category === 'construction').length}

🏗️

Duyurular

{newsItems.filter(n => n.category === 'announcements').length}

📢
)} {/* Media Management Section */} {activeSection === 'media' && (
{/* Header */}

Medya Galerisi Yönetimi

Video ve fotoğraf içeriklerini yönetin

{/* Type Filter */}
{/* Media Grid */}
{filteredMediaList.map((media) => (
{media.title}
{media.type === 'video' ? '🎥 Video' : '📸 Foto'}
{media.duration && (
{media.duration}
)}

{media.title}

{media.description}

{media.date}
))}
{/* Stats */}

Toplam Medya

{mediaItems.length}

📁

Videolar

{mediaItems.filter(m => m.type === 'video').length}

🎥

Fotoğraflar

{mediaItems.filter(m => m.type === 'photo').length}

📸
)} {/* Documents Management Section */} {activeSection === 'documents' && (
{/* Header */}

Belgeler Yönetimi

Proje belgelerini ve dökümanları yönetin

{/* Category Filter */}
{documentCategories.map((category) => ( ))}
{/* Documents Table */}
{filteredDocsList.map((doc) => ( ))}
Belge Kategori Tarih Boyut İşlemler
{getFileIcon(doc.type)}

{doc.title}

{doc.description}

{documentCategories.find(c => c.id === doc.category)?.name} {doc.date} {doc.size}
{/* Stats */}
📋

Toplam

{documents.length}

📄

İhale

{documents.filter(d => d.category === 'ihale').length}

📐

Teknik

{documents.filter(d => d.category === 'teknik').length}

🌱

Çevresel

{documents.filter(d => d.category === 'cevresel').length}

📊

Raporlar

{documents.filter(d => d.category === 'raporlar').length}

)} {/* Metro Line Management Section */} {activeSection === 'metro-line' && (
{/* Header */}

Metro Hattı İstasyonları

İstasyon durumlarını ve ilerlemeyi yönetin

{/* Status Filter */}
{/* Stations Grid */}
{filteredStationsList.map((station) => (
handleStationClick(station.id)} className={`bg-white rounded-xl shadow-sm overflow-hidden hover:shadow-lg transition-all cursor-pointer ${ selectedStationId === station.id ? 'ring-4 ring-[#00B4D8]' : '' }`} >

{station.name}

{getStatusText(station.status)}
{selectedStationId === station.id && (
)}
{/* Progress Bar */}
İlerleme {station.progress}%
{/* Details */}
📅 Başlangıç: {station.startDate}
🎯 Bitiş: {station.expectedCompletion}
👥 Günlük Kapasite: {station.dailyCapacity} yolcu
{station.connections && station.connections.length > 0 && (
🔄 Aktarma:
{station.connections.map((conn, i) => ( {conn} ))}
)}
))}
)} {/* Live Stream Management Section */} {activeSection === 'live-stream' && liveStreamConfig && (

Canlı Yayın Yönetimi

YouTube canlı yayın URL'sini ve ayarlarını yönetin

{ e.preventDefault(); dataStore.setLiveStream(liveStreamConfig); alert('Canlı yayın ayarları kaydedildi!'); }} className="space-y-6">
setLiveStreamConfig({ ...liveStreamConfig, title: e.target.value })} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent" placeholder="Canlı Yayın" />
setLiveStreamConfig({ ...liveStreamConfig, url: e.target.value })} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent" placeholder="https://www.youtube.com/embed/VIDEO_ID" required />

YouTube video URL'sini embed formatında girin. Örnek: https://www.youtube.com/embed/VIDEO_ID

{/* Preview */} {liveStreamConfig.url && (
)}
)} {/* Messages Section */} {activeSection === 'messages' && (

Gelen Mesajlar

Kullanıcılardan gelen dilek, öneri ve şikayetler

{messages.filter(m => !m.read).length} Okunmamış
{messages.length === 0 ? (

Henüz mesaj bulunmuyor

) : (
{messages.map((message) => (

{message.name}

{message.type === 'sikayet' ? 'Şikayet' : message.type === 'oneri' ? 'Öneri' : 'Bilgi Talebi'} {!message.read && ( Yeni )}

📧 {message.email} • 📱 {message.phone}

Konu: {message.subject}

{message.message}

{new Date(message.date).toLocaleString('tr-TR')}

{!message.read && ( )}
))}
)}
)} {/* FAQs Section */} {activeSection === 'faqs' && (

SSS Yönetimi

{faqs.map((faq) => (
{ dataStore.updateFAQ(faq.id, { question: e.target.value }); loadData(); }} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent" />
{ dataStore.updateFAQ(faq.id, { order: parseInt(e.target.value) }); loadData(); }} className="w-16 px-2 py-2 border border-gray-300 rounded-lg text-center" title="Sıra" />