Skip to content

Commit 35d7b2a

Browse files
committed
feat: added websockets to receive job status
1 parent 49bb285 commit 35d7b2a

File tree

3 files changed

+114
-6
lines changed

3 files changed

+114
-6
lines changed

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

+73-6
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,15 @@ import 'package:taskwarrior/app/tour/home_page_tour.dart';
2727
import 'package:taskwarrior/app/utils/constants/taskwarrior_colors.dart';
2828
import 'package:taskwarrior/app/utils/language/supported_language.dart';
2929
import 'package:taskwarrior/app/utils/taskchampion/credentials_storage.dart';
30+
import 'package:taskwarrior/app/utils/taskchampion/websocket.dart';
3031
import 'package:taskwarrior/app/utils/taskfunctions/comparator.dart';
3132
import 'package:taskwarrior/app/utils/taskfunctions/projects.dart';
3233
import 'package:taskwarrior/app/utils/taskfunctions/query.dart';
3334
import 'package:taskwarrior/app/utils/taskfunctions/tags.dart';
3435
import 'package:taskwarrior/app/utils/app_settings/app_settings.dart';
3536
import 'package:tutorial_coach_mark/tutorial_coach_mark.dart';
37+
import 'package:web_socket_channel/status.dart';
38+
import 'package:web_socket_channel/web_socket_channel.dart';
3639

3740
class HomeController extends GetxController {
3841
final SplashController splashController = Get.find<SplashController>();
@@ -55,6 +58,7 @@ class HomeController extends GetxController {
5558
final ScrollController scrollController = ScrollController();
5659
final RxBool showbtn = false.obs;
5760
late TaskDatabase taskdb;
61+
WebSocketChannel? wsChannel;
5862
var tasks = <Tasks>[].obs;
5963

6064
@override
@@ -74,25 +78,32 @@ class HomeController extends GetxController {
7478
taskdb.open();
7579
getUniqueProjects();
7680
_loadTaskChampion();
81+
ever(taskchampion, (bool value) async {
82+
if (value) {
83+
wsChannel = await initCCSyncUpdatesWs();
84+
} else {
85+
if (wsChannel != null) wsChannel?.sink.close(goingAway);
86+
}
87+
});
7788
if (Platform.isAndroid) {
7889
handleHomeWidgetClicked();
7990
}
8091
fetchTasksFromDB();
81-
everAll([
92+
everAll([
8293
pendingFilter,
8394
waitingFilter,
8495
projectFilter,
8596
tagUnion,
8697
selectedSort,
8798
selectedTags,
8899
], (_) {
89-
if (Platform.isAndroid) {
100+
if (Platform.isAndroid) {
90101
WidgetController widgetController =
91102
Get.put(WidgetController());
92-
widgetController.fetchAllData();
103+
widgetController.fetchAllData();
93104

94-
widgetController.update();
95-
}
105+
widgetController.update();
106+
}
96107
});
97108
}
98109

@@ -518,7 +529,7 @@ class HomeController extends GetxController {
518529

519530

520531
];
521-
RxString priority = 'X'.obs;
532+
RxString priority = 'None'.obs;
522533

523534
final tagcontroller = TextEditingController();
524535
RxList<String> tags = <String>[].obs;
@@ -717,4 +728,60 @@ class HomeController extends GetxController {
717728
Widget showDialog = taskchampion.value ? AddTaskToTaskcBottomSheet(homeController: this) : AddTaskBottomSheet(homeController: this);
718729
Get.dialog(showDialog);
719730
}
731+
732+
Future<WebSocketChannel> initCCSyncUpdatesWs() async {
733+
Map<String, String> successMessages = {
734+
"Add Task": "Task added successfully",
735+
"Edit Task": "Task edited successfully",
736+
"Complete Task": "Task completed successfully",
737+
"Delete Task": "Task deleted successfully",
738+
};
739+
Map<String, String> failureMessages = {
740+
"Add Task": "Task addition failed",
741+
"Edit Task": "Task edit failed",
742+
"Complete Task": "Task completion failed",
743+
"Delete Task": "Task deletion failed",
744+
};
745+
String? clientId = await CredentialsStorage.getClientId();
746+
return listenForTaskUpdates(getWsUrl(baseUrl, clientId),
747+
(TaskUpdate update) {
748+
debugPrint("Success: ${update.job} ${successMessages[update.job]!}");
749+
if (successMessages.containsKey(update.job)) {
750+
ScaffoldMessenger.of(Get.context!).showSnackBar(SnackBar(
751+
content: Text(
752+
'${successMessages[update.job]}',
753+
style: TextStyle(
754+
color: AppSettings.isDarkMode
755+
? TaskWarriorColors.kprimaryTextColor
756+
: TaskWarriorColors.kLightPrimaryTextColor,
757+
),
758+
),
759+
backgroundColor: AppSettings.isDarkMode
760+
? TaskWarriorColors.ksecondaryBackgroundColor
761+
: TaskWarriorColors.kLightSecondaryBackgroundColor,
762+
duration: const Duration(seconds: 2)));
763+
}
764+
}, (TaskUpdate update) {
765+
ScaffoldMessenger.of(Get.context!).showSnackBar(SnackBar(
766+
content: Text(
767+
'${failureMessages[update.job]}',
768+
style: TextStyle(
769+
color: AppSettings.isDarkMode
770+
? TaskWarriorColors.kprimaryTextColor
771+
: TaskWarriorColors.kLightPrimaryTextColor,
772+
),
773+
),
774+
backgroundColor: AppSettings.isDarkMode
775+
? TaskWarriorColors.ksecondaryBackgroundColor
776+
: TaskWarriorColors.kLightSecondaryBackgroundColor,
777+
duration: const Duration(seconds: 2)));
778+
});
779+
}
780+
781+
@override
782+
void onClose() {
783+
super.onClose();
784+
taskdb.close();
785+
if (wsChannel != null) wsChannel?.sink.close();
786+
}
720787
}
+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import 'dart:convert';
2+
3+
import 'package:flutter/material.dart';
4+
import 'package:web_socket_channel/web_socket_channel.dart';
5+
6+
class TaskUpdate {
7+
final String status;
8+
final String job;
9+
const TaskUpdate(this.status, this.job);
10+
TaskUpdate.fromJson(Map<String, dynamic> json)
11+
: status = json['status'],
12+
job = json['job'];
13+
Map<String, dynamic> toJson() => {
14+
'status': status,
15+
'job': job,
16+
};
17+
}
18+
19+
Future<WebSocketChannel> listenForTaskUpdates(url, onSuccess, onFailure) async {
20+
final webSocketChannel = WebSocketChannel.connect(
21+
Uri.parse(url),
22+
);
23+
await webSocketChannel.ready;
24+
webSocketChannel.stream.listen((message) {
25+
debugPrint(message);
26+
TaskUpdate update =
27+
TaskUpdate.fromJson(jsonDecode(message) as Map<String, dynamic>);
28+
if (update.status == 'success') {
29+
onSuccess(update);
30+
}
31+
if (update.status == 'failure') {
32+
onFailure(update);
33+
}
34+
});
35+
return webSocketChannel;
36+
}
37+
38+
String getWsUrl(url, clientId) {
39+
return url.replaceFirst('http', 'ws') + '/ws?clientID=' + clientId;
40+
}

pubspec.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ dependencies:
6464
url_launcher: ^6.1.14
6565
uuid: ^4.2.2
6666
built_collection: ^5.1.1
67+
web_socket_channel: ^2.4.0
6768

6869
dev_dependencies:
6970
build_runner: null

0 commit comments

Comments
 (0)