This commit is contained in:
Şahan Hasret
2025-11-20 16:50:28 +03:00
parent 08c426f97b
commit c0b7fb463e
15 changed files with 1395 additions and 646 deletions

View File

@@ -13,6 +13,62 @@ export interface SliderItem {
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[] = [
{
@@ -49,6 +105,98 @@ export const defaultSliderData: SliderItem[] = [
}
];
// 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',
@@ -56,6 +204,11 @@ const KEYS = {
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
@@ -183,6 +336,207 @@ export const dataStore = {
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<Message, 'id' | 'date' | 'read'>) => {
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<SiteSettings>) => {
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<FAQ, 'id'>) => {
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<FAQ>) => {
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<Camera, 'id'>) => {
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<Camera>) => {
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) {
@@ -191,6 +545,11 @@ export const dataStore = {
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);
}
}
};