Erweiterungen

This commit is contained in:
Sven committed 2024-07-29 10:46:55 +02:00
1 parent 41d086e13e
commit 7015d83fd1
20 files changed
+182 -158

No files matched your search

+51 -54
View File
@@ -1,31 +1,34 @@
import 'dart:async';
import 'dart:math';
import 'package:expandable/expandable.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:mqtt_client/mqtt_client.dart';
import 'package:shared_map/shared_map.dart';
import 'package:stadtbote/main.dart';
import 'package:stadtbote/protocoll_messages/accept_job_message.dart';
import 'package:stadtbote/model/job.dart';
import 'package:stadtbote/protocoll_messages/fin_task_message.dart';
import 'package:stadtbote/tools/constants.dart';
import 'package:stadtbote/tools/message_service.dart';
import 'package:stadtbote/tools/messages/job_deleted_message.dart';
import 'package:stadtbote/tools/messages/job_received_message.dart';
import 'package:stadtbote/tools/messages/refresh_badges_message.dart';
import 'package:stadtbote/tools/util.dart';
import 'package:badges/badges.dart' as badges;
import '../tools/messages/publish_payload_message.dart';
Future<void> showAcceptJobsPopup(BuildContext context, List<Job> jobs, Function() onFinished) async {
Timer? _checkForNewJobsTimer;
Map<int, DateTime> _firstDelayTimeMap = {};
Future<void> showAcceptJobsPopup(BuildContext context, SharedMapReference mapReference, Function() onFinished) async {
await showDialog<void>(
context: context,
builder: (BuildContext context) {
return WillPopScope(
onWillPop: () async {
MessageService().unsubscribe(Constants.messageTopicJobDeleted, jobs);
MessageService().unsubscribe(Constants.messageTopicJobReceived, jobs);
_stopTimer();
Navigator.of(context).pop();
@@ -38,34 +41,7 @@ Future<void> showAcceptJobsPopup(BuildContext context, List<Job> jobs, Function(
shadowColor: Colors.transparent,
backgroundColor: Colors.white,
content: StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
if (jobs.isEmpty) {
Navigator.of(context).pop();
onFinished();
}
MessageService().unsubscribe(Constants.messageTopicJobDeleted, jobs);
MessageService().unsubscribe(Constants.messageTopicJobReceived, jobs);
MessageService().subscribe<JobDeletedMessage>(Constants.messageTopicJobDeleted, jobs, (jobDeletedMessage) async {
jobs.removeWhere((value) => value.id == jobDeletedMessage.id);
if (context.mounted) {
setState(() {});
}
});
MessageService().subscribe<JobReceivedMessage>(Constants.messageTopicJobReceived, jobs, (jobMessage) async {
jobs.removeWhere((value) => value.id == jobMessage.job.id);
if (jobMessage.job.state == 0) {
jobs.add(jobMessage.job);
if (context.mounted) {
setState(() {});
}
}
});
_startTimer(mapReference, setState);
return SizedBox(
key: GlobalKey(),
@@ -75,7 +51,7 @@ Future<void> showAcceptJobsPopup(BuildContext context, List<Job> jobs, Function(
height: 100,
padding: const EdgeInsets.all(5),
child: FutureBuilder<List<Widget>>(
future: fetchJobWidgets(jobs),
future: _fetchJobWidgets(mapReference),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Util.getWaitWidget(context);
@@ -91,19 +67,41 @@ Future<void> showAcceptJobsPopup(BuildContext context, List<Job> jobs, Function(
});
}
Future<List<Widget>> fetchJobWidgets(List<Job> jobs) async {
void _startTimer(SharedMapReference mapReference, StateSetter setState) {
_checkForNewJobsTimer ??= Timer.periodic(const Duration(seconds: 5), (Timer t) async {
var jobMap = SharedMap<int, Job>.fromSharedReference(mapReference);
if (await jobMap.length() > 0) {
setState(() { });
}
});
}
void _stopTimer() {
if (_checkForNewJobsTimer != null) {
_checkForNewJobsTimer!.cancel();
_checkForNewJobsTimer = null;
}
}
Future<List<Widget>> _fetchJobWidgets(SharedMapReference mapReference) async {
List<Widget> widgets = [];
for (var job in jobs) {
int enableDelay = 3; //job.delayOrderTime;
if (job.firstDisplayTime == null) {
await MyApp.isarInstance.writeTxn(() async {
job.firstDisplayTime = DateTime.now();
var jobMap = SharedMap<int, Job>.fromSharedReference(mapReference);
await MyApp.isarInstance.jobs.put(job);
});
var entries = await jobMap.entries();
for (var jobEntry in entries) {
var job = jobEntry.value;
int enableDelay = 3; //job.delayOrderTime;
if (!_firstDelayTimeMap.containsKey(job.id)) {
_firstDelayTimeMap[job.id] = DateTime.now();
} else {
enableDelay = max(0, DateTime.now().difference(job.firstDisplayTime!).inSeconds);
DateTime firstDisplayTime = _firstDelayTimeMap[job.id]!;
int diffInSeconds = DateTime.now().difference(firstDisplayTime).inSeconds;
enableDelay = min(0, diffInSeconds);
}
widgets.add(StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
@@ -200,21 +198,21 @@ Future<List<Widget>> fetchJobWidgets(List<Job> jobs) async {
Row(children: [
Expanded(
child: getDefaultButton(!job.global ? 'Ablehnen' : 'Ignorieren', () {
_sendAnswer(job, !job.global ? 2 : 3);
setState(() {
_sendAnswer(job, !job.global ? 2 : 3);
jobs.removeWhere((value) => value.id == job.id);
setState(() {});
//jobs.removeWhere((value) => value.id == job.id);
});
}),
),
const SizedBox(width: 20),
Expanded(
child: getDefaultButton('Annehmen', enabledTimerActive: enableDelay > 0, enabledTimerDelay: enableDelay, () {
_sendAnswer(job, 1);
setState(() {
_sendAnswer(job, 1);
jobs.removeWhere((value) => value.id == job.id);
setState(() {});
//jobs.removeWhere((value) => value.id == job.id);
});
}),
)
])
@@ -245,12 +243,11 @@ _sendAnswer(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;
MessageService().publish<PublishPayloadMessage>(Constants.messageTopicPublishPayload,
arguments: 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);
});
MessageService().publish(Constants.messageTopicUpdateBadges, arguments: RefreshBadgesMessage());
await MessageService().publish(Constants.messageTopicUpdateBadges, arguments: RefreshBadgesMessage());
}
+1 -2
View File
@@ -14,8 +14,7 @@ void showInfosPopup(BuildContext context, SessionStatus? status) async {
late String connectedString = "Bitte warten...";
Future.delayed(const Duration(seconds: 2), () async {
MessageService()
.publish<RequestConnectionStatusMessage>(Constants.messageTopicRequestConnectionStatus, arguments: RequestConnectionStatusMessage());
await MessageService().publish<RequestConnectionStatusMessage>(Constants.messageTopicRequestConnectionStatus, arguments: RequestConnectionStatusMessage());
});
void unsubscribeMessages() {
@@ -42,6 +42,7 @@ showReceiptGiverPopup(BuildContext context, TaskInfo taskInfo, Function(String)
textInputType: TextInputType.text,
formatter: [FilteringTextInputFormatter.singleLineFormatter],
controller: textEditingController,
maxLength: 50,
autofocus: true),
const SizedBox(height: 20),
getDefaultButton('Übernehmen', () {