Ana Sayfa Fix

This commit is contained in:
Şahan Hasret
2025-11-18 15:19:50 +03:00
parent ab43ad61e9
commit 08c426f97b
14 changed files with 2764 additions and 1139 deletions

196
lib/dataStore.ts Normal file
View File

@@ -0,0 +1,196 @@
// 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;
}
// 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
}
];
// LocalStorage keys
const KEYS = {
SLIDER: 'a2metro_slider',
NEWS: 'a2metro_news',
MEDIA: 'a2metro_media',
DOCUMENTS: 'a2metro_documents',
METRO_STATIONS: 'a2metro_stations',
};
// 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<NewsItem, 'id'>) => {
const current = dataStore.getNews();
const newItem = { ...newsItem, id: Date.now() };
dataStore.setNews([newItem, ...current]);
return newItem;
},
updateNews: (id: number, newsItem: Partial<NewsItem>) => {
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<MediaItem, 'id'>) => {
const current = dataStore.getMedia();
const newItem = { ...mediaItem, id: Date.now() };
dataStore.setMedia([newItem, ...current]);
return newItem;
},
updateMedia: (id: number, mediaItem: Partial<MediaItem>) => {
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<Document, 'id'>) => {
const current = dataStore.getDocuments();
const newItem = { ...document, id: Date.now() };
dataStore.setDocuments([newItem, ...current]);
return newItem;
},
updateDocument: (id: number, document: Partial<Document>) => {
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<MetroStation>) => {
const current = dataStore.getMetroStations();
const updated = current.map((item) =>
item.id === id ? { ...item, ...station } : item
);
dataStore.setMetroStations(updated);
},
// 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);
}
}
};