From f0b7f33b8da4e1ce03687210be2950755c93210a Mon Sep 17 00:00:00 2001 From: Papaa14 Date: Sat, 17 May 2025 21:43:57 +0300 Subject: [PATCH] complete captive portal --- assets/gas.jpeg | Bin 0 -> 67765 bytes assets/wi-fi.gif | Bin 0 -> 4023 bytes lib/main.dart | 7 +- lib/screens/home.dart | 228 +++++++++-- lib/screens/login_screen.dart | 706 +++++++++++++-------------------- lib/screens/splash_screen.dart | 114 ++++-- lib/screens/verify.dart | 186 +++++++++ 7 files changed, 746 insertions(+), 495 deletions(-) create mode 100644 assets/gas.jpeg create mode 100644 assets/wi-fi.gif create mode 100644 lib/screens/verify.dart diff --git a/assets/gas.jpeg b/assets/gas.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c5b9b991291f8ef5e8b69879385d3c176eaff82b GIT binary patch literal 67765 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 literal 0 HcmV?d00001 diff --git a/assets/wi-fi.gif b/assets/wi-fi.gif new file mode 100644 index 0000000000000000000000000000000000000000..8ed32b8aef4adeb75e17b4b5e9768152fc5b9db3 GIT binary patch literal 4023 zcmeHJYfw|^8UAu|J0yp2A_++#qlW|o3PKWCh%B@Tffx%oVV8BRb!#G5FO-DQ8h2TH z0tg8P7STmeW*d+SxU>fA>`-fML_l;=K{{U6TZoFNI3wQg_5|I*-O(T0>7SkPJAcm1 zJM(_;<+*(G=4%vl4Sc`{4@tm#UIG${1VIpmLZMQrG#U+tVJ4G_Ac(K8FN?+Ea=8Hk z0X!aW#*7&lhKa@EnKNffB$Ck3(1?hLIdkSjMn*DsZEbDs?d`jE z?ds_0*u8tV)9LK&?A)_w&)&UzySlpe?b~C&Z#fz8k&o5^J z!7rH$QZheQt8^*yNGaJ%h~UQ*Dg}^0gqIs$npAjy-jn1#Nq#x7{{L1AzXa!cO#bsQ zRVkG&NobQE->xtUleX|D4867h!HOmQ>?Wlhi>hoH8{Cn!Ifz|bTsnH##_$0^fsato z=wLyS$)pDW0>#k%f8f2ma{sjvH9ku4ajU#Z;?BsxDw}|)Lz)jTFZ}swquvjQK!x{*l>K#U$&t%M;zps(Ncf zKYxboYZ%9c!ugOX(9-8G%W6Dh#r&=PRcdR;{4nRS?K9@3m2WYV$s{t*xMX^@{CL0# z;NmQuJCSmQFOL3W=2&;0-D7WCLy zp%sK~z!X5HP$t!b>Q#@o1tw+XodFp50vOPVR8fEoBVvuiCFHV@e!bYm11ME_<)ozi zAc*u(%w)A*Q(92NA2Lt)9wFR&O0%d$1{PovIZQ+jA>YANl`Juq83_d=v*Qq&ZWtmF zYoII>>HtkJ-Pe!B0m{Ru#c!1&_%8LR-3R(&zf9h8j99See71kKwhjfeZ4aB}q|_^B zUUtJk56FH(A;3^j5%lfC*>?T3&Lc20^Nhy6ImKsMWC3S$_T69+{6Q^!y$bCF4FhBw zAJw|yF{_#*R2FRu5k%LLp|^GSPj7c_$%5?)s-MIjZPYi$ncN9>MTRI@!Q!omvDWO^ z4!GfUoh2L6`Zostxe*7%NAk;zxo)oUaM_@U(eI-V#nInIFpBrM|3VG=jWct(T&(_% z{86BYga!NbZuI*q8R%LJc=&R~*X>YFdUtH*eullC)@x~`WjfZieQVf478kjt!C1kC za+9Mc%m8V&#Qo`Cf%yu|q>c@wz!ayU>arzQjsTZx;A(kxW(RgR4x2(Mg}@w2pa#IX zlbE?i443TBun$YBgUVR~NetZTR&C_^(#&USvU;k~r~?^VX%?s;Cr(?v0~Kp(p~PKf z03=2*A>atHTNQ zST9RhLQ6qWrUJuCtHAF8%n5U(;(ULfuKGt1j`RGfl38-utI{XAwqmxZe4A-%AMc6C`{*jRD4HzHG@vccCrsMK`FG4Vl~MCiAP=v(A(X5JS2ridnHe=v-~jmS;XY~ z<)xYc%gT6SS4K51B~us?K;rVVQH!@`2mx<7qaW6b33x*ZzeR^id}l7&71OY3WP~(J3$)s1qoWoEm6Wd9TzA84 z-6>?1I>ivkq00kxmYq9YVRX$Emmx`+(Mo!SYEB2~0H3eWgQV6~F(KzM&NmGRG}lTB zud!Eh^RCmZ!+pz@Q)`_Pq2t~;y+ecoNO}tXT7-l^pFJOha3crV$_<*0ev8r0J1J>g zQ3RIFaWv!IOtojP?Xo6pNU_qc(^*~RWrCF+m+h`*_9x#Iem_vJRO^SDblIyND5;D& zd+FumErGc`eOm)k@uonTQYaJ)%xh8VJ>peg8pKQJSzz& z{pw<%;N)ofA;qc^WZgOE5gRLLVT2(|Gg R(B4e)HkQ9rFy0#Y@V~jxU#I{8 literal 0 HcmV?d00001 diff --git a/lib/main.dart b/lib/main.dart index eaf26fe..bb7560f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -15,9 +15,12 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - return const MaterialApp( + return MaterialApp( debugShowCheckedModeBanner: false, - home: SplashScreen(), // Start with SplashScreen + theme:ThemeData( + fontFamily: 'Poppins', + ), + home: const SplashScreen(), // Start with SplashScreen ); } } \ No newline at end of file diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 4b8a313..fd439b6 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -1,53 +1,209 @@ import 'package:flutter/material.dart'; -import 'package:login_page/data/bg_data.dart'; // Import your bgList +import 'package:login_page/screens/login_screen.dart'; // Make sure this import path is correct class HomePage extends StatelessWidget { final String email; + const HomePage({super.key, required this.email}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - automaticallyImplyLeading: true, - title: Text('Hello $email'), - centerTitle: true, - actions: [ - IconButton( - icon: const Icon(Icons.logout), - tooltip: 'Logout', - onPressed: () { - Navigator.of(context).pop(); // Go back to login screen - }, - ), - ], + title: Text("Dashboard"), + automaticallyImplyLeading: false, + actions: [ + // Logout Icon Button + IconButton( + icon: Icon(Icons.logout, color: Colors.black), + onPressed: () { + Navigator.of(context).pushAndRemoveUntil( + MaterialPageRoute(builder: (context) => LoginScreen()), + (route) => false, + ); + }, + ), + ], ), - body: Padding( - padding: const EdgeInsets.all(12.0), - child: ListView.builder( - itemCount: bgList.length, - itemBuilder: (context, index) { - return Container( - margin: const EdgeInsets.symmetric(vertical: 8), - height: 180, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(16), - boxShadow: [ - BoxShadow( - color: Colors.black26, - blurRadius: 8, - offset: Offset(0, 4), - ), - ], - image: DecorationImage( - image: AssetImage(bgList[index]), - fit: BoxFit.cover, + body: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.all(20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Welcome Section Container with Greeting Inside + Container( + padding: EdgeInsets.all(15), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.shade300), + borderRadius: BorderRadius.circular(8), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Greeting + Waving Hand Icon + Row( + children: [ + Text( + "Good Morning, Thereza", + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(width: 5), + Icon(Icons.waving_hand, size: 24, color: Colors.blue), + ], + ), + SizedBox(height: 10), + + // Prepaid Info + Text("Prepaid: 0794606921"), + SizedBox(height: 5), + Text("Credit (Ksh): 0"), + Text("Net Points: 0"), + ], ), ), - ); - }, + + SizedBox(height: 20), + + // Full Width Wholesome Image - No Background + Container( + margin: EdgeInsets.symmetric(vertical: 10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(10), + child: Image.asset( + 'assets/gas.jpeg', + width: double.infinity, + height: 250, // Fallback height for most devices + fit: BoxFit.contain, + ), + ), + ), + + SizedBox(height: 20), + + // Active Subscription Title + Text( + "Your active subscriptions", + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + + SizedBox(height: 10), + + // Active Subscription Card + Card( + elevation: 3, + child: Padding( + padding: EdgeInsets.all(15), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "KKWZBZVZ", + style: TextStyle(fontWeight: FontWeight.bold), + ), + SizedBox(height: 5), + Text("Sh850= 30Days UnlimiNET - 30 Days"), + SizedBox(height: 5), + Text("Used: 3.96 GB"), + SizedBox(height: 5), + Text("Expires: 14/06/2025 17:55"), + Align( + alignment: Alignment.centerRight, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.green, + foregroundColor: Colors.white, + ), + onPressed: () {}, + child: Text("RECONNECT"), + ), + ), + ], + ), + ), + ), + + SizedBox(height: 20), + + // Enter Voucher Code + TextField( + decoration: InputDecoration( + hintText: "Enter Voucher Code", + suffixIcon: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.blue, + foregroundColor: Colors.white, + ), + onPressed: () {}, + child: Text("CONNECT"), + ), + ), + ), + + SizedBox(height: 20), + + // Offers Title + Text( + "Offers", + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + + SizedBox(height: 10), + + // Offers List + _buildOfferCard("Daily FREE 20 Minutes UnlimiNET", "FREE"), + _buildOfferCard("Sh5= 30Minutes UnlimiNET", "Sh5"), + _buildOfferCard("Sh9= 1Hour UnlimiNET", "Sh9"), + _buildOfferCard("Sh13= 2Hours UnlimiNET", "Sh13"), + ], + ), ), ), ); } -} \ No newline at end of file + + // Reusable widget for each offer card + Widget _buildOfferCard(String name, String price) { + return Card( + margin: EdgeInsets.symmetric(vertical: 5), + child: Padding( + padding: EdgeInsets.all(10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(name, style: TextStyle(fontWeight: FontWeight.bold)), + Text("1 Device"), + ], + ), + price == "FREE" + ? OutlinedButton( + style: OutlinedButton.styleFrom( + foregroundColor: Colors.red, + side: BorderSide(color: Colors.red), + ), + onPressed: () {}, + child: Text("FREE"), + ) + : OutlinedButton( + style: OutlinedButton.styleFrom( + foregroundColor: Colors.red, + side: BorderSide(color: Colors.red), + ), + onPressed: () {}, + child: Text("BUY"), + ), + ], + ), + ), + ); + } +} diff --git a/lib/screens/login_screen.dart b/lib/screens/login_screen.dart index 393cbd1..1c2fa75 100644 --- a/lib/screens/login_screen.dart +++ b/lib/screens/login_screen.dart @@ -1,6 +1,8 @@ +import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import '../utils/text_utils.dart'; -import 'home.dart'; +import 'verify.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @@ -9,431 +11,99 @@ class LoginScreen extends StatefulWidget { State createState() => _LoginScreenState(); } -// State class for LoginScreen, with animation support for flipping forms class _LoginScreenState extends State with SingleTickerProviderStateMixin { - bool isDarkMode = false; // Tracks dark mode state - bool isRemembered = false; // Tracks "Remember Me" checkbox - bool isLogin = true; // Tracks if login or register form is shown + bool isDarkMode = false; + bool _phoneHasFocus = false; + bool _phoneContainsText = false; - // Controllers for email and password input fields - final TextEditingController _emailController = TextEditingController(); - final TextEditingController _passwordController = TextEditingController(); + final TextEditingController _phoneController = TextEditingController(); - // Hardcoded credentials, updated on registration or password reset - String _correctEmail = 'Amazons@tech.com'; - String _correctPassword = '12345'; + // Auto-generated verification code + String? _generatedCode; - // Animation controller and animation for flipping between forms - late AnimationController _animationController; - late Animation _animation; + // Timer variables + late Timer _timer; + int _countdown = 60; + bool _isCounting = false; @override void initState() { super.initState(); - // Initialize animation controller for flip effect - _animationController = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 600), - ); - // Tween for flip animation - _animation = Tween(begin: 0, end: 1).animate( - CurvedAnimation(parent: _animationController, curve: Curves.easeInOut), - ); } @override void dispose() { - // Dispose controllers to free resources - _animationController.dispose(); - _emailController.dispose(); - _passwordController.dispose(); + _phoneController.dispose(); + if (_isCounting) _timer.cancel(); super.dispose(); } - // Login logic: checks credentials and navigates to HomePage if correct - void _login() { - if (_emailController.text == _correctEmail && - _passwordController.text == _correctPassword) { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => HomePage(email: _emailController.text), // Go to HomePage - ), - ); - } else { - // Show error if credentials are wrong + /// Validates phone number input + String? _validatePhone(String value) { + if (value.isEmpty) return 'Phone number cannot be empty'; + if (!RegExp(r'^\d{10}$').hasMatch(value)) { + return 'Enter a valid 10-digit phone number'; + } + return null; + } + + /// Generates a random 4-digit code + String _generateVerificationCode() { + final random = DateTime.now().millisecondsSinceEpoch % 9000 + 1000; + return random.toString(); + } + + /// Starts a countdown timer for code expiration + void _startCountdown() { + if (_isCounting) return; + + _isCounting = true; + _timer = Timer.periodic(Duration(seconds: 1), (timer) { + if (_countdown == 0) { + _isCounting = false; + timer.cancel(); + } else { + setState(() { + _countdown--; + }); + } + }); + } + + /// Sends user to Verification Screen with generated code + void _connect() { + final validation = _validatePhone(_phoneController.text); + if (validation != null) { ScaffoldMessenger.of( context, - ).showSnackBar(const SnackBar(content: Text('Invalid credentials'))); + ).showSnackBar(SnackBar(content: Text(validation))); + return; } - } - // Registration logic: updates hardcoded credentials and flips back to login - void _register() { - if (_emailController.text.isNotEmpty && - _passwordController.text.isNotEmpty) { - setState(() { - _correctEmail = _emailController.text; // Update email - _correctPassword = _passwordController.text; // Update password - isLogin = true; // Switch to login form - }); - _animationController.reverse(); // Animate back to login + // Generate new code + _generatedCode = _generateVerificationCode(); + + // Show snackbar and auto-fill in verification screen + WidgetsBinding.instance.addPostFrameCallback((_) { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Registration successful! Please login')), + SnackBar(content: Text("Auto-filled code: $_generatedCode")), ); - } - } - - // Password reset logic: updates the hardcoded password - void _resetPassword(String newPassword) { - setState(() { - _correctPassword = newPassword; // Update password }); - Navigator.pop(context); // Close dialog - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Password updated successfully!')), - ); - } - // Shows a dialog to enter a new password for reset - void _showResetPasswordDialog() { - final TextEditingController newPasswordController = TextEditingController(); + // Start countdown + _countdown = 60; + _startCountdown(); - showDialog( - context: context, - builder: (context) => AlertDialog( - title: Text( - 'Reset Password', - style: TextStyle(color: isDarkMode ? Colors.white : Colors.black), - ), - content: SizedBox( - height: 100, - child: Column( - children: [ - TextFormField( - controller: newPasswordController, // Controller for new password - obscureText: true, // Hide input - decoration: InputDecoration( - labelText: 'New Password', - labelStyle: TextStyle( - color: isDarkMode ? Colors.white70 : Colors.black54, - ), - border: OutlineInputBorder(), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: isDarkMode ? Colors.white70 : Colors.black54, - ), - ), - ), - style: TextStyle( - color: isDarkMode ? Colors.white : Colors.black, - ), - ), - ], - ), - ), - backgroundColor: isDarkMode ? Colors.grey[900] : Colors.white, - actions: [ - // Cancel button - TextButton( - onPressed: () => Navigator.pop(context), - child: Text( - 'Cancel', - style: TextStyle( - color: isDarkMode ? Colors.white70 : Colors.black54, - ), + // Navigate to verification screen + Navigator.push( + context, + MaterialPageRoute( + builder: + (context) => VerificationScreen( + correctCode: _generatedCode!, + autoFillCode: _generatedCode, // Pass generated code for auto-fill ), - ), - // Update button - TextButton( - onPressed: () { - if (newPasswordController.text.isNotEmpty) { - _resetPassword(newPasswordController.text); // Update password - } - }, - child: Text( - 'Update', - style: TextStyle( - color: const Color(0xFFC76723), - fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - ); - } - - // Login form widget - Widget _buildLoginForm() { - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox(height: 20), // Spacer - Center( - child: SizedBox( - height: 150, - width: 200, - child: Image.asset('assets/logo.png', fit: BoxFit.contain), // Logo - ), - ), - const SizedBox(height: 4), - Center( - child: TextUtil( - text: "Login", - weight: true, - size: 30, - color: isDarkMode ? Colors.white : Colors.black, - ), - ), - const SizedBox(height: 20), - TextUtil( - text: "Email", - color: isDarkMode ? Colors.white : Colors.black, - ), - Container( - height: 35, - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: isDarkMode ? Colors.white : Colors.black, - ), - ), - ), - child: TextFormField( - controller: _emailController, // Email input - style: TextStyle(color: isDarkMode ? Colors.white : Colors.black), - decoration: InputDecoration( - suffixIcon: Icon( - Icons.mail, - color: isDarkMode ? Colors.white : Colors.black, - ), - border: InputBorder.none, - ), - ), - ), - const SizedBox(height: 20), - TextUtil( - text: "Password", - color: isDarkMode ? Colors.white : Colors.black, - ), - Container( - height: 35, - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: isDarkMode ? Colors.white : Colors.black, - ), - ), - ), - child: TextFormField( - controller: _passwordController, // Password input - obscureText: true, // Hide input - style: TextStyle(color: isDarkMode ? Colors.white : Colors.black), - decoration: InputDecoration( - suffixIcon: Icon( - Icons.lock, - color: isDarkMode ? Colors.white : Colors.black, - ), - border: InputBorder.none, - ), - ), - ), - const SizedBox(height: 20), - Row( - children: [ - // Remember Me checkbox - TextButton.icon( - onPressed: () { - setState(() { - isRemembered = !isRemembered; - }); - }, - icon: Icon( - isRemembered ? Icons.check_box : Icons.check_box_outline_blank, - color: isDarkMode ? Colors.white : Colors.black, - size: 18, - ), - label: TextUtil( - text: "Remember Me", - size: 12, - color: isDarkMode ? Colors.white : Colors.black, - ), - style: TextButton.styleFrom(padding: EdgeInsets.zero), - ), - const Spacer(), - // Forget password button - TextButton( - onPressed: _showResetPasswordDialog, // Show reset dialog - style: TextButton.styleFrom(padding: EdgeInsets.zero), - child: TextUtil( - text: "FORGET PASSWORD", - size: 12, - color: isDarkMode ? Colors.white : Colors.black, - ), - ), - ], - ), - const SizedBox(height: 20), - // Login button - GestureDetector( - onTap: _login, // Call login logic - child: Container( - height: 40, - width: double.infinity, - decoration: BoxDecoration( - color: isDarkMode ? Colors.white : Colors.black, - borderRadius: BorderRadius.circular(30), - ), - alignment: Alignment.center, - child: TextUtil( - text: "Log In", - color: isDarkMode ? Colors.black : Colors.white, - ), - ), - ), - const SizedBox(height: 20), - // Switch to register form - GestureDetector( - onTap: () { - setState(() { - isLogin = false; // Show register form - _emailController.clear(); - _passwordController.clear(); - }); - _animationController.forward(); // Animate flip - }, - child: Center( - child: TextUtil( - text: "Don't have an account? REGISTER", - size: 14, - color: isDarkMode ? Colors.white : Colors.black, - ), - ), - ), - ], - ); - } - - // Register form widget (flipped) - Widget _buildRegisterForm() { - return Transform( - transform: Matrix4.identity()..rotateY(3.14159), // Flip effect - alignment: Alignment.center, - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox(height: 20), - Center( - child: SizedBox( - height: 150, - width: 200, - child: Image.asset('assets/logo.png', fit: BoxFit.contain), // Logo - ), - ), - const SizedBox(height: 20), - Center( - child: TextUtil( - text: "Register", - weight: true, - size: 30, - color: isDarkMode ? Colors.white : Colors.black, - ), - ), - const SizedBox(height: 20), - TextUtil( - text: "Email", - color: isDarkMode ? Colors.white : Colors.black, - ), - Container( - height: 35, - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: isDarkMode ? Colors.white : Colors.black, - ), - ), - ), - child: TextFormField( - controller: _emailController, // Email input - style: TextStyle(color: isDarkMode ? Colors.white : Colors.black), - decoration: InputDecoration( - suffixIcon: Icon( - Icons.mail, - color: isDarkMode ? Colors.white : Colors.black, - ), - border: InputBorder.none, - ), - ), - ), - const SizedBox(height: 20), - TextUtil( - text: "Password", - color: isDarkMode ? Colors.white : Colors.black, - ), - Container( - height: 35, - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: isDarkMode ? Colors.white : Colors.black, - ), - ), - ), - child: TextFormField( - controller: _passwordController, // Password input - obscureText: true, // Hide input - style: TextStyle(color: isDarkMode ? Colors.white : Colors.black), - decoration: InputDecoration( - suffixIcon: Icon( - Icons.lock, - color: isDarkMode ? Colors.white : Colors.black, - ), - border: InputBorder.none, - ), - ), - ), - const SizedBox(height: 40), - // Register button - GestureDetector( - onTap: _register, // Call register logic - child: Container( - height: 40, - width: double.infinity, - decoration: BoxDecoration( - color: isDarkMode ? Colors.white : Colors.black, - borderRadius: BorderRadius.circular(30), - ), - alignment: Alignment.center, - child: TextUtil( - text: "Register Me", - color: isDarkMode ? Colors.black : Colors.white, - ), - ), - ), - const SizedBox(height: 20), - // Switch to login form - GestureDetector( - onTap: () { - setState(() { - isLogin = true; // Show login form - _emailController.clear(); - _passwordController.clear(); - }); - _animationController.reverse(); // Animate flip - }, - child: Center( - child: TextUtil( - text: "Already have an account? LOGIN", - size: 14, - color: isDarkMode ? Colors.white : Colors.black, - ), - ), - ), - ], ), ); } @@ -441,20 +111,18 @@ class _LoginScreenState extends State @override Widget build(BuildContext context) { return Theme( - data: isDarkMode ? ThemeData.dark() : ThemeData.light(), // Set theme + data: isDarkMode ? ThemeData.dark() : ThemeData.light(), child: Scaffold( appBar: AppBar( - backgroundColor: const Color(0xFFC76723), // Custom orange color + backgroundColor: Color(0xFFC76723), elevation: 0, actions: [ IconButton( - icon: Icon( - isDarkMode ? Icons.light_mode : Icons.dark_mode, - color: Colors.white, - ), + icon: Icon(isDarkMode ? Icons.light_mode : Icons.dark_mode), + color: Colors.white, onPressed: () { setState(() { - isDarkMode = !isDarkMode; // Toggle theme + isDarkMode = !isDarkMode; }); }, ), @@ -463,38 +131,218 @@ class _LoginScreenState extends State body: Container( height: double.infinity, width: double.infinity, - color: isDarkMode ? const Color.fromARGB(255, 26, 24, 24) : Colors.white, // Background color + color: isDarkMode ? Color.fromARGB(255, 26, 24, 24) : Colors.white, child: Align( alignment: Alignment.center, child: Container( width: double.infinity, - margin: const EdgeInsets.symmetric(horizontal: 30), + margin: EdgeInsets.symmetric(horizontal: 30), decoration: BoxDecoration( border: Border.all( - color: isDarkMode - ? const Color(0xFF23272F) // Use a dark blue/grey for dark mode - : const Color.fromARGB(136, 71, 69, 69), + color: + isDarkMode + ? Color.fromARGB(255, 35, 38, 46) + : Color.fromARGB(136, 71, 69, 69), ), borderRadius: BorderRadius.circular(15), - color: isDarkMode - ? const Color.fromARGB(137, 132, 129, 129) // Use a dark blue/grey for dark mode - : Colors.white70, + color: + isDarkMode + ? Color.fromARGB(133, 93, 75, 75) + : Colors.white70, ), child: SingleChildScrollView( child: Padding( - padding: const EdgeInsets.all(25), - child: AnimatedBuilder( - animation: _animation, - builder: (context, child) { - // Flip between login and register forms - return Transform( - transform: Matrix4.identity() - ..setEntry(3, 2, 0.001) - ..rotateY(3.14159 * _animation.value), - alignment: Alignment.center, - child: isLogin ? _buildLoginForm() : _buildRegisterForm(), - ); - }, + padding: const EdgeInsets.all(20), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Logo with tagline directly underneath + Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // Logo + SizedBox( + height: 100, + width: 160, + child: Image.asset( + 'assets/logo.png', + fit: BoxFit.contain, + ), + ), + const SizedBox(height: 4), // Reduced space between logo and tagline + // Tagline + Text( + 'Fast . Reliable . Affordable', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 1.0, + color: + isDarkMode ? Colors.white : Colors.black87, + ), + ), + // Removed the blue line and adjusted spacing + const SizedBox(height: 24), // Added more space after tagline + // "Sign in here" text + TextUtil( + text: "Sign in here", + weight: true, + size: 20, + color: isDarkMode ? Colors.white : Colors.black, + ), + ], + ), + ), + const SizedBox(height: 16), + TextUtil(text: "Phone Number"), + Container( + height: 50, + padding: EdgeInsets.symmetric(horizontal: 12), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[800] : Colors.white, + border: Border.all( + color: + _phoneHasFocus || _phoneContainsText + ? (isDarkMode + ? Colors.blueAccent + : Colors.blue) + : (isDarkMode ? Colors.white : Colors.black) + .withOpacity(0.4), + width: 1.5, + ), + borderRadius: BorderRadius.circular(8), + ), + child: Row( + children: [ + Icon( + Icons.phone, + color: isDarkMode ? Colors.white : Colors.black, + size: 20, + ), + const SizedBox(width: 10), + Expanded( + child: TextFormField( + controller: _phoneController, + keyboardType: TextInputType.number, + maxLength: 10, + style: TextStyle( + color: + isDarkMode ? Colors.white : Colors.black, + ), + decoration: InputDecoration( + hintText: "Enter phone number", + counterText: "", + border: InputBorder.none, + hintStyle: TextStyle( + color: + isDarkMode + ? Colors.white70 + : Colors.black45, + ), + isDense: true, + ), + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + LengthLimitingTextInputFormatter(10), + ], + onChanged: (value) { + setState(() { + _phoneContainsText = value.isNotEmpty; + }); + }, + onTap: () { + setState(() { + _phoneHasFocus = true; + }); + }, + onEditingComplete: () { + setState(() { + _phoneHasFocus = false; + }); + }, + ), + ), + ], + ), + ), + const SizedBox(height: 20), + GestureDetector( + onTap: _connect, + child: Container( + height: 40, + width: double.infinity, + decoration: BoxDecoration( + color: Colors.blue, + borderRadius: BorderRadius.circular(30), + ), + alignment: Alignment.center, + child: TextUtil(text: "Connect", color: Colors.white), + ), + ), + const SizedBox(height: 16), + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + border: Border.all( + color: isDarkMode ? Colors.white24 : Colors.black26, + ), + borderRadius: BorderRadius.circular(12), + color: + isDarkMode ? Colors.grey[850] : Colors.grey[200], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.headset_mic, + color: + isDarkMode ? Colors.blueAccent : Colors.blue, + ), + const SizedBox(width: 8), + Text( + 'Need help? Contact support', + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: + isDarkMode + ? Colors.white70 + : Colors.black54, + ), + ), + ], + ), + ), + const SizedBox(height: 16), + Align( + alignment: Alignment.bottomCenter, + child: Container( + padding: const EdgeInsets.all(12), + width: double.infinity, + decoration: BoxDecoration( + border: Border.all( + color: isDarkMode ? Colors.white24 : Colors.black26, + ), + borderRadius: BorderRadius.circular(12), + color: + isDarkMode ? Colors.grey[850] : Colors.grey[200], + ), + child: Text( + '© Lence Amazons Ltd • All rights reserved • 2025', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: + isDarkMode ? Colors.white70 : Colors.black54, + ), + ), + ), + ), + ], ), ), ), @@ -504,4 +352,4 @@ class _LoginScreenState extends State ), ); } -} +} \ No newline at end of file diff --git a/lib/screens/splash_screen.dart b/lib/screens/splash_screen.dart index e44a5b6..eb2a37e 100644 --- a/lib/screens/splash_screen.dart +++ b/lib/screens/splash_screen.dart @@ -1,9 +1,10 @@ import 'package:flutter/material.dart'; -import 'login_screen.dart'; +import 'package:flutter/services.dart'; // For hiding system UI +import 'login_screen.dart'; // Make sure this import path is correct class SplashScreen extends StatefulWidget { const SplashScreen({super.key}); - + @override State createState() => _SplashScreenState(); } @@ -12,39 +13,96 @@ class _SplashScreenState extends State { @override void initState() { super.initState(); - // Wait for 3 seconds, then navigate to LoginScreen + // Hide system UI (status bar and bottom navigation bar) + SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky); + // Navigate to Login Screen after 3 seconds Future.delayed(const Duration(seconds: 3), () { - // ignore: use_build_context_synchronously - Navigator.of(context).pushReplacement( - MaterialPageRoute( - builder: (context) => const LoginScreen(), - ), + Navigator.pushReplacement( + // ignore: use_build_context_synchronously + context, + MaterialPageRoute(builder: (context) => const LoginScreen()), ); }); } @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: Colors.white, - body: Center( - child: TweenAnimationBuilder( - tween: Tween(begin: 1.0, end: 1.2), - duration: const Duration(milliseconds: 700), - curve: Curves.easeInOut, - builder: (context, scale, child) { - return Transform.scale( - scale: scale, - child: child, - ); - }, - onEnd: () { - setState(() {}); - }, - child: Image.asset( - 'assets/splash.png', - width: 150, - fit: BoxFit.contain, + return AnnotatedRegion( + value: SystemUiOverlayStyle.dark.copyWith( + statusBarColor: Colors.white, // Transparent or match background + systemNavigationBarColor: Colors.white, + ), + child: Scaffold( + backgroundColor: Colors.white, + body: SafeArea( + child: Column( + children: [ + // Main content in the middle (with Expanded to take available space) + Expanded( + child: Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Animated Logo + TweenAnimationBuilder( + tween: Tween(begin: 1.0, end: 1.2), + duration: const Duration(milliseconds: 700), + curve: Curves.easeInOut, + builder: (context, scale, child) { + return Transform.scale(scale: scale, child: child); + }, + child: Image.asset( + 'assets/logo.png', + width: 200, + height: 50, + fit: BoxFit.contain, + ), + ), + const SizedBox(height: 40), + // Loading Text + const Text( + "Just a moment...", + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 16), + // Animated GIF + TweenAnimationBuilder( + tween: Tween(begin: 0.8, end: 1.0), + duration: const Duration(milliseconds: 600), + curve: Curves.easeInOut, + builder: (context, scale, child) => + Transform.scale(scale: scale, child: child), + child: Image.asset( + 'assets/wi-fi.gif', + width: 100, + height: 100, + fit: BoxFit.contain, + ), + ), + const SizedBox(height: 16), + // Info Text + const Text( + "Hang on as we redirect you to the WiFi Portal...", + textAlign: TextAlign.center, + style: TextStyle(fontSize: 14, color: Colors.grey), + ), + ], + ), + ), + ), + ), + + // Footer at the bottom + Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: Text( + "© Lence Amazons Ltd All rights reserved.", + style: TextStyle(fontSize: 12, color: Colors.grey), + ), + ), + ], ), ), ), diff --git a/lib/screens/verify.dart b/lib/screens/verify.dart new file mode 100644 index 0000000..a1ed4d1 --- /dev/null +++ b/lib/screens/verify.dart @@ -0,0 +1,186 @@ +import 'package:flutter/material.dart'; +import 'package:login_page/screens/home.dart'; +import 'dart:async'; + +class VerificationScreen extends StatefulWidget { + final String correctCode; + final String? autoFillCode; + + const VerificationScreen({ + super.key, + required this.correctCode, + this.autoFillCode, + }); + + @override + State createState() => _VerificationScreenState(); +} + +class _VerificationScreenState extends State { + late List _controllers; + late List _focusNodes; + + int _resendTimer = 60; + late Timer _timer; + + @override + void initState() { + super.initState(); + + // Initialize controllers and focus nodes + _controllers = List.generate(4, (_) => TextEditingController()); + _focusNodes = List.generate(4, (_) => FocusNode()); + + // Auto-fill if provided + if (widget.autoFillCode != null && widget.autoFillCode!.length == 4) { + for (int i = 0; i < 4; i++) { + _controllers[i].text = widget.autoFillCode![i]; + } + } + + // Start resend timer + _startResendTimer(); + } + + void _startResendTimer() { + const oneSecond = Duration(seconds: 1); + _timer = Timer.periodic(oneSecond, (timer) { + if (_resendTimer <= 0) { + setState(() { + _resendTimer = 60; + }); + timer.cancel(); + } else { + setState(() { + _resendTimer--; + }); + } + }); + } + + @override + void dispose() { + // Cancel the timer before disposing + _timer.cancel(); + + // Dispose all controllers and focus nodes + for (var c in _controllers) { + c.dispose(); + } + for (var f in _focusNodes) { + f.dispose(); + } + + super.dispose(); + } + + Widget _buildDigitField(int index) { + return SizedBox( + width: 60, + child: TextField( + controller: _controllers[index], + focusNode: _focusNodes[index], + keyboardType: TextInputType.number, + textAlign: TextAlign.center, + maxLength: 1, + decoration: InputDecoration( + counterText: '', + border: OutlineInputBorder(), + ), + onChanged: (value) { + if (value.isNotEmpty && index < 3) { + FocusScope.of(context).requestFocus(_focusNodes[index + 1]); + } + }, + ), + ); + } + + void _verifyCode() { + String enteredCode = _controllers.map((c) => c.text).join(); + + if (enteredCode == widget.correctCode) { + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => HomePage(email: "Verified")), + ); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text("Invalid code")), + ); + } + } + + Widget _buildResendText() { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Resend code in: $_resendTimer seconds", + style: TextStyle(color: Colors.grey), + ), + ], + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text("Enter Code")), + body: Padding( + padding: EdgeInsets.all(20), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Logo Section + Image.asset('assets/logo.png', width: 200), + SizedBox(height: 10), + Text( + "Fast. Reliable. Affordable", + style: TextStyle(fontSize: 16, color: Colors.grey), + ), + SizedBox(height: 20), + + // Instruction + Text( + "Enter verification code sent via SMS", + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + SizedBox(height: 20), + + // 4 Digit Input Fields + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: List.generate(4, (index) => _buildDigitField(index)), + ), + SizedBox(height: 30), + + // Verify Button + ElevatedButton( + onPressed: _verifyCode, + style: ElevatedButton.styleFrom( + backgroundColor: Colors.blue, + foregroundColor: Colors.white, + minimumSize: Size(double.infinity, 50), + ), + child: Text("Verify"), + ), + + SizedBox(height: 20), + _buildResendText(), + + SizedBox(height: 30), + Text( + "Customer Service", + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + Text( + "0702026554 | 0790882866", + style: TextStyle(fontSize: 16), + ), + ], + ), + ), + ); + } +} \ No newline at end of file