From c182fbec2bedefc1cf4cfe82442655a8e43eabf7 Mon Sep 17 00:00:00 2001 From: "balazsmanus@chameleon" Date: Fri, 28 Feb 2025 15:23:44 +0100 Subject: [PATCH] jo vicc --- refilc/lib/models/linked_account.dart | 5 +- .../lib/screens/login/qwid_login.dart | 170 ------------ .../settings/submenu/cloud_sync_screen.dart | 256 ------------------ .../settings/submenu/submenu_screen.i18n.dart | 5 - 4 files changed, 1 insertion(+), 435 deletions(-) delete mode 100644 refilc_mobile_ui/lib/screens/login/qwid_login.dart delete mode 100644 refilc_mobile_ui/lib/screens/settings/submenu/cloud_sync_screen.dart diff --git a/refilc/lib/models/linked_account.dart b/refilc/lib/models/linked_account.dart index 07fc91e4..a73de425 100644 --- a/refilc/lib/models/linked_account.dart +++ b/refilc/lib/models/linked_account.dart @@ -2,7 +2,6 @@ enum AccountType { apple, google, meta, - qwid, } class LinkedAccount { @@ -26,9 +25,7 @@ class LinkedAccount { ? AccountType.apple : json['type'] == 'google' ? AccountType.google - : json['type'] == 'meta' - ? AccountType.meta - : AccountType.qwid, + : AccountType.meta, username: json['username'], displayName: json['display_name'], id: json['id'], diff --git a/refilc_mobile_ui/lib/screens/login/qwid_login.dart b/refilc_mobile_ui/lib/screens/login/qwid_login.dart deleted file mode 100644 index a19269ee..00000000 --- a/refilc_mobile_ui/lib/screens/login/qwid_login.dart +++ /dev/null @@ -1,170 +0,0 @@ -// ignore_for_file: use_build_context_synchronously - -import 'package:flutter/material.dart'; -import 'package:webview_flutter/webview_flutter.dart'; - -class QwIDLoginWidget extends StatefulWidget { - const QwIDLoginWidget({super.key, required this.onLogin}); - - // final String selectedSchool; - final void Function(String code) onLogin; - - @override - State createState() => _QwIDLoginWidgetState(); -} - -class _QwIDLoginWidgetState extends State - with TickerProviderStateMixin { - late final WebViewController controller; - late AnimationController _animationController; - var loadingPercentage = 0; - var currentUrl = ''; - bool _hasFadedIn = false; - - @override - void initState() { - super.initState(); - - _animationController = AnimationController( - vsync: this, // Use the TickerProviderStateMixin - duration: const Duration(milliseconds: 350), - ); - - controller = WebViewController() - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setNavigationDelegate(NavigationDelegate( - onNavigationRequest: (n) async { - if (n.url.startsWith('refilc://oauth2-callback/qwid')) { - 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; - // } - - String longLivedToken = n.url - .replaceAll('refilc://oauth2-callback/qwid?access_token=', ''); - - widget.onLogin(longLivedToken); - // 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; - // }); - - // // final String instituteCode = widget.selectedSchool; - // if (!url.startsWith( - // 'https://mobil.e-kreta.hu/ellenorzo-student/prod/oauthredirect?code=')) { - // return; - // } - - // List 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(); - }, - onProgress: (progress) { - setState(() { - loadingPercentage = progress; - }); - }, - onPageFinished: (url) { - setState(() { - loadingPercentage = 100; - }); - }, - )) - ..loadRequest( - Uri.parse( - 'https://qwid.qwit.dev/oauth2/authorize?client_id=99aa103a-0bd7-43e0-8421-3bb0b2f6adb1&scope=*&redirect_uri=https://api.refilc.hu/v4/oauth2/callback/app/qwid&response_type=code'), // &institute_code=${widget.selectedSchool} - ); - } - - // Future loadLoginUrl() async { - // String nonceStr = await Provider.of(context, listen: false) - // .getAPI(KretaAPI.nonce, json: false); - - // Nonce nonce = getNonce(nonceStr, ); - // } - - @override - void dispose() { - // Step 3: Dispose of the animation controller - _animationController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - // Trigger the fade-in animation only once when loading reaches 100% - if (loadingPercentage == 100 && !_hasFadedIn) { - _animationController.forward(); // Play the animation - _hasFadedIn = - true; // Set the flag to true, so the animation is not replayed - } - - return Stack( - children: [ - // Webview that will be displayed only when the loading is 100% - if (loadingPercentage == 100) - FadeTransition( - opacity: Tween(begin: 0, end: 1).animate( - CurvedAnimation( - parent: _animationController, - curve: Curves.easeIn, - ), - ), - child: WebViewWidget( - controller: controller, - ), - ), - - // Show the CircularProgressIndicator while loading is not 100% - if (loadingPercentage < 100) - Center( - child: TweenAnimationBuilder( - tween: Tween(begin: 0, end: loadingPercentage / 100.0), - duration: const Duration(milliseconds: 300), - builder: (context, double value, child) { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - CircularProgressIndicator( - value: value, // Smoothly animates the progress - ), - ], - ); - }, - ), - ), - ], - ); - } -} diff --git a/refilc_mobile_ui/lib/screens/settings/submenu/cloud_sync_screen.dart b/refilc_mobile_ui/lib/screens/settings/submenu/cloud_sync_screen.dart deleted file mode 100644 index 49916a6e..00000000 --- a/refilc_mobile_ui/lib/screens/settings/submenu/cloud_sync_screen.dart +++ /dev/null @@ -1,256 +0,0 @@ -// import 'package:refilc/models/settings.dart'; -import 'dart:convert'; - -import 'package:refilc/api/client.dart'; -import 'package:refilc/api/providers/user_provider.dart'; -import 'package:refilc/models/settings.dart'; -import 'package:refilc/theme/colors/colors.dart'; -import 'package:refilc_mobile_ui/common/panel/panel_button.dart'; -import 'package:refilc_mobile_ui/common/splitted_panel/splitted_panel.dart'; -import 'package:refilc_mobile_ui/screens/login/qwid_login.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_feather_icons/flutter_feather_icons.dart'; -import 'package:provider/provider.dart'; -import 'package:refilc/models/cloud_sync_data.dart'; -// import 'package:provider/provider.dart'; -import 'submenu_screen.i18n.dart'; - -class MenuCloudSyncSettings extends StatelessWidget { - const MenuCloudSyncSettings({ - super.key, - this.borderRadius = const BorderRadius.vertical( - top: Radius.circular(4.0), bottom: Radius.circular(4.0)), - }); - - final BorderRadius borderRadius; - - @override - Widget build(BuildContext context) { - return PanelButton( - // onPressed: () => Navigator.of(context, rootNavigator: true).push( - // CupertinoPageRoute( - // builder: (context) => const CloudSyncSettingsScreen()), - // ), - title: Text( - "cloud_sync".i18n, - style: - TextStyle(color: AppColors.of(context).text.withValues(alpha: 0.3)), - ), - leading: Icon( - FeatherIcons.uploadCloud, - size: 22.0, - color: AppColors.of(context).text.withValues(alpha: 0.25), - ), - borderRadius: borderRadius, - ); - } -} - -class CloudSyncSettingsScreen extends StatefulWidget { - const CloudSyncSettingsScreen({super.key}); - - @override - CloudSyncSettingsScreenState createState() => CloudSyncSettingsScreenState(); -} - -class CloudSyncSettingsScreenState extends State { - late SettingsProvider settingsProvider; - late UserProvider user; - - String longLivedToken = ''; - - @override - Widget build(BuildContext context) { - SettingsProvider settingsProvider = Provider.of(context); - // UserProvider user = Provider.of(context); - - return Scaffold( - appBar: AppBar( - surfaceTintColor: Theme.of(context).scaffoldBackgroundColor, - leading: BackButton(color: AppColors.of(context).text), - title: Text( - "cloud_sync".i18n, - style: TextStyle(color: AppColors.of(context).text), - ), - ), - body: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 24.0), - child: Column( - children: [ - SplittedPanel( - padding: const EdgeInsets.only(top: 8.0), - cardPadding: const EdgeInsets.all(4.0), - isSeparated: true, - children: [ - PanelButton( - padding: const EdgeInsets.only(left: 14.0, right: 6.0), - onPressed: () async { - 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.9 + - MediaQuery.of(context).viewInsets.bottom, - decoration: const BoxDecoration( - color: Color(0xFFDAE4F7), - borderRadius: BorderRadius.only( - topRight: Radius.circular(24.0), - topLeft: Radius.circular(24.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: QwIDLoginWidget( - onLogin: (String token) { - setState(() { - longLivedToken = token; - }); - Navigator.of(context).pop(); - }, - ), - ), - ), - ), - ) - ], - ), - ); - }, - ).then((value) { - // After closing the modal bottom sheet, check if the code is set - if (longLivedToken.isNotEmpty) { - // Call your API after retrieving the code - settingsProvider.update( - cloudSyncToken: longLivedToken, - store: true, - ); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('login_successful'.i18n))); - } - }); - }, - trailingDivider: true, - title: Text( - "qwit_sign_in".i18n, - style: TextStyle( - color: AppColors.of(context).text.withValues( - alpha: - settingsProvider.gradeOpeningFun ? .95 : .25), - ), - ), - borderRadius: const BorderRadius.vertical( - top: Radius.circular(12.0), - bottom: Radius.circular(12.0), - ), - ), - SwitchListTile( - value: settingsProvider.cloudSyncEnabled, - onChanged: (value) { - settingsProvider.update( - cloudSyncEnabled: value, - store: true, - ); - }, - title: Text("cloud_sync_enabled".i18n), - ), - PanelButton( - padding: const EdgeInsets.only(left: 14.0, right: 6.0), - onPressed: () async { - if (settingsProvider.cloudSyncToken.isEmpty) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text('sign_in_first'.i18n), - ), - ); - return; - } else { - FilcAPI.cloudSync( - { - "settings": jsonEncode(settingsProvider.toMap()), - // "device_ids": [ - // settingsProvider.xFilcId, - // ], - // "refilc_plus_id": settingsProvider.plusSessionId, - }, - settingsProvider.cloudSyncToken, - ).then((response) { - if (response == null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text('sync_failed'.i18n), - ), - ); - return; - } - - CloudSyncData cloudSyncData = CloudSyncData.fromJson( - response['data']['cloud_sync_data']); - - settingsProvider.updateFromMap( - map: cloudSyncData.settings, - store: true, - ); - - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text('sync_successful'.i18n), - ), - ); - }); - } - }, - trailingDivider: true, - title: Text( - "sync_now".i18n, - style: TextStyle( - color: AppColors.of(context).text.withValues( - alpha: - settingsProvider.gradeOpeningFun ? .95 : .25), - ), - ), - borderRadius: const BorderRadius.vertical( - top: Radius.circular(12.0), - bottom: Radius.circular(12.0), - ), - ), - ], - ), - ], - ), - ), - ), - ); - } -} diff --git a/refilc_mobile_ui/lib/screens/settings/submenu/submenu_screen.i18n.dart b/refilc_mobile_ui/lib/screens/settings/submenu/submenu_screen.i18n.dart index 7c74573c..ff70506f 100644 --- a/refilc_mobile_ui/lib/screens/settings/submenu/submenu_screen.i18n.dart +++ b/refilc_mobile_ui/lib/screens/settings/submenu/submenu_screen.i18n.dart @@ -33,7 +33,6 @@ extension SettingsLocalization on String { "theme_share_failed": "An error occurred while sharing the theme.", "theme_share_ratelimit": "You can only share 1 theme per minute.", // cloud sync - "cloud_sync": "Cloud Sync", "secret": "Secret Settings", "goodstudent": "Good student mode", "presentation": "Presentation Mode", @@ -70,8 +69,6 @@ extension SettingsLocalization on String { "understand": "Értem", "theme_share_failed": "Hiba történt a téma megosztása közben.", "theme_share_ratelimit": "Csak 1 témát oszthatsz meg percenként.", - // cloud sync - "cloud_sync": "Felhő szinkronizálás", "secret": "Titkos Beállítások", "goodstudent": "Jó tanuló mód", "presentation": "Bemutató mód", @@ -109,8 +106,6 @@ extension SettingsLocalization on String { "theme_share_failed": "Beim Teilen des Themas ist ein Fehler aufgetreten.", "theme_share_ratelimit": "Sie können nur 1 Thema pro Minute teilen.", - // cloud sync - "cloud_sync": "Cloud-Synchronisierung", "secret": "Geheime Einstellungen", "presentation": "Präsentationsmodus", "goodstudent": "Guter Student Modus",