diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml index ad74def..ea10ad6 100644 --- a/.idea/libraries/Dart_Packages.xml +++ b/.idea/libraries/Dart_Packages.xml @@ -138,7 +138,7 @@ - @@ -152,7 +152,7 @@ - @@ -257,7 +257,7 @@ - @@ -299,7 +299,7 @@ - @@ -327,7 +327,7 @@ - @@ -460,7 +460,7 @@ - @@ -509,7 +509,7 @@ - @@ -551,7 +551,7 @@ - @@ -607,7 +607,7 @@ - @@ -649,7 +649,7 @@ - @@ -705,7 +705,7 @@ - @@ -971,7 +971,7 @@ - @@ -985,7 +985,7 @@ - @@ -1055,7 +1055,7 @@ - @@ -1090,7 +1090,7 @@ - @@ -1125,7 +1125,7 @@ - @@ -1210,8 +1210,8 @@ - - + + @@ -1231,9 +1231,9 @@ - + - + @@ -1248,7 +1248,7 @@ - + @@ -1257,7 +1257,7 @@ - + @@ -1271,20 +1271,20 @@ - + - + - + @@ -1292,7 +1292,7 @@ - + @@ -1305,7 +1305,7 @@ - + @@ -1342,9 +1342,9 @@ - + - + @@ -1354,17 +1354,17 @@ - + - + - + diff --git a/.idea/libraries/Flutter_Plugins.xml b/.idea/libraries/Flutter_Plugins.xml index 8024f0a..74a32cf 100644 --- a/.idea/libraries/Flutter_Plugins.xml +++ b/.idea/libraries/Flutter_Plugins.xml @@ -23,14 +23,14 @@ - - - - - + + + + + diff --git a/lib/view/pages/files/files.dart b/lib/view/pages/files/files.dart index fbe445e..0573c14 100644 --- a/lib/view/pages/files/files.dart +++ b/lib/view/pages/files/files.dart @@ -151,6 +151,7 @@ class _FilesState extends State { ], ), floatingActionButton: FloatingActionButton( + heroTag: "uploadFile", backgroundColor: Theme.of(context).primaryColor, onPressed: () { showDialog(context: context, builder: (context) { diff --git a/lib/view/pages/talk/chatList.dart b/lib/view/pages/talk/chatList.dart index 4d26340..87c6160 100644 --- a/lib/view/pages/talk/chatList.dart +++ b/lib/view/pages/talk/chatList.dart @@ -1,20 +1,12 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:jiffy/jiffy.dart'; -import 'package:marianum_mobile/api/marianumcloud/talk/room/getRoom.dart'; -import 'package:marianum_mobile/api/marianumcloud/talk/room/getRoomParams.dart'; -import 'package:marianum_mobile/view/pages/talk/chatTile.dart'; -import 'package:marianum_mobile/view/pages/talk/searchChat.dart'; -import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart'; import 'package:provider/provider.dart'; -import 'package:shared_preferences/shared_preferences.dart'; import '../../../model/chatList/chatListProps.dart'; -import '../../../widget/confirmDialog.dart'; -import '../../../widget/unimplementedDialog.dart'; -import 'chatView.dart'; +import 'chatTile.dart'; import 'joinChat.dart'; +import 'searchChat.dart'; class ChatList extends StatefulWidget { const ChatList({Key? key}) : super(key: key); @@ -40,6 +32,7 @@ class _ChatListState extends State { @override Widget build(BuildContext context) { + ChatListProps? latestData; return Scaffold( appBar: AppBar( @@ -48,12 +41,14 @@ class _ChatListState extends State { IconButton( icon: const Icon(Icons.search), onPressed: () async { - showSearch(context: context, delegate: SearchChat((await GetRoom(GetRoomParams(includeStatus: true)).run()).data.toList())); + if(latestData == null) return; + showSearch(context: context, delegate: SearchChat(latestData!.getRoomsResponse.data.toList())); }, ) ], ), floatingActionButton: FloatingActionButton( + heroTag: "createChat", backgroundColor: Theme.of(context).primaryColor, onPressed: () { showSearch(context: context, delegate: JoinChat()); @@ -67,8 +62,9 @@ class _ChatListState extends State { return const Center(child: CircularProgressIndicator()); } - List chats = List.empty(growable: true); + latestData = data; + List chats = []; for (var chatRoom in data.getRoomsResponse.sortByLastActivity()) { chats.add(ChatTile(data: chatRoom, query: _query)); } diff --git a/lib/view/pages/talk/chatTile.dart b/lib/view/pages/talk/chatTile.dart index 02f4a49..ee63b9d 100644 --- a/lib/view/pages/talk/chatTile.dart +++ b/lib/view/pages/talk/chatTile.dart @@ -12,8 +12,40 @@ import '../../../api/marianumcloud/talk/setReadMarker/setReadMarkerParams.dart'; import '../../../widget/confirmDialog.dart'; import 'chatView.dart'; -class ChatTile { - ListTile getTile(GetRoomResponseObject data, void Function({bool renew}) query) async { +class ChatTile extends StatefulWidget { + final GetRoomResponseObject data; + final void Function({bool renew}) query; + final bool disableContextActions; + + const ChatTile({Key? key, required this.data, required this.query, this.disableContextActions = false}) : super(key: key); + + @override + State createState() => _ChatTileState(); +} + +class _ChatTileState extends State { + late String username; + + @override + void initState() { + super.initState(); + SharedPreferences.getInstance().then((value) => { + username = value.getString("username")! + }); + } + + void setCurrentAsRead() { + SetReadMarker( + widget.data.token, + true, + setReadMarkerParams: SetReadMarkerParams( + lastReadMessage: widget.data.lastMessage.id + ) + ).run().then((value) => widget.query(renew: true)); + } + + @override + Widget build(BuildContext context) { CircleAvatar circleAvatar = CircleAvatar( foregroundImage: widget.data.type == GetRoomResponseObjectConversationType.oneToOne ? Image.network("https://cloud.marianum-fulda.de/avatar/${widget.data.name}/128").image : null, backgroundColor: Theme.of(context).primaryColor, @@ -21,22 +53,12 @@ class ChatTile { child: widget.data.type == GetRoomResponseObjectConversationType.group ? const Icon(Icons.group) : const Icon(Icons.person), ); - String username = (await SharedPreferences.getInstance()).getString("username")!; - void setCurrentAsRead() { - SetReadMarker( - data.token, - true, - setReadMarkerParams: SetReadMarkerParams( - lastReadMessage: data.lastMessage.id - ) - ).run().then((value) => query(renew: true)); - } return ListTile( leading: Stack( children: [ circleAvatar, Visibility( - visible: data.isFavorite, + visible: widget.data.isFavorite, child: Positioned( right: 0, bottom: 0, @@ -52,13 +74,13 @@ class ChatTile { ) ], ), - title: Text(data.displayName), - subtitle: Text("${Jiffy.parseFromMillisecondsSinceEpoch(data.lastMessage.timestamp * 1000).fromNow()}: ${RichObjectStringProcessor.parseToString(data.lastMessage.message.replaceAll("\n", " "), data.lastMessage.messageParameters)}", overflow: TextOverflow.ellipsis), + title: Text(widget.data.displayName), + subtitle: Text("${Jiffy.parseFromMillisecondsSinceEpoch(widget.data.lastMessage.timestamp * 1000).fromNow()}: ${RichObjectStringProcessor.parseToString(widget.data.lastMessage.message.replaceAll("\n", " "), widget.data.lastMessage.messageParameters)}", overflow: TextOverflow.ellipsis), trailing: Row( mainAxisSize: MainAxisSize.min, children: [ Visibility( - visible: data.unreadMessages > 0, + visible: widget.data.unreadMessages > 0, child: Container( padding: const EdgeInsets.all(1), decoration: BoxDecoration( @@ -70,7 +92,7 @@ class ChatTile { minHeight: 20, ), child: Text( - "${data.unreadMessages}", + "${widget.data.unreadMessages}", style: const TextStyle( color: Colors.white, fontSize: 15, @@ -85,20 +107,21 @@ class ChatTile { setCurrentAsRead(); PersistentNavBarNavigator.pushNewScreen( context, - screen: ChatView(room: data, selfId: username, avatar: circleAvatar), + screen: ChatView(room: widget.data, selfId: username, avatar: circleAvatar), withNavBar: false ); }, onLongPress: () { + if(widget.disableContextActions) return; showDialog(context: context, builder: (context) => SimpleDialog( children: [ Visibility( - visible: data.unreadMessages > 0, + visible: widget.data.unreadMessages > 0, replacement: ListTile( leading: const Icon(Icons.mark_chat_unread_outlined), title: const Text("Als ungelesen markieren"), onTap: () { - SetReadMarker(data.token, false).run().then((value) => query(renew: true)); + SetReadMarker(widget.data.token, false).run().then((value) => widget.query(renew: true)); Navigator.of(context).pop(); }, ), @@ -112,12 +135,12 @@ class ChatTile { ), ), Visibility( - visible: data.isFavorite, + visible: widget.data.isFavorite, replacement: ListTile( leading: const Icon(Icons.star_outline), title: const Text("Zu favoriten hinzufügen"), onTap: () { - SetFavorite(data.token, true).run().then((value) => query(renew: true)); + SetFavorite(widget.data.token, true).run().then((value) => widget.query(renew: true)); Navigator.of(context).pop(); }, ), @@ -125,7 +148,7 @@ class ChatTile { leading: const Icon(Icons.stars_outlined), title: const Text("Von favoriten entfernen"), onTap: () { - SetFavorite(data.token, false).run().then((value) => query(renew: true)); + SetFavorite(widget.data.token, false).run().then((value) => widget.query(renew: true)); Navigator.of(context).pop(); }, ), @@ -139,7 +162,7 @@ class ChatTile { content: "Du benötigst ggf. eine Einladung um erneut beizutreten.", confirmButton: "Löschen", onConfirm: () { - LeaveRoom(data.token).run().then((value) => query(renew: true)); + LeaveRoom(widget.data.token).run().then((value) => widget.query(renew: true)); Navigator.of(context).pop(); }, ).asDialog(context); @@ -151,40 +174,3 @@ class ChatTile { ); } } - -class ChatTile extends StatefulWidget { - final GetRoomResponseObject data; - final void Function({bool renew}) query; - - const ChatTile({Key? key, required this.data, required this.query}) : super(key: key); - - @override - State createState() => _ChatTileState(); -} - -class _ChatTileState extends State { - - late CircleAvatar circleAvatar; - late String username; - - @override - void initState() { - SharedPreferences.getInstance().then((value) => { - username = value.getString("username")! - }); - - circleAvatar = CircleAvatar( - foregroundImage: data.type == GetRoomResponseObjectConversationType.oneToOne ? Image.network("https://cloud.marianum-fulda.de/avatar/${data.name}/128").image : null, - backgroundColor: Theme.of(context).primaryColor, - foregroundColor: Colors.white, - child: data.type == GetRoomResponseObjectConversationType.group ? const Icon(Icons.group) : const Icon(Icons.person), - ); - } - - - - @override - Widget build(BuildContext context) { - - } -} diff --git a/lib/view/pages/talk/searchChat.dart b/lib/view/pages/talk/searchChat.dart index 7579b08..c566fa9 100644 --- a/lib/view/pages/talk/searchChat.dart +++ b/lib/view/pages/talk/searchChat.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:marianum_mobile/view/pages/talk/chatTile.dart'; import '../../../api/marianumcloud/talk/room/getRoomResponse.dart'; +import 'chatTile.dart'; class SearchChat extends SearchDelegate { List chats; @@ -29,7 +29,7 @@ class SearchChat extends SearchDelegate { itemCount: items.length, itemBuilder: (context, index) { var item = items.elementAt(index); - return ChatTile(data: item, query: ({bool renew = true}) {}); + return ChatTile(data: item, disableContextActions: true, query: ({bool renew = true}) {}); }, ); }