Files
Xpress-rider/lib/views/introscreens/splashscreen.dart

189 lines
5.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'dart:async';
import 'package:nearle/views/helpers/constants/Colorconstants.dart';
import 'package:nearle/views/introscreens/introscreen.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:nearle/widget/Bottom_page.dart';
import 'package:nearle/views/onboardscreens/Sign_in.dart';
import 'package:nearle/views/onboardscreens/signin_banner.dart';
import 'package:nearle/views/updatescreen/UpdateScreen.dart';
import 'package:new_version_plus/new_version_plus.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:nearle/views/onboardscreens/Mpin.dart';
import 'package:nearle/controllers/auth.dart';
class Splashscreen extends StatefulWidget {
const Splashscreen({super.key});
@override
State<Splashscreen> createState() => _SplashscreenState();
}
class _SplashscreenState extends State<Splashscreen> {
late final ImageProvider _logoProvider;
bool _imagePrecached = false;
bool _hasCheckedUpdate = false;
@override
void initState() {
super.initState();
_logoProvider = const AssetImage("assets/images/nearlesplash2.png");
WidgetsBinding.instance.addPostFrameCallback((_) async {
try {
await precacheImage(_logoProvider, context);
if (mounted) {
setState(() {
_imagePrecached = true;
});
}
} catch (e) {
if (mounted) {
setState(() {
_imagePrecached = true;
});
}
}
});
// FAST splash: 1 second
Timer(const Duration(seconds: 1), () {
if (mounted) {
_startNextStep();
}
});
}
// FAST second step: 0.2 sec
void _startNextStep() {
Timer(const Duration(milliseconds: 200), () {
if (mounted && !_hasCheckedUpdate) {
_checkForUpdateAndNavigate();
}
});
}
Future<void> _checkForUpdateAndNavigate() async {
if (_hasCheckedUpdate) return;
_hasCheckedUpdate = true;
try {
final newVersion = NewVersionPlus(
iOSId: '284882215',
androidId: "com.nearle.partner",
);
final status = await newVersion.getVersionStatus();
if (status != null && status.canUpdate) {
if (mounted) {
Get.offAll(
() => UpdateScreen(
mCurrentVersion: status.localVersion,
mUpdateVersion: status.storeVersion,
mIsForceUpdate: true,
),
transition: Transition.fadeIn,
);
}
return;
}
} catch (e) {}
_navigateToNextScreen();
}
Future<void> _navigateToNextScreen() async {
final prefs = await SharedPreferences.getInstance();
final bool isLoggedOut = prefs.getBool('logged_out') ?? false;
final bool hasSeenIntro = prefs.getBool('has_seen_intro') ?? false;
final int? savedUserId = prefs.getInt('userid');
// 🚀 Check for App Update (Force Login if version changed)
try {
final packageInfo = await PackageInfo.fromPlatform();
final currentVersion = packageInfo.version;
final lastRunVersion = prefs.getString('last_run_version');
if (lastRunVersion != null && lastRunVersion != currentVersion) {
debugPrint(
'[SPLASH] App update detected: $lastRunVersion -> $currentVersion. Forcing re-verification.',
);
final String? savedPhone = prefs.getString('contactno');
final int? savedUserId = prefs.getInt('userid');
// Update stored version
await prefs.setString('last_run_version', currentVersion);
if (savedUserId != null && savedPhone != null && savedPhone.isNotEmpty) {
debugPrint('[SPLASH] User was logged in. Redirecting to MPIN page.');
// Initialize AuthController and set the phone for MPIN verification
final auth = Get.put(AuthController());
auth.currentPhone = savedPhone;
// Clear sensitive session data to force re-verification
await prefs.remove('userid');
await prefs.remove('partnerid');
await prefs.remove('onduty');
await prefs.setBool('logged_out', true);
if (mounted) {
Get.offAll(() => Mpin());
}
return;
} else {
debugPrint('[SPLASH] User was not logged in. Redirecting to Sign In.');
if (mounted) {
Get.offAll(() => const SignIn());
}
return;
}
}
// Save current version for next run
await prefs.setString('last_run_version', currentVersion);
} catch (e) {
debugPrint('[SPLASH] Version check error: $e');
}
if (!mounted) return;
if (!isLoggedOut && savedUserId != null && savedUserId > 0) {
final onduty = prefs.getInt('onduty') ?? 0;
if (onduty == 0) {
Get.offAll(() => const SigninBanner());
} else {
Get.offAll(() => const BottomPage());
}
} else {
if (hasSeenIntro) {
Get.offAll(() => const SignIn());
} else {
Get.offAll(() => Introscreen());
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: ColorConstants.secondaryColor,
body: SafeArea(
child: Center(
child: _imagePrecached
? Image(
image: _logoProvider,
fit: BoxFit.contain,
)
: const SizedBox(),
),
),
);
}
}