197 lines
6.3 KiB
TypeScript
197 lines
6.3 KiB
TypeScript
// 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);
|
||
}
|
||
}
|
||
};
|