From 8d77b17220323ff853dfea7a2f4cc0098b2ff45b Mon Sep 17 00:00:00 2001 From: mohamadmahdi jebeli Date: Sat, 27 Sep 2025 08:37:32 +0330 Subject: [PATCH] handle login status --- lib/screens/auth/onboarding_page.dart | 22 ++++-- lib/simple_auth_gate.dart | 97 ++++++++++++++++----------- 2 files changed, 74 insertions(+), 45 deletions(-) diff --git a/lib/screens/auth/onboarding_page.dart b/lib/screens/auth/onboarding_page.dart index cf905c6..2d63574 100644 --- a/lib/screens/auth/onboarding_page.dart +++ b/lib/screens/auth/onboarding_page.dart @@ -1,12 +1,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import '../../extension/screenSize.dart'; import '../../gen/assets.gen.dart'; import '../../res/colors.dart'; -import 'login_page.dart'; class OnboardingPage extends StatefulWidget { - const OnboardingPage({super.key}); + final VoidCallback? onCompleted; + + const OnboardingPage({super.key, this.onCompleted}); @override State createState() => _OnboardingPageState(); @@ -28,17 +30,23 @@ class _OnboardingPageState extends State { Assets.icons.slide3.path, ]; - void _next() { + void _next() async { if (currentIndex < imageAssets.length - 1) { _pageController.nextPage( duration: Duration(milliseconds: 300), curve: Curves.easeInOut, ); } else { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => LoginPage()), - ); + final prefs = await SharedPreferences.getInstance(); + await prefs.setBool('first_time_user', false); + + if (mounted) { + if (widget.onCompleted != null) { + widget.onCompleted!(); + } else { + Navigator.pop(context); + } + } } } diff --git a/lib/simple_auth_gate.dart b/lib/simple_auth_gate.dart index 9200f22..f03a55c 100644 --- a/lib/simple_auth_gate.dart +++ b/lib/simple_auth_gate.dart @@ -3,51 +3,72 @@ import 'package:flutter/material.dart'; import 'package:lba/screens/auth/login_page.dart'; import 'package:lba/screens/auth/onboarding_page.dart'; import 'package:lba/screens/mains/navigation/navigation.dart'; +import 'package:shared_preferences/shared_preferences.dart'; -class SimpleAuthGate extends StatelessWidget { +class SimpleAuthGate extends StatefulWidget { const SimpleAuthGate({super.key}); @override - Widget build(BuildContext context) { - return StreamBuilder( - stream: FirebaseAuth.instance.authStateChanges(), - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Scaffold( - body: Center( - child: CircularProgressIndicator(), - ), - ); - } + State createState() => _SimpleAuthGateState(); +} - if (snapshot.hasError) { - return const Scaffold( - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.error, size: 64, color: Colors.red), - SizedBox(height: 16), - Text('An error occurred. Please try again later.'), - ], - ), - ), - ); - } +class _SimpleAuthGateState extends State { + bool _isLoading = true; + Widget? _targetScreen; - final user = snapshot.data; - final isLoggedIn = user != null; - - if (isLoggedIn) { - return const MainScreen(); - } - - return _shouldShowOnboarding() ? const OnboardingPage() : const LoginPage(); - }, - ); + @override + void initState() { + super.initState(); + _determineInitialScreen(); } - bool _shouldShowOnboarding() { - return false; + Future _determineInitialScreen() async { + final user = FirebaseAuth.instance.currentUser; + final isLoggedIn = user != null; + + if (isLoggedIn) { + _setTargetScreen(const MainScreen()); + return; + } + + final prefs = await SharedPreferences.getInstance(); + final isFirstTime = prefs.getBool('first_time_user') ?? true; + + if (isFirstTime) { + _setTargetScreen(OnboardingPage( + onCompleted: () { + _setTargetScreen(const LoginPage()); + }, + )); + } else { + _setTargetScreen(const LoginPage()); + } + } + + void _setTargetScreen(Widget screen) { + if (mounted) { + setState(() { + _targetScreen = screen; + _isLoading = false; + }); + } + } + + @override + Widget build(BuildContext context) { + if (_isLoading || _targetScreen == null) { + return const Scaffold( + body: Center( + child: CircularProgressIndicator(), + ), + ); + } + + return _targetScreen!; + } + + static Future resetOnboarding() async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setBool('first_time_user', true); } }