Proje: OkulUp · Hub: OkulUp — Architecture
Navigation Architecture
Yapı
OkulUp iki katmanlı navigasyon kullanıyor:
1. Expo Router (File-Based)
app/
├── _layout.tsx # Root layout — provider'lar + Stack
├── index.tsx # Redirect: auth varsa /home, yoksa /login
├── (auth)/ # Auth flow (login, register, consent, forgot-password)
├── (tabs)/ # Ana tab ekranları
│ ├── _layout.tsx # TabBar inject eden custom layout
│ ├── home.tsx
│ ├── announcements.tsx
│ ├── messages.tsx
│ ├── notifications.tsx
│ ├── profile.tsx
│ ├── calendar.tsx
│ ├── payments.tsx
│ ├── tracking.tsx
│ ├── reports.tsx
│ ├── assignments.tsx
│ ├── meal-menus.tsx
│ └── ...
├── (admin)/ # Admin-only ekranlar (users CRUD)
├── announcement/[id].tsx
├── meal-menu/[id].tsx
├── chat/[id].tsx
├── settings/
└── ...
2. Custom TabBar
(tabs)/_layout.tsx içinde TabBar bileşeni kullanılıyor — Expo’nun default tab navigator yok.
TabBar dinamik: getTabItems(context) fonksiyonu kullanıcı rolüne ve mobileConfig’e göre gösterilecek tab’ları belirliyor. Her oturumda tab yapısı değişebilir.
Tab sırası:
- Home (her zaman)
- Announcements (view permission varsa)
- Messages veya QuickAccess (role’e göre)
- QuickAccess (role’e göre: admin→reports, teacher→attendance, parent→tracking, student→assignments)
- Profile (her zaman)
3. Custom Drawer
Expo Router Drawer kullanılmıyor. Tamamen custom Drawer.tsx:
DrawerProvider+DrawerContextile açma/kapama state’i- Genişlik:
SCREEN_WIDTH * 0.78 - Animasyon:
react-native-reanimatedile sliding - Drawer’da navigation item’ları
getDrawerItems(context)ile belirleniyor - Drawer’daki item’lar
surfaces: ['drawer']olanlar
Navigation Item Sistemi
Her navigation item’ın surfaces alanı var: 'tab' | 'drawer'.
- Bir item hem tab hem drawer’da görünebilir (e.g., payments, tracking)
- Bazıları sadece drawer’da (e.g., calendar, events, meal-menus)
- Bazıları sadece tab’da (e.g., notifications, profile)
Related
- tech-stack — kullanılan kütüphaneler
- permission-system — navigation visibility nasıl belirleniyor