initial commit: push everything

This commit is contained in:
2026-07-06 20:27:53 +05:30
commit df4e044d74
329 changed files with 36620 additions and 0 deletions

View File

@@ -0,0 +1,264 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:nearle/views/helpers/constants/Font_constant.dart';
import 'dart:io';
import 'package:url_launcher/url_launcher.dart';
import 'package:nearle/views/helpers/constants/Colorconstants.dart';
import 'package:new_version_plus/new_version_plus.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:nearle/views/introscreens/introscreen.dart';
import 'package:nearle/widget/Bottom_page.dart';
import 'package:nearle/views/onboardscreens/signin_banner.dart';
class UpdateScreen extends StatefulWidget {
final bool mIsForceUpdate;
final String mCurrentVersion;
final String mUpdateVersion;
const UpdateScreen({
super.key,
this.mIsForceUpdate = true,
required this.mCurrentVersion,
required this.mUpdateVersion,
});
@override
State<UpdateScreen> createState() => _UpdateScreenState();
}
class _UpdateScreenState extends State<UpdateScreen>
with WidgetsBindingObserver {
bool _isCheckingVersion = false;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed && !_isCheckingVersion) {
checkVersionAndNavigate();
}
}
Future<void> checkVersionAndNavigate() async {
if (_isCheckingVersion) return;
_isCheckingVersion = true;
try {
await Future.delayed(const Duration(seconds: 1));
final newVersion = NewVersionPlus(
iOSId: '284882215',
androidId: "com.nearle.partner",
);
final status = await newVersion.getVersionStatus();
if (status != null) {
if (!status.canUpdate) {
if (mounted) {
_navigateToNextScreen();
}
}
}
} catch (e) {
print("Error checking version: $e");
} finally {
_isCheckingVersion = false;
}
}
Future<void> _navigateToNextScreen() async {
final prefs = await SharedPreferences.getInstance();
final isLoggedOut = prefs.getBool('logged_out') == true;
final savedUserId = prefs.getInt('userid');
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 {
Get.offAll(() => Introscreen());
}
}
@override
Widget build(BuildContext context) {
double h = Get.height;
double w = Get.width;
return WillPopScope(
onWillPop: () async {
if (widget.mIsForceUpdate) {
SystemNavigator.pop();
return false;
}
return false;
},
child: Scaffold(
backgroundColor: Colors.white,
extendBodyBehindAppBar: true,
appBar: AppBar(
backgroundColor: Colors.transparent,
elevation: 0,
scrolledUnderElevation: 0,
surfaceTintColor: Colors.transparent,
systemOverlayStyle: const SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
statusBarIconBrightness: Brightness.dark,
statusBarBrightness: Brightness.light,
),
),
body: SafeArea(
top: true,
bottom: false, // Bottom safe area handled in bottomNavigationBar
child: LayoutBuilder(
builder: (context, constraints) {
return SingleChildScrollView(
child: ConstrainedBox(
constraints: BoxConstraints(
minHeight: constraints.maxHeight,
),
child: IntrinsicHeight(
child: Column(
children: [
/// top spacing (responsive)
SizedBox(height: h * 0.06),
/// 🚀 Image (auto scales)
Padding(
padding: EdgeInsets.symmetric(horizontal: w * 0.08),
child: Image.asset(
"assets/images/update.png",
height: h * 0.28,
fit: BoxFit.contain,
),
),
SizedBox(height: h * 0.03),
/// 🔥 Title
Text(
"A New Update is Available!",
style: TextStyle(
fontSize: h * 0.025,
fontWeight: FontWeight.bold,
fontFamily: FontConstants.fontFamily,
color: Colors.black87,
),
textAlign: TextAlign.center,
),
SizedBox(height: h * 0.015),
/// 📄 Subtitle
Padding(
padding: EdgeInsets.symmetric(horizontal: w * 0.08),
child: Text(
"New features are here to make your app experience even smoother and more user-friendly!",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: h * 0.018,
color: Colors.grey,
height: 1.4,
fontFamily: FontConstants.fontFamily,
),
),
),
SizedBox(height: h * 0.03),
/// Version Text
Text(
"Available version: ${widget.mUpdateVersion}",
style: TextStyle(
fontSize: h * 0.017,
color: Colors.grey,
fontFamily: FontConstants.fontFamily,
),
),
Spacer(), // pushes content for large screens
],
),
),
),
);
},
),
),
/// ⭐ Bottom Button (fixed, responsive) with bottom safe area
bottomNavigationBar: SafeArea(
top: false,
bottom: true,
child: Padding(
padding: EdgeInsets.fromLTRB(
w * 0.06,
0,
w * 0.06,
h * 0.03,
),
child: SizedBox(
width: double.infinity,
height: h * 0.065,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: ColorConstants.primaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
),
onPressed: () => downloadActions(),
child: Text(
"Update Now",
style: TextStyle(
fontSize: h * 0.022,
fontFamily: FontConstants.fontFamily,
color: Colors.white,
),
),
),
),
),
),
),
);
}
void downloadActions() async {
String url;
var s = Platform.isAndroid ? "Android" : "Ios";
if (s == "Android") {
url = 'https://play.google.com/store/apps/details?id=com.nearle.partner';
} else {
url = 'https://apps.apple.com/us/app/nearle/id1596895375ls=1';
}
final uri = Uri.parse(url);
if (await canLaunchUrl(uri)) {
await launchUrl(uri, mode: LaunchMode.externalApplication);
} else {
throw 'Could not launch App';
}
}
}