From 2d5c270641308bdd86bca5ce53400118c18ddbfb Mon Sep 17 00:00:00 2001
From: zypherift <regokoppany@gmail.com>
Date: Wed, 21 Aug 2024 23:22:27 +0200
Subject: [PATCH] change kretenlogin to widget

---
 .../lib/screens/login/kreten_login.dart       | 124 +++------
 .../lib/screens/login/login_screen.dart       | 254 ++++++++++--------
 2 files changed, 187 insertions(+), 191 deletions(-)

diff --git a/refilc_mobile_ui/lib/screens/login/kreten_login.dart b/refilc_mobile_ui/lib/screens/login/kreten_login.dart
index df7bcb6..673e296 100644
--- a/refilc_mobile_ui/lib/screens/login/kreten_login.dart
+++ b/refilc_mobile_ui/lib/screens/login/kreten_login.dart
@@ -3,17 +3,17 @@
 import 'package:flutter/material.dart';
 import 'package:webview_flutter/webview_flutter.dart';
 
-class KretenLoginScreen extends StatefulWidget {
-  const KretenLoginScreen({super.key, required this.onLogin});
+class KretenLoginWidget extends StatefulWidget {
+  const KretenLoginWidget({super.key, required this.onLogin});
 
   // final String selectedSchool;
   final void Function(String code) onLogin;
 
   @override
-  State<KretenLoginScreen> createState() => _KretenLoginScreenState();
+  State<KretenLoginWidget> createState() => _KretenLoginWidgetState();
 }
 
-class _KretenLoginScreenState extends State<KretenLoginScreen> {
+class _KretenLoginWidgetState extends State<KretenLoginWidget> {
   late final WebViewController controller;
   var loadingPercentage = 0;
   var currentUrl = '';
@@ -24,71 +24,35 @@ class _KretenLoginScreenState extends State<KretenLoginScreen> {
     controller = WebViewController()
       ..setJavaScriptMode(JavaScriptMode.unrestricted)
       ..setNavigationDelegate(NavigationDelegate(
-        onNavigationRequest: (n) async {
-          if (n.url.startsWith('https://mobil.e-kreta.hu')) {
-            setState(() {
-              loadingPercentage = 0;
-              currentUrl = n.url;
-            });
-
-            // final String instituteCode = widget.selectedSchool;
-            // if (!n.url.startsWith(
-            //     'https://mobil.e-kreta.hu/ellenorzo-student/prod/oauthredirect?code=')) {
-            //   return;
-            // }
-
-            List<String> requiredThings = n.url
-                .replaceAll(
-                    'https://mobil.e-kreta.hu/ellenorzo-student/prod/oauthredirect?code=',
-                    '')
-                .replaceAll(
-                    '&scope=openid%20email%20offline_access%20kreta-ellenorzo-webapi.public%20kreta-eugyintezes-webapi.public%20kreta-fileservice-webapi.public%20kreta-mobile-global-webapi.public%20kreta-dkt-webapi.public%20kreta-ier-webapi.public&state=refilc_student_mobile&session_state=',
-                    ':')
-                .split(':');
-
-            String code = requiredThings[0];
-            // String sessionState = requiredThings[1];
-
-            widget.onLogin(code);
-            // Future.delayed(const Duration(milliseconds: 500), () {
-            //   Navigator.of(context).pop();
-            // });
-            // Navigator.of(context).pop();
-
-            return NavigationDecision.prevent;
-          } else {
-            return NavigationDecision.navigate;
-          }
-        },
         onPageStarted: (url) async {
-          // setState(() {
-          //   loadingPercentage = 0;
-          //   currentUrl = url;
+          setState(() {
+            loadingPercentage = 0;
+            currentUrl = url;
+          });
+
+          // final String instituteCode = widget.selectedSchool;
+          if (!url.startsWith(
+              'https://mobil.e-kreta.hu/ellenorzo-student/prod/oauthredirect?code=')) {
+            return;
+          }
+
+          List<String> requiredThings = url
+              .replaceAll(
+                  'https://mobil.e-kreta.hu/ellenorzo-student/prod/oauthredirect?code=',
+                  '')
+              .replaceAll(
+                  '&scope=openid%20email%20offline_access%20kreta-ellenorzo-webapi.public%20kreta-eugyintezes-webapi.public%20kreta-fileservice-webapi.public%20kreta-mobile-global-webapi.public%20kreta-dkt-webapi.public%20kreta-ier-webapi.public&state=refilc_student_mobile&session_state=',
+                  ':')
+              .split(':');
+
+          String code = requiredThings[0];
+          // String sessionState = requiredThings[1];
+
+          widget.onLogin(code);
+          // Future.delayed(const Duration(milliseconds: 500), () {
+          //   Navigator.of(context).pop();
           // });
-
-          // // final String instituteCode = widget.selectedSchool;
-          // if (!url.startsWith(
-          //     'https://mobil.e-kreta.hu/ellenorzo-student/prod/oauthredirect?code=')) {
-          //   return;
-          // }
-
-          // List<String> requiredThings = url
-          //     .replaceAll(
-          //         'https://mobil.e-kreta.hu/ellenorzo-student/prod/oauthredirect?code=',
-          //         '')
-          //     .replaceAll(
-          //         '&scope=openid%20email%20offline_access%20kreta-ellenorzo-webapi.public%20kreta-eugyintezes-webapi.public%20kreta-fileservice-webapi.public%20kreta-mobile-global-webapi.public%20kreta-dkt-webapi.public%20kreta-ier-webapi.public&state=refilc_student_mobile&session_state=',
-          //         ':')
-          //     .split(':');
-
-          // String code = requiredThings[0];
-          // // String sessionState = requiredThings[1];
-
-          // widget.onLogin(code);
-          // // Future.delayed(const Duration(milliseconds: 500), () {
-          // //   Navigator.of(context).pop();
-          // // });
-          // // Navigator.of(context).pop();
+          // Navigator.of(context).pop();
         },
         onProgress: (progress) {
           setState(() {
@@ -114,24 +78,18 @@ class _KretenLoginScreenState extends State<KretenLoginScreen> {
   //     Nonce nonce = getNonce(nonceStr, );
   // }
 
-  @override
+ @override
   Widget build(BuildContext context) {
-    return Scaffold(
-      appBar: AppBar(
-        leading: const BackButton(),
-        title: const Text('e-KRÉTA Bejelentkezés'),
-      ),
-      body: Stack(
-        children: [
-          WebViewWidget(
-            controller: controller,
+    return Stack(
+      children: [
+        WebViewWidget(
+          controller: controller,
+        ),
+        if (loadingPercentage < 100)
+          LinearProgressIndicator(
+            value: loadingPercentage / 100.0,
           ),
-          if (loadingPercentage < 100)
-            LinearProgressIndicator(
-              value: loadingPercentage / 100.0,
-            ),
-        ],
-      ),
+      ],
     );
   }
 }
diff --git a/refilc_mobile_ui/lib/screens/login/login_screen.dart b/refilc_mobile_ui/lib/screens/login/login_screen.dart
index 298da46..7e74d36 100644
--- a/refilc_mobile_ui/lib/screens/login/login_screen.dart
+++ b/refilc_mobile_ui/lib/screens/login/login_screen.dart
@@ -3,14 +3,19 @@
 import 'package:refilc/api/client.dart';
 import 'package:refilc/api/login.dart';
 import 'package:refilc/theme/colors/colors.dart';
+import 'package:refilc_mobile_ui/common/bottom_sheet_menu/rounded_bottom_sheet.dart';
 import 'package:refilc_mobile_ui/common/custom_snack_bar.dart';
 import 'package:refilc_mobile_ui/common/system_chrome.dart';
+import 'package:refilc_mobile_ui/common/widgets/absence/absence_display.dart';
+import 'package:refilc_mobile_ui/screens/login/login_button.dart';
+import 'package:refilc_mobile_ui/screens/login/login_input.dart';
 import 'package:refilc_mobile_ui/screens/login/school_input/school_input.dart';
 import 'package:refilc_mobile_ui/screens/settings/privacy_view.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'login_screen.i18n.dart';
 import 'package:carousel_slider/carousel_slider.dart';
+import 'package:flutter_svg/flutter_svg.dart';
 import 'package:refilc_mobile_ui/screens/login/kreten_login.dart'; //new library for new web login
 
 class LoginScreen extends StatefulWidget {
@@ -27,8 +32,8 @@ class LoginScreenState extends State<LoginScreen> {
   final passwordController = TextEditingController();
   final schoolController = SchoolInputController();
   final _scrollController = ScrollController();
-  // new controllers
   final codeController = TextEditingController();
+
   LoginState _loginState = LoginState.normal;
   bool showBack = false;
 
@@ -54,7 +59,7 @@ class LoginScreenState extends State<LoginScreen> {
     SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
       statusBarColor: Colors.transparent,
       statusBarIconBrightness: Brightness.light,
-      systemNavigationBarColor: Color(0xFFDAE4F7),
+      systemNavigationBarColor: Colors.white,
       systemNavigationBarIconBrightness: Brightness.dark,
     ));
 
@@ -80,7 +85,7 @@ class LoginScreenState extends State<LoginScreen> {
     precacheImage(const AssetImage('assets/images/showcase2.png'), context);
     precacheImage(const AssetImage('assets/images/showcase3.png'), context);
     precacheImage(const AssetImage('assets/images/showcase4.png'), context);
-    // bool selected = false;
+    bool selected = false;
 
     return Scaffold(
       body: Container(
@@ -97,17 +102,9 @@ class LoginScreenState extends State<LoginScreen> {
                 children: [
                   // app icon
                   Padding(
-                      padding: const EdgeInsets.only(left: 24, top: 0),
+                      padding: const EdgeInsets.only(left: 24, top: 20),
                       child: Row(
                         children: [
-                          if (showBack)
-                            Material(
-                              type: MaterialType.transparency,
-                              child: showBack
-                                  ? const BackButton(color: Colors.black)
-                                  : const SizedBox(height: 48.0),
-                            ),
-                          if (showBack) const SizedBox(width: 8),
                           Image.asset(
                             'assets/icons/ic_rounded.png',
                             width: 30.0,
@@ -121,6 +118,12 @@ class LoginScreenState extends State<LoginScreen> {
                                 fontWeight: FontWeight.bold,
                                 fontFamily: 'Montserrat'),
                           ),
+                          Material(
+                            type: MaterialType.transparency,
+                            child: showBack
+                                ? BackButton(color: AppColors.of(context).text)
+                                : const SizedBox(height: 48.0),
+                          ),
                         ],
                       )),
                   Stack(
@@ -131,7 +134,7 @@ class LoginScreenState extends State<LoginScreen> {
                         mainAxisAlignment: MainAxisAlignment.end,
                         crossAxisAlignment: CrossAxisAlignment.end,
                         children: [
-                          const SizedBox(height: 20),
+                          const SizedBox(height: 21),
                           CarouselSlider(
                             options: CarouselOptions(
                                 height: MediaQuery.of(context).size.height,
@@ -198,115 +201,145 @@ class LoginScreenState extends State<LoginScreen> {
                         ],
                       ),
                       Container(
-                        height: 330,
+                        height: 300,
                         width: double.infinity,
                         decoration: const BoxDecoration(
                           gradient: LinearGradient(
                             colors: [Color(0x00DAE4F7), Color(0xFFDAE4F7)],
-                            stops: [0, 0.24],
+                            stops: [0, 0.12],
                             begin: Alignment.topCenter,
                             end: Alignment.bottomCenter,
                           ),
                         ),
                         child: Padding(
                           padding: EdgeInsets.only(
-                              top: 90,
+                              top: 50,
                               bottom: MediaQuery.of(context).viewInsets.bottom),
                           child: Column(
                             children: [
                               SizedBox(
-                                height: 52,
+                                height: 48,
                                 width: double.infinity,
                                 child: Padding(
                                   padding: const EdgeInsets.symmetric(
                                       horizontal: 16),
-                                  child: GestureDetector(
-                                    onTap: () {
-                                      final NavigatorState navigator =
-                                          Navigator.of(context);
-                                      navigator
-                                          .push(
-                                        MaterialPageRoute(
-                                          builder: (context) =>
-                                              KretenLoginScreen(
-                                            onLogin: (String code) {
-                                              codeController.text = code;
-                                              navigator.pop();
-                                            },
-                                          ),
-                                        ),
-                                      )
-                                          .then((value) {
-                                        if (codeController.text != "") {
-                                          _NewLoginAPI(context: context);
-                                        }
-                                      });
-                                    },
-                                    child: Container(
-                                        width:
-                                            MediaQuery.of(context).size.width *
-                                                0.75,
-                                        height: 60.0,
-                                        decoration: BoxDecoration(
-                                          // image: const DecorationImage(
-                                          //   image:
-                                          //       AssetImage('assets/images/btn_kreten_login.png'),
-                                          //   fit: BoxFit.scaleDown,
-                                          // ),
-                                          borderRadius:
-                                              BorderRadius.circular(12.0),
-                                          color: const Color(0xFF0097C1),
-                                        ),
-                                        padding: const EdgeInsets.only(
-                                            top: 5.0,
-                                            left: 5.0,
-                                            right: 5.0,
-                                            bottom: 5.0),
-                                        child: Row(
-                                          mainAxisAlignment:
-                                              MainAxisAlignment.center,
-                                          children: [
-                                            Image.asset(
-                                              'assets/images/btn_kreten_login.png',
-                                            ),
-                                            const SizedBox(
-                                              width: 10.0,
-                                            ),
-                                            Container(
-                                              width: 1.0,
-                                              height: 30.0,
-                                              color: Colors.white,
-                                            ),
-                                            const SizedBox(
-                                              width: 10.0,
-                                            ),
-                                            Text(
-                                              'login_w_kreta_acc'.i18n,
-                                              textAlign: TextAlign.center,
-                                              style: const TextStyle(
-                                                color: Colors.white,
-                                                fontWeight: FontWeight.bold,
-                                                fontSize: 14.0,
+                                  child: FilledButton(
+                                      style: ButtonStyle(
+                                          shape: WidgetStateProperty.all<
+                                                  RoundedRectangleBorder>(
+                                              const RoundedRectangleBorder(
+                                        borderRadius: BorderRadius.all(
+                                            Radius.circular(12)),
+                                      ))),
+                                      onPressed: () {
+                                        showModalBottomSheet(
+                                          backgroundColor: Colors.transparent,
+                                          context: context,
+                                          isScrollControlled:
+                                              true, // This ensures the modal accommodates input fields properly
+                                          builder: (BuildContext context) {
+                                            return Container(
+                                              height: MediaQuery.of(context)
+                                                          .size
+                                                          .height *
+                                                      0.8 +
+                                                  MediaQuery.of(context)
+                                                      .viewInsets
+                                                      .bottom,
+                                              decoration: const BoxDecoration(
+                                                color: Color(0xFFDAE4F7),
+                                                borderRadius: BorderRadius.only(
+                                                  topRight:
+                                                      Radius.circular(24.0),
+                                                  topLeft:
+                                                      Radius.circular(24.0),
+                                                ),
                                               ),
-                                            ),
-                                          ],
-                                        )),
-                                  ),
-                                ),
-                              ),
-                              const SizedBox(height: 17),
-                              // privacy policy
-                              GestureDetector(
-                                onTap: () => PrivacyView.show(context),
-                                child: Text(
-                                  'privacy'.i18n,
-                                  style: const TextStyle(
-                                    color: Colors.black,
-                                    fontWeight: FontWeight.w500,
-                                    fontSize: 14.0,
-                                  ),
+                                              child: Column(
+                                                crossAxisAlignment:
+                                                    CrossAxisAlignment.center,
+                                                mainAxisAlignment:
+                                                    MainAxisAlignment.start,
+                                                children: [
+                                                  Padding(
+                                                    padding: const EdgeInsets
+                                                        .symmetric(
+                                                        vertical: 18),
+                                                    child: Container(
+                                                      decoration:
+                                                          const BoxDecoration(
+                                                        color:
+                                                            Color(0xFFB9C8E5),
+                                                        borderRadius:
+                                                            BorderRadius.only(
+                                                          topRight:
+                                                              Radius.circular(
+                                                                  2.0),
+                                                          topLeft:
+                                                              Radius.circular(
+                                                                  2.0),
+                                                        ),
+                                                      ),
+                                                      width: 40,
+                                                      height: 4,
+                                                    ),
+                                                  ),
+                                                  Expanded(
+                                                    child: Padding(
+                                                      padding:
+                                                          const EdgeInsets.only(
+                                                              right: 14,
+                                                              left: 14,
+                                                              bottom: 24),
+                                                      child: ClipRRect(
+                                                        borderRadius:
+                                                            BorderRadius
+                                                                .circular(16),
+                                                        child: Container(
+                                                          decoration:
+                                                              BoxDecoration(
+                                                            borderRadius:
+                                                                BorderRadius
+                                                                    .circular(
+                                                                        16),
+                                                          ),
+                                                          child:
+                                                              KretenLoginWidget(
+                                                            onLogin:
+                                                                (String code) {
+                                                              codeController
+                                                                  .text = code;
+                                                              Navigator.of(
+                                                                      context)
+                                                                  .pop();
+                                                            },
+                                                          ),
+                                                        ),
+                                                      ),
+                                                    ),
+                                                  )
+                                                ],
+                                              ),
+                                            );
+                                          },
+                                        ).then((value) {
+                                          // After closing the modal bottom sheet, check if the code is set
+                                          if (codeController.text.isNotEmpty) {
+                                            // Call your API after retrieving the code
+                                            _NewLoginAPI(context: context);
+                                          }
+                                        });
+                                      },
+                                      child: Text(
+                                        "login_w_kreta_acc".i18n,
+                                        style: const TextStyle(
+                                            fontFamily: 'Montserrat',
+                                            fontSize: 16,
+                                            fontWeight: FontWeight.w700),
+                                      )),
                                 ),
                               ),
+                              const SizedBox(height: 8),
                             ],
                           ),
                         ),
@@ -334,6 +367,18 @@ class LoginScreenState extends State<LoginScreen> {
                         textAlign: TextAlign.center,
                       ),
                     ),
+                  // privacy policy
+                  GestureDetector(
+                    onTap: () => PrivacyView.show(context),
+                    child: Text(
+                      'privacy'.i18n,
+                      style: TextStyle(
+                        color: AppColors.of(context).loginSecondary,
+                        fontWeight: FontWeight.w500,
+                        fontSize: 14.0,
+                      ),
+                    ),
+                  ),
                 ],
               ),
             ),
@@ -390,13 +435,6 @@ class LoginScreenState extends State<LoginScreen> {
   //       }),
   //     );
   //   }
-
-  //   setState(() => _loginState = LoginState.inProgress);
-  //   _callAPI();
-  // }
-
-  // new login api
-  // ignore: non_constant_identifier_names
   void _NewLoginAPI({required BuildContext context}) {
     String code = codeController.text;