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

ContextDosyaSorumluluk
ThemeContextcontexts/ThemeContext.tsxDark/light mode
CompanyContextcontexts/CompanyContext.tsxFirma seçimi, firma verisi
SchoolContextcontexts/SchoolContext.tsxOkul seçimi, okul listesi
NotificationContextcontexts/NotificationContext.tsxBildirim 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.