Proje: Okul B2B App · Hub: Okul B2B App — Incidents

LoadingScreen’de Takılı Kalma — Sessiz Hata Sorunu

Semptom

Kullanıcı şikayetleri: “Uygulama açılış ekranında takılıyor, hiçbir şey olmuyor, kapatıp açmam gerekiyor.”

Root Cause

  1. CompanyContext ve SchoolContext hatayı error state’te tutuyordu ama kullanıcıya göstermiyordu — sadece log’a yazıyordu.
  2. API error ya da ConnectionError olunca setIsReady(false) yapılıyor, kullanıcı LoadingScreen’de sonsuz kalıyor.
  3. <Toast /> yalnızca isReady=true olunca mount oluyordu (kökte AuthenticatedApp içinde render ediliyordu). LoadingScreen’de Toast mount olmadığı için Toast.show() boşa gidecekti.

Çözüm

1. Toast’ı !isReady branch’ine de ekle

app/_layout.tsx:

if (!isReady) {
  return (
    <>
      <LoadingScreen/>
      <Toast config={toastConfig} topOffset={75}/>
    </>
  );
}

2. Context error’larını toast olarak surface et

CompanyContext.tsx:

const lastErrorToastRef = useRef<string | null>(null);
useEffect(() => {
  if (error && error !== lastErrorToastRef.current) {
    lastErrorToastRef.current = error;
    AlertNotification.showError('Bağlantı Sorunu', error, 5000);
  } else if (!error) {
    lastErrorToastRef.current = null;
  }
}, [error]);

SchoolContext.tsx’te aynı pattern (“Okul Bilgileri Yüklenemedi” başlığıyla).

3. Network listener ekle (yükleme sırasında internet gitmesi)

CompanyContext.tsx:

useEffect(() => {
  if (isReady) return;
  const unsubscribe = networkManager.addListener((state) => {
    if (!state.isConnected || state.isInternetReachable === false) {
      AlertNotification.showError('İnternet Bağlantısı Yok', 'Lütfen bağlantınızı kontrol edin', 5000);
    }
  });
  return unsubscribe;
}, [isReady]);

lastErrorToastRef ile aynı hatanın spam olması engellendi (ref, re-show için null’a dönebilir).

Sonuç

DurumÖnceSonra
Company API 500LoadingScreen sonsuzToast: “Bağlantı Sorunu”
Wifi kesilirseLoadingScreen sonsuzToast: “İnternet Bağlantısı Yok”
Okul API timeoutLoadingScreen sonsuzToast: “Okul Bilgileri Yüklenemedi”

Sınırlama

Şu an sadece toast gösteriliyor, “Tekrar Dene” butonu yok. Kullanıcı toast kaybolunca hâlâ uygulamayı kapatıp açmak zorunda. İleride LoadingScreen’e retry butonu eklenebilir (hatta timeout sonrası otomatik retry).

Dosyalar

  • app/_layout.tsx<Toast> LoadingScreen branch’inde de
  • contexts/CompanyContext.tsx — error useEffect + network listener
  • contexts/SchoolContext.tsx — error useEffect