Erweiterungen
This commit is contained in:
1 parent
41d086e13e
commit
7015d83fd1
20 files changed
+182
-158
No files matched your search
@@ -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());
|
||||
}
|
||||
@@ -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', () {
|
||||
|
||||
Reference in new issue
Block a user