# رفع مشکل فریز شدن اپ موبایل با اینترنت داخلی

## مشکل
هنگام استفاده از اینترنت داخلی (بدون فیلترشکن)، اپلیکیشن موبایل در صفحه لودینگ فریز می‌شد و باز نمی‌شد. این به دلیل timeout های طولانی در موارد زیر بود:

1. **Firebase Initialization**: تلاش برای اتصال به سرورهای گوگل تا 30 ثانیه
2. **Firebase Notifications**: دریافت توکن FCM از سرورهای گوگل
3. **User Info Fetch**: درخواست‌های API بدون محدودیت زمانی
4. **Server Data Fetch**: دریافت اطلاعات سرور بدون timeout

## تغییرات انجام شده

### 1. Firebase Initialization با Timeout ([main.dart](lib/main.dart))

```dart
// قبل
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
await FirebaseApi().initNotification();

// بعد
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform)
    .timeout(
  const Duration(seconds: 10),
  onTimeout: () {
    debugPrint("Firebase initialization timed out - continuing without Firebase");
    throw TimeoutException('Firebase initialization timeout', const Duration(seconds: 10));
  },
);

await FirebaseApi().initNotification().timeout(
  const Duration(seconds: 5),
  onTimeout: () {
    debugPrint("Firebase notification init timed out - continuing");
  },
);
```

**مزایا:**
- اگر Firebase در 10 ثانیه initialize نشد، اپ ادامه می‌دهد
- اگر FCM توکن دریافت نشد، اپ باز می‌شود (فقط نوتیفیکیشن کار نمی‌کند)
- کاربر دیگر در لودینگ گیر نمی‌کند

### 2. User Info با Timeout ([splash.dart](lib/views/splash/splash.dart))

```dart
// قبل
final result = await userProvider.getUserInfo();

// بعد
final result = await userProvider.getUserInfo().timeout(
  const Duration(seconds: 15),
  onTimeout: () {
    debugPrint("getUserInfo timed out - treating as failure");
    return false;
  },
);
```

**مزایا:**
- اگر سرور در 15 ثانیه پاسخ نداد، کاربر به صفحه لاگین می‌رود
- جلوگیری از انتظار نامحدود

### 3. Server Data با Timeout و Error Handling

```dart
// قبل
await ServerDataProvider.getData();

// بعد
try {
  await ServerDataProvider.getData().timeout(
    const Duration(seconds: 10),
    onTimeout: () {
      debugPrint("ServerDataProvider.getData timed out - continuing without server data");
    },
  );
} catch (e) {
  debugPrint("ServerDataProvider.getData failed: $e - continuing");
  // Continue even if server data fetch fails
}
```

**مزایا:**
- اگر دریافت تنظیمات سرور fail شد، اپ باز می‌شود
- از مقادیر پیش‌فرض استفاده می‌شود

## نتیجه

### قبل از تغییرات ❌
- اپ در لودینگ فریز می‌شد
- زمان انتظار: 30+ ثانیه
- در نهایت خطا نشان می‌داد یا crash می‌کرد

### بعد از تغییرات ✅
- اپ حداکثر در 15-25 ثانیه باز می‌شود
- اگر Firebase/Notifications fail شد، اپ باز می‌شود (فقط نوتیفیکیشن ها کار نمی‌کنند)
- اگر Server Data fail شد، از مقادیر پیش‌فرض استفاده می‌شود
- تجربه کاربری بسیار بهتر با اینترنت داخلی

## Timeout Summary

| بخش | Timeout قبل | Timeout جدید | رفتار در Timeout |
|-----|------------|--------------|------------------|
| Firebase Init | 30s+ | 10s | ادامه بدون Firebase |
| FCM Token | 30s+ | 5s | ادامه بدون Notification |
| User Info | نامحدود | 15s | برو به صفحه لاگین |
| Server Data | نامحدود | 10s | استفاده از مقادیر پیش‌فرض |
| **کل** | **90s+** | **40s (max)** | **اپ باز می‌شود** |

## تست

برای تست این تغییرات:

1. **با اینترنت داخلی:**
   ```bash
   flutter run --release
   ```
   اپ باید در کمتر از 25 ثانیه باز شود

2. **بدون اینترنت:**
   اپ باید خطای اتصال نشان دهد و دکمه "تلاش مجدد" را نمایش دهد

3. **با فیلترشکن:**
   اپ باید نرمال کار کند (کمتر از 10 ثانیه)

## نکات مهم

⚠️ **Firebase و Notification**
- اگر Firebase initialize نشود، امکانات زیر کار نمی‌کنند:
  - Push Notifications
  - FCM
  - Firebase Analytics (اگر استفاده شود)

✅ **امکانات اصلی اپ**
- تمام امکانات اصلی اپ بدون Firebase هم کار می‌کنند
- API ها
- لاگین/ثبت نام
- محتوای اپ
- پخش رسانه

## مقایسه با نسخه وب

| پلتفرم | مشکل | راه‌حل |
|--------|------|--------|
| **Web** | CanvasKit و فونت‌های گوگل | محلی‌سازی فایل‌ها |
| **Mobile** | Firebase Timeout | Timeout کوتاه‌تر + Graceful Degradation |

---

**توسعه داده شده در:** ژانویه 2026
**نسخه اپ:** 5.0.0+7006
