// Veri yönetimi için localStorage tabanlı store import { newsData, type NewsItem } from '@/data/news'; import { mediaData, type MediaItem } from '@/data/media'; import { documentsData, type Document } from '@/data/documents'; import { metroStations, type MetroStation } from '@/data/metroStations'; export interface SliderItem { id: number; title: string; description: string; buttonText: string; buttonLink: string; active: boolean; } export interface LiveStreamConfig { url: string; active: boolean; title?: string; } export interface Message { id: string; name: string; email: string; phone: string; subject: string; type: 'sikayet' | 'oneri' | 'bilgi'; message: string; date: string; read: boolean; } export interface FAQ { id: number; question: string; answer: string; order: number; } export interface Camera { id: number; name: string; location: string; videoUrl: string; status: 'online' | 'offline'; viewers?: number; order: number; } export interface SiteSettings { contact: { phone: string; email: string; address: string; kep: string; }; social: { facebook: string; twitter: string; instagram: string; youtube: string; linkedin?: string; }; companyInfo: { name: string; fullName: string; foundedYear: string; }; } // Default slider data export const defaultSliderData: SliderItem[] = [ { id: 1, title: 'Ankara Metro Altyapı Projelerinde Öncü Çözümler', description: 'Ankara Büyükşehir Belediyesi ile birlikte, modern teknoloji ve mühendislik uzmanlığımızla başkentin ulaşım ağını inşa ediyor, geleceğin metro sistemlerini bugünden hayata geçiriyoruz.', buttonText: 'Detayları Gör', buttonLink: '#proje-detay', active: true }, { id: 2, title: 'A2 Metro Hattı İnşaatında Son Aşamaya Gelindi', description: '15 istasyonlu A2 Metro Hattı projemiz %75 tamamlandı. 2026 yılında hizmete açılacak modern metro hattımız, günlük 300 bin yolcuya hizmet verecek.', buttonText: 'İlerlemeyi İzle', buttonLink: '#metro-hatti', active: true }, { id: 3, title: 'Çevre Dostu Metro Teknolojileri', description: 'Yenilenebilir enerji kaynakları ve sürdürülebilir inşaat teknikleri ile çevre dostu metro projelerine imza atıyoruz. Karbon emisyonunu %40 azaltan yenilikçi çözümlerimiz.', buttonText: 'Yeşil Projeler', buttonLink: '#cevre', active: true }, { id: 4, title: 'Güvenli İnşaat, Güvenli Gelecek', description: 'ISO 45001 sertifikalı iş güvenliği sistemlerimiz ile 2000+ çalışanımızın güvenliğini en üst düzeyde tutuyoruz. Sıfır iş kazası hedefiyle çalışıyoruz.', buttonText: 'Güvenlik Önlemleri', buttonLink: '#guvenlik', active: true } ]; // Default FAQ data export const defaultFAQData: FAQ[] = [ { id: 1, question: 'A2 Metro Hattı projesi ne zaman tamamlanacak?', answer: 'A2 Metro Hattı projesinin 2026 yılı sonunda tamamlanması planlanmaktadır. Proje, Dikimevi-Natoyolu güzergâhında 6.5 kilometre uzunluğunda ve 5 istasyonlu bir metro hattı inşasını kapsamaktadır.', order: 1 }, { id: 2, question: 'Metro hattı hangi istasyonları kapsayacak?', answer: 'A2 Metro Hattı aşağıdaki istasyonları içerecektir: Dikimevi İstasyonu, Tuzluçayır İstasyonu, Natoyolu İstasyonu ve diğer ara istasyonlar. Toplam 5 istasyon bulunacaktır.', order: 2 }, { id: 3, question: 'İnşaat çalışmaları sırasında trafik nasıl etkilenecek?', answer: 'İnşaat çalışmaları sırasında geçici trafik düzenlemeleri uygulanacaktır. Alternatif güzergâhlar belirlenecek ve yönlendirme levhaları yerleştirilecektir. Vatandaşlarımızın anlayışına sığınıyoruz.', order: 3 }, { id: 4, question: 'Proje maliyeti ne kadar?', answer: 'A2 Metro Hattı projesinin toplam maliyeti yaklaşık 2.5 milyar TL olarak belirlenmiştir. Bu maliyet, tünel kazısı, istasyon inşaatı, ray döşeme ve elektrik-elektronik sistemleri kapsamaktadır.', order: 4 }, { id: 5, question: 'Çevreye etkisi ne olacak?', answer: 'Proje, çevre dostu teknolojiler kullanılarak gerçekleştirilmektedir. Çevresel Etki Değerlendirme (ÇED) raporu hazırlanmış ve gerekli izinler alınmıştır. İnşaat sırasında toz kontrolü ve gürültü önleme tedbirleri uygulanacaktır.', order: 5 }, { id: 6, question: 'İstasyonlar hangi özelliklere sahip olacak?', answer: 'İstasyonlar modern mimari tasarımla, enerji verimliliği, erişilebilirlik ve güvenlik ön planda tutularak inşa edilecektir. Güneş enerjisi panelleri, LED aydınlatma ve akıllı havalandırma sistemleri kullanılacaktır.', order: 6 }, { id: 7, question: 'İnşaatta hangi teknolojiler kullanılacak?', answer: 'Proje kapsamında TBM (Tunnel Boring Machine) tünel açma makinesi kullanılacaktır. Bu teknoloji sayesinde kazı çalışmaları daha hızlı ve güvenli şekilde gerçekleştirilecektir.', order: 7 }, { id: 8, question: 'Proje ilerleme durumu nasıl takip edilebilir?', answer: 'Bu web sitesi üzerinden canlı yayın, haberler ve medya galerisi bölümlerinden proje ilerleme durumunu takip edebilirsiniz. Ayrıca aylık ilerleme raporları yayınlanmaktadır.', order: 8 } ]; // Default Camera data export const defaultCameraData: Camera[] = [ { id: 1, name: 'Dikimevi İstasyonu - Ana Giriş', location: 'Dikimevi', videoUrl: 'https://www.youtube.com/embed/b9q88QDEcKg?autoplay=1', status: 'online', viewers: 1243, order: 1 }, { id: 2, name: 'Tuzluçayır İstasyonu - İnşaat Sahası', location: 'Tuzluçayır', videoUrl: 'https://www.youtube.com/embed/b9q88QDEcKg?autoplay=1', status: 'online', viewers: 856, order: 2 }, { id: 3, name: 'A2 Metro Hattı - Tünel Kazı Çalışması', location: 'Mamak', videoUrl: 'https://www.youtube.com/embed/b9q88QDEcKg?autoplay=1', status: 'online', viewers: 2134, order: 3 }, { id: 4, name: 'İstasyon Binası İç Mekan', location: 'Dikimevi', videoUrl: 'https://www.youtube.com/embed/b9q88QDEcKg?autoplay=1', status: 'online', viewers: 534, order: 4 } ]; // LocalStorage keys const KEYS = { SLIDER: 'a2metro_slider', NEWS: 'a2metro_news', MEDIA: 'a2metro_media', DOCUMENTS: 'a2metro_documents', METRO_STATIONS: 'a2metro_stations', LIVE_STREAM: 'a2metro_live_stream', SITE_SETTINGS: 'a2metro_site_settings', MESSAGES: 'a2metro_messages', FAQS: 'a2metro_faqs', CAMERAS: 'a2metro_cameras' }; // Helper functions const isBrowser = typeof window !== 'undefined'; export const dataStore = { // Slider getSlider: (): SliderItem[] => { if (!isBrowser) return defaultSliderData; const stored = localStorage.getItem(KEYS.SLIDER); return stored ? JSON.parse(stored) : defaultSliderData; }, setSlider: (data: SliderItem[]) => { if (isBrowser) { localStorage.setItem(KEYS.SLIDER, JSON.stringify(data)); } }, // News getNews: (): NewsItem[] => { if (!isBrowser) return newsData; const stored = localStorage.getItem(KEYS.NEWS); return stored ? JSON.parse(stored) : newsData; }, setNews: (data: NewsItem[]) => { if (isBrowser) { localStorage.setItem(KEYS.NEWS, JSON.stringify(data)); } }, addNews: (newsItem: Omit) => { const current = dataStore.getNews(); const newItem = { ...newsItem, id: Date.now() }; dataStore.setNews([newItem, ...current]); return newItem; }, updateNews: (id: number, newsItem: Partial) => { const current = dataStore.getNews(); const updated = current.map((item) => item.id === id ? { ...item, ...newsItem } : item ); dataStore.setNews(updated); }, deleteNews: (id: number) => { const current = dataStore.getNews(); const filtered = current.filter((item) => item.id !== id); dataStore.setNews(filtered); }, // Media getMedia: (): MediaItem[] => { if (!isBrowser) return mediaData; const stored = localStorage.getItem(KEYS.MEDIA); return stored ? JSON.parse(stored) : mediaData; }, setMedia: (data: MediaItem[]) => { if (isBrowser) { localStorage.setItem(KEYS.MEDIA, JSON.stringify(data)); } }, addMedia: (mediaItem: Omit) => { const current = dataStore.getMedia(); const newItem = { ...mediaItem, id: Date.now() }; dataStore.setMedia([newItem, ...current]); return newItem; }, updateMedia: (id: number, mediaItem: Partial) => { const current = dataStore.getMedia(); const updated = current.map((item) => item.id === id ? { ...item, ...mediaItem } : item ); dataStore.setMedia(updated); }, deleteMedia: (id: number) => { const current = dataStore.getMedia(); const filtered = current.filter((item) => item.id !== id); dataStore.setMedia(filtered); }, // Documents getDocuments: (): Document[] => { if (!isBrowser) return documentsData; const stored = localStorage.getItem(KEYS.DOCUMENTS); return stored ? JSON.parse(stored) : documentsData; }, setDocuments: (data: Document[]) => { if (isBrowser) { localStorage.setItem(KEYS.DOCUMENTS, JSON.stringify(data)); } }, addDocument: (document: Omit) => { const current = dataStore.getDocuments(); const newItem = { ...document, id: Date.now() }; dataStore.setDocuments([newItem, ...current]); return newItem; }, updateDocument: (id: number, document: Partial) => { const current = dataStore.getDocuments(); const updated = current.map((item) => item.id === id ? { ...item, ...document } : item ); dataStore.setDocuments(updated); }, deleteDocument: (id: number) => { const current = dataStore.getDocuments(); const filtered = current.filter((item) => item.id !== id); dataStore.setDocuments(filtered); }, // Metro Stations getMetroStations: (): MetroStation[] => { if (!isBrowser) return metroStations; const stored = localStorage.getItem(KEYS.METRO_STATIONS); return stored ? JSON.parse(stored) : metroStations; }, setMetroStations: (data: MetroStation[]) => { if (isBrowser) { localStorage.setItem(KEYS.METRO_STATIONS, JSON.stringify(data)); } }, updateStation: (id: number, station: Partial) => { const current = dataStore.getMetroStations(); const updated = current.map((item) => item.id === id ? { ...item, ...station } : item ); dataStore.setMetroStations(updated); }, // Live Stream getLiveStream: (): LiveStreamConfig => { if (!isBrowser) { return { url: 'https://www.youtube.com/embed/jfKfPfyJRdk?si=example', active: true, title: 'Canlı Yayın' }; } const stored = localStorage.getItem(KEYS.LIVE_STREAM); return stored ? JSON.parse(stored) : { url: 'https://www.youtube.com/embed/jfKfPfyJRdk?si=example', active: true, title: 'Canlı Yayın' }; }, setLiveStream: (config: LiveStreamConfig) => { if (isBrowser) { localStorage.setItem(KEYS.LIVE_STREAM, JSON.stringify(config)); } }, // Messages getMessages: (): Message[] => { if (!isBrowser) return []; const stored = localStorage.getItem(KEYS.MESSAGES); return stored ? JSON.parse(stored) : []; }, addMessage: (message: Omit) => { const messages = dataStore.getMessages(); const newMessage: Message = { ...message, id: Date.now().toString(), date: new Date().toISOString(), read: false }; messages.unshift(newMessage); if (isBrowser) { localStorage.setItem(KEYS.MESSAGES, JSON.stringify(messages)); } return newMessage; }, markMessageAsRead: (id: string) => { const messages = dataStore.getMessages(); const updated = messages.map(msg => msg.id === id ? { ...msg, read: true } : msg ); if (isBrowser) { localStorage.setItem(KEYS.MESSAGES, JSON.stringify(updated)); } }, deleteMessage: (id: string) => { const messages = dataStore.getMessages(); const filtered = messages.filter(msg => msg.id !== id); if (isBrowser) { localStorage.setItem(KEYS.MESSAGES, JSON.stringify(filtered)); } }, // Site Settings getSiteSettings: (): SiteSettings => { if (!isBrowser) { return { contact: { phone: '+90 (312) 123 45 67', email: 'info@a2metro.com.tr', address: 'Ankara Teknokent, Cyberpark C Blok Kat:3 No:301 Çankaya/ANKARA', kep: 'a2metro@hs03.kep.tr' }, social: { facebook: 'https://facebook.com/a2metro', twitter: 'https://twitter.com/a2metro', instagram: 'https://instagram.com/a2metro', youtube: 'https://youtube.com/@a2metro', linkedin: 'https://linkedin.com/company/a2metro' }, companyInfo: { name: 'A2 Metro', fullName: 'A2 Metro Yapı ve İnşaat A.Ş.', foundedYear: '2010' } }; } const stored = localStorage.getItem(KEYS.SITE_SETTINGS); if (stored) return JSON.parse(stored); // Default settings const defaultSettings: SiteSettings = { contact: { phone: '+90 (312) 123 45 67', email: 'info@a2metro.com.tr', address: 'Ankara Teknokent, Cyberpark C Blok Kat:3 No:301 Çankaya/ANKARA', kep: 'a2metro@hs03.kep.tr' }, social: { facebook: 'https://facebook.com/a2metro', twitter: 'https://twitter.com/a2metro', instagram: 'https://instagram.com/a2metro', youtube: 'https://youtube.com/@a2metro', linkedin: 'https://linkedin.com/company/a2metro' }, companyInfo: { name: 'A2 Metro', fullName: 'A2 Metro Yapı ve İnşaat A.Ş.', foundedYear: '2010' } }; localStorage.setItem(KEYS.SITE_SETTINGS, JSON.stringify(defaultSettings)); return defaultSettings; }, updateSiteSettings: (settings: Partial) => { const current = dataStore.getSiteSettings(); const updated = { ...current, ...settings, contact: { ...current.contact, ...(settings.contact || {}) }, social: { ...current.social, ...(settings.social || {}) }, companyInfo: { ...current.companyInfo, ...(settings.companyInfo || {}) } }; if (isBrowser) { localStorage.setItem(KEYS.SITE_SETTINGS, JSON.stringify(updated)); } }, // FAQs getFAQs: (): FAQ[] => { if (!isBrowser) return defaultFAQData; const stored = localStorage.getItem(KEYS.FAQS); return stored ? JSON.parse(stored) : defaultFAQData; }, setFAQs: (faqs: FAQ[]) => { if (isBrowser) { localStorage.setItem(KEYS.FAQS, JSON.stringify(faqs)); } }, addFAQ: (faq: Omit) => { const faqs = dataStore.getFAQs(); const newFAQ: FAQ = { ...faq, id: faqs.length > 0 ? Math.max(...faqs.map(f => f.id)) + 1 : 1 }; dataStore.setFAQs([...faqs, newFAQ]); return newFAQ; }, updateFAQ: (id: number, updates: Partial) => { const faqs = dataStore.getFAQs(); const updated = faqs.map(faq => faq.id === id ? { ...faq, ...updates } : faq ); dataStore.setFAQs(updated); }, deleteFAQ: (id: number) => { const faqs = dataStore.getFAQs(); dataStore.setFAQs(faqs.filter(faq => faq.id !== id)); }, // Cameras getCameras: (): Camera[] => { if (!isBrowser) return defaultCameraData; const stored = localStorage.getItem(KEYS.CAMERAS); return stored ? JSON.parse(stored) : defaultCameraData; }, setCameras: (cameras: Camera[]) => { if (isBrowser) { localStorage.setItem(KEYS.CAMERAS, JSON.stringify(cameras)); } }, addCamera: (camera: Omit) => { const cameras = dataStore.getCameras(); const newCamera: Camera = { ...camera, id: cameras.length > 0 ? Math.max(...cameras.map(c => c.id)) + 1 : 1 }; dataStore.setCameras([...cameras, newCamera]); return newCamera; }, updateCamera: (id: number, updates: Partial) => { const cameras = dataStore.getCameras(); const updated = cameras.map(camera => camera.id === id ? { ...camera, ...updates } : camera ); dataStore.setCameras(updated); }, deleteCamera: (id: number) => { const cameras = dataStore.getCameras(); dataStore.setCameras(cameras.filter(camera => camera.id !== id)); }, // Reset all data resetAll: () => { if (isBrowser) { localStorage.removeItem(KEYS.SLIDER); localStorage.removeItem(KEYS.NEWS); localStorage.removeItem(KEYS.MEDIA); localStorage.removeItem(KEYS.DOCUMENTS); localStorage.removeItem(KEYS.METRO_STATIONS); localStorage.removeItem(KEYS.LIVE_STREAM); localStorage.removeItem(KEYS.SITE_SETTINGS); localStorage.removeItem(KEYS.MESSAGES); localStorage.removeItem(KEYS.FAQS); localStorage.removeItem(KEYS.CAMERAS); } } };