Advertisement
NotSooFriendly94

Untitled

Apr 21st, 2024
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 32.13 KB | None | 0 0
  1. import 'package:flutter/material.dart';
  2. import 'package:http/http.dart' as http;
  3. import 'package:google_fonts/google_fonts.dart';
  4. import 'package:task_app_es/work_screen.dart';
  5.  
  6. class LoginPage extends StatefulWidget {
  7.   const LoginPage({Key? key}) : super(key: key);
  8.  
  9.   @override
  10.   _LoginPageState createState() => _LoginPageState();
  11. }
  12.  
  13. class _LoginPageState extends State<LoginPage> with WidgetsBindingObserver {
  14.   final Map<String, String> credentials = {
  15.     'Char': 'Charanne556.',
  16.     'Lewis': 'PW',
  17.     'Andy': 'Polski123',
  18.     'Emmanuel': 'Kayari1'
  19.     // Add more username/password pairs here
  20.   };
  21.  
  22.   String enteredUsername = '';
  23.   String enteredPassword = '';
  24.   bool _isLoading = false;
  25.   bool _loginFailed = false;
  26.   bool _keyboardVisible = false;
  27.   bool _pageVisible = false;
  28.  
  29.   @override
  30.   void initState() {
  31.     super.initState();
  32.     WidgetsBinding.instance!.addObserver(this);
  33.     // Delay to start fading in the page after 3 seconds
  34.     Future.delayed(const Duration(milliseconds: 500), () {
  35.       setState(() {
  36.         _pageVisible = true;
  37.       });
  38.     });
  39.   }
  40.  
  41.   @override
  42.   void dispose() {
  43.     WidgetsBinding.instance!.removeObserver(this);
  44.     super.dispose();
  45.   }
  46.  
  47.   @override
  48.   void didChangeMetrics() {
  49.     final bool isKeyboardOpen = MediaQuery.of(context).viewInsets.bottom > 0;
  50.     setState(() {
  51.       _keyboardVisible = isKeyboardOpen;
  52.     });
  53.   }
  54.  
  55.   @override
  56.   Widget build(BuildContext context) {
  57.     return Scaffold(
  58.       backgroundColor: Colors.transparent,
  59.       appBar: AppBar(
  60.         toolbarHeight: 15,
  61.         backgroundColor: const Color.fromARGB(255, 0, 0, 0),
  62.       ),
  63.       body: AnimatedOpacity(
  64.         opacity: _pageVisible ? 1.0 : 0.0,
  65.         duration: const Duration(milliseconds: 1500),
  66.         child: GestureDetector(
  67.           onTap: () {
  68.             FocusScope.of(context).unfocus();
  69.           },
  70.           child: Stack(
  71.             children: [
  72.               Container(
  73.                 width: double.infinity,
  74.                 height: double.infinity,
  75.                 decoration: const BoxDecoration(
  76.                   gradient: LinearGradient(
  77.                     begin: Alignment.centerLeft,
  78.                     end: Alignment.centerRight,
  79.                     colors: [
  80.                       Color.fromARGB(255, 71, 0, 165),
  81.                       Color.fromARGB(255, 117, 0, 172),
  82.                     ],
  83.                   ),
  84.                 ),
  85.               ),
  86.               SingleChildScrollView(
  87.                 child: Center(
  88.                   child: Padding(
  89.                     padding: const EdgeInsets.all(0.0),
  90.                     child: Column(
  91.                       crossAxisAlignment: CrossAxisAlignment.center,
  92.                       children: [
  93.                         const SizedBox(height: 10.0),
  94.                         Center(
  95.                           child: Stack(
  96.                             children: [
  97.                               Text(
  98.                                 'Login',
  99.                                 style: GoogleFonts.langar(
  100.                                   textStyle: TextStyle(
  101.                                     fontSize: 100,
  102.                                     fontWeight: FontWeight.w400,
  103.                                     foreground: Paint()
  104.                                       ..shader = const LinearGradient(
  105.                                         colors: [
  106.                                           Color.fromARGB(59, 117, 1, 212),
  107.                                           Color.fromARGB(54, 157, 45, 255),
  108.                                           Color.fromARGB(50, 134, 0, 211),
  109.                                         ],
  110.                                       ).createShader(
  111.                                         const Rect.fromLTWH(
  112.                                           100.0, // left position
  113.                                           0.0, // top position
  114.                                           200, // width
  115.                                           100.0, // height
  116.                                         ),
  117.                                       ),
  118.                                   ),
  119.                                 ),
  120.                               ),
  121.                               Text(
  122.                                 'Login',
  123.                                 style: GoogleFonts.langar(
  124.                                   textStyle: TextStyle(
  125.                                     fontSize: 100,
  126.                                     fontWeight: FontWeight.w800,
  127.                                     foreground: Paint()
  128.                                       ..style = PaintingStyle.stroke
  129.                                       ..strokeWidth = 0.2
  130.                                       ..color =
  131.                                           const Color.fromARGB(95, 51, 1, 97),
  132.                                   ),
  133.                                 ),
  134.                               ),
  135.                             ],
  136.                           ),
  137.                         ),
  138.                         const SizedBox(height: 20.0),
  139.                         AnimatedContainer(
  140.                           duration: const Duration(milliseconds: 500),
  141.                           curve: Curves.easeInOut,
  142.                           width: 300.0,
  143.                           height: 150,
  144.                           padding: const EdgeInsets.symmetric(horizontal: 10.0),
  145.                           decoration: BoxDecoration(
  146.                             color: const Color.fromARGB(0, 0, 0, 0),
  147.                             borderRadius: BorderRadius.circular(10.0),
  148.                             border: Border.all(
  149.                               width: 2.0,
  150.                               color: const Color.fromARGB(0, 255, 255, 255),
  151.                             ),
  152.                           ),
  153.                           child: Column(
  154.                             children: [
  155.                               Container(
  156.                                 decoration: BoxDecoration(
  157.                                   color: const Color.fromARGB(78, 1, 0, 2),
  158.                                   borderRadius: BorderRadius.circular(15.0),
  159.                                   border: Border.all(
  160.                                     width: 2.0,
  161.                                     color: const Color.fromARGB(
  162.                                         141, 201, 137, 243),
  163.                                   ),
  164.                                 ),
  165.                                 child: TextFormField(
  166.                                   textAlign: TextAlign.center,
  167.                                   style: GoogleFonts.kodeMono(
  168.                                     fontSize: 22,
  169.                                     color: const Color.fromARGB(
  170.                                         255, 229, 125, 255),
  171.                                   ),
  172.                                   decoration: InputDecoration.collapsed(
  173.                                     hintText: 'Username',
  174.                                     hintStyle: GoogleFonts.bebasNeue(
  175.                                       fontSize: 28,
  176.                                       color: const Color.fromARGB(
  177.                                           148, 235, 171, 255),
  178.                                     ),
  179.                                   ),
  180.                                   onChanged: (value) {
  181.                                     setState(() {
  182.                                       enteredUsername = value;
  183.                                     });
  184.                                   },
  185.                                 ),
  186.                               ),
  187.                               const SizedBox(height: 20.0),
  188.                               Container(
  189.                                 decoration: BoxDecoration(
  190.                                   color: const Color.fromARGB(78, 1, 0, 2),
  191.                                   borderRadius: BorderRadius.circular(15.0),
  192.                                   border: Border.all(
  193.                                     width: 2.0,
  194.                                     color: const Color.fromARGB(
  195.                                         141, 201, 137, 243),
  196.                                   ),
  197.                                 ),
  198.                                 child: TextFormField(
  199.                                   textAlign: TextAlign.center,
  200.                                   obscureText: true,
  201.                                   style: GoogleFonts.kodeMono(
  202.                                     fontSize: 22,
  203.                                     color: const Color.fromARGB(
  204.                                         255, 229, 125, 255),
  205.                                   ),
  206.                                   decoration: InputDecoration.collapsed(
  207.                                     hintText: 'Password',
  208.                                     hintStyle: GoogleFonts.bebasNeue(
  209.                                       fontSize: 28,
  210.                                       color: const Color.fromARGB(
  211.                                           148, 235, 171, 255),
  212.                                     ),
  213.                                   ),
  214.                                   onChanged: (value) {
  215.                                     setState(() {
  216.                                       enteredPassword = value;
  217.                                     });
  218.                                   },
  219.                                 ),
  220.                               ),
  221.                             ],
  222.                           ),
  223.                         ),
  224.                         const SizedBox(height: 10.0),
  225.                         _isLoading
  226.                             ? const CircularProgressIndicator()
  227.                             : SizedBox(
  228.                                 height: 40.0,
  229.                                 width: 150.0,
  230.                                 child: InkWell(
  231.                                   onTap: _login,
  232.                                   child: Container(
  233.                                     decoration: BoxDecoration(
  234.                                       borderRadius: BorderRadius.circular(15.0),
  235.                                       color: const Color.fromARGB(
  236.                                           124, 240, 201, 255),
  237.                                       border: Border.all(
  238.                                         width: 2.0,
  239.                                         color: const Color.fromARGB(
  240.                                             255, 227, 214, 255),
  241.                                       ),
  242.                                     ),
  243.                                     child: const Center(
  244.                                       child: Text(
  245.                                         'Login',
  246.                                         style: TextStyle(
  247.                                           fontSize: 20.0,
  248.                                           fontWeight: FontWeight.bold,
  249.                                           color: Color.fromARGB(
  250.                                               193, 231, 190, 255),
  251.                                         ),
  252.                                       ),
  253.                                     ),
  254.                                   ),
  255.                                 ),
  256.                               ),
  257.                         const SizedBox(height: 25.0),
  258.                         SizedBox(
  259.                           height: 40.0,
  260.                           width: 200.0,
  261.                           child: InkWell(
  262.                             onTap: () => _createUser(context),
  263.                             child: Container(
  264.                               decoration: BoxDecoration(
  265.                                 borderRadius: BorderRadius.circular(15.0),
  266.                                 color: const Color.fromARGB(124, 240, 201, 255),
  267.                                 border: Border.all(
  268.                                   width: 2.0,
  269.                                   color:
  270.                                       const Color.fromARGB(255, 227, 214, 255),
  271.                                 ),
  272.                               ),
  273.                               child: const Center(
  274.                                 child: Text(
  275.                                   'Create User',
  276.                                   style: TextStyle(
  277.                                     fontSize: 20.0,
  278.                                     fontWeight: FontWeight.bold,
  279.                                     color: Color.fromARGB(193, 231, 190, 255),
  280.                                   ),
  281.                                 ),
  282.                               ),
  283.                             ),
  284.                           ),
  285.                         ),
  286.                       ],
  287.                     ),
  288.                   ),
  289.                 ),
  290.               ),
  291.               AnimatedPositioned(
  292.                 duration: const Duration(milliseconds: 100),
  293.                 curve: Curves.easeInOut,
  294.                 bottom: _keyboardVisible ? 0 : 0,
  295.                 left: _keyboardVisible ? 0 : 100,
  296.                 child: AnimatedContainer(
  297.                   duration: const Duration(milliseconds: 100),
  298.                   curve: Curves.easeInOut,
  299.                   width: _keyboardVisible ? 45 : 200,
  300.                   height: _keyboardVisible ? 45 : 200,
  301.                   child: Image.asset(
  302.                     'assets/cat_galaxy.gif',
  303.                     repeat: ImageRepeat.noRepeat,
  304.                   ),
  305.                 ),
  306.               ),
  307.             ],
  308.           ),
  309.         ),
  310.       ),
  311.     );
  312.   }
  313.  
  314.   void showErrorPrompt(String message) {
  315.     showDialog(
  316.       context: context,
  317.       builder: (context) => AlertDialog(
  318.         title: const Text('Error'),
  319.         content: Text(message),
  320.         actions: [
  321.           TextButton(
  322.             onPressed: () => Navigator.of(context).pop(),
  323.             child: const Text('OK'),
  324.           ),
  325.         ],
  326.       ),
  327.     );
  328.   }
  329.  
  330.   void _login() {
  331.     // Hide the keyboard
  332.     FocusScope.of(context).unfocus();
  333.  
  334.     setState(() {
  335.       _isLoading = true;
  336.     });
  337.  
  338.     // Check if username and password are empty
  339.     if (enteredUsername.isEmpty && enteredPassword.isEmpty) {
  340.       showErrorPrompt('Please enter a username and password');
  341.       setState(() {
  342.         _isLoading = false;
  343.       });
  344.       return;
  345.     }
  346.  
  347.     // Check if username is missing
  348.     if (enteredUsername.isEmpty) {
  349.       showErrorPrompt('Please enter a valid username to continue');
  350.       setState(() {
  351.         _isLoading = false;
  352.       });
  353.       return;
  354.     }
  355.  
  356.     // Check if password is missing
  357.     if (enteredPassword.isEmpty) {
  358.       showErrorPrompt('Please enter a valid password to continue');
  359.       setState(() {
  360.         _isLoading = false;
  361.       });
  362.       return;
  363.     }
  364.  
  365.     // Send the login request
  366.     http.post(
  367.       Uri.parse('https://notsoofriendly.co.uk/TaskApp_ES/handle_login.php'),
  368.       body: {
  369.         'username': enteredUsername,
  370.         'password': enteredPassword,
  371.       },
  372.     ).then((response) {
  373.       // Check if the response is valid
  374.       if (response.statusCode == 200) {
  375.         // Check if the response contains 'valid login'
  376.         if (response.body.trim() == 'valid login') {
  377.           // Navigate to WorkScreen
  378.           Navigator.pushReplacement(
  379.             context,
  380.             MaterialPageRoute(builder: (context) => const WorkScreen()),
  381.           );
  382.         } else {
  383.           // Invalid credentials
  384.           showErrorPrompt(
  385.               'Username or Password is incorrect, please try again');
  386.         }
  387.       } else {
  388.         // Show error message for failed request
  389.         showErrorPrompt('Failed to log in. Please try again later.');
  390.       }
  391.  
  392.       // Reset loading state
  393.       setState(() {
  394.         _isLoading = false;
  395.       });
  396.     }).catchError((error) {
  397.       // Show error message for exceptions
  398.       showErrorPrompt('An error occurred. Please try again later.');
  399.  
  400.       // Reset loading state
  401.       setState(() {
  402.         _isLoading = false;
  403.       });
  404.     });
  405.   }
  406.  
  407.  
  408.   void _createUser(BuildContext context) async {
  409.   String errorMessage = '';
  410.   String username = '';
  411.   String password = '';
  412.   String email = '';
  413.  
  414.   // Variables to track validation status of each input field
  415.   bool isUsernameValid = false;
  416.   bool isPasswordValid = false;
  417.   bool isEmailValid = false;
  418.  
  419.   // Function to update validation status and check if all fields are valid
  420.   bool isFormValid() {
  421.     return isUsernameValid && isPasswordValid && isEmailValid;
  422.   }
  423.  
  424.   // Function to get icon based on validation status
  425.   Widget getIcon(bool isValid) {
  426.     return isValid
  427.         ? const Icon(Icons.check, color: Colors.green)
  428.         : const Icon(Icons.close, color: Colors.red);
  429.   }
  430.  
  431.   showDialog(
  432.     context: context,
  433.     builder: (context) => AlertDialog(
  434.       shape: RoundedRectangleBorder(
  435.         borderRadius: BorderRadius.circular(15.0), // Rounded corners
  436.       ),
  437.       backgroundColor: Colors.deepPurple.withOpacity(0.8),
  438.       contentPadding: const EdgeInsets.all(15),
  439.       content: ConstrainedBox(
  440.         constraints: BoxConstraints(
  441.           maxHeight: MediaQuery.of(context).size.height - 50,
  442.           minWidth: MediaQuery.of(context).size.width - 10,
  443.         ),
  444.         child: SingleChildScrollView(
  445.           child: Column(
  446.             crossAxisAlignment: CrossAxisAlignment.center,
  447.             mainAxisSize: MainAxisSize.min,
  448.             children: [
  449.               const Text(
  450.                 'Create User',
  451.                 style: TextStyle(
  452.                   fontSize: 20,
  453.                   fontWeight: FontWeight.bold,
  454.                   color: Colors.white,
  455.                 ),
  456.               ),
  457.               const SizedBox(height: 20),
  458.               Container(
  459.                 margin: const EdgeInsets.symmetric(horizontal: 5),
  460.                 decoration: BoxDecoration(
  461.                   borderRadius: BorderRadius.circular(20.0),
  462.                   color: Colors.transparent,
  463.                 ),
  464.                 child: ExpansionTile(
  465.                   expandedCrossAxisAlignment: CrossAxisAlignment.center,
  466.                   iconColor: const Color.fromARGB(255, 255, 196, 0),
  467.                   collapsedIconColor: Colors.white,
  468.                   title: const Text(
  469.                     'User Creation Help',
  470.                     style: TextStyle(
  471.                       fontSize: 16,
  472.                       fontWeight: FontWeight.bold,
  473.                       color: Color.fromARGB(255, 255, 196, 0),
  474.                     ),
  475.                   ),
  476.                   initiallyExpanded: false,
  477.                   children: [
  478.                     const SizedBox(height: 10), // Gap of 10px
  479.                     Container(
  480.                       decoration: BoxDecoration(
  481.                         borderRadius: BorderRadius.circular(20.0),
  482.                         color: Colors.deepPurple.withOpacity(0.8),
  483.                       ),
  484.                       child: const ExpansionTile(
  485.                         title: Text(
  486.                           'Username Creation',
  487.                           textAlign: TextAlign.center,
  488.                           style: TextStyle(
  489.                             fontSize: 14,
  490.                             fontWeight: FontWeight.bold,
  491.                             color: Colors.white,
  492.                           ),
  493.                         ),
  494.                         iconColor: Color.fromARGB(255, 255, 196, 0),
  495.                         collapsedIconColor: Colors.white,
  496.                         initiallyExpanded: false,
  497.                         children: [
  498.                           Padding(
  499.                             padding: EdgeInsets.symmetric(horizontal: 16.0),
  500.                             child: Column(
  501.                               crossAxisAlignment: CrossAxisAlignment.center,
  502.                               children: [
  503.                                 Text(
  504.                                   'Username should be the same as your ES Computer Username:',
  505.                                   style: TextStyle(
  506.                                     fontSize: 14,
  507.                                     fontWeight: FontWeight.bold,
  508.                                     color: Colors.white,
  509.                                   ),
  510.                                   textAlign: TextAlign.center,
  511.                                 ),
  512.                                 Text(
  513.                                   '"John.Doe"',
  514.                                   style: TextStyle(
  515.                                     fontSize: 13,
  516.                                     fontStyle: FontStyle.italic,
  517.                                     color: Colors.white,
  518.                                   ),
  519.                                   textAlign: TextAlign.center,
  520.                                 ),
  521.                               ],
  522.                             ),
  523.                           ),
  524.                         ],
  525.                       ),
  526.                     ),
  527.                     const SizedBox(height: 10), // Gap of 10px
  528.                     Container(
  529.                       decoration: BoxDecoration(
  530.                         borderRadius: BorderRadius.circular(20.0),
  531.                         color: Colors.deepPurple.withOpacity(0.8),
  532.                       ),
  533.                       child: const ExpansionTile(
  534.                         title: Text(
  535.                           'Password Creation',
  536.                           textAlign: TextAlign.center,
  537.                           style: TextStyle(
  538.                             fontSize: 14,
  539.                             fontWeight: FontWeight.bold,
  540.                             color: Colors.white,
  541.                           ),
  542.                         ),
  543.                         iconColor: Color.fromARGB(255, 255, 196, 0),
  544.                         collapsedIconColor: Colors.white,
  545.                         initiallyExpanded: false,
  546.                         children: [
  547.                           Padding(
  548.                             padding: EdgeInsets.symmetric(horizontal: 16.0),
  549.                             child: Column(
  550.                               crossAxisAlignment: CrossAxisAlignment.center,
  551.                               children: [
  552.                                 Text(
  553.                                   'Password must contain 6 Characters, including a capital Letter, Lower Case Letter & 1 Special Character:',
  554.                                   style: TextStyle(
  555.                                     fontSize: 14,
  556.                                     fontWeight: FontWeight.bold,
  557.                                     color: Colors.white,
  558.                                   ),
  559.                                   textAlign: TextAlign.center,
  560.                                 ),
  561.                                 Text(
  562.                                   '"ExamplePW24!"',
  563.                                   style: TextStyle(
  564.                                     fontSize: 13,
  565.                                     fontStyle: FontStyle.italic,
  566.                                     color: Colors.white,
  567.                                   ),
  568.                                   textAlign: TextAlign.center,
  569.                                 ),
  570.                               ],
  571.                             ),
  572.                           ),
  573.                         ],
  574.                       ),
  575.                     ),
  576.                     const SizedBox(height: 10), // Gap of 10px
  577.                     Container(
  578.                       margin: const EdgeInsets.only(bottom: 10),
  579.                       decoration: BoxDecoration(
  580.                         borderRadius: BorderRadius.circular(20.0),
  581.                         color: Colors.deepPurple.withOpacity(0.8),
  582.                       ),
  583.                       child: const ExpansionTile(
  584.                         title: Text(
  585.                           'Email Address Creation',
  586.                           textAlign: TextAlign.center,
  587.                           style: TextStyle(
  588.                             fontSize: 14,
  589.                             fontWeight: FontWeight.bold,
  590.                             color: Colors.white,
  591.                           ),
  592.                         ),
  593.                         iconColor: Color.fromARGB(255, 255, 196, 0),
  594.                         collapsedIconColor: Colors.white,
  595.                         initiallyExpanded: false,
  596.                         children: [
  597.                           Padding(
  598.                             padding: EdgeInsets.symmetric(horizontal: 16.0),
  599.                             child: Column(
  600.                               crossAxisAlignment: CrossAxisAlignment.center,
  601.                               children: [
  602.                                 Text(
  603.                                   'ES Work Email Address must follow the format:',
  604.                                   style: TextStyle(
  605.                                     fontSize: 14,
  606.                                     fontWeight: FontWeight.bold,
  607.                                     color: Colors.white,
  608.                                   ),
  609.                                   textAlign: TextAlign.center,
  610.                                 ),
  611.                                 Text(
  612.                                   '" firstname.lastname@epilepsysociety.org.uk"',
  613.                                   style: TextStyle(
  614.                                     fontSize: 13,
  615.                                     fontStyle: FontStyle.italic,
  616.                                     color: Colors.white,
  617.                                   ),
  618.                                   textAlign: TextAlign.center,
  619.                                 ),
  620.                               ],
  621.                             ),
  622.                           ),
  623.                         ],
  624.                       ),
  625.                     ),
  626.                   ],
  627.                 ),
  628.               ),
  629.               const SizedBox(height: 20),
  630.               TextFormField(
  631.                 decoration: InputDecoration(
  632.                   floatingLabelAlignment: FloatingLabelAlignment.center,
  633.                   labelText: 'ES Username:',
  634.                   labelStyle: const TextStyle(
  635.                     color: Color.fromARGB(255, 190, 131, 252),
  636.                     fontSize: 18,
  637.                   ),
  638.                   suffixIcon: getIcon(isUsernameValid),
  639.                 ),
  640.                 textAlign: TextAlign.left,
  641.                 style: const TextStyle(
  642.                   color: Color.fromARGB(255, 255, 255, 255),
  643.                   fontSize: 20,
  644.                 ),
  645.                 onChanged: (value) {
  646.                   setState(() {
  647.                     username = value;
  648.                     isUsernameValid = _validateUsername(username);
  649.                   });
  650.                 },
  651.               ),
  652.               // Password TextFormField
  653.               TextFormField(
  654.                 decoration: InputDecoration(
  655.                   floatingLabelAlignment: FloatingLabelAlignment.center,
  656.                   labelText: 'Password:',
  657.                   labelStyle: const TextStyle(
  658.                     color: Color.fromARGB(255, 190, 131, 252),
  659.                     fontSize: 18,
  660.                   ),
  661.                   suffixIcon: getIcon(isPasswordValid),
  662.                 ),
  663.                 textAlign: TextAlign.left,
  664.                 style: const TextStyle(
  665.                   color: Color.fromARGB(255, 255, 255, 255),
  666.                   fontSize: 20,
  667.                 ),
  668.                 onChanged: (value) {
  669.                   setState(() {
  670.                     password = value;
  671.                     isPasswordValid = _validatePassword(password);
  672.                   });
  673.                 },
  674.               ),
  675.               // Email TextFormField
  676.               TextFormField(
  677.                 decoration: InputDecoration(
  678.                   floatingLabelAlignment: FloatingLabelAlignment.center,
  679.                   labelText: 'ES Work Email Address:',
  680.                   labelStyle: const TextStyle(
  681.                     color: Color.fromARGB(255, 190, 131, 252),
  682.                     fontSize: 18,
  683.                   ),
  684.                   suffixIcon: getIcon(isEmailValid),
  685.                 ),
  686.                 textAlign: TextAlign.left,
  687.                 style: const TextStyle(
  688.                   color: Color.fromARGB(255, 255, 255, 255),
  689.                   fontSize: 12,
  690.                 ),
  691.                 onChanged: (value) {
  692.                   setState(() {
  693.                     email = value;
  694.                     isEmailValid = _validateEmail(email, username);
  695.                   });
  696.                 },
  697.               ),
  698.               const SizedBox(height: 20),
  699.               Row(
  700.                 mainAxisAlignment: MainAxisAlignment.center,
  701.                 children: [
  702.                   TextButton(
  703.                     onPressed: () => Navigator.of(context).pop(),
  704.                     child: const Text(
  705.                       'Cancel',
  706.                       style: TextStyle(color: Colors.white, fontSize: 22.0),
  707.                     ),
  708.                   ),
  709.                   const SizedBox(width: 20),
  710.                   TextButton(
  711.                     onPressed: isFormValid()
  712.                         ? () async {
  713.                             // Process user creation
  714.                             final response = await createUser(username, password, email);
  715.                             print(response);
  716.                             if (response == 'success') {
  717.                               // Close the form if user creation is successful
  718.                               Navigator.of(context).pop();
  719.                               return;
  720.                             } else {
  721.                               // Reset form if user creation failed
  722.                               errorMessage = 'Failed to create user';
  723.                             }
  724.  
  725.                             // Print whether user creation is valid
  726.                             bool userCreationValid = errorMessage.isEmpty;
  727.                             print('User Creation Valid: $userCreationValid');
  728.  
  729.                             // Show error prompt if necessary
  730.                             if (errorMessage.isNotEmpty) {
  731.                               _showErrorPrompt(errorMessage, context);
  732.                             }
  733.                           }
  734.                         : null,
  735.                     child: const Text(
  736.                       'Create',
  737.                       style: TextStyle(color: Colors.white, fontSize: 22.0),
  738.                     ),
  739.                   ),
  740.                 ],
  741.               ),
  742.             ],
  743.           ),
  744.         ),
  745.       ),
  746.     ),
  747.   );
  748. }
  749.  
  750.   Future<String> createUser(
  751.       String username, String password, String email) async {
  752.     final response = await http.post(
  753.       Uri.parse('https://notsoofriendly.co.uk/TaskApp_ES/ta_add_user.php'),
  754.       body: {
  755.         'username': username,
  756.         'password': password,
  757.         'email': email,
  758.       },
  759.     );
  760.     if (response.statusCode == 200) {
  761.       return 'success';
  762.     } else {
  763.       throw Exception('Failed to create user');
  764.     }
  765.   }
  766.  
  767.   bool _validateUsername(String username) {
  768.     // Check if username matches the format firstname.lastname
  769.     RegExp usernameRegExp = RegExp(r'^[a-zA-Z]+\.[a-zA-Z]+$');
  770.     return usernameRegExp.hasMatch(username);
  771.   }
  772.  
  773.   bool _validatePassword(String password) {
  774.     // Password must contain 6 characters, including a capital letter, lowercase letter, and a special character
  775.     RegExp passwordRegExp =
  776.         RegExp(r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[^\w\s]).{6,}$');
  777.     return passwordRegExp.hasMatch(password);
  778.   }
  779.  
  780.   bool _validateEmail(String email, String username) {
  781.     // Email must follow the format: firstname.lastname@epilepsysociety.org.uk
  782.     String emailPattern = '${username.toLowerCase()}@epilepsysociety.org.uk';
  783.     return email.toLowerCase() == emailPattern;
  784.   }
  785.  
  786.   void _showErrorPrompt(String message, BuildContext context) {
  787.     if (context != null && mounted) {
  788.       showDialog(
  789.         context: context,
  790.         builder: (context) => AlertDialog(
  791.           title: const Text('Error'),
  792.           content: Text(message),
  793.           actions: [
  794.             TextButton(
  795.               onPressed: () => Navigator.of(context).pop(),
  796.               child: const Text('OK'),
  797.             ),
  798.           ],
  799.         ),
  800.       );
  801.     }
  802.   }
  803. }
  804.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement