Proje: Okul B2B App · Hub: Okul B2B App — Conventions
Context State Yönetimi
Bu projede global state için Redux/Zustand kullanılmaz. Tümü React Context API ile yönetilir.
Context’ler
| Context | Dosya | Sorumluluk |
|---|---|---|
ThemeContext | contexts/ThemeContext.tsx | Dark/light mode |
CompanyContext | contexts/CompanyContext.tsx | Firma seçimi, firma verisi |
SchoolContext | contexts/SchoolContext.tsx | Okul seçimi, okul listesi |
NotificationContext | contexts/NotificationContext.tsx | Bildirim durumu |
useCompany() Hook
const {
company, // Seçili firma verisi (Company | null)
selectedCompanyId, // Seçili firma ID'si
setSelectedCompanyId, // Firma değiştirme
isReady, // Context yükleme tamamlandı mı?
isLoading, // Yükleniyor mu?
needsCompanySelection, // Firma seçim ekranı gösterilmeli mi?
hasNoCompanies, // Hiç firma yok mu?
error, // Hata mesajı
} = useCompany();useSchool() Hook
const {
schools, // Tüm okullar listesi
selectedSchool, // Seçili okul (SchoolUI | null)
selectedSchoolId, // Seçili okul ID'si
setSelectedSchool, // Okul değiştirme
isLoading,
error,
} = useSchool();CompanyProvider Remount Stratejisi
Yeni login’de CompanyProvider zorla remount edilir (key={authKey}). Bu isReady state’ini sıfırlar ve firma verisinin taze yüklenmesini sağlar.
// _layout.tsx içinde
<CompanyProvider key={`auth-${authKey}`}>
...
</CompanyProvider>authKey her başarılı login’de setAuthKey(prev => prev + 1) ile artırılır.
School Stats Lazy Loading
SchoolContext okul listesini yükledikten sonra istatistikleri (lead sayısı, fotoğraf sayısı) ayrıca ve paralel olarak yükler. Bu ilk ekran render’ını hızlandırır:
const [leadsResponse, galleryResponse] = await Promise.all([
LeadsService.getLeads(1, 1, school.id),
GalleryService.getPhotos(school.id, 1, 100)
]);Terms Guard
CompanyProvider mount edilmeden önce TermsGuard kullanım şartları kabulünü kontrol eder. Kabul edilmemişse TermsAcceptanceModal gösterilir.
Related
- data-flow — Context’lerin akıştaki yeri
- firma-okul-hiyerarsisi — CompanyContext’in domain context’i