Files
gulermak_metro/app/page.tsx
Şahan Hasret 08c426f97b Ana Sayfa Fix
2025-11-18 15:19:50 +03:00

515 lines
26 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use client';
import { useState, useEffect } from 'react';
import Image from 'next/image';
import Link from 'next/link';
import Header from "@/components/Header";
import MetroLine from "@/components/MetroLine";
import Footer from "@/components/Footer";
import DocumentsSection from "@/components/DocumentsSection";
import MediaGallery from "@/components/MediaGallery";
import ComplaintForm from "@/components/ComplaintForm";
import ContactSection from "@/components/ContactSection";
import { dataStore } from '@/lib/dataStore';
export default function Home() {
const [showLiveStream, setShowLiveStream] = useState(false);
const [showNews, setShowNews] = useState(false);
const [selectedNews, setSelectedNews] = useState<number | null>(null);
const [showDocuments, setShowDocuments] = useState(false);
const [showMediaGallery, setShowMediaGallery] = useState(false);
const [showComplaintForm, setShowComplaintForm] = useState(false);
const [showContact, setShowContact] = useState(false);
const [currentSlide, setCurrentSlide] = useState(0);
// Gerçek veriler için state
const [heroSlides, setHeroSlides] = useState(dataStore.getSlider());
const [newsData, setNewsData] = useState(dataStore.getNews());
// Verileri yükle
useEffect(() => {
setHeroSlides(dataStore.getSlider());
setNewsData(dataStore.getNews());
}, []);
// Modal açıldığında yukarı kaydır - KALDIRILDI (kullanıcı deneyimi için)
// useEffect(() => {
// if (showLiveStream || showNews || showDocuments || showMediaGallery || showComplaintForm || showContact) {
// window.scrollTo({ top: 0, behavior: 'smooth' });
// }
// }, [showLiveStream, showNews, showDocuments, showMediaGallery, showComplaintForm, showContact]);
// Auto slider - aktif slider sayısına göre
useEffect(() => {
const activeSlides = heroSlides.filter(slide => slide.active);
if (activeSlides.length === 0) return;
const timer = setInterval(() => {
setCurrentSlide((prev) => (prev + 1) % activeSlides.length);
}, 10000); // 10 saniyede bir değiş
return () => clearInterval(timer);
}, [heroSlides]);
// Featured news (ana sayfada gösterilecek haberler)
const featuredNews = newsData.filter(news => news.featured).slice(0, 4);
// Aktif slider'ları al
const activeSlides = heroSlides.filter(slide => slide.active);
return (
<div className="min-h-screen bg-[#003366]">
<Header />
{/* Hero Video Section */}
<div className="relative w-full h-[60vh] md:h-screen pt-20">
{/* Video Background */}
<div className="absolute inset-0 overflow-hidden">
<video
className="w-full h-full object-cover"
autoPlay
loop
muted
playsInline
>
<source src="/assets/high-speed-metro-design-template-559897134973592cb13d708cec30ea39_screen.mp4" type="video/mp4" />
Tarayıcınız video etiketini desteklemiyor.
</video>
{/* Dark Overlay */}
<div className="absolute inset-0 bg-linear-to-b from-[#003366]/70 via-[#004B87]/50 to-[#003366]/90"></div>
</div>
{/* Content Overlay */}
<div className="relative z-10 h-full flex items-center">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 w-full">
<div className="max-w-3xl">
{/* Slider Content */}
<div className="relative">
{activeSlides.map((slide, index) => (
<div
key={slide.id}
className={`transition-all duration-700 ${
index === currentSlide
? 'opacity-100 translate-x-0'
: 'opacity-0 absolute inset-0 translate-x-full pointer-events-none'
}`}
>
<h1 className="text-3xl md:text-4xl lg:text-6xl font-bold text-white mb-4 md:mb-6 leading-tight">
{slide.title}
</h1>
<p className="text-base md:text-lg lg:text-xl text-[#F8F9FA] mb-6 md:mb-8 leading-relaxed">
{slide.description}
</p>
{/* Action Buttons - Mobilde gizle */}
<div className="hidden md:flex flex-col sm:flex-row gap-4">
<button className="px-8 py-4 bg-[#00B4D8] text-white font-semibold rounded-lg hover:bg-[#48CAE4] transition-all duration-300 shadow-lg shadow-[#00B4D8]/30 flex items-center justify-center space-x-2">
<span>{slide.buttonText}</span>
<svg className="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
</svg>
</button>
<button className="px-8 py-4 bg-transparent border-2 border-white text-white font-semibold rounded-lg hover:bg-white hover:text-[#004B87] transition-all duration-300">
Tüm Duyuruları Gör
</button>
</div>
</div>
))}
</div>
{/* Pagination Dots & Navigation */}
<div className="hidden md:flex items-center justify-between mt-12">
{/* Dots */}
<div className="flex space-x-3">
{activeSlides.map((_, index) => (
<button
key={index}
onClick={() => setCurrentSlide(index)}
className={`h-3 rounded-full transition-all duration-300 ${
index === currentSlide
? 'w-8 bg-white'
: 'w-3 bg-white/30 hover:bg-white/50'
}`}
aria-label={`Slide ${index + 1}`}
/>
))}
</div>
{/* Arrow Navigation */}
<div className="flex space-x-2">
<button
onClick={() => setCurrentSlide((prev) => (prev - 1 + activeSlides.length) % activeSlides.length)}
className="w-10 h-10 rounded-full bg-white/20 hover:bg-white/30 flex items-center justify-center transition-all backdrop-blur-sm"
aria-label="Previous slide"
>
<svg className="w-6 h-6 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
</svg>
</button>
<button
onClick={() => setCurrentSlide((prev) => (prev + 1) % activeSlides.length)}
className="w-10 h-10 rounded-full bg-white/20 hover:bg-white/30 flex items-center justify-center transition-all backdrop-blur-sm"
aria-label="Next slide"
>
<svg className="w-6 h-6 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
</svg>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
{/* Alt Menü Kartları - Mobilde normal akış, Desktop'ta overlay */}
<div className="relative md:absolute md:bottom-0 md:left-0 md:right-0 z-20 md:translate-y-3/4 bg-[#003366] md:bg-transparent py-6 md:py-0">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-3 md:gap-4">
{/* Canlı Yayın */}
<button
onClick={() => {
setShowLiveStream(!showLiveStream);
setShowNews(false);
setShowDocuments(false);
setShowMediaGallery(false);
setShowComplaintForm(false);
setShowContact(false);
}}
className="bg-white rounded-xl p-4 md:p-6 shadow-lg hover:shadow-xl transition-all duration-300 hover:-translate-y-1 flex flex-col items-center text-center group"
>
<div className="w-10 h-10 md:w-12 md:h-12 mb-2 md:mb-3 text-[#004B87] group-hover:text-[#00B4D8] transition-colors">
<svg fill="currentColor" viewBox="0 0 24 24">
<path d="M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4zM14 13h-3v3H9v-3H6v-2h3V8h2v3h3v2z"/>
</svg>
</div>
<span className="text-[#004B87] font-semibold text-xs md:text-sm">Canlı Yayın</span>
</button>
{/* Haberler */}
<button
onClick={() => {
setShowNews(!showNews);
setShowLiveStream(false);
setShowDocuments(false);
setShowMediaGallery(false);
setShowComplaintForm(false);
setShowContact(false);
}}
className="bg-white rounded-xl p-4 md:p-6 shadow-lg hover:shadow-xl transition-all duration-300 hover:-translate-y-1 flex flex-col items-center text-center group"
>
<div className="w-10 h-10 md:w-12 md:h-12 mb-2 md:mb-3 text-[#004B87] group-hover:text-[#00B4D8] transition-colors">
<svg fill="currentColor" viewBox="0 0 24 24">
<path d="M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4.86 8.86l-3 3.87L9 13.14 6 17h12l-3.86-5.14z"/>
</svg>
</div>
<span className="text-[#004B87] font-semibold text-xs md:text-sm">Haberler</span>
</button>
{/* Belgeler */}
<button
onClick={() => {
setShowDocuments(!showDocuments);
setShowLiveStream(false);
setShowNews(false);
setShowMediaGallery(false);
setShowComplaintForm(false);
setShowContact(false);
}}
className="bg-white rounded-xl p-4 md:p-6 shadow-lg hover:shadow-xl transition-all duration-300 hover:-translate-y-1 flex flex-col items-center text-center group"
>
<div className="w-10 h-10 md:w-12 md:h-12 mb-2 md:mb-3 text-[#004B87] group-hover:text-[#00B4D8] transition-colors">
<svg fill="currentColor" viewBox="0 0 24 24">
<path d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z"/>
</svg>
</div>
<span className="text-[#004B87] font-semibold text-xs md:text-sm">Belgeler</span>
</button>
{/* Medya Galerisi */}
<button
onClick={() => {
setShowMediaGallery(!showMediaGallery);
setShowLiveStream(false);
setShowNews(false);
setShowDocuments(false);
setShowComplaintForm(false);
setShowContact(false);
}}
className="bg-white rounded-xl p-4 md:p-6 shadow-lg hover:shadow-xl transition-all duration-300 hover:-translate-y-1 flex flex-col items-center text-center group"
>
<div className="w-10 h-10 md:w-12 md:h-12 mb-2 md:mb-3 text-[#004B87] group-hover:text-[#00B4D8] transition-colors">
<svg fill="currentColor" viewBox="0 0 24 24">
<path d="M4 6h18V4H4c-1.1 0-2 .9-2 2v11H0v3h14v-3H4V6zm19 2h-6c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h6c.55 0 1-.45 1-1V9c0-.55-.45-1-1-1zm-1 9h-4v-7h4v7z"/>
</svg>
</div>
<span className="text-[#004B87] font-semibold text-xs md:text-sm">Medya Galerisi</span>
</button>
{/* Dilek-Şikayet */}
<button
onClick={() => {
setShowComplaintForm(!showComplaintForm);
setShowLiveStream(false);
setShowNews(false);
setShowDocuments(false);
setShowMediaGallery(false);
setShowContact(false);
}}
className="bg-white rounded-xl p-4 md:p-6 shadow-lg hover:shadow-xl transition-all duration-300 hover:-translate-y-1 flex flex-col items-center text-center group"
>
<div className="w-10 h-10 md:w-12 md:h-12 mb-2 md:mb-3 text-[#004B87] group-hover:text-[#00B4D8] transition-colors">
<svg fill="currentColor" viewBox="0 0 24 24">
<path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 9h-2V5h2v6zm0 4h-2v-2h2v2z"/>
</svg>
</div>
<span className="text-[#004B87] font-semibold text-xs md:text-sm">Dilek-Şikayet</span>
</button>
{/* E-İletişim */}
<button
onClick={() => {
setShowContact(!showContact);
setShowLiveStream(false);
setShowNews(false);
setShowDocuments(false);
setShowMediaGallery(false);
setShowComplaintForm(false);
}}
className="bg-white rounded-xl p-4 md:p-6 shadow-lg hover:shadow-xl transition-all duration-300 hover:-translate-y-1 flex flex-col items-center text-center group"
>
<div className="w-10 h-10 md:w-12 md:h-12 mb-2 md:mb-3 text-[#004B87] group-hover:text-[#00B4D8] transition-colors">
<svg fill="currentColor" viewBox="0 0 24 24">
<path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/>
</svg>
</div>
<span className="text-[#004B87] font-semibold text-xs md:text-sm">E-İletişim</span>
</button>
</div>
</div>
</div>
{/* Canlı Yayın Video Bölümü */}
{showLiveStream && (
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 pt-8 md:pt-32 pb-8">
<div className="bg-white rounded-2xl shadow-2xl p-6 lg:p-8">
<div className="flex items-center justify-between mb-6">
<div className="flex items-center space-x-3">
<div className="w-3 h-3 bg-red-500 rounded-full animate-pulse"></div>
<h2 className="text-2xl font-bold text-[#004B87]">Canlı Yayın</h2>
</div>
<button
onClick={() => setShowLiveStream(false)}
className="text-gray-500 hover:text-red-500 transition-colors"
>
<svg className="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
{/* YouTube Video Embed */}
<div className="relative w-full" style={{paddingBottom: '56.25%'}}>
<iframe
className="absolute top-0 left-0 w-full h-full rounded-lg"
src="https://www.youtube.com/embed/b9q88QDEcKg?autoplay=1"
title="Canlı Yayın"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
></iframe>
</div>
<p className="mt-4 text-gray-600 text-sm">
A2 Metro Hattı İnşaat Çalışmaları - Canlı Yayın
</p>
</div>
</div>
)}
{/* Haberler Bölümü */}
{showNews && (
<div className={`max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 ${showLiveStream ? 'pt-8' : 'pt-8 md:pt-32'} pb-8`}>
<div className="bg-white rounded-2xl shadow-2xl p-6 lg:p-8">
<div className="flex items-center justify-between mb-6">
<div className="flex items-center space-x-3">
<div className="w-10 h-10 bg-[#004B87] rounded-lg flex items-center justify-center">
<svg className="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24">
<path d="M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4.86 8.86l-3 3.87L9 13.14 6 17h12l-3.86-5.14z"/>
</svg>
</div>
<h2 className="text-2xl font-bold text-[#004B87]">Son Haberler</h2>
</div>
<div className="flex items-center space-x-3">
<Link
href="/haberler"
className="px-4 py-2 bg-[#00B4D8] text-white rounded-lg hover:bg-[#0096C7] transition-all font-semibold text-sm flex items-center space-x-2"
>
<span>Tümünü Gör</span>
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
</svg>
</Link>
<button
onClick={() => setShowNews(false)}
className="text-gray-500 hover:text-red-500 transition-colors"
>
<svg className="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
</div>
{/* Haberler Grid veya Detay */}
{selectedNews === null ? (
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
{featuredNews.map((news) => (
<div key={news.id} className="bg-gray-50 rounded-xl overflow-hidden hover:shadow-lg transition-all duration-300 hover:-translate-y-1">
{/* Haber Görseli */}
<div className="h-48 overflow-hidden">
<Image
src={news.image}
alt={news.title}
width={400}
height={192}
className="w-full h-full object-cover hover:scale-110 transition-transform duration-500"
/>
</div>
{/* Haber İçeriği */}
<div className="p-5">
<div className="flex items-center space-x-2 text-sm text-gray-500 mb-2">
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z"/>
</svg>
<span>{news.date}</span>
</div>
<h3 className="text-lg font-bold text-[#004B87] mb-2 line-clamp-2">
{news.title}
</h3>
<p className="text-gray-600 text-sm line-clamp-3 mb-4">
{news.summary}
</p>
<button
onClick={() => setSelectedNews(news.id)}
className="text-[#00B4D8] hover:text-[#004B87] font-semibold text-sm flex items-center space-x-1 transition-colors"
>
<span>Devamını Oku</span>
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
</svg>
</button>
</div>
</div>
))}
</div>
) : (
/* Haber Detayı */
<div className="animate-fadeIn">
{newsData.filter(n => n.id === selectedNews).map((news) => (
<div key={news.id}>
{/* Geri Butonu */}
<button
onClick={() => setSelectedNews(null)}
className="flex items-center space-x-2 text-[#00B4D8] hover:text-[#004B87] font-semibold mb-6 transition-colors"
>
<svg className="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
</svg>
<span>Haberlere Dön</span>
</button>
{/* Detay İçerik */}
<div className="bg-white rounded-xl overflow-hidden">
{/* Büyük Görsel */}
<div className="h-96 overflow-hidden">
<Image
src={news.image}
alt={news.title}
width={800}
height={384}
className="w-full h-full object-cover"
/>
</div>
{/* Detay Metni */}
<div className="p-8">
<div className="flex items-center space-x-2 text-sm text-gray-500 mb-4">
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z"/>
</svg>
<span>{news.date}</span>
</div>
<h1 className="text-3xl font-bold text-[#004B87] mb-6">
{news.title}
</h1>
<div className="prose max-w-none">
<p className="text-gray-700 text-lg leading-relaxed mb-4">
{news.content}
</p>
</div>
{/* Alt Bilgi */}
<div className="mt-8 pt-6 border-t border-gray-200">
<div className="flex items-center justify-between">
<div className="flex items-center space-x-4">
<span className="text-sm text-gray-500">Paylaş:</span>
<button className="text-[#00B4D8] hover:text-[#004B87] transition-colors">
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z"/>
</svg>
</button>
</div>
<button
onClick={() => setSelectedNews(null)}
className="px-6 py-2 bg-[#00B4D8] text-white rounded-lg hover:bg-[#004B87] transition-colors"
>
Kapat
</button>
</div>
</div>
</div>
</div>
</div>
))}
</div>
)}
</div>
</div>
)}
{/* Belgeler Bölümü */}
{showDocuments && <DocumentsSection onClose={() => setShowDocuments(false)} />}
{/* Medya Galerisi Bölümü */}
{showMediaGallery && <MediaGallery onClose={() => setShowMediaGallery(false)} />}
{/* Dilek-Şikayet Formu */}
{showComplaintForm && <ComplaintForm onClose={() => setShowComplaintForm(false)} />}
{/* E-İletişim Bölümü */}
{showContact && <ContactSection onClose={() => setShowContact(false)} />}
{/* Ana İçerik - Kartlar için üstten boşluk */}
<main className={`max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 ${showLiveStream || showNews || showDocuments || showMediaGallery || showComplaintForm || showContact ? 'pt-8' : 'pt-8 md:pt-32'} pb-12`}>
<div className="text-center mb-16">
<h2 className="text-3xl font-bold text-white mb-4">
Metro Hat Durumları
</h2>
<p className="text-lg text-[#F8F9FA] max-w-2xl mx-auto mb-8">
Ankara Metro hatları ve durak bilgileri. Metro treni şu anda hangi durakta görebilirsiniz.
</p>
</div>
{/* Metro İnşaat Projesi - Animasyonlu */}
<MetroLine />
</main>
{/* Footer */}
<Footer />
</div>
);
}