Erweiterungen

This commit is contained in:
Sven committed 2024-02-08 14:30:30 +01:00
1 parent 47f31b7a5a
commit c69a5644a1
5 files changed
+128 -18

No files matched your search

+8
View File
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:isar/isar.dart';
import 'package:mqtt_client/mqtt_client.dart';
import 'package:stadtbote/content_views/accepted_jobs_page.dart';
import 'package:stadtbote/content_views/approach_area_page.dart';
import 'package:stadtbote/content_views/assigned_jobs_page.dart';
@@ -8,11 +9,13 @@ import 'package:stadtbote/content_views/messages_page.dart';
import 'package:stadtbote/content_views/utils/content_view_widget.dart';
import 'package:stadtbote/content_views/utils/header_info.dart';
import 'package:stadtbote/model/job.dart';
import 'package:stadtbote/model/message.dart';
import 'package:stadtbote/model/status.dart';
import 'package:stadtbote/popups/accept_jobs_popup.dart';
import 'package:stadtbote/popups/infos_popup.dart';
import 'package:stadtbote/tools/message_service.dart';
import 'package:stadtbote/tools/messages/job_received_message.dart';
import 'package:stadtbote/tools/messages/message_message.dart';
import 'package:stadtbote/tools/messages/session_info_update.dart';
import 'package:badges/badges.dart' as badges;
@@ -243,6 +246,10 @@ class _MainPageState extends State<MainPage> {
MessageService().subscribe<JobReceivedMessage>(Constants.messageTopicJobReceived, this, (JobReceivedMessage jobReceivedMessage) {
_jobReceived(jobReceivedMessage.job);
});
MessageService().subscribe<MessageReceivedMessage>(Constants.messageTopicMessageReceived, this, (MessageReceivedMessage mesage) {
_refreshBadges();
});
}
void _exitMessages() {
@@ -254,6 +261,7 @@ class _MainPageState extends State<MainPage> {
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();
}
void _jobReceived(Job job) {
+12 -5
View File
@@ -90,11 +90,15 @@ class _MessagesPageState extends State<MessagesPage> {
}
void _handleSendPressed(types.PartialText text) async {
var now = DateTime.now();
var message = sbmessage.Message();
message.text = [text.text];
message.from = _sid;
message.subj = '';
message.time = DateFormat("yyyy.mm.dd HH:mm").format(DateTime.now());
message.time = now.toIso8601String();
message.read = true;
message.id = await sbmessage.Message.getNextId();
MyApp.isarInstance.writeTxnSync(() {
@@ -105,7 +109,7 @@ class _MessagesPageState extends State<MessagesPage> {
_messages.insert(0, types.TextMessage(
author: _user,
createdAt: DateTime.now().millisecondsSinceEpoch,
createdAt: now.millisecondsSinceEpoch,
id: const Uuid().v4().toString(),
text: text.text,
));
@@ -125,14 +129,17 @@ class _MessagesPageState extends State<MessagesPage> {
_messages.insert(0, types.TextMessage(
author: message.from == _sid ? _user : _central,
createdAt: DateTime.now().millisecondsSinceEpoch,
createdAt: DateTime.parse(message.time).millisecondsSinceEpoch,
id: const Uuid().v4().toString(),
text: text,
));
setState(() {});
message.read = true;
MyApp.isarInstance.writeTxnSync(() {
MyApp.isarInstance.messages.putSync(message);
});
}
Util.logInfo('');
setState(() {});
}
}
+22
View File
@@ -1,5 +1,6 @@
import 'package:isar/isar.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:stadtbote/main.dart';
import 'package:stadtbote/tools/util.dart';
part 'message.g.dart';
@@ -17,12 +18,33 @@ class Message {
late List<String> text;
late bool? read = false;
Message();
factory Message.fromJson(Map<String, dynamic> json) => _$MessageFromJson(json);
Map<String, dynamic> toJson() => _$MessageToJson(this);
static Future<Message> mergeFromJson(Map<String, dynamic> json) async {
var availableMessage = await MyApp.isarInstance.messages.filter().idEqualTo(json["id"]).findFirst();
if (availableMessage != null) {
availableMessage.id = json["id"];
availableMessage.time = json["time"];
availableMessage.from = json["from"];
availableMessage.subj = json["subj"];
availableMessage.text = (json['text'] as List<dynamic>).map((e) => e as String).toList();
return availableMessage;
} else {
var message = Message.fromJson(json);
message.read = false;
return message;
}
}
static Future<int> getNextId() async {
int currentExport500Id = await Util.preferencesGetInt('next_message_id', 0) as int;
+85 -12
View File
@@ -22,18 +22,23 @@ const MessageSchema = CollectionSchema(
name: r'from',
type: IsarType.string,
),
r'subj': PropertySchema(
r'read': PropertySchema(
id: 1,
name: r'read',
type: IsarType.bool,
),
r'subj': PropertySchema(
id: 2,
name: r'subj',
type: IsarType.string,
),
r'text': PropertySchema(
id: 2,
id: 3,
name: r'text',
type: IsarType.stringList,
),
r'time': PropertySchema(
id: 3,
id: 4,
name: r'time',
type: IsarType.string,
)
@@ -78,9 +83,10 @@ void _messageSerialize(
Map<Type, List<int>> allOffsets,
) {
writer.writeString(offsets[0], object.from);
writer.writeString(offsets[1], object.subj);
writer.writeStringList(offsets[2], object.text);
writer.writeString(offsets[3], object.time);
writer.writeBool(offsets[1], object.read);
writer.writeString(offsets[2], object.subj);
writer.writeStringList(offsets[3], object.text);
writer.writeString(offsets[4], object.time);
}
Message _messageDeserialize(
@@ -92,9 +98,10 @@ Message _messageDeserialize(
final object = Message();
object.from = reader.readString(offsets[0]);
object.id = id;
object.subj = reader.readString(offsets[1]);
object.text = reader.readStringList(offsets[2]) ?? [];
object.time = reader.readString(offsets[3]);
object.read = reader.readBoolOrNull(offsets[1]);
object.subj = reader.readString(offsets[2]);
object.text = reader.readStringList(offsets[3]) ?? [];
object.time = reader.readString(offsets[4]);
return object;
}
@@ -108,10 +115,12 @@ P _messageDeserializeProp<P>(
case 0:
return (reader.readString(offset)) as P;
case 1:
return (reader.readString(offset)) as P;
return (reader.readBoolOrNull(offset)) as P;
case 2:
return (reader.readStringList(offset) ?? []) as P;
return (reader.readString(offset)) as P;
case 3:
return (reader.readStringList(offset) ?? []) as P;
case 4:
return (reader.readString(offset)) as P;
default:
throw IsarError('Unknown property with id $propertyId');
@@ -389,6 +398,32 @@ extension MessageQueryFilter
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> readIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'read',
));
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> readIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'read',
));
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> readEqualTo(
bool? value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'read',
value: value,
));
});
}
QueryBuilder<Message, Message, QAfterFilterCondition> subjEqualTo(
String value, {
bool caseSensitive = true,
@@ -884,6 +919,18 @@ extension MessageQuerySortBy on QueryBuilder<Message, Message, QSortBy> {
});
}
QueryBuilder<Message, Message, QAfterSortBy> sortByRead() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'read', Sort.asc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> sortByReadDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'read', Sort.desc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> sortBySubj() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'subj', Sort.asc);
@@ -935,6 +982,18 @@ extension MessageQuerySortThenBy
});
}
QueryBuilder<Message, Message, QAfterSortBy> thenByRead() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'read', Sort.asc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> thenByReadDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'read', Sort.desc);
});
}
QueryBuilder<Message, Message, QAfterSortBy> thenBySubj() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'subj', Sort.asc);
@@ -969,6 +1028,12 @@ extension MessageQueryWhereDistinct
});
}
QueryBuilder<Message, Message, QDistinct> distinctByRead() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'read');
});
}
QueryBuilder<Message, Message, QDistinct> distinctBySubj(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@@ -1004,6 +1069,12 @@ extension MessageQueryProperty
});
}
QueryBuilder<Message, bool?, QQueryOperations> readProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'read');
});
}
QueryBuilder<Message, String, QQueryOperations> subjProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'subj');
@@ -1032,7 +1103,8 @@ Message _$MessageFromJson(Map<String, dynamic> json) => Message()
..time = json['time'] as String
..from = json['from'] as String
..subj = json['subj'] as String
..text = (json['text'] as List<dynamic>).map((e) => e as String).toList();
..text = (json['text'] as List<dynamic>).map((e) => e as String).toList()
..read = json['read'] as bool?;
Map<String, dynamic> _$MessageToJson(Message instance) => <String, dynamic>{
'id': instance.id,
@@ -1040,4 +1112,5 @@ Map<String, dynamic> _$MessageToJson(Message instance) => <String, dynamic>{
'from': instance.from,
'subj': instance.subj,
'text': instance.text,
'read': instance.read,
};
+1 -1
View File
@@ -271,7 +271,7 @@ class MqttCore {
}
void _messageMessageReceived(Map<String, dynamic> payloadData) async {
var newMessage = Message.fromJson(payloadData);
var newMessage = await Message.mergeFromJson(payloadData);
await MyApp.isarInstance.writeTxn(() async {
await MyApp.isarInstance.messages.put(newMessage);