import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../../core/di.dart'; import '../../../core/session/session_cubit.dart'; import '../cubit/login_cubit.dart'; import '../cubit/login_state.dart'; import 'agreement_view.dart'; import 'otp_view.dart'; import 'permission_view.dart'; import 'phone_view.dart'; /// مضيف تدفّق الدخول: خطوة واحدة معروضة في كل لحظة، والانتقال بينها من /// الـCubit لا من التنقّل — فلا يستطيع المستخدم الرجوع لخطوة تخطّاها. class LoginPage extends StatefulWidget { const LoginPage({super.key}); @override State createState() => _LoginPageState(); } class _LoginPageState extends State with WidgetsBindingObserver { late final LoginCubit _cubit = sl(); @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); _cubit.close(); super.dispose(); } @override void didChangeAppLifecycleState(AppLifecycleState lifecycle) { // العودة من إعدادات النظام بعد منح الإذن يدوياً — بلا هذا الفحص تبقى // شاشة الإذن عالقة (حالة حافة مثبتة ميدانياً، docs/39 §2). if (lifecycle == AppLifecycleState.resumed && _cubit.state.step == LoginStep.permission) { _cubit.checkLocationPermission(); } } @override Widget build(BuildContext context) { return BlocProvider.value( value: _cubit, child: BlocListener( listenWhen: (prev, next) => next.step == LoginStep.done, listener: (context, state) { final user = state.user; if (user != null) context.read().onLoggedIn(user); }, child: BlocBuilder( buildWhen: (prev, next) => prev.step != next.step, builder: (context, state) => switch (state.step) { LoginStep.agreement => const AgreementView(), LoginStep.permission => const PermissionView(), LoginStep.phone => const PhoneView(), LoginStep.otp || LoginStep.done => const OtpView(), }, ), ), ); } }