Erweiterungen

This commit is contained in:
Sven committed 2024-11-14 10:56:36 +01:00
1 parent 96544ca924
commit def0f3fc2f
136 files changed
+4172 -499

No files matched your search

+25 -6
View File
@@ -1,3 +1,4 @@
import 'package:dart_mq/dart_mq.dart';
import 'package:flutter/material.dart';
import 'package:isar/isar.dart';
import 'package:stadtbote/content_views/tour_list_page.dart';
@@ -25,7 +26,7 @@ class AcceptedJobsPage extends ContentViewWidget {
}
}
class _AcceptedJobsPageState extends State<AcceptedJobsPage> {
class _AcceptedJobsPageState extends State<AcceptedJobsPage> with ProducerMixin {
late List<Job> _jobs;
late bool _initCompleted = false;
@@ -85,7 +86,7 @@ class _AcceptedJobsPageState extends State<AcceptedJobsPage> {
children: <Widget>[
Text(
DateFormat('dd.MM.yyyy HH:mm').format(DateTime.parse(job.ordertime).toLocal()).toString(),
style: TextStyle(backgroundColor: isJobInFuture(job) ? Colors.yellow : Colors.transparent),
style: TextStyle(backgroundColor: isJobInFuture(job) ? Colors.red : Colors.transparent),
textAlign: TextAlign.left,
),
Text(
@@ -132,7 +133,13 @@ class _AcceptedJobsPageState extends State<AcceptedJobsPage> {
}
void _clicked(Job job) async {
await MessageService().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: TourListPage(job: job));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPushContentView,
payload: TourListPage(job: job),
);
//await MessageService().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: TourListPage(job: job));
}
}
@@ -141,7 +148,7 @@ class _HeaderWidget extends StatefulWidget {
State<_HeaderWidget> createState() => _HeaderWidgetState();
}
class _HeaderWidgetState extends State<_HeaderWidget> {
class _HeaderWidgetState extends State<_HeaderWidget> with ProducerMixin {
@override
void initState() {
super.initState();
@@ -171,7 +178,13 @@ class _HeaderWidgetState extends State<_HeaderWidget> {
child: FittedBox(
child: GestureDetector(
onTap: () async {
await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPopContentView,
payload: PopContentViewMessage(count: 1),
);
//await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
},
child: const CircleAvatar(
radius: 10,
@@ -194,7 +207,13 @@ class _HeaderWidgetState extends State<_HeaderWidget> {
child: FittedBox(
child: GestureDetector(
onTap: () async {
await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPopContentView,
payload: PopContentViewMessage(count: 1),
);
//await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
},
child: const CircleAvatar(
backgroundColor: Constants.colorPrimary,
+34 -8
View File
@@ -1,4 +1,5 @@
import 'package:dart_mq/dart_mq.dart';
import 'package:flutter/material.dart';
import 'package:isar/isar.dart';
import 'package:mqtt5_client/mqtt5_client.dart';
@@ -30,7 +31,7 @@ class ApproachAreaPage extends ContentViewWidget {
}
}
class _ApproachAreaPageState extends State<ApproachAreaPage> {
class _ApproachAreaPageState extends State<ApproachAreaPage> with ProducerMixin{
late Ranking? _ranking;
late bool _initCompleted = false;
@@ -54,7 +55,8 @@ class _ApproachAreaPageState extends State<ApproachAreaPage> {
void deactivate() {
super.deactivate();
MessageService().unsubscribe(Constants.messageTopicRankingUpdated, this);
// TODO MESSAGING
//MessageService().unsubscribe(Constants.messageTopicRankingUpdated, this);
}
@override
@@ -201,15 +203,27 @@ class _ApproachAreaPageState extends State<ApproachAreaPage> {
setPosMessage.track!.pos!.acc = position.accuracy.toInt();
}
await MessageService().publish<PublishPayloadMessage>(Constants.messageTopicPublishPayload, arguments: PublishPayloadMessage(topic: "set_zip", message: setPosMessage.toJson(), qos: MqttQos.exactlyOnce));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPublishPayload,
payload: PublishPayloadMessage(topic: "set_zip", message: setPosMessage.toJson(), qos: MqttQos.exactlyOnce),
);
//await MessageService().publish<PublishPayloadMessage>(Constants.messageTopicPublishPayload, arguments: PublishPayloadMessage(topic: "set_zip", message: setPosMessage.toJson(), qos: MqttQos.exactlyOnce));
}
_initMessages() {
MessageService().subscribe<RankingUpdated>(Constants.messageTopicRankingUpdated, this, (rankingUpdateMessage) async {
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPopContentView,
payload: PopContentViewMessage(count: 1),
);
/*MessageService().subscribe<RankingUpdated>(Constants.messageTopicRankingUpdated, this, (rankingUpdateMessage) async {
_ranking = await MyApp.isarInstance.rankings.where().findFirst();
setState(() {});
});
});*/
}
}
@@ -218,7 +232,7 @@ class _HeaderWidget extends StatefulWidget {
State<_HeaderWidget> createState() => _HeaderWidgetState();
}
class _HeaderWidgetState extends State<_HeaderWidget> {
class _HeaderWidgetState extends State<_HeaderWidget> with ProducerMixin {
@override
void initState() {
super.initState();
@@ -248,7 +262,13 @@ class _HeaderWidgetState extends State<_HeaderWidget> {
child: FittedBox(
child: GestureDetector(
onTap: () async {
await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPopContentView,
payload: PopContentViewMessage(count: 1),
);
//await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
},
child: const CircleAvatar(
radius: 10,
@@ -271,7 +291,13 @@ class _HeaderWidgetState extends State<_HeaderWidget> {
child: FittedBox(
child: GestureDetector(
onTap: () async {
await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPopContentView,
payload: PopContentViewMessage(count: 1),
);
//await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
},
child: const CircleAvatar(
backgroundColor: Constants.colorPrimary,
+32 -7
View File
@@ -1,4 +1,5 @@
import 'package:dart_mq/dart_mq.dart';
import 'package:expandable/expandable.dart';
import 'package:flutter/material.dart';
import 'package:isar/isar.dart';
@@ -32,7 +33,7 @@ class AssignedJobsPage extends ContentViewWidget {
}
}
class _AssignedJobsPageState extends State<AssignedJobsPage> {
class _AssignedJobsPageState extends State<AssignedJobsPage> with ProducerMixin {
late bool _initCompleted = false;
List<Widget> _entries = [];
@@ -112,7 +113,7 @@ class _AssignedJobsPageState extends State<AssignedJobsPage> {
Text(
DateFormat('dd.MM.yyyy HH:mm').format(DateTime.parse(job.ordertime).toLocal()).toString(),
textAlign: TextAlign.left,
style: TextStyle(backgroundColor: isJobInFuture(job) ? Colors.yellow : Colors.white),
style: TextStyle(backgroundColor: isJobInFuture(job) ? Colors.red : Colors.white),
),
Text('Auftragsnummer: ${job.id}'),
Text(job.tours[0].comp),
@@ -189,13 +190,25 @@ class _AssignedJobsPageState extends State<AssignedJobsPage> {
message.track.pos!.long = currentPosition != null ? currentPosition.longitude : 0.0;
message.track.pos!.acc = currentPosition != null ? currentPosition.accuracy.toInt() : 0;
await MessageService().publish<PublishPayloadMessage>(Constants.messageTopicPublishPayload, arguments: PublishPayloadMessage(topic: "reaction", message: message.toJson(), qos: MqttQos.exactlyOnce));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPublishPayload,
payload: PublishPayloadMessage(topic: "reaction", message: message.toJson(), qos: MqttQos.exactlyOnce),
);
//await MessageService().publish<PublishPayloadMessage>(Constants.messageTopicPublishPayload, arguments: PublishPayloadMessage(topic: "reaction", message: message.toJson(), qos: MqttQos.exactlyOnce));
await MyApp.isarInstance.writeTxn(() async {
await MyApp.isarInstance.jobs.delete(job.id);
});
await MessageService().publish<RefreshBadgesMessage>(Constants.messageTopicUpdateBadges, arguments: RefreshBadgesMessage());
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicUpdateBadges,
payload: RefreshBadgesMessage(),
);
//await MessageService().publish<RefreshBadgesMessage>(Constants.messageTopicUpdateBadges, arguments: RefreshBadgesMessage());
_entries = await _createListEntries();
@@ -210,7 +223,7 @@ class _HeaderWidget extends StatefulWidget {
State<_HeaderWidget> createState() => _HeaderWidgetState();
}
class _HeaderWidgetState extends State<_HeaderWidget> {
class _HeaderWidgetState extends State<_HeaderWidget> with ProducerMixin {
@override
void initState() {
super.initState();
@@ -240,7 +253,13 @@ class _HeaderWidgetState extends State<_HeaderWidget> {
child: FittedBox(
child: GestureDetector(
onTap: () async {
await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPopContentView,
payload: PopContentViewMessage(count: 1),
);
//await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
},
child: const CircleAvatar(
radius: 10,
@@ -263,7 +282,13 @@ class _HeaderWidgetState extends State<_HeaderWidget> {
child: FittedBox(
child: GestureDetector(
onTap: () async {
await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPopContentView,
payload: PopContentViewMessage(count: 1),
);
//await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
},
child: const CircleAvatar(
backgroundColor: Constants.colorPrimary,
+24 -5
View File
@@ -1,3 +1,4 @@
import 'package:dart_mq/dart_mq.dart';
import 'package:flutter/material.dart';
import 'package:isar/isar.dart';
import 'package:stadtbote/content_views/tour_list_page.dart';
@@ -25,7 +26,7 @@ class FinishedJobsPage extends ContentViewWidget {
}
}
class _FinishedJobsPageState extends State<FinishedJobsPage> {
class _FinishedJobsPageState extends State<FinishedJobsPage> with ProducerMixin {
late List<Job> _jobs;
late bool _initCompleted = false;
@@ -120,7 +121,13 @@ class _FinishedJobsPageState extends State<FinishedJobsPage> {
}
void _clicked(Job job) async {
await MessageService().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: TourListPage(job: job, readOnly: true,));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPushContentView,
payload: TourListPage(job: job, readOnly: true),
);
//await MessageService().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: TourListPage(job: job, readOnly: true,));
}
}
@@ -129,7 +136,7 @@ class _HeaderWidget extends StatefulWidget {
State<_HeaderWidget> createState() => _HeaderWidgetState();
}
class _HeaderWidgetState extends State<_HeaderWidget> {
class _HeaderWidgetState extends State<_HeaderWidget> with ProducerMixin {
@override
void initState() {
super.initState();
@@ -159,7 +166,13 @@ class _HeaderWidgetState extends State<_HeaderWidget> {
child: FittedBox(
child: GestureDetector(
onTap: () async {
await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPopContentView,
payload: PopContentViewMessage(count: 1),
);
//await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
},
child: const CircleAvatar(
radius: 10,
@@ -182,7 +195,13 @@ class _HeaderWidgetState extends State<_HeaderWidget> {
child: FittedBox(
child: GestureDetector(
onTap: () async {
await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPushContentView,
payload: PopContentViewMessage(count: 1),
);
//await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
},
child: const CircleAvatar(
backgroundColor: Constants.colorPrimary,
+141 -44
View File
@@ -1,3 +1,4 @@
import 'package:dart_mq/dart_mq.dart';
import 'package:flutter/material.dart';
import 'package:isar/isar.dart';
import 'package:mqtt5_client/mqtt5_client.dart';
@@ -10,7 +11,7 @@ import 'package:stadtbote/content_views/utils/content_view_widget.dart';
import 'package:stadtbote/main.dart';
import 'package:stadtbote/model/job.dart';
import 'package:stadtbote/model/location_status.dart';
import 'package:stadtbote/model/message.dart';
import 'package:stadtbote/model/chat_message.dart';
import 'package:stadtbote/model/session_status.dart';
import 'package:stadtbote/popups/infos_popup.dart';
import 'package:stadtbote/protocoll_messages/logout_message.dart';
@@ -42,7 +43,7 @@ class MainPage extends ContentViewWidget {
}
}
class _MainPageState extends State<MainPage> {
class _MainPageState extends State<MainPage> with ConsumerMixin, ProducerMixin {
final ValueNotifier<int> _assignedJobsValueNotifier = ValueNotifier<int>(0);
final ValueNotifier<int> _acceptedJobsValueNotifier = ValueNotifier<int>(0);
final ValueNotifier<int> _messagesValueNotifier = ValueNotifier<int>(0);
@@ -61,8 +62,6 @@ class _MainPageState extends State<MainPage> {
@override
void dispose() {
super.dispose();
_exitMessages();
}
@override
@@ -102,9 +101,15 @@ class _MainPageState extends State<MainPage> {
'Zugewiesene Aufträge',
image: Image.asset('assets/zugewiesene_auftraege.png', width: 30, height: 30),
() async => {
await MessageService()
.publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const AssignedJobsPage())
}),
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPushContentView,
payload: const AssignedJobsPage(),
)
//await MessageService().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const AssignedJobsPage())
}
),
);
},
),
@@ -136,9 +141,16 @@ class _MainPageState extends State<MainPage> {
'Angenommene Aufträge',
image: Image.asset('assets/angenommene_auftraege.png', width: 30, height: 30),
() async => {
await MessageService()
.publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const AcceptedJobsPage())
}));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPushContentView,
payload: const AcceptedJobsPage(),
)
//await MessageService().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const AcceptedJobsPage())
}
)
);
},
),
),
@@ -149,9 +161,15 @@ class _MainPageState extends State<MainPage> {
'Erledigte Aufträge',
image: Image.asset('assets/erledigte_auftraege.png', width: 30, height: 30),
() async => {
await MessageService()
.publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const FinishedJobsPage())
}),
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPushContentView,
payload: const FinishedJobsPage(),
)
//await MessageService().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const FinishedJobsPage())
}
),
),
SizedBox(height: _loggedOut == true ? 0 : 20),
Visibility(
@@ -180,9 +198,16 @@ class _MainPageState extends State<MainPage> {
'Nachrichten',
image: Image.asset('assets/nachrichten.png', width: 30, height: 30),
() async => {
await MessageService()
.publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const MessagesPage())
}));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPushContentView,
payload: const MessagesPage(),
)
//await MessageService().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const MessagesPage())
}
)
);
},
),
),
@@ -193,8 +218,12 @@ class _MainPageState extends State<MainPage> {
'Anfahrtsbereich',
image: Image.asset('assets/anfahrtsbereich.png', width: 30, height: 30),
() async => {
await MessageService()
.publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const ApproachAreaPage())
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPushContentView,
payload: const ApproachAreaPage(),
)
//await MessageService().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: const ApproachAreaPage())
}),
),
SizedBox(height: _loggedOut == true ? 0 : 20),
@@ -226,31 +255,58 @@ class _MainPageState extends State<MainPage> {
}
_initMessages() {
MessageService().subscribe<JobReceivedMessage>(Constants.messageTopicJobReceived, this, (JobReceivedMessage jobReceivedMessage) {
subscribe(
queueId: Constants.messageTopicRemoveJob,
callback: (message) {
_refreshBadges();
},
);
subscribe(
queueId: Constants.messageTopicJobReceived,
callback: (message) {
_jobReceived((message.payload as JobReceivedMessage).job);
},
);
/*MessageService().subscribe<JobReceivedMessage>(Constants.messageTopicJobReceived, this, (JobReceivedMessage jobReceivedMessage) {
_jobReceived(jobReceivedMessage.job);
});
});*/
MessageService().subscribe<MessageReceivedMessage>(Constants.messageTopicMessageReceived, this, (MessageReceivedMessage mesage) {
subscribe(
queueId: Constants.messageTopicMessageReceived,
callback: (message) {
_refreshBadges();
},
);
/*MessageService().subscribe<MessageReceivedMessage>(Constants.messageTopicMessageReceived, this, (MessageReceivedMessage mesage) {
_refreshBadges();
});
});*/
MessageService().subscribe<JobDeletedMessage>(Constants.messageTopicJobDeleted, this, (JobDeletedMessage job) {
subscribe(
queueId: Constants.messageTopicJobDeleted,
callback: (message) {
_refreshBadges();
},
);
/*MessageService().subscribe<JobDeletedMessage>(Constants.messageTopicJobDeleted, this, (JobDeletedMessage job) {
_refreshBadges();
});
});*/
MessageService().subscribe<RefreshBadgesMessage>(Constants.messageTopicUpdateBadges, this, (RefreshBadgesMessage message) {
subscribe(
queueId: Constants.messageTopicUpdateBadges,
callback: (message) {
_refreshBadges();
},
);
/*MessageService().subscribe<RefreshBadgesMessage>(Constants.messageTopicUpdateBadges, this, (RefreshBadgesMessage message) {
_refreshBadges();
});
}
void _exitMessages() {
MessageService().unsubscribeAll(this);
});*/
}
void _refreshBadges() async {
_assignedJobsValueNotifier.value = await MyApp.isarInstance.jobs.filter().stateEqualTo(0).count();
_acceptedJobsValueNotifier.value = await MyApp.isarInstance.jobs.filter().stateEqualTo(1).count();
_messagesValueNotifier.value = await MyApp.isarInstance.messages.filter().readEqualTo(false).count();
_messagesValueNotifier.value = await MyApp.isarInstance.chatMessages.filter().readEqualTo(false).count();
}
void _jobReceived(Job job) {
@@ -261,7 +317,13 @@ class _MainPageState extends State<MainPage> {
if (!_loggedOut) {
showLogoutAlertDialog(context);
} else {
await MessageService().publish<ConnectClientMessage>(Constants.messageTopicConnectClient, arguments: ConnectClientMessage());
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicConnectClient,
payload: ConnectClientMessage(),
);
//await MessageService().publish<ConnectClientMessage>(Constants.messageTopicConnectClient, arguments: ConnectClientMessage());
_loggedOut = false;
@@ -281,12 +343,28 @@ class _MainPageState extends State<MainPage> {
_loggedOut = true;
await MessageService().publish<DisconnectClientMessage>(Constants.messageTopicDisconnectClient, arguments: DisconnectClientMessage());
Future.delayed(const Duration(seconds: 2), () async {
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicDisconnectClient,
payload: DisconnectClientMessage(),
);
Future.delayed(const Duration(seconds: 5), () async {
Navigator.of(context).pop();
//await MessageService().publish<DisconnectClientMessage>(Constants.messageTopicDisconnectClient, arguments: DisconnectClientMessage());
setState(() {});
Future.delayed(const Duration(seconds: 3), () async {
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicDisconnectClient,
payload: DisconnectClientMessage(),
);
//await MessageService().publish<DisconnectClientMessage>(Constants.messageTopicDisconnectClient, arguments: DisconnectClientMessage());
Navigator.of(MyApp.appNavigatorKey.currentContext!).pop();
setState(() {});
});
});
},
);
@@ -329,8 +407,13 @@ class _MainPageState extends State<MainPage> {
logoutMessage.pos!.acc = position.accuracy.toInt();
}
await MessageService().publish<PublishPayloadMessage>(Constants.messageTopicPublishPayload,
arguments: PublishPayloadMessage(topic: "logout", message: logoutMessage.toJson(), qos: MqttQos.exactlyOnce));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPublishPayload,
payload: PublishPayloadMessage(topic: "logout", message: logoutMessage.toJson(), qos: MqttQos.exactlyOnce),
);
//await MessageService().publish<PublishPayloadMessage>(Constants.messageTopicPublishPayload, arguments: PublishPayloadMessage(topic: "logout", message: logoutMessage.toJson(), qos: MqttQos.exactlyOnce));
}
}
@@ -339,7 +422,7 @@ class _HeaderWidget extends StatefulWidget {
State<_HeaderWidget> createState() => _HeaderWidgetState();
}
class _HeaderWidgetState extends State<_HeaderWidget> {
class _HeaderWidgetState extends State<_HeaderWidget> with ConsumerMixin {
final ValueNotifier<String> _zipValueNotifier = ValueNotifier("-----");
final ValueNotifier<String> _zipRealValueNotifier = ValueNotifier("-----");
final ValueNotifier<String> _sidValueNotifier = ValueNotifier("-----");
@@ -498,13 +581,27 @@ class _HeaderWidgetState extends State<_HeaderWidget> {
}
_initMessages() {
MessageService().subscribe<SessionStatusInfoUpdate>(Constants.messageTopicSessionStatusInfoUpdate, this, (sessionStatusInfoUpdateMessage) {
_updateHeader();
});
subscribe(
queueId: Constants.messageTopicSessionStatusInfoUpdate,
callback: (message) {
_updateHeader();
},
);
MessageService().subscribe<LocationStatusUpdate>(Constants.messageTopicLocationStatusUpdated, this, (statusInfoUpdateMessage) {
/*MessageService().subscribe<SessionStatusInfoUpdate>(Constants.messageTopicSessionStatusInfoUpdate, this, (sessionStatusInfoUpdateMessage) {
_updateHeader();
});
});*/
subscribe(
queueId: Constants.messageTopicLocationStatusUpdated,
callback: (message) {
_updateHeader();
},
);
/*MessageService().subscribe<LocationStatusUpdate>(Constants.messageTopicLocationStatusUpdated, this, (statusInfoUpdateMessage) {
_updateHeader();
});*/
}
_updateHeader() async {
+32 -13
View File
@@ -1,4 +1,5 @@
import 'package:dart_mq/dart_mq.dart';
import 'package:flutter/material.dart';
import 'package:flutter_chat_ui/flutter_chat_ui.dart';
import 'package:flutter_chat_types/flutter_chat_types.dart' as types;
@@ -7,8 +8,8 @@ import 'package:mqtt5_client/mqtt5_client.dart';
import 'package:stadtbote/content_views/utils/content_view_widget.dart';
import 'package:stadtbote/main.dart';
import 'package:stadtbote/messages/pop_content_view_message.dart';
import 'package:stadtbote/model/message.dart' as sbmessage;
import 'package:stadtbote/model/message.dart';
import 'package:stadtbote/model/chat_message.dart' as sbmessage;
import 'package:stadtbote/model/chat_message.dart';
import 'package:stadtbote/model/session_status.dart';
import 'package:stadtbote/tools/constants.dart';
import 'package:stadtbote/tools/message_service.dart';
@@ -30,7 +31,7 @@ class MessagesPage extends ContentViewWidget {
}
}
class _MessagesPageState extends State<MessagesPage> {
class _MessagesPageState extends State<MessagesPage> with ProducerMixin {
bool _initCompleted = false;
late String _sid;
@@ -87,19 +88,25 @@ class _MessagesPageState extends State<MessagesPage> {
void _handleSendPressed(types.PartialText text) async {
var now = DateTime.now();
var message = sbmessage.Message();
var message = sbmessage.ChatMessage();
message.text = text.text;
message.from = _sid;
message.subj = '';
message.time = now.toUtc().toIso8601String();
message.read = true;
message.id = await sbmessage.Message.getNextId();
message.id = await sbmessage.ChatMessage.getNextId();
await MyApp.isarInstance.writeTxn(() async {
await MyApp.isarInstance.messages.put(message);
await MyApp.isarInstance.chatMessages.put(message);
});
await MessageService().publish<PublishPayloadMessage>(Constants.messageTopicPublishPayload, arguments: PublishPayloadMessage(topic: "message", message: message.toJson(), qos: MqttQos.exactlyOnce));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPublishPayload,
payload: PublishPayloadMessage(topic: "message", message: message.toJson(), qos: MqttQos.exactlyOnce),
);
//await MessageService().publish<PublishPayloadMessage>(Constants.messageTopicPublishPayload, arguments: PublishPayloadMessage(topic: "message", message: message.toJson(), qos: MqttQos.exactlyOnce));
_messages.insert(0, types.TextMessage(
author: _user,
@@ -114,7 +121,7 @@ class _MessagesPageState extends State<MessagesPage> {
Future<void> _fetchMessages() async {
_messages.clear();
var messages = await MyApp.isarInstance.messages.where().findAll();
var messages = await MyApp.isarInstance.chatMessages.where().findAll();
for (var message in messages) {
_messages.add(types.TextMessage(
author: message.from == _sid ? _user : _central,
@@ -127,7 +134,7 @@ class _MessagesPageState extends State<MessagesPage> {
message.read = true;
await MyApp.isarInstance.writeTxn(() async {
await MyApp.isarInstance.messages.put(message);
await MyApp.isarInstance.chatMessages.put(message);
});
}
@@ -166,7 +173,7 @@ class _MessagesPageState extends State<MessagesPage> {
const SizedBox(width: 20),
Expanded(
child: getDefaultButton('Ja', () async => {
await MyApp.isarInstance.writeTxn(() async => { await MyApp.isarInstance.messages.delete(int.parse(message.id))}),
await MyApp.isarInstance.writeTxn(() async => { await MyApp.isarInstance.chatMessages.delete(int.parse(message.id))}),
_fetchMessages(),
@@ -192,7 +199,7 @@ class _HeaderWidget extends StatefulWidget {
State<_HeaderWidget> createState() => _HeaderWidgetState();
}
class _HeaderWidgetState extends State<_HeaderWidget> {
class _HeaderWidgetState extends State<_HeaderWidget> with ProducerMixin {
@override
void initState() {
super.initState();
@@ -222,7 +229,13 @@ class _HeaderWidgetState extends State<_HeaderWidget> {
child: FittedBox(
child: GestureDetector(
onTap: () async {
await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPopContentView,
payload: PopContentViewMessage(count: 1),
);
//await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
},
child: const CircleAvatar(
radius: 10,
@@ -245,7 +258,13 @@ class _HeaderWidgetState extends State<_HeaderWidget> {
child: FittedBox(
child: GestureDetector(
onTap: () async {
await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPopContentView,
payload: PopContentViewMessage(count: 1),
);
//await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
},
child: const CircleAvatar(
backgroundColor: Constants.colorPrimary,
+45 -8
View File
@@ -1,5 +1,6 @@
import 'dart:convert';
import 'package:dart_mq/dart_mq.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:intl/intl.dart';
@@ -50,7 +51,7 @@ class TaskListPage extends ContentViewWidget {
}
}
class _TaskListPageState extends State<TaskListPage> {
class _TaskListPageState extends State<TaskListPage> with ProducerMixin {
late bool _initCompleted = false;
late List<TaskInfo> _taskList;
@@ -420,7 +421,13 @@ class _TaskListPageState extends State<TaskListPage> {
_finishTaskProcessing(taskInfo);
await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 2));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPopContentView,
payload: PopContentViewMessage(count: 2),
);
//await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 2));
}
});
});
@@ -471,7 +478,13 @@ class _TaskListPageState extends State<TaskListPage> {
message.task.pos = null;
}
await MessageService().publish<PublishPayloadMessage>(Constants.messageTopicPublishPayload, arguments: PublishPayloadMessage(topic: "fin_task", message: message.toJson(), qos: MqttQos.exactlyOnce));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPublishPayload,
payload: PublishPayloadMessage(topic: "fin_task", message: message.toJson(), qos: MqttQos.exactlyOnce),
);
//await MessageService().publish<PublishPayloadMessage>(Constants.messageTopicPublishPayload, arguments: PublishPayloadMessage(topic: "fin_task", message: message.toJson(), qos: MqttQos.exactlyOnce));
}
FinTourTask _createAnswerHeader(TaskInfo taskInfo) {
@@ -515,7 +528,13 @@ class _TaskListPageState extends State<TaskListPage> {
}
}
await MessageService().publish<PublishPayloadMessage>(Constants.messageTopicPublishPayload, arguments: PublishPayloadMessage(topic: "fin_tour", message: finTourMessage.toJson(), qos: MqttQos.exactlyOnce));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPublishPayload,
payload: PublishPayloadMessage(topic: "fin_tour", message: finTourMessage.toJson(), qos: MqttQos.exactlyOnce),
);
//await MessageService().publish<PublishPayloadMessage>(Constants.messageTopicPublishPayload, arguments: PublishPayloadMessage(topic: "fin_tour", message: finTourMessage.toJson(), qos: MqttQos.exactlyOnce));
widget.tour.state = Constants.stateFinishedNotConfirmed;
@@ -540,7 +559,13 @@ class _TaskListPageState extends State<TaskListPage> {
message.time = DateTime.now().millisecondsSinceEpoch;
message.data = picture.data;
await MessageService().publish<PublishPayloadMessage>(Constants.messageTopicPublishPayload, arguments: PublishPayloadMessage(topic: "pic", message: message.toJson(), qos: MqttQos.exactlyOnce));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPublishPayload,
payload: PublishPayloadMessage(topic: "pic", message: message.toJson(), qos: MqttQos.exactlyOnce),
);
//await MessageService().publish<PublishPayloadMessage>(Constants.messageTopicPublishPayload, arguments: PublishPayloadMessage(topic: "pic", message: message.toJson(), qos: MqttQos.exactlyOnce));
await MyApp.isarInstance.writeTxn(() async {
await MyApp.isarInstance.pictures.delete(picture.id);
@@ -575,7 +600,7 @@ class _HeaderWidget extends StatefulWidget {
State<_HeaderWidget> createState() => _HeaderWidgetState();
}
class _HeaderWidgetState extends State<_HeaderWidget> {
class _HeaderWidgetState extends State<_HeaderWidget> with ProducerMixin {
@override
void initState() {
super.initState();
@@ -605,7 +630,13 @@ class _HeaderWidgetState extends State<_HeaderWidget> {
child: FittedBox(
child: GestureDetector(
onTap: () async {
await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPopContentView,
payload: PopContentViewMessage(count: 1),
);
//await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
},
child: const CircleAvatar(
radius: 10,
@@ -628,7 +659,13 @@ class _HeaderWidgetState extends State<_HeaderWidget> {
child: FittedBox(
child: GestureDetector(
onTap: () async {
await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPopContentView,
payload: PopContentViewMessage(count: 1),
);
//await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
},
child: const CircleAvatar(
backgroundColor: Constants.colorPrimary,
+24 -5
View File
@@ -1,3 +1,4 @@
import 'package:dart_mq/dart_mq.dart';
import 'package:flutter/material.dart';
import 'package:stadtbote/content_views/task_list_page.dart';
import 'package:stadtbote/content_views/utils/content_view_widget.dart';
@@ -30,7 +31,7 @@ class TourDetailsPage extends ContentViewWidget {
}
}
class _TourDetailsPageState extends State<TourDetailsPage> {
class _TourDetailsPageState extends State<TourDetailsPage> with ProducerMixin {
late bool _initCompleted = false;
@override
@@ -133,7 +134,13 @@ class _TourDetailsPageState extends State<TourDetailsPage> {
const SizedBox(height: 10),
getDefaultButton('Weiter', () async =>
{
await MessageService().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: TaskListPage(job: widget.job, tour: widget.tour, readOnly: widget.readOnly))
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPushContentView,
payload: TaskListPage(job: widget.job, tour: widget.tour, readOnly: widget.readOnly),
)
//await MessageService().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: TaskListPage(job: widget.job, tour: widget.tour, readOnly: widget.readOnly))
}),
],
),
@@ -146,7 +153,7 @@ class _HeaderWidget extends StatefulWidget {
State<_HeaderWidget> createState() => _HeaderWidgetState();
}
class _HeaderWidgetState extends State<_HeaderWidget> {
class _HeaderWidgetState extends State<_HeaderWidget> with ProducerMixin {
@override
void initState() {
super.initState();
@@ -176,7 +183,13 @@ class _HeaderWidgetState extends State<_HeaderWidget> {
child: FittedBox(
child: GestureDetector(
onTap: () async {
await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPopContentView,
payload: PopContentViewMessage(count: 1),
);
//await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
},
child: const CircleAvatar(
radius: 10,
@@ -199,7 +212,13 @@ class _HeaderWidgetState extends State<_HeaderWidget> {
child: FittedBox(
child: GestureDetector(
onTap: () async {
await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPopContentView,
payload: PopContentViewMessage(count: 1),
);
//await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
},
child: const CircleAvatar(
backgroundColor: Constants.colorPrimary,
+24 -5
View File
@@ -1,3 +1,4 @@
import 'package:dart_mq/dart_mq.dart';
import 'package:flutter/material.dart';
import 'package:stadtbote/content_views/tour_details_page.dart';
import 'package:stadtbote/content_views/utils/content_view_widget.dart';
@@ -28,7 +29,7 @@ class TourListPage extends ContentViewWidget {
}
}
class _TourListPageState extends State<TourListPage> {
class _TourListPageState extends State<TourListPage> with ProducerMixin {
late List<JobTour> _tours;
late bool _initCompleted = false;
@@ -198,7 +199,13 @@ class _TourListPageState extends State<TourListPage> {
}
Future<void> _clicked(JobTour tour, bool readOnly) async {
await MessageService().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: TourDetailsPage(job: widget.job, tour: tour, readOnly: readOnly));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPushContentView,
payload: TourDetailsPage(job: widget.job, tour: tour, readOnly: readOnly),
);
//await MessageService().publish<ContentViewWidget>(Constants.messageTopicPushContentView, arguments: TourDetailsPage(job: widget.job, tour: tour, readOnly: readOnly));
}
}
@@ -207,7 +214,7 @@ class _HeaderWidget extends StatefulWidget {
State<_HeaderWidget> createState() => _HeaderWidgetState();
}
class _HeaderWidgetState extends State<_HeaderWidget> {
class _HeaderWidgetState extends State<_HeaderWidget> with ProducerMixin {
@override
void initState() {
super.initState();
@@ -237,7 +244,13 @@ class _HeaderWidgetState extends State<_HeaderWidget> {
child: FittedBox(
child: GestureDetector(
onTap: () async {
await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPopContentView,
payload: PopContentViewMessage(count: 1),
);
//await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
},
child: const CircleAvatar(
radius: 10,
@@ -260,7 +273,13 @@ class _HeaderWidgetState extends State<_HeaderWidget> {
child: FittedBox(
child: GestureDetector(
onTap: () async {
await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicPopContentView,
payload: PopContentViewMessage(count: 1),
);
//await MessageService().publish<PopContentViewMessage>(Constants.messageTopicPopContentView, arguments: PopContentViewMessage(count: 1));
},
child: const CircleAvatar(
backgroundColor: Constants.colorPrimary,
+106 -20
View File
@@ -1,5 +1,6 @@
import 'dart:async';
import 'package:dart_mq/dart_mq.dart';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:isar/isar.dart';
@@ -8,7 +9,7 @@ import 'package:shared_map/shared_map.dart';
import 'package:stadtbote/messages/pop_content_view_message.dart';
import 'package:stadtbote/model/enqueued_message.dart';
import 'package:stadtbote/model/log_entry.dart';
import 'package:stadtbote/model/message.dart';
import 'package:stadtbote/model/chat_message.dart';
import 'package:stadtbote/model/pictures.dart';
import 'package:stadtbote/model/rank.dart';
import 'package:stadtbote/model/location_status.dart';
@@ -35,13 +36,32 @@ Future<void> main() async {
runZonedGuarded(() async {
WidgetsFlutterBinding.ensureInitialized();
MQClient.initialize();
MQClient.instance.declareQueue(Constants.messageTopicRemoveJob);
MQClient.instance.declareQueue(Constants.messageTopicPublishPayload);
MQClient.instance.declareQueue(Constants.messageTopicDisconnectClient);
MQClient.instance.declareQueue(Constants.messageTopicConnectClient);
MQClient.instance.declareQueue(Constants.messageTopicRequestConnectionStatus);
MQClient.instance.declareQueue(Constants.messageTopicConnectionStatusChanged);
MQClient.instance.declareQueue(Constants.messageTopicJobDeleted);
MQClient.instance.declareQueue(Constants.messageTopicRankingUpdated);
MQClient.instance.declareQueue(Constants.messageTopicSessionInfoUpdate);
MQClient.instance.declareQueue(Constants.messageTopicSessionStatusInfoUpdate);
MQClient.instance.declareQueue(Constants.messageTopicLocationStatusUpdated);
MQClient.instance.declareQueue(Constants.messageTopicPushContentView);
MQClient.instance.declareQueue(Constants.messageTopicPopContentView);
MQClient.instance.declareQueue(Constants.messageTopicReplaceContentView);
MQClient.instance.declareQueue(Constants.messageTopicJobReceived);
MQClient.instance.declareQueue(Constants.messageTopicMessageReceived);
MQClient.instance.declareQueue(Constants.messageTopicUpdateBadges);
final dir = await getApplicationDocumentsDirectory();
MyApp.isarInstance = await Isar.open([
SessionStatusSchema,
LocationStatusSchema,
JobSchema,
TaskInfoSchema,
MessageSchema,
ChatMessageSchema,
EnqueuedMessageSchema,
LogEntrySchema,
RankingSchema,
@@ -84,7 +104,7 @@ class MyApp extends StatefulWidget {
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
class _MyAppState extends State<MyApp> with ConsumerMixin {
final MqttCore mqttCore = MqttCore();
@override void initState() {
@@ -161,7 +181,7 @@ class Main extends StatefulWidget {
State<Main> createState() => _MainState();
}
class _MainState extends State<Main> with SingleTickerProviderStateMixin {
class _MainState extends State<Main> with SingleTickerProviderStateMixin, ProducerMixin, ConsumerMixin {
late ContentViewWidget _currentContent;
late WidgetStack<ContentViewWidget> contentStack = WidgetStack();
@@ -282,25 +302,75 @@ class _MainState extends State<Main> with SingleTickerProviderStateMixin {
}
void _initMessages() {
MessageService().unsubscribeAll(this);
MessageService().subscribe<ContentViewWidget>(Constants.messageTopicPushContentView, this, (ContentViewWidget widget) {
subscribe(
queueId: Constants.messageTopicPushContentView,
callback: (message) {
var widget = message.payload as ContentViewWidget;
_pushContentView(widget);
},
);
/*MessageService().subscribe<ContentViewWidget>(Constants.messageTopicPushContentView, this, (ContentViewWidget widget) {
_pushContentView(widget);
});
});*/
MessageService().subscribe<PopContentViewMessage>(Constants.messageTopicPopContentView, this, (PopContentViewMessage message) {
subscribe(
queueId: Constants.messageTopicPopContentView,
callback: (message) {
var popContentViewMessage = message.payload as PopContentViewMessage;
_popContentView(popContentViewMessage.count);
},
);
/*MessageService().subscribe<PopContentViewMessage>(Constants.messageTopicPopContentView, this, (PopContentViewMessage message) {
_popContentView(message.count);
});
});*/
MessageService().subscribe<ContentViewWidget>(Constants.messageTopicReplaceContentView, this, (ContentViewWidget widget) {
subscribe(
queueId: Constants.messageTopicReplaceContentView,
callback: (message) {
var widget = message.payload as ContentViewWidget;
_replaceContentView(widget);
},
);
/*MessageService().subscribe<ContentViewWidget>(Constants.messageTopicReplaceContentView, this, (ContentViewWidget widget) {
_replaceContentView(widget);
});
});*/
MessageService().subscribe<ConnectionStatus>(Constants.messageTopicConnectionStatusChanged, this, (ConnectionStatus connectionStatus) {
subscribe(
queueId: Constants.messageTopicConnectionStatusChanged,
callback: (message) {
var connectionStatus = message.payload as ConnectionStatus;
_connectionStatusChanged(connectionStatus);
},
);
/*MessageService().subscribe<ConnectionStatus>(Constants.messageTopicConnectionStatusChanged, this, (ConnectionStatus connectionStatus) {
_connectionStatusChanged(connectionStatus);
});
});*/
MessageService().subscribe<RemoveJobMessage>(Constants.messageTopicRemoveJob, this, (RemoveJobMessage job) async {
subscribe(
queueId: Constants.messageTopicRemoveJob,
callback: (message) async {
var removeJobMessage = message.payload as RemoveJobMessage;
await MyApp.isarInstance.writeTxn(() async {
await MyApp.isarInstance.jobs.where().filter().idEqualTo(removeJobMessage.id).deleteAll();
});
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicJobDeleted,
payload: JobDeletedMessage(id: removeJobMessage.id),
);
//await MessageService().publish<JobDeletedMessage>(Constants.messageTopicJobDeleted, arguments: JobDeletedMessage(id: job.id));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicUpdateBadges,
payload: RefreshBadgesMessage,
);
//await MessageService().publish<RefreshBadgesMessage>(Constants.messageTopicUpdateBadges, arguments: RefreshBadgesMessage());
},
);
/*MessageService().subscribe<RemoveJobMessage>(Constants.messageTopicRemoveJob, this, (RemoveJobMessage job) async {
await MyApp.isarInstance.writeTxn(() async {
await MyApp.isarInstance.jobs.where().filter().idEqualTo(job.id).deleteAll();
});
@@ -308,17 +378,33 @@ class _MainState extends State<Main> with SingleTickerProviderStateMixin {
await MessageService().publish<JobDeletedMessage>(Constants.messageTopicJobDeleted, arguments: JobDeletedMessage(id: job.id));
await MessageService().publish<RefreshBadgesMessage>(Constants.messageTopicUpdateBadges, arguments: RefreshBadgesMessage());
});
});*/
MessageService().subscribe<JobReceivedMessage>(Constants.messageTopicJobReceived, this, (JobReceivedMessage jobReceivedMessage) async {
subscribe(
queueId: Constants.messageTopicJobReceived,
callback: (message) async {
var jobReceived = message.payload as JobReceivedMessage;
if (jobReceived.job.state == 0) {
await _jobMap!.put(jobReceived.job.id, jobReceived.job);
}
},
);
/*MessageService().subscribe<JobReceivedMessage>(Constants.messageTopicJobReceived, this, (JobReceivedMessage jobReceivedMessage) async {
if (jobReceivedMessage.job.state == 0) {
await _jobMap!.put(jobReceivedMessage.job.id, jobReceivedMessage.job);
}
});
});*/
MessageService().subscribe<JobDeletedMessage>(Constants.messageTopicJobDeleted, this, (JobDeletedMessage jobDeletedMessage) async {
subscribe(
queueId: Constants.messageTopicJobDeleted,
callback: (message) async {
var jobDeleted = message.payload as JobDeletedMessage;
await _jobMap!.remove(jobDeleted.id);
},
);
/*MessageService().subscribe<JobDeletedMessage>(Constants.messageTopicJobDeleted, this, (JobDeletedMessage jobDeletedMessage) async {
await _jobMap!.remove(jobDeletedMessage.id);
});
});*/
}
void _replaceContentView(ContentViewWidget widget) async {
@@ -3,11 +3,11 @@ import 'package:json_annotation/json_annotation.dart';
import 'package:stadtbote/main.dart';
import 'package:stadtbote/tools/util.dart';
part 'message.g.dart';
part 'chat_message.g.dart';
@collection
@JsonSerializable()
class Message {
class ChatMessage {
late Id id;
late String time;
@@ -20,14 +20,14 @@ class Message {
late bool? read = false;
Message();
ChatMessage();
factory Message.fromJson(Map<String, dynamic> json) => _$MessageFromJson(json);
factory ChatMessage.fromJson(Map<String, dynamic> json) => _$ChatMessageFromJson(json);
Map<String, dynamic> toJson() => _$MessageToJson(this);
Map<String, dynamic> toJson() => _$ChatMessageToJson(this);
static Future<Message> mergeFromJson(Map<String, dynamic> json) async {
var availableMessage = await MyApp.isarInstance.messages.filter().idEqualTo(json["id"]).findFirst();
static Future<ChatMessage> mergeFromJson(Map<String, dynamic> json) async {
var availableMessage = await MyApp.isarInstance.chatMessages.filter().idEqualTo(json["id"]).findFirst();
if (availableMessage != null) {
availableMessage.id = json["id"];
@@ -38,7 +38,7 @@ class Message {
return availableMessage;
} else {
var message = Message.fromJson(json);
var message = ChatMessage.fromJson(json);
message.read = false;
return message;
@@ -1,6 +1,6 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'message.dart';
part of 'chat_message.dart';
// **************************************************************************
// IsarCollectionGenerator
@@ -9,13 +9,13 @@ part of 'message.dart';
// coverage:ignore-file
// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types
extension GetMessageCollection on Isar {
IsarCollection<Message> get messages => this.collection();
extension GetChatMessageCollection on Isar {
IsarCollection<ChatMessage> get chatMessages => this.collection();
}
const MessageSchema = CollectionSchema(
name: r'Message',
id: 2463283977299753079,
const ChatMessageSchema = CollectionSchema(
name: r'ChatMessage',
id: 35366979330584919,
properties: {
r'from': PropertySchema(
id: 0,
@@ -43,22 +43,22 @@ const MessageSchema = CollectionSchema(
type: IsarType.string,
)
},
estimateSize: _messageEstimateSize,
serialize: _messageSerialize,
deserialize: _messageDeserialize,
deserializeProp: _messageDeserializeProp,
estimateSize: _chatMessageEstimateSize,
serialize: _chatMessageSerialize,
deserialize: _chatMessageDeserialize,
deserializeProp: _chatMessageDeserializeProp,
idName: r'id',
indexes: {},
links: {},
embeddedSchemas: {},
getId: _messageGetId,
getLinks: _messageGetLinks,
attach: _messageAttach,
getId: _chatMessageGetId,
getLinks: _chatMessageGetLinks,
attach: _chatMessageAttach,
version: '3.1.0+1',
);
int _messageEstimateSize(
Message object,
int _chatMessageEstimateSize(
ChatMessage object,
List<int> offsets,
Map<Type, List<int>> allOffsets,
) {
@@ -70,8 +70,8 @@ int _messageEstimateSize(
return bytesCount;
}
void _messageSerialize(
Message object,
void _chatMessageSerialize(
ChatMessage object,
IsarWriter writer,
List<int> offsets,
Map<Type, List<int>> allOffsets,
@@ -83,13 +83,13 @@ void _messageSerialize(
writer.writeString(offsets[4], object.time);
}
Message _messageDeserialize(
ChatMessage _chatMessageDeserialize(
Id id,
IsarReader reader,
List<int> offsets,
Map<Type, List<int>> allOffsets,
) {
final object = Message();
final object = ChatMessage();
object.from = reader.readString(offsets[0]);
object.id = id;
object.read = reader.readBoolOrNull(offsets[1]);
@@ -99,7 +99,7 @@ Message _messageDeserialize(
return object;
}
P _messageDeserializeProp<P>(
P _chatMessageDeserializeProp<P>(
IsarReader reader,
int propertyId,
int offset,
@@ -121,28 +121,31 @@ P _messageDeserializeProp<P>(
}
}
Id _messageGetId(Message object) {
Id _chatMessageGetId(ChatMessage object) {
return object.id;
}
List<IsarLinkBase<dynamic>> _messageGetLinks(Message object) {
List<IsarLinkBase<dynamic>> _chatMessageGetLinks(ChatMessage object) {
return [];
}
void _messageAttach(IsarCollection<dynamic> col, Id id, Message object) {
void _chatMessageAttach(
IsarCollection<dynamic> col, Id id, ChatMessage object) {
object.id = id;
}
extension MessageQueryWhereSort on QueryBuilder<Message, Message, QWhere> {
QueryBuilder<Message, Message, QAfterWhere> anyId() {
extension ChatMessageQueryWhereSort
on QueryBuilder<ChatMessage, ChatMessage, QWhere> {
QueryBuilder<ChatMessage, ChatMessage, QAfterWhere> anyId() {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(const IdWhereClause.any());
});
}
}
extension MessageQueryWhere on QueryBuilder<Message, Message, QWhereClause> {
QueryBuilder<Message, Message, QAfterWhereClause> idEqualTo(Id id) {
extension ChatMessageQueryWhere
on QueryBuilder<ChatMessage, ChatMessage, QWhereClause> {
QueryBuilder<ChatMessage, ChatMessage, QAfterWhereClause> idEqualTo(Id id) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IdWhereClause.between(
lower: id,
@@ -151,7 +154,8 @@ extension MessageQueryWhere on QueryBuilder<Message, Message, QWhereClause> {
});
}
QueryBuilder<Message, Message, QAfterWhereClause> idNotEqualTo(Id id) {
QueryBuilder<ChatMessage, ChatMessage, QAfterWhereClause> idNotEqualTo(
Id id) {
return QueryBuilder.apply(this, (query) {
if (query.whereSort == Sort.asc) {
return query
@@ -173,7 +177,7 @@ extension MessageQueryWhere on QueryBuilder<Message, Message, QWhereClause> {
});
}
QueryBuilder<Message, Message, QAfterWhereClause> idGreaterThan(Id id,
QueryBuilder<ChatMessage, ChatMessage, QAfterWhereClause> idGreaterThan(Id id,
{bool include = false}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(
@@ -182,7 +186,7 @@ extension MessageQueryWhere on QueryBuilder<Message, Message, QWhereClause> {
});
}
QueryBuilder<Message, Message, QAfterWhereClause> idLessThan(Id id,
QueryBuilder<ChatMessage, ChatMessage, QAfterWhereClause> idLessThan(Id id,
{bool include = false}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(
@@ -191,7 +195,7 @@ extension MessageQueryWhere on QueryBuilder<Message, Message, QWhereClause> {
});
}
QueryBuilder<Message, Message, QAfterWhereClause> idBetween(
QueryBuilder<ChatMessage, ChatMessage, QAfterWhereClause> idBetween(
Id lowerId,
Id upperId, {
bool includeLower = true,
@@ -208,9 +212,9 @@ extension MessageQueryWhere on QueryBuilder<Message, Message, QWhereClause> {
}
}
extension MessageQueryFilter
on QueryBuilder<Message, Message, QFilterCondition> {
QueryBuilder<Message, Message, QAfterFilterCondition> fromEqualTo(
extension ChatMessageQueryFilter
on QueryBuilder<ChatMessage, ChatMessage, QFilterCondition> {
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> fromEqualTo(
String value, {
bool caseSensitive = true,
}) {
@@ -223,7 +227,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> fromGreaterThan(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> fromGreaterThan(
String value, {
bool include = false,
bool caseSensitive = true,
@@ -238,7 +242,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> fromLessThan(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> fromLessThan(
String value, {
bool include = false,
bool caseSensitive = true,
@@ -253,7 +257,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> fromBetween(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> fromBetween(
String lower,
String upper, {
bool includeLower = true,
@@ -272,7 +276,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> fromStartsWith(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> fromStartsWith(
String value, {
bool caseSensitive = true,
}) {
@@ -285,7 +289,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> fromEndsWith(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> fromEndsWith(
String value, {
bool caseSensitive = true,
}) {
@@ -298,7 +302,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> fromContains(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> fromContains(
String value,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@@ -310,7 +314,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> fromMatches(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> fromMatches(
String pattern,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@@ -322,7 +326,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> fromIsEmpty() {
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> fromIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'from',
@@ -331,7 +335,8 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> fromIsNotEmpty() {
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition>
fromIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'from',
@@ -340,7 +345,8 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> idEqualTo(Id value) {
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> idEqualTo(
Id value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'id',
@@ -349,7 +355,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> idGreaterThan(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> idGreaterThan(
Id value, {
bool include = false,
}) {
@@ -362,7 +368,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> idLessThan(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> idLessThan(
Id value, {
bool include = false,
}) {
@@ -375,7 +381,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> idBetween(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> idBetween(
Id lower,
Id upper, {
bool includeLower = true,
@@ -392,7 +398,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> readIsNull() {
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> readIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'read',
@@ -400,7 +406,8 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> readIsNotNull() {
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition>
readIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'read',
@@ -408,7 +415,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> readEqualTo(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> readEqualTo(
bool? value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
@@ -418,7 +425,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> subjEqualTo(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> subjEqualTo(
String value, {
bool caseSensitive = true,
}) {
@@ -431,7 +438,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> subjGreaterThan(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> subjGreaterThan(
String value, {
bool include = false,
bool caseSensitive = true,
@@ -446,7 +453,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> subjLessThan(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> subjLessThan(
String value, {
bool include = false,
bool caseSensitive = true,
@@ -461,7 +468,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> subjBetween(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> subjBetween(
String lower,
String upper, {
bool includeLower = true,
@@ -480,7 +487,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> subjStartsWith(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> subjStartsWith(
String value, {
bool caseSensitive = true,
}) {
@@ -493,7 +500,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> subjEndsWith(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> subjEndsWith(
String value, {
bool caseSensitive = true,
}) {
@@ -506,7 +513,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> subjContains(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> subjContains(
String value,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@@ -518,7 +525,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> subjMatches(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> subjMatches(
String pattern,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@@ -530,7 +537,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> subjIsEmpty() {
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> subjIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'subj',
@@ -539,7 +546,8 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> subjIsNotEmpty() {
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition>
subjIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'subj',
@@ -548,7 +556,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> textEqualTo(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> textEqualTo(
String value, {
bool caseSensitive = true,
}) {
@@ -561,7 +569,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> textGreaterThan(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> textGreaterThan(
String value, {
bool include = false,
bool caseSensitive = true,
@@ -576,7 +584,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> textLessThan(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> textLessThan(
String value, {
bool include = false,
bool caseSensitive = true,
@@ -591,7 +599,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> textBetween(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> textBetween(
String lower,
String upper, {
bool includeLower = true,
@@ -610,7 +618,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> textStartsWith(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> textStartsWith(
String value, {
bool caseSensitive = true,
}) {
@@ -623,7 +631,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> textEndsWith(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> textEndsWith(
String value, {
bool caseSensitive = true,
}) {
@@ -636,7 +644,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> textContains(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> textContains(
String value,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@@ -648,7 +656,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> textMatches(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> textMatches(
String pattern,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@@ -660,7 +668,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> textIsEmpty() {
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> textIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'text',
@@ -669,7 +677,8 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> textIsNotEmpty() {
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition>
textIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'text',
@@ -678,7 +687,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> timeEqualTo(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> timeEqualTo(
String value, {
bool caseSensitive = true,
}) {
@@ -691,7 +700,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> timeGreaterThan(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> timeGreaterThan(
String value, {
bool include = false,
bool caseSensitive = true,
@@ -706,7 +715,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> timeLessThan(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> timeLessThan(
String value, {
bool include = false,
bool caseSensitive = true,
@@ -721,7 +730,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> timeBetween(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> timeBetween(
String lower,
String upper, {
bool includeLower = true,
@@ -740,7 +749,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> timeStartsWith(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> timeStartsWith(
String value, {
bool caseSensitive = true,
}) {
@@ -753,7 +762,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> timeEndsWith(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> timeEndsWith(
String value, {
bool caseSensitive = true,
}) {
@@ -766,7 +775,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> timeContains(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> timeContains(
String value,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@@ -778,7 +787,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> timeMatches(
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> timeMatches(
String pattern,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@@ -790,7 +799,7 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> timeIsEmpty() {
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition> timeIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'time',
@@ -799,7 +808,8 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> timeIsNotEmpty() {
QueryBuilder<ChatMessage, ChatMessage, QAfterFilterCondition>
timeIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'time',
@@ -809,179 +819,180 @@ extension MessageQueryFilter
}
}
extension MessageQueryObject
on QueryBuilder<Message, Message, QFilterCondition> {}
extension ChatMessageQueryObject
on QueryBuilder<ChatMessage, ChatMessage, QFilterCondition> {}
extension MessageQueryLinks
on QueryBuilder<Message, Message, QFilterCondition> {}
extension ChatMessageQueryLinks
on QueryBuilder<ChatMessage, ChatMessage, QFilterCondition> {}
extension MessageQuerySortBy on QueryBuilder<Message, Message, QSortBy> {
QueryBuilder<Message, Message, QAfterSortBy> sortByFrom() {
extension ChatMessageQuerySortBy
on QueryBuilder<ChatMessage, ChatMessage, QSortBy> {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> sortByFrom() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'from', Sort.asc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> sortByFromDesc() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> sortByFromDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'from', Sort.desc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> sortByRead() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> sortByRead() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'read', Sort.asc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> sortByReadDesc() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> sortByReadDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'read', Sort.desc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> sortBySubj() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> sortBySubj() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'subj', Sort.asc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> sortBySubjDesc() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> sortBySubjDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'subj', Sort.desc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> sortByText() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> sortByText() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'text', Sort.asc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> sortByTextDesc() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> sortByTextDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'text', Sort.desc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> sortByTime() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> sortByTime() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'time', Sort.asc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> sortByTimeDesc() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> sortByTimeDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'time', Sort.desc);
});
}
}
extension MessageQuerySortThenBy
on QueryBuilder<Message, Message, QSortThenBy> {
QueryBuilder<Message, Message, QAfterSortBy> thenByFrom() {
extension ChatMessageQuerySortThenBy
on QueryBuilder<ChatMessage, ChatMessage, QSortThenBy> {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> thenByFrom() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'from', Sort.asc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> thenByFromDesc() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> thenByFromDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'from', Sort.desc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> thenById() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> thenById() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'id', Sort.asc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> thenByIdDesc() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> thenByIdDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'id', Sort.desc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> thenByRead() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> thenByRead() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'read', Sort.asc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> thenByReadDesc() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> thenByReadDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'read', Sort.desc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> thenBySubj() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> thenBySubj() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'subj', Sort.asc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> thenBySubjDesc() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> thenBySubjDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'subj', Sort.desc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> thenByText() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> thenByText() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'text', Sort.asc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> thenByTextDesc() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> thenByTextDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'text', Sort.desc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> thenByTime() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> thenByTime() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'time', Sort.asc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> thenByTimeDesc() {
QueryBuilder<ChatMessage, ChatMessage, QAfterSortBy> thenByTimeDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'time', Sort.desc);
});
}
}
extension MessageQueryWhereDistinct
on QueryBuilder<Message, Message, QDistinct> {
QueryBuilder<Message, Message, QDistinct> distinctByFrom(
extension ChatMessageQueryWhereDistinct
on QueryBuilder<ChatMessage, ChatMessage, QDistinct> {
QueryBuilder<ChatMessage, ChatMessage, QDistinct> distinctByFrom(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'from', caseSensitive: caseSensitive);
});
}
QueryBuilder<Message, Message, QDistinct> distinctByRead() {
QueryBuilder<ChatMessage, ChatMessage, QDistinct> distinctByRead() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'read');
});
}
QueryBuilder<Message, Message, QDistinct> distinctBySubj(
QueryBuilder<ChatMessage, ChatMessage, QDistinct> distinctBySubj(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'subj', caseSensitive: caseSensitive);
});
}
QueryBuilder<Message, Message, QDistinct> distinctByText(
QueryBuilder<ChatMessage, ChatMessage, QDistinct> distinctByText(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'text', caseSensitive: caseSensitive);
});
}
QueryBuilder<Message, Message, QDistinct> distinctByTime(
QueryBuilder<ChatMessage, ChatMessage, QDistinct> distinctByTime(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'time', caseSensitive: caseSensitive);
@@ -989,39 +1000,39 @@ extension MessageQueryWhereDistinct
}
}
extension MessageQueryProperty
on QueryBuilder<Message, Message, QQueryProperty> {
QueryBuilder<Message, int, QQueryOperations> idProperty() {
extension ChatMessageQueryProperty
on QueryBuilder<ChatMessage, ChatMessage, QQueryProperty> {
QueryBuilder<ChatMessage, int, QQueryOperations> idProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'id');
});
}
QueryBuilder<Message, String, QQueryOperations> fromProperty() {
QueryBuilder<ChatMessage, String, QQueryOperations> fromProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'from');
});
}
QueryBuilder<Message, bool?, QQueryOperations> readProperty() {
QueryBuilder<ChatMessage, bool?, QQueryOperations> readProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'read');
});
}
QueryBuilder<Message, String, QQueryOperations> subjProperty() {
QueryBuilder<ChatMessage, String, QQueryOperations> subjProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'subj');
});
}
QueryBuilder<Message, String, QQueryOperations> textProperty() {
QueryBuilder<ChatMessage, String, QQueryOperations> textProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'text');
});
}
QueryBuilder<Message, String, QQueryOperations> timeProperty() {
QueryBuilder<ChatMessage, String, QQueryOperations> timeProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'time');
});
@@ -1032,15 +1043,16 @@ extension MessageQueryProperty
// JsonSerializableGenerator
// **************************************************************************
Message _$MessageFromJson(Map<String, dynamic> json) => Message()
..id = json['id'] as int
ChatMessage _$ChatMessageFromJson(Map<String, dynamic> json) => ChatMessage()
..id = (json['id'] as num).toInt()
..time = json['time'] as String
..from = json['from'] as String
..subj = json['subj'] as String
..text = json['text'] as String
..read = json['read'] as bool?;
Map<String, dynamic> _$MessageToJson(Message instance) => <String, dynamic>{
Map<String, dynamic> _$ChatMessageToJson(ChatMessage instance) =>
<String, dynamic>{
'id': instance.id,
'time': instance.time,
'from': instance.from,
+2 -1
View File
@@ -1,3 +1,4 @@
import 'package:dart_mq/dart_mq.dart';
import 'package:isar/isar.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:stadtbote/model/job_tour.dart';
@@ -8,7 +9,7 @@ part 'job.g.dart';
@collection
@JsonSerializable()
class Job {
class Job with ProducerMixin {
late Id id;
@JsonKey(name: 'ver')
late String ver;
+5 -5
View File
@@ -1546,16 +1546,16 @@ extension JobQueryProperty on QueryBuilder<Job, Job, QQueryProperty> {
// **************************************************************************
Job _$JobFromJson(Map<String, dynamic> json) => Job()
..id = json['id'] as int
..id = (json['id'] as num).toInt()
..ver = json['ver'] as String
..state = json['state'] as int
..state = (json['state'] as num).toInt()
..crFilter = json['cr_filter'] as String?
..ordertime = json['ordertime'] as String
..offsWarn = json['offs_warn'] as int
..offsWarn = (json['offs_warn'] as num).toInt()
..global = json['global'] as bool
..vhtId = json['vht_id'] as int
..vhtId = (json['vht_id'] as num).toInt()
..rem = json['rem'] as String
..delayOrderTime = json['delayOrderTime'] as int
..delayOrderTime = (json['delayOrderTime'] as num).toInt()
..tours = (json['tours'] as List<dynamic>)
.map((e) => JobTour.fromJson(e as Map<String, dynamic>))
.toList();
+3 -3
View File
@@ -1615,9 +1615,9 @@ extension JobTourQueryObject
// **************************************************************************
JobTour _$JobTourFromJson(Map<String, dynamic> json) => JobTour()
..id = json['id'] as int
..sort = json['sort'] as int
..state = json['state'] as int
..id = (json['id'] as num).toInt()
..sort = (json['sort'] as num).toInt()
..state = (json['state'] as num).toInt()
..mode = json['mode'] as String
..comp = json['comp'] as String
..person = json['person'] as String
+1 -1
View File
@@ -835,7 +835,7 @@ extension LocationStatusQueryProperty
LocationStatus _$LocationStatusFromJson(Map<String, dynamic> json) =>
LocationStatus()
..id = json['id'] as int?
..id = (json['id'] as num?)?.toInt()
..zip = json['zip'] as String
..area = json['area'] as String
..zipReal = json['zip_real'] as String;
+1 -1
View File
@@ -643,7 +643,7 @@ extension LogEntryQueryProperty
// **************************************************************************
LogEntry _$LogEntryFromJson(Map<String, dynamic> json) => LogEntry()
..id = json['id'] as int
..id = (json['id'] as num).toInt()
..time = DateTime.parse(json['time'] as String)
..severity = $enumDecode(_$LogEntrySeverityEnumEnumMap, json['severity'])
..text = json['text'] as String;
+5 -5
View File
@@ -1240,7 +1240,7 @@ extension VehicleQueryObject
// **************************************************************************
Ranking _$RankingFromJson(Map<String, dynamic> json) => Ranking()
..id = json['id'] as int?
..id = (json['id'] as num?)?.toInt()
..ranks = (json['ranking'] as List<dynamic>)
.map((e) => Rank.fromJson(e as Map<String, dynamic>))
.toList();
@@ -1251,7 +1251,7 @@ Map<String, dynamic> _$RankingToJson(Ranking instance) => <String, dynamic>{
};
Rank _$RankFromJson(Map<String, dynamic> json) => Rank()
..id = json['id'] as int
..id = (json['id'] as num).toInt()
..zip = json['zip'] as String
..area = json['area'] as String?
..vehicles = (json['vehicles'] as List<dynamic>)
@@ -1266,9 +1266,9 @@ Map<String, dynamic> _$RankToJson(Rank instance) => <String, dynamic>{
};
Vehicle _$VehicleFromJson(Map<String, dynamic> json) => Vehicle()
..id = json['id'] as int
..type = json['type'] as int
..cnt = json['cnt'] as int?
..id = (json['id'] as num).toInt()
..type = (json['type'] as num).toInt()
..cnt = (json['cnt'] as num?)?.toInt()
..self = json['self'] as bool? ?? false;
Map<String, dynamic> _$VehicleToJson(Vehicle instance) => <String, dynamic>{
+5 -5
View File
@@ -1507,12 +1507,12 @@ extension SessionStatusQueryProperty
SessionStatus _$SessionStatusFromJson(Map<String, dynamic> json) =>
SessionStatus()
..custId = json['cust_id'] as int
..hqId = json['hq_id'] as int
..usrId = json['usr_id'] as int
..crId = json['cr_id'] as int
..custId = (json['cust_id'] as num).toInt()
..hqId = (json['hq_id'] as num).toInt()
..usrId = (json['usr_id'] as num).toInt()
..crId = (json['cr_id'] as num).toInt()
..sid = json['sid'] as String
..vhtId = json['vht_id'] as int
..vhtId = (json['vht_id'] as num).toInt()
..locZip = json['loc_zip'] as String
..serverVersion = json['server_version'] as String
..serverInstance = json['server_instance'] as String;
+1 -1
View File
@@ -789,7 +789,7 @@ extension StatusPosQueryObject
// **************************************************************************
Status _$StatusFromJson(Map<String, dynamic> json) => Status()
..id = json['id'] as int?
..id = (json['id'] as num?)?.toInt()
..pos = StatusPos.fromJson(json['pos'] as Map<String, dynamic>);
Map<String, dynamic> _$StatusToJson(Status instance) => <String, dynamic>{
+8 -8
View File
@@ -1456,19 +1456,19 @@ extension TourEntryQueryObject
// **************************************************************************
TourTask _$TourTaskFromJson(Map<String, dynamic> json) => TourTask()
..sId = json['s_id'] as int
..type = json['type'] as int
..sId = (json['s_id'] as num).toInt()
..type = (json['type'] as num).toInt()
..topic = json['topic'] as String
..opt = json['opt'] as bool? ?? false
..reenter = json['reenter'] as bool? ?? false
..min = json['min'] as int?
..max = json['max'] as int?
..maxLen = json['max_len'] as int?
..min = (json['min'] as num?)?.toInt()
..max = (json['max'] as num?)?.toInt()
..maxLen = (json['max_len'] as num?)?.toInt()
..rt = json['rt'] as bool?
..track = json['track'] as bool?
..txt = json['txt'] as String?
..taskArrival = json['task_arrival'] as int?
..taskFinWork = json['task_fin_work'] as int?
..taskArrival = (json['task_arrival'] as num?)?.toInt()
..taskFinWork = (json['task_fin_work'] as num?)?.toInt()
..entries = (json['entries'] as List<dynamic>?)
?.map((e) => TourEntry.fromJson(e as Map<String, dynamic>))
.toList();
@@ -1491,7 +1491,7 @@ Map<String, dynamic> _$TourTaskToJson(TourTask instance) => <String, dynamic>{
};
TourEntry _$TourEntryFromJson(Map<String, dynamic> json) => TourEntry()
..code = json['code'] as int
..code = (json['code'] as num).toInt()
..text = json['text'] as String
..queryRemark = json['query_remark'] as bool;
+23 -19
View File
@@ -1,5 +1,4 @@
import 'dart:async';
import 'dart:math';
import 'package:expandable/expandable.dart';
import 'package:flutter/material.dart';
@@ -21,12 +20,10 @@ import '../tools/messages/publish_payload_message.dart';
late bool _initTimer;
late Timer _checkForNewJobsTimer;
late Map<int, DateTime> _firstDelayTimeMap;
late Map<int, bool> _infoExpandedMap;
Future<void> showAcceptJobsPopup(SharedMapReference mapReference, Function() onFinished) async {
_initTimer = true;
_firstDelayTimeMap = {};
_infoExpandedMap = {};
await showDialog<void>(
@@ -97,7 +94,6 @@ void _stopTimer() {
_checkForNewJobsTimer.cancel();
}
Future<List<Widget>> _fetchJobWidgets(StateSetter dialogState, Function() onFinished, SharedMapReference mapReference) async {
List<Widget> widgets = [];
@@ -107,15 +103,6 @@ Future<List<Widget>> _fetchJobWidgets(StateSetter dialogState, Function() onFini
for (var jobEntry in entries) {
var job = jobEntry.value;
int enableDelay = job.delayOrderTime;
if (!_firstDelayTimeMap.containsKey(job.id)) {
_firstDelayTimeMap[job.id] = DateTime.now();
} else {
DateTime firstDisplayTime = _firstDelayTimeMap[job.id]!;
int diffInSeconds = DateTime.now().difference(firstDisplayTime).inSeconds;
enableDelay = min(0, diffInSeconds);
}
ExpandableController controller = ExpandableController();
controller.expanded = _infoExpandedMap[job.id] != null ? _infoExpandedMap[job.id]! : false;
@@ -165,7 +152,7 @@ Future<List<Widget>> _fetchJobWidgets(StateSetter dialogState, Function() onFini
child: Text(
DateFormat('dd.MM.yyyy HH:mm').format(DateTime.parse(job.ordertime).toLocal()).toString(),
textAlign: TextAlign.left,
style: TextStyle(backgroundColor: isJobInFuture(job) ? Colors.yellow : Colors.transparent),
style: TextStyle(backgroundColor: isJobInFuture(job) ? Colors.red : Colors.transparent),
),
),
SizedBox(width: double.infinity, child: Text('Auftragsnummer: ${job.id}', textAlign: TextAlign.left)),
@@ -231,7 +218,10 @@ Future<List<Widget>> _fetchJobWidgets(StateSetter dialogState, Function() onFini
jobMap.remove(job.id);
MessageService().publish<RemoveJobMessage>(Constants.messageTopicRemoveJob, arguments: RemoveJobMessage(id: job.id));
job.sendMessage(
routingKey: Constants.messageTopicRemoveJob,
payload: RemoveJobMessage(id: job.id),
);
setState(() {});
@@ -245,7 +235,7 @@ Future<List<Widget>> _fetchJobWidgets(StateSetter dialogState, Function() onFini
),
const SizedBox(width: 20),
Expanded(
child: getDefaultButton('Annehmen', enabledTimerActive: enableDelay > 0, enabledTimerDelay: enableDelay, () {
child: getDefaultButton('Annehmen', enabledTimerActive: false, () {
dialogState(() {
if (jobMap.length() == 1) {
_stopTimer();
@@ -255,7 +245,10 @@ Future<List<Widget>> _fetchJobWidgets(StateSetter dialogState, Function() onFini
jobMap.remove(job.id);
MessageService().publish<RemoveJobMessage>(Constants.messageTopicRemoveJob, arguments: RemoveJobMessage(id: job.id));
job.sendMessage(
routingKey: Constants.messageTopicRemoveJob,
payload: RemoveJobMessage(id: job.id),
);
setState(() {});
@@ -295,8 +288,19 @@ _sendAnswer(SharedMapReference mapReference, Job job, int item) async {
message.track.pos!.long = currentPosition != null ? currentPosition.longitude : 0.0;
message.track.pos!.acc = currentPosition != null ? currentPosition.accuracy.toInt() : 0;
await MessageService().publish<PublishPayloadMessage>(Constants.messageTopicPublishPayload, arguments: PublishPayloadMessage(topic: "reaction", message: message.toJson(), qos: MqttQos.exactlyOnce));
// TODO MESSAGING
job.sendMessage(
routingKey: Constants.messageTopicPublishPayload,
payload: PublishPayloadMessage(topic: "reaction", message: message.toJson(), qos: MqttQos.exactlyOnce),
);
await MessageService().publish(Constants.messageTopicUpdateBadges, arguments: RefreshBadgesMessage());
//await MessageService().publish<PublishPayloadMessage>(Constants.messageTopicPublishPayload, arguments: PublishPayloadMessage(topic: "reaction", message: message.toJson(), qos: MqttQos.exactlyOnce));
// TODO MESSAGING
job.sendMessage(
routingKey: Constants.messageTopicUpdateBadges,
payload: RefreshBadgesMessage(),
);
//await MessageService().publish(Constants.messageTopicUpdateBadges, arguments: RefreshBadgesMessage());
}
+5 -5
View File
@@ -14,12 +14,12 @@ void showInfosPopup(SessionStatus? status) async {
late String connectedString = "Bitte warten...";
Future.delayed(const Duration(seconds: 2), () async {
await MessageService().publish<RequestConnectionStatusMessage>(Constants.messageTopicRequestConnectionStatus, arguments: RequestConnectionStatusMessage());
//await MessageService().publish<RequestConnectionStatusMessage>(Constants.messageTopicRequestConnectionStatus, arguments: RequestConnectionStatusMessage());
});
void unsubscribeMessages() {
MessageService().unsubscribe(Constants.messageTopicCurrentConnectionStatus, version);
MessageService().unsubscribe(Constants.messageTopicConnectionStatusChanged, version);
//MessageService().unsubscribe(Constants.messageTopicCurrentConnectionStatus, version);
//MessageService().unsubscribe(Constants.messageTopicConnectionStatusChanged, version);
}
await showDialog(
@@ -69,7 +69,7 @@ void showInfosPopup(SessionStatus? status) async {
text += "Keine Informationen gefunden";
}
MessageService().subscribe<CurrentConnectionStatusMessage>(Constants.messageTopicCurrentConnectionStatus, version,
/*MessageService().subscribe<CurrentConnectionStatusMessage>(Constants.messageTopicCurrentConnectionStatus, version,
(CurrentConnectionStatusMessage currentConnectionStatusMessage) async {
connectedString = currentConnectionStatusMessage.state ? "Verbunden" : "NICHT verbunden";
@@ -81,7 +81,7 @@ void showInfosPopup(SessionStatus? status) async {
connectedString = connectionStatus.status == ConnectionStatusEnum.connected ? "Verbunden" : "NICHT verbunden";
if (context.mounted) setState(() {});
});
});*/
return SizedBox(
key: GlobalKey(),
@@ -7,9 +7,9 @@ part of 'accept_job_message.dart';
// **************************************************************************
Reaction _$ReactionFromJson(Map<String, dynamic> json) => Reaction()
..id = json['id'] as int
..id = (json['id'] as num).toInt()
..ver = json['ver'] as String
..item = json['item'] as int
..item = (json['item'] as num).toInt()
..track = Track.fromJson(json['track'] as Map<String, dynamic>);
Map<String, dynamic> _$ReactionToJson(Reaction instance) => <String, dynamic>{
@@ -19,10 +19,10 @@ Map<String, dynamic> _$AcknowledgeJobToJson(AcknowledgeJob instance) =>
AcknowledgeJobReceived _$AcknowledgeJobReceivedFromJson(
Map<String, dynamic> json) =>
AcknowledgeJobReceived()
..id = json['id'] as int
..state = json['state'] as int
..id = (json['id'] as num).toInt()
..state = (json['state'] as num).toInt()
..ver = json['ver'] as String
..utc = json['utc'] as int;
..utc = (json['utc'] as num).toInt();
Map<String, dynamic> _$AcknowledgeJobReceivedToJson(
AcknowledgeJobReceived instance) =>
@@ -9,7 +9,7 @@ part of 'bootstrap_request.dart';
BootstrapRequest _$BootstrapRequestFromJson(Map<String, dynamic> json) =>
BootstrapRequest()
..app = json['app'] as String
..ver = json['ver'] as int
..ver = (json['ver'] as num).toInt()
..mqttClientId = json['mqttClientId'] as String
..deviceObject =
DeviceObject.fromJson(json['device'] as Map<String, dynamic>);
@@ -12,7 +12,7 @@ BootstrapResponse _$BootstrapResponseFromJson(Map<String, dynamic> json) =>
..id = json['id'] as String
..toServer = json['to_server'] as String
..fromServer = json['from_server'] as String
..status = json['status'] as int
..status = (json['status'] as num).toInt()
..message = json['message'] as String;
Map<String, dynamic> _$BootstrapResponseToJson(BootstrapResponse instance) =>
@@ -283,7 +283,7 @@ Map<String, dynamic> _$FinTaskMessageToJson(FinTaskMessage instance) =>
};
FinTask _$FinTaskFromJson(Map<String, dynamic> json) => FinTask()
..trId = json['tr_id'] as int
..trId = (json['tr_id'] as num).toInt()
..task = Task.fromJson(json['task'] as Map<String, dynamic>);
Map<String, dynamic> _$FinTaskToJson(FinTask instance) => <String, dynamic>{
@@ -292,7 +292,7 @@ Map<String, dynamic> _$FinTaskToJson(FinTask instance) => <String, dynamic>{
};
Task _$TaskFromJson(Map<String, dynamic> json) => Task()
..sId = json['s_id'] as int
..sId = (json['s_id'] as num).toInt()
..time = json['time'] as String
..pos = json['pos'] == null
? null
@@ -307,7 +307,7 @@ Map<String, dynamic> _$TaskToJson(Task instance) => <String, dynamic>{
FinTaskPos _$FinTaskPosFromJson(Map<String, dynamic> json) => FinTaskPos()
..lat = (json['lat'] as num).toDouble()
..long = (json['long'] as num).toDouble()
..acc = json['acc'] as int;
..acc = (json['acc'] as num).toInt();
Map<String, dynamic> _$FinTaskPosToJson(FinTaskPos instance) =>
<String, dynamic>{
@@ -16,7 +16,7 @@ Map<String, dynamic> _$FinTourMessageToJson(FinTourMessage instance) =>
};
FinTour _$FinTourFromJson(Map<String, dynamic> json) => FinTour()
..trId = json['tr_id'] as int
..trId = (json['tr_id'] as num).toInt()
..com = json['com'] as String
..track = json['track'] == null
? null
@@ -33,10 +33,10 @@ Map<String, dynamic> _$FinTourToJson(FinTour instance) => <String, dynamic>{
};
FinTourTask _$FinTourTaskFromJson(Map<String, dynamic> json) => FinTourTask()
..sId = json['s_id'] as int
..sId = (json['s_id'] as num).toInt()
..time = json['time'] as String
..val = json['val'] as String?
..code = json['code'] as int?
..code = (json['code'] as num?)?.toInt()
..sign = json['sign'] as String?
..codes = (json['codes'] as List<dynamic>?)?.map((e) => e as String).toList()
..pos = json['pos'] == null
@@ -7,7 +7,7 @@ part of 'job_del_message.dart';
// **************************************************************************
JobDelMessage _$JobDelMessageFromJson(Map<String, dynamic> json) =>
JobDelMessage()..id = json['id'] as int;
JobDelMessage()..id = (json['id'] as num).toInt();
Map<String, dynamic> _$JobDelMessageToJson(JobDelMessage instance) =>
<String, dynamic>{
+1 -1
View File
@@ -23,7 +23,7 @@ LogoutMessagePosition _$LogoutMessagePositionFromJson(
..time = json['time'] as String
..lat = (json['lat'] as num).toDouble()
..long = (json['long'] as num).toDouble()
..acc = json['acc'] as int;
..acc = (json['acc'] as num).toInt();
Map<String, dynamic> _$LogoutMessagePositionToJson(
LogoutMessagePosition instance) =>
+3 -3
View File
@@ -7,9 +7,9 @@ part of 'pic_message.dart';
// **************************************************************************
PicData _$PicDataFromJson(Map<String, dynamic> json) => PicData()
..trId = json['tr_id'] as int
..num = json['num'] as int
..time = json['time'] as int
..trId = (json['tr_id'] as num).toInt()
..num = (json['num'] as num).toInt()
..time = (json['time'] as num).toInt()
..data = json['data'] as String;
Map<String, dynamic> _$PicDataToJson(PicData instance) => <String, dynamic>{
@@ -8,7 +8,7 @@ part of 'sync_jobs_message.dart';
SyncJobsMessage _$SyncJobsMessageFromJson(Map<String, dynamic> json) =>
SyncJobsMessage()
..utcUnixTime = json['utc_unix_time'] as int
..utcUnixTime = (json['utc_unix_time'] as num).toInt()
..sync =
SyncJobMessageSync.fromJson(json['sync'] as Map<String, dynamic>);
@@ -31,9 +31,9 @@ Map<String, dynamic> _$SyncJobMessageSyncToJson(SyncJobMessageSync instance) =>
SyncJobMessageJob _$SyncJobMessageJobFromJson(Map<String, dynamic> json) =>
SyncJobMessageJob()
..id = json['id'] as int
..id = (json['id'] as num).toInt()
..ver = json['ver'] as String
..state = json['state'] as int;
..state = (json['state'] as num).toInt();
Map<String, dynamic> _$SyncJobMessageJobToJson(SyncJobMessageJob instance) =>
<String, dynamic>{
+1 -1
View File
@@ -11,7 +11,7 @@ TrackPosition _$TrackPositionFromJson(Map<String, dynamic> json) =>
..time = json['time'] as String
..lat = (json['lat'] as num).toDouble()
..long = (json['long'] as num).toDouble()
..acc = json['acc'] as int;
..acc = (json['acc'] as num).toInt();
Map<String, dynamic> _$TrackPositionToJson(TrackPosition instance) =>
<String, dynamic>{
@@ -8,7 +8,7 @@ part of 'track_station_message.dart';
TrackStationMessage _$TrackStationMessageFromJson(Map<String, dynamic> json) =>
TrackStationMessage()
..sid = json['s_id'] as int
..sid = (json['s_id'] as num).toInt()
..time = json['time'] as String
..pos = json['pos'] == null
? null
+1 -1
View File
@@ -803,7 +803,7 @@ Map<String, dynamic> _$ZipTrackToJson(ZipTrack instance) => <String, dynamic>{
ZipTrackPos _$ZipTrackPosFromJson(Map<String, dynamic> json) => ZipTrackPos()
..lat = (json['lat'] as num).toDouble()
..long = (json['long'] as num).toDouble()
..acc = json['acc'] as int;
..acc = (json['acc'] as num).toInt();
Map<String, dynamic> _$ZipTrackPosToJson(ZipTrackPos instance) =>
<String, dynamic>{
+3 -3
View File
@@ -1,8 +1,8 @@
import 'dart:async';
typedef EventHandler<T> = void Function(T args);
//typedef EventHandler<T> = void Function(T args);
class _MapEntry {
/*class _MapEntry {
late dynamic owner;
late dynamic handler;
@@ -75,4 +75,4 @@ class MessageService {
await completer.future;
}
}
}*/
+2 -2
View File
@@ -1,7 +1,7 @@
import 'package:stadtbote/model/message.dart';
import 'package:stadtbote/model/chat_message.dart';
class MessageReceivedMessage {
final Message message;
final ChatMessage message;
MessageReceivedMessage({required this.message});
}
+145 -32
View File
@@ -3,6 +3,7 @@ import 'dart:convert';
import 'dart:math';
import 'package:archive/archive.dart';
import 'package:dart_mq/dart_mq.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:http/http.dart' as http;
import 'package:isar/isar.dart';
@@ -11,7 +12,7 @@ import 'package:mqtt5_client/mqtt5_server_client.dart';
import 'package:stadtbote/model/enqueued_message.dart';
import 'package:stadtbote/model/job.dart';
import 'package:stadtbote/model/log_entry.dart';
import 'package:stadtbote/model/message.dart';
import 'package:stadtbote/model/chat_message.dart';
import 'package:stadtbote/model/location_status.dart';
import 'package:stadtbote/model/rank.dart';
import 'package:stadtbote/model/status.dart';
@@ -52,7 +53,7 @@ import 'util.dart';
enum ConnectionStateEnum { notConnected, connected }
class MqttCore {
class MqttCore with ProducerMixin, ConsumerMixin {
late ConnectionStateEnum connectionState = ConnectionStateEnum.notConnected;
late bool _disconnectInProgress = false;
@@ -80,7 +81,13 @@ class MqttCore {
}
_disconnectMqttClient() async {
await MessageService().publish<ConnectionStatus>(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.notConnected));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicConnectionStatusChanged,
payload: ConnectionStatus(status: ConnectionStatusEnum.notConnected),
);
//await MessageService().publish<ConnectionStatus>(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.notConnected));
_disconnectInProgress = true;
@@ -131,12 +138,24 @@ class MqttCore {
} else {
Util.logInfo('Verbindung zum MQTT-Broker fehlgeschlagen!');
await MessageService().publish<ConnectionStatus>(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.notConnected));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicConnectionStatusChanged,
payload: ConnectionStatus(status: ConnectionStatusEnum.notConnected),
);
//await MessageService().publish<ConnectionStatus>(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.notConnected));
}
} catch (ex) {
Util.logInfo('Verbindung zum MQTT-Broker fehlgeschlagen!: $ex');
await MessageService().publish<ConnectionStatus>(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.notConnected));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicConnectionStatusChanged,
payload: ConnectionStatus(status: ConnectionStatusEnum.notConnected),
);
//await MessageService().publish<ConnectionStatus>(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.notConnected));
}
}
@@ -250,7 +269,13 @@ class MqttCore {
Util.logInfo('subscribed to topic: $fromServerTopic');
await MessageService().publish<ConnectionStatus>(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.connected));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicConnectionStatusChanged,
payload: ConnectionStatus(status: ConnectionStatusEnum.connected),
);
//await MessageService().publish<ConnectionStatus>(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.connected));
}
void _sessionMessageReceived(payloadData) async {
@@ -267,7 +292,13 @@ class MqttCore {
await MyApp.isarInstance.sessionStatus.put(sessionStatusMessage);
});
await MessageService().publish<SessionStatusInfoUpdate>(Constants.messageTopicSessionStatusInfoUpdate, arguments: SessionStatusInfoUpdate(status: sessionStatusMessage));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicSessionStatusInfoUpdate,
payload: SessionStatusInfoUpdate(status: sessionStatusMessage),
);
//await MessageService().publish<SessionStatusInfoUpdate>(Constants.messageTopicSessionStatusInfoUpdate, arguments: SessionStatusInfoUpdate(status: sessionStatusMessage));
_startTrackTimer();
}
@@ -280,7 +311,13 @@ class MqttCore {
await MyApp.isarInstance.status.put(statusMessage);
});
await MessageService().publish<StatusInfoUpdate>(Constants.messageTopicStatusInfoUpdated, arguments: StatusInfoUpdate(status: statusMessage));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicStatusInfoUpdated,
payload: StatusInfoUpdate(status: statusMessage),
);
//await MessageService().publish<StatusInfoUpdate>(Constants.messageTopicStatusInfoUpdated, arguments: StatusInfoUpdate(status: statusMessage));
}
void _locationStatusMessageReceived(payloadData) async {
@@ -291,7 +328,13 @@ class MqttCore {
await MyApp.isarInstance.locationStatus.put(locationStatus);
});
await MessageService().publish<LocationStatusUpdate>(Constants.messageTopicLocationStatusUpdated, arguments: LocationStatusUpdate(status: locationStatus));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicLocationStatusUpdated,
payload: LocationStatusUpdate(status: locationStatus),
);
// await MessageService().publish<LocationStatusUpdate>(Constants.messageTopicLocationStatusUpdated, arguments: LocationStatusUpdate(status: locationStatus));
}
void _rankingMessageReceived(payloadData) async {
@@ -302,7 +345,13 @@ class MqttCore {
await MyApp.isarInstance.rankings.put(ranking);
});
await MessageService().publish<RankingUpdated>(Constants.messageTopicRankingUpdated, arguments: RankingUpdated());
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicRankingUpdated,
payload: RankingUpdated(),
);
//await MessageService().publish<RankingUpdated>(Constants.messageTopicRankingUpdated, arguments: RankingUpdated());
}
void _jobMessageReceived(payloadData) async {
@@ -322,11 +371,13 @@ class MqttCore {
_acknowlegdeJob(newJob);
try {
await MessageService().publish<JobReceivedMessage>(Constants.messageTopicJobReceived, arguments: JobReceivedMessage(job: newJob));
} catch (ex) {
Util.logException("publish messageTopicJobReceived failed!");
}
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicJobReceived,
payload: JobReceivedMessage(job: newJob),
);
// await MessageService().publish<JobReceivedMessage>(Constants.messageTopicJobReceived, arguments: JobReceivedMessage(job: newJob));
}
void _jobDeleteReceived(payloadData) async {
@@ -336,7 +387,13 @@ class MqttCore {
await MyApp.isarInstance.jobs.where().filter().idEqualTo(jobDelMessage.id).deleteAll();
});
await MessageService().publish<JobDeletedMessage>(Constants.messageTopicJobDeleted, arguments: JobDeletedMessage(id: jobDelMessage.id));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicJobDeleted,
payload: JobDeletedMessage(id: jobDelMessage.id),
);
//await MessageService().publish<JobDeletedMessage>(Constants.messageTopicJobDeleted, arguments: JobDeletedMessage(id: jobDelMessage.id));
}
void _syncRequestReceived(payloadData) async {
@@ -346,15 +403,21 @@ class MqttCore {
}
void _messageMessageReceived(Map<String, dynamic> payloadData) async {
var newMessage = await Message.mergeFromJson(payloadData);
var newMessage = await ChatMessage.mergeFromJson(payloadData);
await MyApp.isarInstance.writeTxn(() async {
await MyApp.isarInstance.messages.put(newMessage);
await MyApp.isarInstance.chatMessages.put(newMessage);
});
await Util.playMp3('asbeep.mp3');
await MessageService().publish<MessageReceivedMessage>(Constants.messageTopicMessageReceived, arguments: MessageReceivedMessage(message: newMessage));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicMessageReceived,
payload: MessageReceivedMessage(message: newMessage),
);
//await MessageService().publish<MessageReceivedMessage>(Constants.messageTopicMessageReceived, arguments: MessageReceivedMessage(message: newMessage));
}
void _messageUploadDeviceLogReceived(payloadData) async {
@@ -403,7 +466,13 @@ class MqttCore {
_cancelTrackTimer();
await MessageService().publish<ConnectionStatus>(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.notConnected));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicConnectionStatusChanged,
payload: ConnectionStatus(status: ConnectionStatusEnum.notConnected),
);
//await MessageService().publish<ConnectionStatus>(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.notConnected));
}
Future<void> _clientConnected() async {
@@ -413,7 +482,13 @@ class MqttCore {
_initSession();
await MessageService().publish<ConnectionStatus>(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.connected));
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicConnectionStatusChanged,
payload: ConnectionStatus(status: ConnectionStatusEnum.connected),
);
//await MessageService().publish<ConnectionStatus>(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.connected));
}
void _processBootstrap() async {
@@ -458,8 +533,6 @@ class MqttCore {
var brokerUriAndPortArray = bootstrapResponsePayload.broker.replaceFirst("mqtt://", "").split(":");
_brokerUri = brokerUriAndPortArray[0];
_brokerPort = int.parse(brokerUriAndPortArray[1]);
//_brokerUri = "192.168.180.27";
//_brokerPort = 1883;
_clientId = bootstrapResponsePayload.id;
_fromServerTopic = bootstrapResponsePayload.fromServer;
_toServerTopic = bootstrapResponsePayload.toServer;
@@ -559,20 +632,60 @@ class MqttCore {
}
void initMessages() {
MessageService().subscribe<PublishPayloadMessage>(Constants.messageTopicPublishPayload, this, (PublishPayloadMessage payloadMessage) {
_publishText(payloadMessage.topic, jsonEncode(payloadMessage.message), payloadMessage.qos);
});
subscribe(
queueId: Constants.messageTopicPublishPayload,
callback: (message) {
var publisPayloadMessage = message.payload as PublishPayloadMessage;
MessageService().subscribe<DisconnectClientMessage>(Constants.messageTopicDisconnectClient, this,
_publishText(publisPayloadMessage.topic, jsonEncode(publisPayloadMessage.message), publisPayloadMessage.qos);
},
);
/*MessageService().subscribe<PublishPayloadMessage>(Constants.messageTopicPublishPayload, this, (PublishPayloadMessage payloadMessage) {
_publishText(payloadMessage.topic, jsonEncode(payloadMessage.message), payloadMessage.qos);
});*/
subscribe(
queueId: Constants.messageTopicDisconnectClient,
callback: (message) {
_disconnectMqttClient();
},
);
/*MessageService().subscribe<DisconnectClientMessage>(Constants.messageTopicDisconnectClient, this,
(DisconnectClientMessage disconnectClientMessage) {
_disconnectMqttClient();
});
});*/
MessageService().subscribe<ConnectClientMessage>(Constants.messageTopicConnectClient, this, (ConnectClientMessage connectClientMessage) {
subscribe(
queueId: Constants.messageTopicConnectClient,
callback: (message) {
_connectToBroker();
},
);
/*MessageService().subscribe<ConnectClientMessage>(Constants.messageTopicConnectClient, this, (ConnectClientMessage connectClientMessage) {
_connectToBroker();
});
});*/
MessageService().subscribe<RequestConnectionStatusMessage>(Constants.messageTopicRequestConnectionStatus, this,
subscribe(
queueId: Constants.messageTopicRequestConnectionStatus,
callback: (message) {
bool connected = false;
if (_mqttClient != null && _mqttClient!.connectionStatus != null) {
if (_mqttClient!.connectionStatus!.state == MqttConnectionState.connected) {
connected = true;
}
}
// TODO MESSAGING
sendMessage(
routingKey: Constants.messageTopicCurrentConnectionStatus,
payload: CurrentConnectionStatusMessage(state: connected),
);
//await MessageService().publish<CurrentConnectionStatusMessage>(Constants.messageTopicCurrentConnectionStatus, arguments: CurrentConnectionStatusMessage(state: connected));
},
);
/*MessageService().subscribe<RequestConnectionStatusMessage>(Constants.messageTopicRequestConnectionStatus, this,
(RequestConnectionStatusMessage requestConnectionStatusMessage) async {
bool connected = false;
if (_mqttClient != null && _mqttClient!.connectionStatus != null) {
@@ -582,6 +695,6 @@ class MqttCore {
}
await MessageService().publish<CurrentConnectionStatusMessage>(Constants.messageTopicCurrentConnectionStatus, arguments: CurrentConnectionStatusMessage(state: connected));
});
});*/
}
}