6.5 KiB
6.5 KiB
Timeline Yapı Düzeltmeleri
Tarih: 2026-02-08
Sorunlar ve Çözümler
✅ SORUN 1: TimelineView.tsx - Bozuk Yapı
Lokasyon: src/pages/TripPlanner/TimelineView.tsx
Problem:
- Satır 75-143 arasında eşleşmeyen kapanış tag'leri vardı
- Fazladan bir
</div>kapanış tag'i React render hatasına neden oluyordu - İç içe geçmiş yapı bozulmuştu
Çözüm:
// ✅ DOĞRU YAPI
return (
// Line 81: Outer wrapper - Full height flex column
<div className="h-full flex flex-col">
{/* Line 83-109: Header - Fixed height, sticky */}
<div className="p-4 sm:p-6 border-b border-border/50 bg-background/80 shrink-0">
<div className="space-y-4">
{/* Day selectors and start point */}
</div>
</div>
{/* Line 111-179: Scroll container - Flex-1 with proper ref */}
<div ref={timelineScrollRef} className="flex-1 min-h-0">
<ScrollArea className="h-full">
<div className="p-4 sm:p-6">
{/* Content: AI recommendations, DND context, timeline */}
</div>
</ScrollArea>
</div>
</div> {/* Line 180: Closes outer wrapper */}
);
Değişiklikler:
- Fazladan
</div>tag'i kaldırıldı - Doğru kapanış sırası sağlandı:
- Line 177:
</div>- Content padding kapanışı - Line 178:
</ScrollArea>- ScrollArea kapanışı - Line 179:
</div>- timelineScrollRef div kapanışı - Line 180:
</div>- Outer wrapper kapanışı
- Line 177:
✅ SORUN 2: TripPlannerMobile.tsx - Eksik Flex Layout
Lokasyon: src/pages/TripPlanner/TripPlannerMobile.tsx
Problem:
- Container
flex-1 relativeama parent height tanımlı değildi - ViewSwitcher positioning belirsizdi
- TimelineView/MapView containers
h-fullama parent flex column değildi
Çözüm:
export const TripPlannerMobile = ({ activeTab, setActiveTab, timelineProps, mapProps }) => {
return (
// ✅ Mobile only (<sm), full height flex container
<div className="flex sm:hidden flex-col flex-1 relative overflow-hidden">
{/* ✅ Tab content - Flex-1 to fill space */}
<div className="flex-1 min-h-0 overflow-hidden">
{activeTab === 'timeline' ? (
<div className="w-full h-full">
<TimelineView {...timelineProps} />
</div>
) : (
<div className="w-full h-full">
<MapView {...mapProps} />
</div>
)}
</div>
{/* ✅ Tab switcher - Fixed at bottom */}
<div className="shrink-0">
<ViewSwitcher activeTab={activeTab} onTabChange={setActiveTab} />
</div>
</div>
);
};
Değişiklikler:
- Ana container'a
flex-coleklendi (dikey düzen için) - Tab content için wrapper div eklendi:
flex-1 min-h-0 overflow-hidden - ViewSwitcher için wrapper div eklendi:
shrink-0(sabit yükseklik için) - Bu yapı sayesinde:
- Timeline/Map içeriği tüm boş alanı doldurur
- ViewSwitcher her zaman altta sabit kalır
- Overflow düzgün çalışır
✅ SORUN 3: TripPlannerDesktop.tsx - Zaten Doğru
Lokasyon: src/pages/TripPlanner/TripPlannerDesktop.tsx
Durum: ✅ Değişiklik gerekmedi
export const TripPlannerDesktop = ({ timelineProps, mapProps }) => {
return (
<div className="hidden sm:flex flex-1 overflow-hidden">
{/* Timeline - Fixed width */}
<div className="w-[450px] lg:w-[500px] shrink-0 h-full border-r border-border/50 bg-background/50">
<TimelineView {...timelineProps} />
</div>
{/* Map - Flexible width */}
<div className="flex-1 h-full relative">
<MapView {...mapProps} />
</div>
</div>
);
};
Yapı Özeti
TimelineView İç Yapısı
<div className="h-full flex flex-col"> ← Outer wrapper
├─ <div className="...shrink-0"> ← Header (fixed height)
│ └─ Day selectors, start point
│
└─ <div ref={timelineScrollRef} className="flex-1 min-h-0"> ← Scroll container
└─ <ScrollArea className="h-full">
└─ <div className="p-4 sm:p-6"> ← Content padding
├─ AI Tour Recommendation
├─ DndContext
│ ├─ DayTimeline
│ └─ DragOverlay
└─ AISuggestions
Mobile Layout Yapısı
<div className="flex sm:hidden flex-col flex-1 relative overflow-hidden">
├─ <div className="flex-1 min-h-0 overflow-hidden"> ← Content area
│ └─ TimelineView | MapView
│
└─ <div className="shrink-0"> ← Tab switcher
└─ ViewSwitcher (fixed positioned)
Desktop Layout Yapısı
<div className="hidden sm:flex flex-1 overflow-hidden">
├─ <div className="w-[450px] lg:w-[500px] shrink-0"> ← Timeline sidebar
│ └─ TimelineView
│
└─ <div className="flex-1"> ← Map area
└─ MapView
Test Edilmesi Gerekenler
✅ Lint Kontrolü
npm run lint
Sonuç: ✅ Tüm dosyalar başarıyla geçti
🧪 Manuel Test Listesi
-
Desktop Görünüm (≥640px):
- Timeline sidebar sabit genişlikte görünüyor
- Map alanı kalan alanı dolduruyor
- Timeline içinde scroll çalışıyor
- Drag & drop çalışıyor
-
Mobile Görünüm (<640px):
- Tab switcher altta görünüyor
- Timeline/Map arası geçiş çalışıyor
- Timeline scroll çalışıyor
- Map tam ekran görünüyor
- ViewSwitcher her zaman görünür
-
Genel:
- Hiçbir console hatası yok
- Layout bozulması yok
- Tüm interaktif öğeler çalışıyor
Teknik Detaylar
Flexbox Kullanımı
flex-1: Kalan alanı doldururshrink-0: Küçülmeyi engeller (sabit boyut)min-h-0: Flex child'ların overflow'u düzgün çalışması için gerekli
Scroll Yönetimi
overflow-hidden: Parent container'da scroll'u engellerScrollArea: Shadcn/ui custom scroll component'iref={timelineScrollRef}: Programatik scroll kontrolü için
Responsive Breakpoints
sm:hidden: Mobile only (< 640px)hidden sm:flex: Desktop only (≥ 640px)lg:w-[500px]: Large screens için daha geniş sidebar
Sonuç
✅ Tüm yapısal sorunlar çözüldü ✅ Lint kontrolü başarılı ✅ Responsive layout düzgün çalışıyor
Artık Timeline ve Map görünümleri hem desktop hem mobile'da düzgün çalışmalı.