From c6981048f65012a9a6552480ed90f02993e2e3ae Mon Sep 17 00:00:00 2001 From: Pavel401 Date: Tue, 10 Feb 2026 12:17:31 +0530 Subject: [PATCH 1/3] feat: enhance sync functionality and UI feedback in home controller and app bar --- .../home/controllers/home_controller.dart | 50 +++- .../modules/home/views/home_page_app_bar.dart | 66 +++++- .../manage_task_champion_creds_view.dart | 219 +++++++++++++----- lib/app/utils/language/english_sentences.dart | 2 +- 4 files changed, 263 insertions(+), 74 deletions(-) diff --git a/lib/app/modules/home/controllers/home_controller.dart b/lib/app/modules/home/controllers/home_controller.dart index b4ba1f6f..218eea55 100644 --- a/lib/app/modules/home/controllers/home_controller.dart +++ b/lib/app/modules/home/controllers/home_controller.dart @@ -550,15 +550,47 @@ class HomeController extends GetxController { isNeededtoSyncOnStart(BuildContext context) async { final SharedPreferences prefs = await SharedPreferences.getInstance(); - bool? value; - value = prefs.getBool('sync-onStart') ?? false; - String? clientId, encryptionSecret; - clientId = await CredentialsStorage.getClientId(); - encryptionSecret = await CredentialsStorage.getEncryptionSecret(); - if (value) { - synchronize(context, false); - refreshTasks(clientId!, encryptionSecret!); - } else {} + final bool syncEnabled = prefs.getBool('sync-onStart') ?? false; + if (!syncEnabled) return; + + final String? clientId = await CredentialsStorage.getClientId(); + final String? encryptionSecret = + await CredentialsStorage.getEncryptionSecret(); + + try { + isRefreshing.value = true; + if (taskReplica.value) { + if (clientId != null && encryptionSecret != null) { + await refreshReplicaTasks(); + } + } else if (taskchampion.value) { + if (clientId != null && encryptionSecret != null) { + await refreshTasks(clientId, encryptionSecret); + } + } else { + await synchronize(context, false); + } + if (context.mounted) { + final tColors = + Theme.of(context).extension()!; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + 'Sync Completed', + style: TextStyle( + color: tColors.primaryTextColor, + ), + ), + backgroundColor: tColors.primaryBackgroundColor, + duration: const Duration(seconds: 2), + ), + ); + } + } catch (e) { + debugPrint('Error during sync on start: $e'); + } finally { + isRefreshing.value = false; + } } RxBool syncOnStart = false.obs; diff --git a/lib/app/modules/home/views/home_page_app_bar.dart b/lib/app/modules/home/views/home_page_app_bar.dart index 359c3adb..72643e2d 100644 --- a/lib/app/modules/home/views/home_page_app_bar.dart +++ b/lib/app/modules/home/views/home_page_app_bar.dart @@ -127,7 +127,7 @@ class HomePageAppBar extends StatelessWidget implements PreferredSizeWidget { key: controller.refreshKey, icon: !controller.isRefreshing.value ? Icon(Icons.refresh, color: TaskWarriorColors.white) - : Icon(Icons.autorenew, color: TaskWarriorColors.white), + : const _SpinningIcon(), onPressed: controller.isRefreshing.value ? null : () async { @@ -151,8 +151,23 @@ class HomePageAppBar extends StatelessWidget implements PreferredSizeWidget { } debugPrint("Refreshing Replica tasks"); controller.isRefreshing.value = true; - await controller.refreshReplicaTasks(); - controller.isRefreshing.value = false; + try { + await controller.refreshReplicaTasks(); + _showResultSnackBar( + context, 'Sync Completed', false); + } catch (e) { + debugPrint('Error refreshing replica tasks: $e'); + _showResultSnackBar( + context, + SentenceManager( + currentLanguage: + controller.selectedLanguage.value) + .sentences + .homePageTaskWarriorNotConfigured, + true); + } finally { + controller.isRefreshing.value = false; + } return; } @@ -177,13 +192,7 @@ class HomePageAppBar extends StatelessWidget implements PreferredSizeWidget { .hideCurrentSnackBar(); _showResultSnackBar( - context, - SentenceManager( - currentLanguage: - controller.selectedLanguage.value) - .sentences - .homePageFetchingTasks, - false); + context, 'Sync Completed', false); } catch (e) { debugPrint('Error refreshing tasks: $e'); ScaffoldMessenger.of(context) @@ -216,6 +225,8 @@ class HomePageAppBar extends StatelessWidget implements PreferredSizeWidget { await controller.synchronize(context, true); ScaffoldMessenger.of(context) .hideCurrentSnackBar(); + _showResultSnackBar( + context, 'Sync Completed', false); } catch (e) { ScaffoldMessenger.of(context) .hideCurrentSnackBar(); @@ -280,3 +291,38 @@ class HomePageAppBar extends StatelessWidget implements PreferredSizeWidget { @override Size get preferredSize => AppBar().preferredSize; } + +class _SpinningIcon extends StatefulWidget { + const _SpinningIcon(); + + @override + State<_SpinningIcon> createState() => _SpinningIconState(); +} + +class _SpinningIconState extends State<_SpinningIcon> + with SingleTickerProviderStateMixin { + late final AnimationController _controller; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + duration: const Duration(seconds: 1), + vsync: this, + )..repeat(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return RotationTransition( + turns: _controller, + child: Icon(Icons.refresh, color: TaskWarriorColors.white), + ); + } +} diff --git a/lib/app/modules/manage_task_champion_creds/views/manage_task_champion_creds_view.dart b/lib/app/modules/manage_task_champion_creds/views/manage_task_champion_creds_view.dart index 797eaabb..d2c126c1 100644 --- a/lib/app/modules/manage_task_champion_creds/views/manage_task_champion_creds_view.dart +++ b/lib/app/modules/manage_task_champion_creds/views/manage_task_champion_creds_view.dart @@ -37,20 +37,20 @@ class ManageTaskChampionCredsView ], ), actions: [ - IconButton( - icon: Icon( - Icons.info, - color: TaskWarriorColors.white, - ), - onPressed: () async { - String url = !controller.taskReplica.value - ? "https://github.com/its-me-abhishek/ccsync" - : "https://github.com/GothenburgBitFactory/taskchampion"; - if (!await launchUrl(Uri.parse(url))) { - throw Exception('Could not launch $url'); - } - }, - ), + // IconButton( + // icon: Icon( + // Icons.info, + // color: TaskWarriorColors.white, + // ), + // onPressed: () async { + // String url = !controller.taskReplica.value + // ? "https://github.com/its-me-abhishek/ccsync" + // : "https://github.com/GothenburgBitFactory/taskchampion"; + // if (!await launchUrl(Uri.parse(url))) { + // throw Exception('Could not launch $url'); + // } + // }, + // ), ], leading: IconButton( icon: Icon(Icons.arrow_back, color: TaskWarriorColors.white), @@ -114,21 +114,39 @@ class ManageTaskChampionCredsView ), )), const SizedBox(height: 20), - Obx(() => Center( - child: ElevatedButton( - onPressed: controller.isCheckingCreds.value - ? null - : () async { - int status = await controller.saveCredentials(); - if (status == 0) { + Obx(() => SizedBox( + width: double.infinity, + height: 48, + child: ElevatedButton( + onPressed: controller.isCheckingCreds.value + ? null + : () async { + int status = + await controller.saveCredentials(); + if (status == 0) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + SentenceManager( + currentLanguage: + AppSettings + .selectedLanguage) + .sentences + .credentialsSavedSuccessfully, + style: TextStyle( + color: tColors.primaryTextColor, + ), + ), + backgroundColor: tColors + .secondaryBackgroundColor, + duration: + const Duration(seconds: 2))); + return; + } ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - SentenceManager( - currentLanguage: AppSettings - .selectedLanguage) - .sentences - .credentialsSavedSuccessfully, + "Unable to fetch tasks with it ! Check creds", style: TextStyle( color: tColors.primaryTextColor, ), @@ -137,35 +155,39 @@ class ManageTaskChampionCredsView tColors.secondaryBackgroundColor, duration: const Duration(seconds: 2))); - return; - } - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - "Unable to fetch tasks with it ! Check creds", - style: TextStyle( - color: tColors.primaryTextColor, - ), - ), - backgroundColor: - tColors.secondaryBackgroundColor, - duration: const Duration(seconds: 2))); - }, - child: controller.isCheckingCreds.value - ? const SizedBox( - height: 20, - width: 20, - child: CircularProgressIndicator( - color: Color.fromARGB(255, 83, 83, 83), - strokeWidth: 2.0, + }, + style: ElevatedButton.styleFrom( + backgroundColor: TaskWarriorColors.deepPurple, + foregroundColor: TaskWarriorColors.white, + elevation: 4, + shadowColor: + TaskWarriorColors.purple.withValues(alpha: 0.4), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), + child: controller.isCheckingCreds.value + ? const SizedBox( + height: 20, + width: 20, + child: CircularProgressIndicator( + color: Colors.white, + strokeWidth: 2.0, + ), + ) + : Text( + SentenceManager( + currentLanguage: + AppSettings.selectedLanguage) + .sentences + .saveCredentials, + style: GoogleFonts.poppins( + fontSize: 16, + fontWeight: FontWeight.w600, + ), ), - ) - : Text(SentenceManager( - currentLanguage: - AppSettings.selectedLanguage) - .sentences - .saveCredentials), - ))), + ), + )), const SizedBox(height: 10), Text( SentenceManager( @@ -177,6 +199,95 @@ class ManageTaskChampionCredsView color: tColors.primaryTextColor, ), ), + const SizedBox(height: 30), + Divider( + color: tColors.primaryTextColor?.withValues(alpha: 0.3)), + const SizedBox(height: 16), + Text( + 'Use CCSync for Easy Sync', + style: GoogleFonts.poppins( + fontSize: 18, + fontWeight: FontWeight.w600, + color: tColors.primaryTextColor, + ), + ), + const SizedBox(height: 8), + Text( + 'CCSync uses TaskChampion to sync your tasks ' + 'across multiple devices seamlessly. You also ' + 'get a web dashboard to manage your tasks from ' + 'any browser.', + style: TextStyle( + fontSize: 14, + color: tColors.primaryTextColor?.withValues(alpha: 0.8), + height: 1.5, + ), + ), + const SizedBox(height: 12), + Text( + 'Login to CCSync, copy your credentials, and paste them above.', + style: TextStyle( + fontSize: 14, + color: tColors.primaryTextColor?.withValues(alpha: 0.8), + ), + ), + const SizedBox(height: 16), + Center( + child: OutlinedButton.icon( + icon: Icon(Icons.open_in_new, + color: TaskWarriorColors.purple), + label: Text( + 'Open CCSync', + style: TextStyle(color: TaskWarriorColors.purple), + ), + style: OutlinedButton.styleFrom( + side: BorderSide(color: TaskWarriorColors.purple), + padding: const EdgeInsets.symmetric( + horizontal: 24, vertical: 12), + ), + onPressed: () async { + final url = Uri.parse( + 'https://taskwarrior-server.ccextractor.org/home'); + if (!await launchUrl(url, + mode: LaunchMode.externalApplication)) { + throw Exception('Could not launch $url'); + } + }, + ), + ), + const SizedBox(height: 24), + Divider( + color: tColors.primaryTextColor?.withValues(alpha: 0.3)), + const SizedBox(height: 12), + Text( + 'Or bring your own credentials from a self-hosted ' + 'TaskChampion sync server.', + style: TextStyle( + fontSize: 13, + color: tColors.primaryTextColor?.withValues(alpha: 0.6), + ), + ), + const SizedBox(height: 4), + GestureDetector( + onTap: () async { + final url = Uri.parse( + 'https://github.com/GothenburgBitFactory/taskchampion-sync-server'); + if (!await launchUrl(url, + mode: LaunchMode.externalApplication)) { + throw Exception('Could not launch $url'); + } + }, + child: Text( + 'GothenburgBitFactory/taskchampion-sync-server', + style: TextStyle( + fontSize: 13, + color: TaskWarriorColors.purple, + decoration: TextDecoration.underline, + decorationColor: TaskWarriorColors.purple, + ), + ), + ), + const SizedBox(height: 20), ], ), ), diff --git a/lib/app/utils/language/english_sentences.dart b/lib/app/utils/language/english_sentences.dart index 6e631539..a40a8e48 100644 --- a/lib/app/utils/language/english_sentences.dart +++ b/lib/app/utils/language/english_sentences.dart @@ -645,7 +645,7 @@ class EnglishSentences extends Sentences { @override String get credentialsSavedSuccessfully => 'Credentials saved successfully'; @override - String get saveCredentials => 'save credentials'; + String get saveCredentials => 'Save'; @override String get tip => "Tip: Click on the info icon in the top right corner to get your credentials"; From c564fa723bcc94fbd980cfeb94f4ab8824825c1f Mon Sep 17 00:00:00 2001 From: Shubham Ingale Date: Tue, 10 Feb 2026 13:21:05 +0530 Subject: [PATCH 2/3] translations and theme fix --- .../manage_task_champion_creds_view.dart | 44 ++++++++++++------- lib/app/utils/language/bengali_sentences.dart | 13 ++++++ lib/app/utils/language/english_sentences.dart | 13 ++++++ lib/app/utils/language/french_sentences.dart | 14 ++++++ lib/app/utils/language/hindi_sentences.dart | 13 ++++++ lib/app/utils/language/marathi_sentences.dart | 14 ++++++ lib/app/utils/language/sentences.dart | 8 ++++ lib/app/utils/language/spanish_sentences.dart | 13 ++++++ 8 files changed, 116 insertions(+), 16 deletions(-) diff --git a/lib/app/modules/manage_task_champion_creds/views/manage_task_champion_creds_view.dart b/lib/app/modules/manage_task_champion_creds/views/manage_task_champion_creds_view.dart index d2c126c1..7b2db3ca 100644 --- a/lib/app/modules/manage_task_champion_creds/views/manage_task_champion_creds_view.dart +++ b/lib/app/modules/manage_task_champion_creds/views/manage_task_champion_creds_view.dart @@ -157,8 +157,8 @@ class ManageTaskChampionCredsView const Duration(seconds: 2))); }, style: ElevatedButton.styleFrom( - backgroundColor: TaskWarriorColors.deepPurple, - foregroundColor: TaskWarriorColors.white, + backgroundColor: tColors.primaryTextColor, + foregroundColor: tColors.primaryBackgroundColor, elevation: 4, shadowColor: TaskWarriorColors.purple.withValues(alpha: 0.4), @@ -204,7 +204,10 @@ class ManageTaskChampionCredsView color: tColors.primaryTextColor?.withValues(alpha: 0.3)), const SizedBox(height: 16), Text( - 'Use CCSync for Easy Sync', + SentenceManager( + currentLanguage: AppSettings.selectedLanguage) + .sentences + .ccsyncEasySyncTitle, style: GoogleFonts.poppins( fontSize: 18, fontWeight: FontWeight.w600, @@ -213,10 +216,10 @@ class ManageTaskChampionCredsView ), const SizedBox(height: 8), Text( - 'CCSync uses TaskChampion to sync your tasks ' - 'across multiple devices seamlessly. You also ' - 'get a web dashboard to manage your tasks from ' - 'any browser.', + SentenceManager( + currentLanguage: AppSettings.selectedLanguage) + .sentences + .ccsyncIntro, style: TextStyle( fontSize: 14, color: tColors.primaryTextColor?.withValues(alpha: 0.8), @@ -225,7 +228,10 @@ class ManageTaskChampionCredsView ), const SizedBox(height: 12), Text( - 'Login to CCSync, copy your credentials, and paste them above.', + SentenceManager( + currentLanguage: AppSettings.selectedLanguage) + .sentences + .ccsyncLoginInstruction, style: TextStyle( fontSize: 14, color: tColors.primaryTextColor?.withValues(alpha: 0.8), @@ -235,13 +241,16 @@ class ManageTaskChampionCredsView Center( child: OutlinedButton.icon( icon: Icon(Icons.open_in_new, - color: TaskWarriorColors.purple), + color: tColors.primaryTextColor), label: Text( - 'Open CCSync', - style: TextStyle(color: TaskWarriorColors.purple), + SentenceManager( + currentLanguage: AppSettings.selectedLanguage) + .sentences + .ccsyncOpenButton, + style: TextStyle(color: tColors.primaryTextColor), ), style: OutlinedButton.styleFrom( - side: BorderSide(color: TaskWarriorColors.purple), + side: BorderSide(color: tColors.primaryTextColor!), padding: const EdgeInsets.symmetric( horizontal: 24, vertical: 12), ), @@ -260,8 +269,10 @@ class ManageTaskChampionCredsView color: tColors.primaryTextColor?.withValues(alpha: 0.3)), const SizedBox(height: 12), Text( - 'Or bring your own credentials from a self-hosted ' - 'TaskChampion sync server.', + SentenceManager( + currentLanguage: AppSettings.selectedLanguage) + .sentences + .ccsyncSelfHosted, style: TextStyle( fontSize: 13, color: tColors.primaryTextColor?.withValues(alpha: 0.6), @@ -281,9 +292,10 @@ class ManageTaskChampionCredsView 'GothenburgBitFactory/taskchampion-sync-server', style: TextStyle( fontSize: 13, - color: TaskWarriorColors.purple, + color: tColors.primaryTextColor?.withValues(alpha: 0.6), decoration: TextDecoration.underline, - decorationColor: TaskWarriorColors.purple, + decorationColor: + tColors.primaryTextColor?.withValues(alpha: 0.6), ), ), ), diff --git a/lib/app/utils/language/bengali_sentences.dart b/lib/app/utils/language/bengali_sentences.dart index 4768b418..4761031c 100644 --- a/lib/app/utils/language/bengali_sentences.dart +++ b/lib/app/utils/language/bengali_sentences.dart @@ -2,6 +2,19 @@ import 'package:taskwarrior/app/utils/language/sentences.dart'; class BengaliSentences extends Sentences { @override + String get ccsyncLoginInstruction => + 'CCSync-এ লগইন করুন, আপনার শংসাপত্র কপি করুন এবং উপরে পেস্ট করুন।'; + @override + String get ccsyncEasySyncTitle => 'সহজ সিঙ্কের জন্য CCSync ব্যবহার করুন'; + @override + String get ccsyncOpenButton => 'CCSync খুলুন'; + @override + String get ccsyncIntro => + 'CCSync TaskChampion ব্যবহার করে আপনার কাজগুলি একাধিক ডিভাইসে নির্বিঘ্নে সিঙ্ক করে। আপনি যেকোনো ব্রাউজার থেকে আপনার কাজগুলি পরিচালনা করার জন্য একটি ওয়েব ড্যাশবোর্ডও পান।'; + @override + String get ccsyncSelfHosted => + 'অথবা একটি স্ব-হোস্টেড TaskChampion সিঙ্ক সার্ভার থেকে আপনার নিজস্ব শংসাপত্র আনুন।'; + @override String get helloWorld => 'হ্যালো বিশ্ব!'; @override String get homePageTitle => 'হোম পেজ'; diff --git a/lib/app/utils/language/english_sentences.dart b/lib/app/utils/language/english_sentences.dart index a40a8e48..a6b0fb00 100644 --- a/lib/app/utils/language/english_sentences.dart +++ b/lib/app/utils/language/english_sentences.dart @@ -2,6 +2,19 @@ import 'package:taskwarrior/app/utils/language/sentences.dart'; class EnglishSentences extends Sentences { @override + String get ccsyncLoginInstruction => + 'Login to CCSync, copy your credentials, and paste them above.'; + @override + String get ccsyncEasySyncTitle => 'Use CCSync for Easy Sync'; + @override + String get ccsyncOpenButton => 'Open CCSync'; + @override + String get ccsyncIntro => + 'CCSync uses TaskChampion to sync your tasks across multiple devices seamlessly. You also get a web dashboard to manage your tasks from any browser.'; + @override + String get ccsyncSelfHosted => + 'Or bring your own credentials from a self-hosted TaskChampion sync server.'; + @override String get helloWorld => 'Hello, World!'; @override diff --git a/lib/app/utils/language/french_sentences.dart b/lib/app/utils/language/french_sentences.dart index 6558fc35..788a0cb6 100644 --- a/lib/app/utils/language/french_sentences.dart +++ b/lib/app/utils/language/french_sentences.dart @@ -2,6 +2,20 @@ import 'package:taskwarrior/app/utils/language/sentences.dart'; class FrenchSentences extends Sentences { @override + String get ccsyncLoginInstruction => + 'Connectez-vous à CCSync, copiez vos identifiants et collez-les ci-dessus.'; + @override + String get ccsyncEasySyncTitle => + 'Utilisez CCSync pour une synchronisation facile'; + @override + String get ccsyncOpenButton => 'Ouvrir CCSync'; + @override + String get ccsyncIntro => + 'CCSync utilise TaskChampion pour synchroniser vos tâches sur plusieurs appareils sans effort. Vous bénéficiez également d’un tableau de bord web pour gérer vos tâches depuis n’importe quel navigateur.'; + @override + String get ccsyncSelfHosted => + 'Ou utilisez vos propres identifiants depuis un serveur TaskChampion auto-hébergé.'; + @override String get helloWorld => 'Bonjour, le monde!'; @override String get homePageTitle => 'Page d\'accueil'; diff --git a/lib/app/utils/language/hindi_sentences.dart b/lib/app/utils/language/hindi_sentences.dart index fd148096..6b5c428b 100644 --- a/lib/app/utils/language/hindi_sentences.dart +++ b/lib/app/utils/language/hindi_sentences.dart @@ -2,6 +2,19 @@ import 'package:taskwarrior/app/utils/language/sentences.dart'; class HindiSentences extends Sentences { @override + String get ccsyncLoginInstruction => + 'CCSync में लॉगिन करें, अपनी क्रेडेंशियल्स कॉपी करें, और उन्हें ऊपर पेस्ट करें।'; + @override + String get ccsyncEasySyncTitle => 'आसान सिंक के लिए CCSync का उपयोग करें'; + @override + String get ccsyncOpenButton => 'CCSync खोलें'; + @override + String get ccsyncIntro => + 'CCSync आपके कार्यों को कई डिवाइसों पर TaskChampion के माध्यम से निर्बाध रूप से सिंक करता है। आपको किसी भी ब्राउज़र से अपने कार्यों को प्रबंधित करने के लिए एक वेब डैशबोर्ड भी मिलता है।'; + @override + String get ccsyncSelfHosted => + 'या अपने स्वयं के TaskChampion सिंक सर्वर से क्रेडेंशियल्स लाएँ।'; + @override String get helloWorld => 'नमस्ते दुनिया!'; @override String get homePageTitle => 'होम पेज'; diff --git a/lib/app/utils/language/marathi_sentences.dart b/lib/app/utils/language/marathi_sentences.dart index c4abf2d9..b7045742 100644 --- a/lib/app/utils/language/marathi_sentences.dart +++ b/lib/app/utils/language/marathi_sentences.dart @@ -2,6 +2,20 @@ import 'package:taskwarrior/app/utils/language/sentences.dart'; class MarathiSentences extends Sentences { @override + String get ccsyncLoginInstruction => + 'CCSync मध्ये लॉगिन करा, तुमची क्रेडेन्शियल्स कॉपी करा आणि वर पेस्ट करा.'; + @override + String get ccsyncEasySyncTitle => 'सोप्या सिंकसाठी CCSync वापरा'; + @override + String get ccsyncOpenButton => 'CCSync उघडा'; + @override + String get ccsyncIntro => + 'CCSync TaskChampion वापरून तुमची कामे अनेक उपकरणांवर सहजपणे सिंक करते. तुम्हाला कोणत्याही ब्राउझरमधून तुमची कामे व्यवस्थापित करण्यासाठी वेब डॅशबोर्ड देखील मिळतो.'; + + @override + String get ccsyncSelfHosted => + 'किंवा स्वतःच्या TaskChampion सिंक सर्व्हरमधून तुमची क्रेडेन्शियल्स वापरा.'; + @override String get helloWorld => 'नमस्कार, जग!'; @override String get homePageTitle => 'होम पेज'; diff --git a/lib/app/utils/language/sentences.dart b/lib/app/utils/language/sentences.dart index 77cb1877..891f3e30 100644 --- a/lib/app/utils/language/sentences.dart +++ b/lib/app/utils/language/sentences.dart @@ -1,4 +1,12 @@ abstract class Sentences { + /// CCSync UI additional sentences + String get ccsyncLoginInstruction; + String get ccsyncEasySyncTitle; + String get ccsyncOpenButton; + + /// CCSync intro and self-hosted sentences + String get ccsyncIntro; + String get ccsyncSelfHosted; String get helloWorld; String get homePageTitle; diff --git a/lib/app/utils/language/spanish_sentences.dart b/lib/app/utils/language/spanish_sentences.dart index 17d73340..94d6a460 100644 --- a/lib/app/utils/language/spanish_sentences.dart +++ b/lib/app/utils/language/spanish_sentences.dart @@ -2,6 +2,19 @@ import 'package:taskwarrior/app/utils/language/sentences.dart'; class SpanishSentences extends Sentences { @override + String get ccsyncLoginInstruction => + 'Inicia sesión en CCSync, copia tus credenciales y pégalas arriba.'; + @override + String get ccsyncEasySyncTitle => 'Usa CCSync para una sincronización fácil'; + @override + String get ccsyncOpenButton => 'Abrir CCSync'; + @override + String get ccsyncIntro => + 'CCSync utiliza TaskChampion para sincronizar tus tareas en múltiples dispositivos sin problemas. También obtienes un panel web para gestionar tus tareas desde cualquier navegador.'; + @override + String get ccsyncSelfHosted => + 'O utiliza tus propias credenciales de un servidor de sincronización TaskChampion autohospedado.'; + @override String get helloWorld => '¡Hola, mundo!'; @override String get homePageTitle => 'Página de inicio'; From 11d869abb62bbf5ca81984fee65d38c570dcd457 Mon Sep 17 00:00:00 2001 From: Shubham Ingale Date: Tue, 10 Feb 2026 13:27:36 +0530 Subject: [PATCH 3/3] remove tip as (i) icon is no longer avl --- .../views/manage_task_champion_creds_view.dart | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/lib/app/modules/manage_task_champion_creds/views/manage_task_champion_creds_view.dart b/lib/app/modules/manage_task_champion_creds/views/manage_task_champion_creds_view.dart index 7b2db3ca..e9b98351 100644 --- a/lib/app/modules/manage_task_champion_creds/views/manage_task_champion_creds_view.dart +++ b/lib/app/modules/manage_task_champion_creds/views/manage_task_champion_creds_view.dart @@ -188,17 +188,6 @@ class ManageTaskChampionCredsView ), ), )), - const SizedBox(height: 10), - Text( - SentenceManager( - currentLanguage: AppSettings.selectedLanguage) - .sentences - .tip, - style: TextStyle( - fontSize: 15, - color: tColors.primaryTextColor, - ), - ), const SizedBox(height: 30), Divider( color: tColors.primaryTextColor?.withValues(alpha: 0.3)),