Erweiterungen
This commit is contained in:
1 parent
47f31b7a5a
commit
c69a5644a1
5 files changed
+128
-18
No files matched your search
@@ -1,5 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:isar/isar.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/accepted_jobs_page.dart';
|
||||||
import 'package:stadtbote/content_views/approach_area_page.dart';
|
import 'package:stadtbote/content_views/approach_area_page.dart';
|
||||||
import 'package:stadtbote/content_views/assigned_jobs_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/content_view_widget.dart';
|
||||||
import 'package:stadtbote/content_views/utils/header_info.dart';
|
import 'package:stadtbote/content_views/utils/header_info.dart';
|
||||||
import 'package:stadtbote/model/job.dart';
|
import 'package:stadtbote/model/job.dart';
|
||||||
|
import 'package:stadtbote/model/message.dart';
|
||||||
import 'package:stadtbote/model/status.dart';
|
import 'package:stadtbote/model/status.dart';
|
||||||
import 'package:stadtbote/popups/accept_jobs_popup.dart';
|
import 'package:stadtbote/popups/accept_jobs_popup.dart';
|
||||||
import 'package:stadtbote/popups/infos_popup.dart';
|
import 'package:stadtbote/popups/infos_popup.dart';
|
||||||
import 'package:stadtbote/tools/message_service.dart';
|
import 'package:stadtbote/tools/message_service.dart';
|
||||||
import 'package:stadtbote/tools/messages/job_received_message.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:stadtbote/tools/messages/session_info_update.dart';
|
||||||
import 'package:badges/badges.dart' as badges;
|
import 'package:badges/badges.dart' as badges;
|
||||||
|
|
||||||
@@ -243,6 +246,10 @@ class _MainPageState extends State<MainPage> {
|
|||||||
MessageService().subscribe<JobReceivedMessage>(Constants.messageTopicJobReceived, this, (JobReceivedMessage jobReceivedMessage) {
|
MessageService().subscribe<JobReceivedMessage>(Constants.messageTopicJobReceived, this, (JobReceivedMessage jobReceivedMessage) {
|
||||||
_jobReceived(jobReceivedMessage.job);
|
_jobReceived(jobReceivedMessage.job);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
MessageService().subscribe<MessageReceivedMessage>(Constants.messageTopicMessageReceived, this, (MessageReceivedMessage mesage) {
|
||||||
|
_refreshBadges();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void _exitMessages() {
|
void _exitMessages() {
|
||||||
@@ -254,6 +261,7 @@ class _MainPageState extends State<MainPage> {
|
|||||||
void _refreshBadges() async {
|
void _refreshBadges() async {
|
||||||
_assignedJobsValueNotifier.value = await MyApp.isarInstance.jobs.filter().stateEqualTo(0).count();
|
_assignedJobsValueNotifier.value = await MyApp.isarInstance.jobs.filter().stateEqualTo(0).count();
|
||||||
_acceptedJobsValueNotifier.value = await MyApp.isarInstance.jobs.filter().stateEqualTo(1).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) {
|
void _jobReceived(Job job) {
|
||||||
|
|||||||
@@ -90,11 +90,15 @@ class _MessagesPageState extends State<MessagesPage> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _handleSendPressed(types.PartialText text) async {
|
void _handleSendPressed(types.PartialText text) async {
|
||||||
|
var now = DateTime.now();
|
||||||
|
|
||||||
var message = sbmessage.Message();
|
var message = sbmessage.Message();
|
||||||
message.text = [text.text];
|
message.text = [text.text];
|
||||||
message.from = _sid;
|
message.from = _sid;
|
||||||
message.subj = '';
|
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();
|
message.id = await sbmessage.Message.getNextId();
|
||||||
|
|
||||||
MyApp.isarInstance.writeTxnSync(() {
|
MyApp.isarInstance.writeTxnSync(() {
|
||||||
@@ -105,7 +109,7 @@ class _MessagesPageState extends State<MessagesPage> {
|
|||||||
|
|
||||||
_messages.insert(0, types.TextMessage(
|
_messages.insert(0, types.TextMessage(
|
||||||
author: _user,
|
author: _user,
|
||||||
createdAt: DateTime.now().millisecondsSinceEpoch,
|
createdAt: now.millisecondsSinceEpoch,
|
||||||
id: const Uuid().v4().toString(),
|
id: const Uuid().v4().toString(),
|
||||||
text: text.text,
|
text: text.text,
|
||||||
));
|
));
|
||||||
@@ -125,14 +129,17 @@ class _MessagesPageState extends State<MessagesPage> {
|
|||||||
|
|
||||||
_messages.insert(0, types.TextMessage(
|
_messages.insert(0, types.TextMessage(
|
||||||
author: message.from == _sid ? _user : _central,
|
author: message.from == _sid ? _user : _central,
|
||||||
createdAt: DateTime.now().millisecondsSinceEpoch,
|
createdAt: DateTime.parse(message.time).millisecondsSinceEpoch,
|
||||||
id: const Uuid().v4().toString(),
|
id: const Uuid().v4().toString(),
|
||||||
text: text,
|
text: text,
|
||||||
));
|
));
|
||||||
|
|
||||||
setState(() {});
|
message.read = true;
|
||||||
|
MyApp.isarInstance.writeTxnSync(() {
|
||||||
|
MyApp.isarInstance.messages.putSync(message);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Util.logInfo('');
|
setState(() {});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:isar/isar.dart';
|
import 'package:isar/isar.dart';
|
||||||
import 'package:json_annotation/json_annotation.dart';
|
import 'package:json_annotation/json_annotation.dart';
|
||||||
|
import 'package:stadtbote/main.dart';
|
||||||
import 'package:stadtbote/tools/util.dart';
|
import 'package:stadtbote/tools/util.dart';
|
||||||
|
|
||||||
part 'message.g.dart';
|
part 'message.g.dart';
|
||||||
@@ -17,12 +18,33 @@ class Message {
|
|||||||
|
|
||||||
late List<String> text;
|
late List<String> text;
|
||||||
|
|
||||||
|
late bool? read = false;
|
||||||
|
|
||||||
Message();
|
Message();
|
||||||
|
|
||||||
factory Message.fromJson(Map<String, dynamic> json) => _$MessageFromJson(json);
|
factory Message.fromJson(Map<String, dynamic> json) => _$MessageFromJson(json);
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => _$MessageToJson(this);
|
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 {
|
static Future<int> getNextId() async {
|
||||||
int currentExport500Id = await Util.preferencesGetInt('next_message_id', 0) as int;
|
int currentExport500Id = await Util.preferencesGetInt('next_message_id', 0) as int;
|
||||||
|
|
||||||
|
|||||||
+85
-12
@@ -22,18 +22,23 @@ const MessageSchema = CollectionSchema(
|
|||||||
name: r'from',
|
name: r'from',
|
||||||
type: IsarType.string,
|
type: IsarType.string,
|
||||||
),
|
),
|
||||||
r'subj': PropertySchema(
|
r'read': PropertySchema(
|
||||||
id: 1,
|
id: 1,
|
||||||
|
name: r'read',
|
||||||
|
type: IsarType.bool,
|
||||||
|
),
|
||||||
|
r'subj': PropertySchema(
|
||||||
|
id: 2,
|
||||||
name: r'subj',
|
name: r'subj',
|
||||||
type: IsarType.string,
|
type: IsarType.string,
|
||||||
),
|
),
|
||||||
r'text': PropertySchema(
|
r'text': PropertySchema(
|
||||||
id: 2,
|
id: 3,
|
||||||
name: r'text',
|
name: r'text',
|
||||||
type: IsarType.stringList,
|
type: IsarType.stringList,
|
||||||
),
|
),
|
||||||
r'time': PropertySchema(
|
r'time': PropertySchema(
|
||||||
id: 3,
|
id: 4,
|
||||||
name: r'time',
|
name: r'time',
|
||||||
type: IsarType.string,
|
type: IsarType.string,
|
||||||
)
|
)
|
||||||
@@ -78,9 +83,10 @@ void _messageSerialize(
|
|||||||
Map<Type, List<int>> allOffsets,
|
Map<Type, List<int>> allOffsets,
|
||||||
) {
|
) {
|
||||||
writer.writeString(offsets[0], object.from);
|
writer.writeString(offsets[0], object.from);
|
||||||
writer.writeString(offsets[1], object.subj);
|
writer.writeBool(offsets[1], object.read);
|
||||||
writer.writeStringList(offsets[2], object.text);
|
writer.writeString(offsets[2], object.subj);
|
||||||
writer.writeString(offsets[3], object.time);
|
writer.writeStringList(offsets[3], object.text);
|
||||||
|
writer.writeString(offsets[4], object.time);
|
||||||
}
|
}
|
||||||
|
|
||||||
Message _messageDeserialize(
|
Message _messageDeserialize(
|
||||||
@@ -92,9 +98,10 @@ Message _messageDeserialize(
|
|||||||
final object = Message();
|
final object = Message();
|
||||||
object.from = reader.readString(offsets[0]);
|
object.from = reader.readString(offsets[0]);
|
||||||
object.id = id;
|
object.id = id;
|
||||||
object.subj = reader.readString(offsets[1]);
|
object.read = reader.readBoolOrNull(offsets[1]);
|
||||||
object.text = reader.readStringList(offsets[2]) ?? [];
|
object.subj = reader.readString(offsets[2]);
|
||||||
object.time = reader.readString(offsets[3]);
|
object.text = reader.readStringList(offsets[3]) ?? [];
|
||||||
|
object.time = reader.readString(offsets[4]);
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,10 +115,12 @@ P _messageDeserializeProp<P>(
|
|||||||
case 0:
|
case 0:
|
||||||
return (reader.readString(offset)) as P;
|
return (reader.readString(offset)) as P;
|
||||||
case 1:
|
case 1:
|
||||||
return (reader.readString(offset)) as P;
|
return (reader.readBoolOrNull(offset)) as P;
|
||||||
case 2:
|
case 2:
|
||||||
return (reader.readStringList(offset) ?? []) as P;
|
return (reader.readString(offset)) as P;
|
||||||
case 3:
|
case 3:
|
||||||
|
return (reader.readStringList(offset) ?? []) as P;
|
||||||
|
case 4:
|
||||||
return (reader.readString(offset)) as P;
|
return (reader.readString(offset)) as P;
|
||||||
default:
|
default:
|
||||||
throw IsarError('Unknown property with id $propertyId');
|
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(
|
QueryBuilder<Message, Message, QAfterFilterCondition> subjEqualTo(
|
||||||
String value, {
|
String value, {
|
||||||
bool caseSensitive = true,
|
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() {
|
QueryBuilder<Message, Message, QAfterSortBy> sortBySubj() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addSortBy(r'subj', Sort.asc);
|
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() {
|
QueryBuilder<Message, Message, QAfterSortBy> thenBySubj() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addSortBy(r'subj', Sort.asc);
|
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(
|
QueryBuilder<Message, Message, QDistinct> distinctBySubj(
|
||||||
{bool caseSensitive = true}) {
|
{bool caseSensitive = true}) {
|
||||||
return QueryBuilder.apply(this, (query) {
|
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() {
|
QueryBuilder<Message, String, QQueryOperations> subjProperty() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addPropertyName(r'subj');
|
return query.addPropertyName(r'subj');
|
||||||
@@ -1032,7 +1103,8 @@ Message _$MessageFromJson(Map<String, dynamic> json) => Message()
|
|||||||
..time = json['time'] as String
|
..time = json['time'] as String
|
||||||
..from = json['from'] as String
|
..from = json['from'] as String
|
||||||
..subj = json['subj'] 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>{
|
Map<String, dynamic> _$MessageToJson(Message instance) => <String, dynamic>{
|
||||||
'id': instance.id,
|
'id': instance.id,
|
||||||
@@ -1040,4 +1112,5 @@ Map<String, dynamic> _$MessageToJson(Message instance) => <String, dynamic>{
|
|||||||
'from': instance.from,
|
'from': instance.from,
|
||||||
'subj': instance.subj,
|
'subj': instance.subj,
|
||||||
'text': instance.text,
|
'text': instance.text,
|
||||||
|
'read': instance.read,
|
||||||
};
|
};
|
||||||
@@ -271,7 +271,7 @@ class MqttCore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _messageMessageReceived(Map<String, dynamic> payloadData) async {
|
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.writeTxn(() async {
|
||||||
await MyApp.isarInstance.messages.put(newMessage);
|
await MyApp.isarInstance.messages.put(newMessage);
|
||||||
|
|||||||
Reference in new issue
Block a user