import '../../../core/api/api_exception.dart'; /// سبب الفشل كـ**رمز** لا كنصّ. /// /// docs/23 §3 يقول إن الـCubit يحوّل خطأ الشبكة إلى رسالة عربية؛ وdocs/26 §4 /// (الأحدث، وهو الذي «يفعّل قاعدة docs/23 §2 التي كانت بلا أداة») يوجب مرور /// كل نص مرئي بطبقة الترجمة. والـCubit لا يعرف `BuildContext` (docs/23 §3). /// الجمع بينها: الـCubit يُصدر الرمز، والواجهة تترجمه سطراً واحداً — فتبقى /// الشاشة بلا منطق، والنص بلغتين. enum AuthFailure { /// رمز خاطئ أو منتهي الصلاحية. invalidCode, /// تجاوز عدد المحاولات — الخادم يُبطل الرمز فوراً (docs/38 §2). tooManyAttempts, /// تجاوز حدّ طلب الرمز: ثلاثة كل خمس دقائق. rateLimited, network, timeout, server, } extension AuthFailureX on ApiException { AuthFailure toAuthFailure() { if (isRateLimited) return AuthFailure.rateLimited; if (kind == ApiErrorKind.network) return AuthFailure.network; if (kind == ApiErrorKind.timeout) return AuthFailure.timeout; if (isUnauthorized) { // الخادم يفرّق بين «رمز خاطئ» و«محاولات كثيرة» بالنصّ وحده. return message.contains('Too many') ? AuthFailure.tooManyAttempts : AuthFailure.invalidCode; } return AuthFailure.server; } }