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,51 +3,72 @@ 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 @override
Widget build(BuildContext context) { State<SimpleAuthGate> createState() => _SimpleAuthGateState();
return StreamBuilder<User?>( }
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
);
}
if (snapshot.hasError) { class _SimpleAuthGateState extends State<SimpleAuthGate> {
return const Scaffold( bool _isLoading = true;
body: Center( Widget? _targetScreen;
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; @override
final isLoggedIn = user != null; void initState() {
super.initState();
if (isLoggedIn) { _determineInitialScreen();
return const MainScreen();
}
return _shouldShowOnboarding() ? const OnboardingPage() : const LoginPage();
},
);
} }
bool _shouldShowOnboarding() { Future<void> _determineInitialScreen() async {
return false; 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<void> resetOnboarding() async {
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('first_time_user', true);
} }
} }