handle login status

This commit is contained in:
mohamadmahdi jebeli 2025-09-27 08:37:32 +03:30
parent bdddd9768e
commit 8d77b17220
2 changed files with 74 additions and 45 deletions

View File

@ -1,12 +1,14 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../extension/screenSize.dart'; import '../../extension/screenSize.dart';
import '../../gen/assets.gen.dart'; import '../../gen/assets.gen.dart';
import '../../res/colors.dart'; import '../../res/colors.dart';
import 'login_page.dart';
class OnboardingPage extends StatefulWidget { class OnboardingPage extends StatefulWidget {
const OnboardingPage({super.key}); final VoidCallback? onCompleted;
const OnboardingPage({super.key, this.onCompleted});
@override @override
State<OnboardingPage> createState() => _OnboardingPageState(); State<OnboardingPage> createState() => _OnboardingPageState();
@ -28,17 +30,23 @@ class _OnboardingPageState extends State<OnboardingPage> {
Assets.icons.slide3.path, Assets.icons.slide3.path,
]; ];
void _next() { void _next() async {
if (currentIndex < imageAssets.length - 1) { if (currentIndex < imageAssets.length - 1) {
_pageController.nextPage( _pageController.nextPage(
duration: Duration(milliseconds: 300), duration: Duration(milliseconds: 300),
curve: Curves.easeInOut, curve: Curves.easeInOut,
); );
} else { } else {
Navigator.push( final prefs = await SharedPreferences.getInstance();
context, await prefs.setBool('first_time_user', false);
MaterialPageRoute(builder: (context) => LoginPage()),
); if (mounted) {
if (widget.onCompleted != null) {
widget.onCompleted!();
} else {
Navigator.pop(context);
}
}
} }
} }

View File

@ -3,16 +3,60 @@ import 'package:flutter/material.dart';
import 'package:lba/screens/auth/login_page.dart'; import 'package:lba/screens/auth/login_page.dart';
import 'package:lba/screens/auth/onboarding_page.dart'; import 'package:lba/screens/auth/onboarding_page.dart';
import 'package:lba/screens/mains/navigation/navigation.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}); const SimpleAuthGate({super.key});
@override
State<SimpleAuthGate> createState() => _SimpleAuthGateState();
}
class _SimpleAuthGateState extends State<SimpleAuthGate> {
bool _isLoading = true;
Widget? _targetScreen;
@override
void initState() {
super.initState();
_determineInitialScreen();
}
Future<void> _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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return StreamBuilder<User?>( if (_isLoading || _targetScreen == null) {
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Scaffold( return const Scaffold(
body: Center( body: Center(
child: CircularProgressIndicator(), child: CircularProgressIndicator(),
@ -20,34 +64,11 @@ class SimpleAuthGate extends StatelessWidget {
); );
} }
if (snapshot.hasError) { return _targetScreen!;
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.'),
],
),
),
);
} }
final user = snapshot.data; static Future<void> resetOnboarding() async {
final isLoggedIn = user != null; final prefs = await SharedPreferences.getInstance();
await prefs.setBool('first_time_user', true);
if (isLoggedIn) {
return const MainScreen();
}
return _shouldShowOnboarding() ? const OnboardingPage() : const LoginPage();
},
);
}
bool _shouldShowOnboarding() {
return false;
} }
} }