diff --git a/lib/content_views/main_page.dart b/lib/content_views/main_page.dart index 27494f8..a2b7302 100644 --- a/lib/content_views/main_page.dart +++ b/lib/content_views/main_page.dart @@ -22,13 +22,13 @@ import '../tools/util.dart'; class MainPage extends ContentViewWidget { final ValueNotifier _zipValueNotifier = ValueNotifier("----"); - final ValueNotifier _sidValueNotifier = ValueNotifier("----"); + final ValueNotifier sidValueNotifier = ValueNotifier("----"); MainPage({super.key}) { Status? status = MyApp.isarInstance.status.where().findFirstSync(); if (status != null) { _zipValueNotifier.value = status.locZip; - _sidValueNotifier.value = status.sid; + sidValueNotifier.value = status.sid; } } @@ -56,7 +56,7 @@ class MainPage extends ContentViewWidget { ), const SizedBox(height: 5), ValueListenableBuilder( - valueListenable: _sidValueNotifier, + valueListenable: sidValueNotifier, builder: (context, value, child) { return Text( value, @@ -244,7 +244,7 @@ class _MainPageState extends State { _initMessages() { BroadcastReceiver().subscribe(Constants.messageTopicStatusInfoUpdate, (statusInfoUpdateMessage) { - widget._sidValueNotifier.value = statusInfoUpdateMessage.status.sid; + widget.sidValueNotifier.value = statusInfoUpdateMessage.status.sid; }); BroadcastReceiver().subscribe(Constants.messageTopicJobReceived, (JobReceivedMessage jobReceivedMessage) { diff --git a/lib/content_views/messages_page.dart b/lib/content_views/messages_page.dart index d1db616..552e72a 100644 --- a/lib/content_views/messages_page.dart +++ b/lib/content_views/messages_page.dart @@ -1,10 +1,15 @@ - 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; +import 'package:intl/intl.dart'; +import 'package:isar/isar.dart'; import 'package:stadtbote/content_views/utils/content_view_widget.dart'; import 'package:stadtbote/content_views/utils/header_info.dart'; +import 'package:stadtbote/main.dart'; +import 'package:stadtbote/model/message.dart' as sbmessage; +import 'package:stadtbote/model/status.dart'; import 'package:stadtbote/popups/infos_popup.dart'; +import 'package:uuid/uuid.dart'; import '../tools/util.dart'; @@ -17,25 +22,12 @@ class MessagesPage extends ContentViewWidget { @override Future getHeaderInfo(BuildContext context) async { return HeaderInfo( - titleWidget: Container( - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 3), - child: const Column(children: [ - Text( - 'Zeile 1', - style: TextStyle( - color: Colors.white, - fontSize: 18.0, - ), - ), - SizedBox(height: 5), - Text( - 'Zeile 2', - style: TextStyle( - color: Colors.white, - fontSize: 18.0, - ), - ), - ]), + titleWidget: const Text( + 'Nachrichten', + style: TextStyle( + color: Colors.white, + fontSize: 24.0, + ), ), rightButtonEnabled: true, rightButtonVisible: true, @@ -47,27 +39,97 @@ class MessagesPage extends ContentViewWidget { } class _MessagesPageState extends State { + bool _initCompleted = false; + + late String _sid; + late final List _messages = []; final _user = const types.User( id: '82091008-a484-4a89-ae75-a22bf8d6f3ac', ); + final _central = const types.User( + id: '82091008-a484-4a89-ae75-a22bf8d6f3ad', + ); + + @override + void initState() { + super.initState(); + + Future.delayed(const Duration(seconds: 0), () async { + var status = await MyApp.isarInstance.status.where().findFirst(); + _sid = status != null ? status.sid : 'Unbekannt'; + + await _fetchMessages(); + + _initCompleted = true; + + setState(() {}); + }); + } + @override Widget build(BuildContext context) { + if (!_initCompleted) { + return Util.getWaitWidget(context); + } + return Stack( children: [ Chat( messages: _messages, onSendPressed: _handleSendPressed, - showUserAvatars: true, - showUserNames: true, + showUserAvatars: false, + showUserNames: false, user: _user, ), ], ); } - void _handleSendPressed(types.PartialText p1) { + void _handleSendPressed(types.PartialText text) async { + 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.id = 0; + + await MyApp.isarInstance.writeTxn(() async { + await MyApp.isarInstance.messages.put(message); + }); + + _messages.insert(0, types.TextMessage( + author: _user, + createdAt: DateTime.now().millisecondsSinceEpoch, + id: const Uuid().v4().toString(), + text: text.text, + )); + + setState(() {}); + } + + Future _fetchMessages() async { + _messages.clear(); + + var messages = await MyApp.isarInstance.messages.where().findAll(); + for (var message in messages) { + var text = ''; + for (var textLine in message.text) { + text += '$textLine\n'; + } + + _messages.add(types.TextMessage( + author: message.from == _sid ? _user : _central, + createdAt: DateTime.now().millisecondsSinceEpoch, + id: Uuid().v4().toString(), + text: text, + )); + + setState(() {}); + } + + Util.logInfo(''); } } diff --git a/lib/main.dart b/lib/main.dart index 4f00a74..2abddaf 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_broadcast_receiver/flutter_broadcast_receiver.dart'; import 'package:isar/isar.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:stadtbote/model/message.dart'; import 'package:stadtbote/model/task_info.dart'; import 'package:stadtbote/tools/colored_safe_area.dart'; import 'package:stadtbote/model/status.dart'; @@ -24,7 +25,8 @@ Future main() async { MyApp.isarInstance = await Isar.open([ StatusSchema, JobSchema, - TaskInfoSchema + TaskInfoSchema, + MessageSchema, ], directory: dir.path); runZonedGuarded(() { diff --git a/lib/tools/mqtt_core.dart b/lib/tools/mqtt_core.dart index 404699f..e6f8f51 100644 --- a/lib/tools/mqtt_core.dart +++ b/lib/tools/mqtt_core.dart @@ -184,7 +184,7 @@ class MqttCore { await MyApp.isarInstance.messages.put(newMessage); }); - BroadcastReceiver().publish(Constants.messageTopicJobReceived, arguments: MessageReceivedMessage(message: newMessage)); + BroadcastReceiver().publish(Constants.messageTopicMessageReceived, arguments: MessageReceivedMessage(message: newMessage)); } void _startReconnectTimer() {