handle login status
This commit is contained in:
parent
bdddd9768e
commit
8d77b17220
|
|
@ -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<OnboardingPage> createState() => _OnboardingPageState();
|
||||
|
|
@ -28,17 +30,23 @@ class _OnboardingPageState extends State<OnboardingPage> {
|
|||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<User?>(
|
||||
stream: FirebaseAuth.instance.authStateChanges(),
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.connectionState == ConnectionState.waiting) {
|
||||
return const Scaffold(
|
||||
body: Center(
|
||||
child: CircularProgressIndicator(),
|
||||
),
|
||||
);
|
||||
}
|
||||
State<SimpleAuthGate> 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<SimpleAuthGate> {
|
||||
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<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
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue