Skip to content

Commit a878150

Browse files
feat: tc creds page changes and syncing fixes
PR #587 --- * feat: enhance sync functionality and UI feedback in home controller and app bar * translations and theme fix * remove tip as (i) icon is no longer avl --------- Co-authored-by: Shubham Ingale <shubhamingale779@gmail.com>
1 parent a33cabe commit a878150

File tree

10 files changed

+356
-78
lines changed

10 files changed

+356
-78
lines changed

lib/app/modules/home/controllers/home_controller.dart

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -550,15 +550,47 @@ class HomeController extends GetxController {
550550

551551
isNeededtoSyncOnStart(BuildContext context) async {
552552
final SharedPreferences prefs = await SharedPreferences.getInstance();
553-
bool? value;
554-
value = prefs.getBool('sync-onStart') ?? false;
555-
String? clientId, encryptionSecret;
556-
clientId = await CredentialsStorage.getClientId();
557-
encryptionSecret = await CredentialsStorage.getEncryptionSecret();
558-
if (value) {
559-
synchronize(context, false);
560-
refreshTasks(clientId!, encryptionSecret!);
561-
} else {}
553+
final bool syncEnabled = prefs.getBool('sync-onStart') ?? false;
554+
if (!syncEnabled) return;
555+
556+
final String? clientId = await CredentialsStorage.getClientId();
557+
final String? encryptionSecret =
558+
await CredentialsStorage.getEncryptionSecret();
559+
560+
try {
561+
isRefreshing.value = true;
562+
if (taskReplica.value) {
563+
if (clientId != null && encryptionSecret != null) {
564+
await refreshReplicaTasks();
565+
}
566+
} else if (taskchampion.value) {
567+
if (clientId != null && encryptionSecret != null) {
568+
await refreshTasks(clientId, encryptionSecret);
569+
}
570+
} else {
571+
await synchronize(context, false);
572+
}
573+
if (context.mounted) {
574+
final tColors =
575+
Theme.of(context).extension<TaskwarriorColorTheme>()!;
576+
ScaffoldMessenger.of(context).showSnackBar(
577+
SnackBar(
578+
content: Text(
579+
'Sync Completed',
580+
style: TextStyle(
581+
color: tColors.primaryTextColor,
582+
),
583+
),
584+
backgroundColor: tColors.primaryBackgroundColor,
585+
duration: const Duration(seconds: 2),
586+
),
587+
);
588+
}
589+
} catch (e) {
590+
debugPrint('Error during sync on start: $e');
591+
} finally {
592+
isRefreshing.value = false;
593+
}
562594
}
563595

564596
RxBool syncOnStart = false.obs;

lib/app/modules/home/views/home_page_app_bar.dart

Lines changed: 56 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ class HomePageAppBar extends StatelessWidget implements PreferredSizeWidget {
127127
key: controller.refreshKey,
128128
icon: !controller.isRefreshing.value
129129
? Icon(Icons.refresh, color: TaskWarriorColors.white)
130-
: Icon(Icons.autorenew, color: TaskWarriorColors.white),
130+
: const _SpinningIcon(),
131131
onPressed: controller.isRefreshing.value
132132
? null
133133
: () async {
@@ -151,8 +151,23 @@ class HomePageAppBar extends StatelessWidget implements PreferredSizeWidget {
151151
}
152152
debugPrint("Refreshing Replica tasks");
153153
controller.isRefreshing.value = true;
154-
await controller.refreshReplicaTasks();
155-
controller.isRefreshing.value = false;
154+
try {
155+
await controller.refreshReplicaTasks();
156+
_showResultSnackBar(
157+
context, 'Sync Completed', false);
158+
} catch (e) {
159+
debugPrint('Error refreshing replica tasks: $e');
160+
_showResultSnackBar(
161+
context,
162+
SentenceManager(
163+
currentLanguage:
164+
controller.selectedLanguage.value)
165+
.sentences
166+
.homePageTaskWarriorNotConfigured,
167+
true);
168+
} finally {
169+
controller.isRefreshing.value = false;
170+
}
156171
return;
157172
}
158173

@@ -177,13 +192,7 @@ class HomePageAppBar extends StatelessWidget implements PreferredSizeWidget {
177192
.hideCurrentSnackBar();
178193

179194
_showResultSnackBar(
180-
context,
181-
SentenceManager(
182-
currentLanguage:
183-
controller.selectedLanguage.value)
184-
.sentences
185-
.homePageFetchingTasks,
186-
false);
195+
context, 'Sync Completed', false);
187196
} catch (e) {
188197
debugPrint('Error refreshing tasks: $e');
189198
ScaffoldMessenger.of(context)
@@ -216,6 +225,8 @@ class HomePageAppBar extends StatelessWidget implements PreferredSizeWidget {
216225
await controller.synchronize(context, true);
217226
ScaffoldMessenger.of(context)
218227
.hideCurrentSnackBar();
228+
_showResultSnackBar(
229+
context, 'Sync Completed', false);
219230
} catch (e) {
220231
ScaffoldMessenger.of(context)
221232
.hideCurrentSnackBar();
@@ -280,3 +291,38 @@ class HomePageAppBar extends StatelessWidget implements PreferredSizeWidget {
280291
@override
281292
Size get preferredSize => AppBar().preferredSize;
282293
}
294+
295+
class _SpinningIcon extends StatefulWidget {
296+
const _SpinningIcon();
297+
298+
@override
299+
State<_SpinningIcon> createState() => _SpinningIconState();
300+
}
301+
302+
class _SpinningIconState extends State<_SpinningIcon>
303+
with SingleTickerProviderStateMixin {
304+
late final AnimationController _controller;
305+
306+
@override
307+
void initState() {
308+
super.initState();
309+
_controller = AnimationController(
310+
duration: const Duration(seconds: 1),
311+
vsync: this,
312+
)..repeat();
313+
}
314+
315+
@override
316+
void dispose() {
317+
_controller.dispose();
318+
super.dispose();
319+
}
320+
321+
@override
322+
Widget build(BuildContext context) {
323+
return RotationTransition(
324+
turns: _controller,
325+
child: Icon(Icons.refresh, color: TaskWarriorColors.white),
326+
);
327+
}
328+
}

0 commit comments

Comments
 (0)