Merge branch 'language-translation' of https://git.7o9o.net/md.asif5/kmobile into language-translation

This commit is contained in:
2025-07-24 22:24:30 +05:30
3 changed files with 155 additions and 58 deletions

View File

@@ -294,6 +294,126 @@ class _AuthGateState extends State<AuthGate> {
}*/
@override
Widget build(BuildContext context) {
if (_checking) {
return const SplashScreen();
}
// ✅ Step 1: Show welcome screen first, only once
if (_showWelcome) {
return WelcomeScreen(
onContinue: () {
setState(() {
_showWelcome = false;
});
},
);
}
// ✅ Step 2: Check login status
if (_isLoggedIn) {
if (_hasMPin) {
if (_biometricEnabled) {
return FutureBuilder<bool>(
future: _tryBiometric(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const SplashScreen();
}
if (snapshot.data == true) {
return const NavigationScaffold(); // Authenticated
}
// ❌ Biometric failed → Show MPIN screen
return MPinScreen(
mode: MPinMode.enter,
onCompleted: (_) {
Navigator.of(context).pushReplacement(
MaterialPageRoute(
builder: (_) => const NavigationScaffold(),
),
);
},
);
},
);
} else {
return MPinScreen(
mode: MPinMode.enter,
onCompleted: (_) {
Navigator.of(context).pushReplacement(
MaterialPageRoute(
builder: (_) => const NavigationScaffold(),
),
);
},
);
}
} else {
// No MPIN set → show MPIN set screen + biometric dialog
return MPinScreen(
mode: MPinMode.set,
onCompleted: (_) async {
final storage = getIt<SecureStorage>();
final localAuth = LocalAuthentication();
final optIn = await showDialog<bool>(
context: context,
barrierDismissible: false,
builder: (ctx) => AlertDialog(
title:
Text(AppLocalizations.of(context).enableFingerprintLogin),
content:
Text(AppLocalizations.of(context).enableFingerprintMessage),
actions: [
TextButton(
onPressed: () => Navigator.of(ctx).pop(false),
child: Text(AppLocalizations.of(context).no),
),
TextButton(
onPressed: () => Navigator.of(ctx).pop(true),
child: Text(AppLocalizations.of(context).yes),
),
],
),
);
if (optIn == true) {
final canCheck = await localAuth.canCheckBiometrics;
bool didAuth = false;
if (canCheck) {
didAuth = await localAuth.authenticate(
localizedReason:
AppLocalizations.of(context).authenticateToEnable,
options: const AuthenticationOptions(
stickyAuth: true,
biometricOnly: true,
),
);
await storage.write(
'biometric_enabled', didAuth ? 'true' : 'false');
} else {
await storage.write('biometric_enabled', 'false');
}
}
Navigator.of(context).pushReplacement(
MaterialPageRoute(
builder: (_) => const NavigationScaffold(),
),
);
},
);
}
}
// ✅ Step 3: If not logged in, show login screen
return const LoginScreen();
}
}
/*@override
Widget build(BuildContext context) {
if (_checking) {
return const SplashScreen();
@@ -409,7 +529,7 @@ class _AuthGateState extends State<AuthGate> {
}
return const LoginScreen();
}
}
}*/
class NavigationScaffold extends StatefulWidget {
const NavigationScaffold({super.key});

View File

@@ -43,18 +43,18 @@ class _WelcomeScreenState extends State<WelcomeScreen> {
children: [
Text(
AppLocalizations.of(context).kconnect,
style: TextStyle(
style: const TextStyle(
fontSize: 36,
fontWeight: FontWeight.bold,
color: Colors.white,
letterSpacing: 1.5,
),
),
SizedBox(height: 12),
const SizedBox(height: 12),
Text(
AppLocalizations.of(context).kccBankFull,
textAlign: TextAlign.center,
style: TextStyle(
style: const TextStyle(
fontSize: 18,
color: Colors.white,
letterSpacing: 1.2,

View File

@@ -480,16 +480,10 @@ class _DashboardScreenState extends State<DashboardScreen> {
context,
MaterialPageRoute(
builder: (context) =>
const FundTransferBeneficiaryScreen(),
),
);
},
disable: true,
),
_buildQuickLink(
Symbols.server_person,
AppLocalizations.of(context).accountInfo,
() {
const FundTransferBeneficiaryScreen()));
}, disable: true),
_buildQuickLink(Symbols.server_person,
AppLocalizations.of(context).accountInfo, () {
Navigator.push(
context,
MaterialPageRoute(
@@ -509,45 +503,28 @@ class _DashboardScreenState extends State<DashboardScreen> {
context,
MaterialPageRoute(
builder: (context) => AccountStatementScreen(
accountNo:
users[selectedAccountIndex].accountNo!,
),
),
);
},
),
_buildQuickLink(
Symbols.checkbook,
AppLocalizations.of(context).handleCheque,
() {},
disable: true,
),
_buildQuickLink(
Icons.group,
AppLocalizations.of(context).manageBeneficiary,
() {
accountNo: users[selectedAccountIndex]
.accountNo!,
)));
}),
_buildQuickLink(Symbols.checkbook,
AppLocalizations.of(context).handleCheque, () {},
disable: true),
_buildQuickLink(Icons.group,
AppLocalizations.of(context).manageBeneficiary, () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
const ManageBeneficiariesScreen(),
),
);
},
disable: true,
),
_buildQuickLink(
Symbols.support_agent,
AppLocalizations.of(context).contactUs,
() {
const ManageBeneficiariesScreen()));
}, disable: true),
_buildQuickLink(Symbols.support_agent,
AppLocalizations.of(context).contactUs, () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const EnquiryScreen(),
),
);
},
),
builder: (context) => const EnquiryScreen()));
}),
],
),
const SizedBox(height: 5),