diff --git a/lib/model/chatList/chatProps.dart b/lib/model/chatList/chatProps.dart index cdc4073..6a19713 100644 --- a/lib/model/chatList/chatProps.dart +++ b/lib/model/chatList/chatProps.dart @@ -32,4 +32,8 @@ class ChatProps extends DataHolder { run(); } + String currentToken() { + return _queryToken; + } + } \ No newline at end of file diff --git a/lib/notification/notifyUpdater.dart b/lib/notification/notifyUpdater.dart index a6740dc..b445f0f 100644 --- a/lib/notification/notifyUpdater.dart +++ b/lib/notification/notifyUpdater.dart @@ -6,12 +6,12 @@ import 'dart:developer'; import 'package:crypto/crypto.dart'; import 'package:fast_rsa/fast_rsa.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:marianum_mobile/storage/base/settingsProvider.dart'; import '../api/mhsl/notify/register/notifyRegister.dart'; import '../api/mhsl/notify/register/notifyRegisterParams.dart'; import '../model/accountData.dart'; import '../model/endpointData.dart'; +import '../storage/base/settingsProvider.dart'; import '../widget/confirmDialog.dart'; class NotifyUpdater { diff --git a/lib/view/pages/talk/chatList.dart b/lib/view/pages/talk/chatList.dart index dacee98..1e6e9bf 100644 --- a/lib/view/pages/talk/chatList.dart +++ b/lib/view/pages/talk/chatList.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_split_view/flutter_split_view.dart'; import 'package:provider/provider.dart'; import '../../../api/marianumcloud/talk/createRoom/createRoom.dart'; @@ -11,7 +12,8 @@ import '../../../notification/notifyUpdater.dart'; import '../../../storage/base/settingsProvider.dart'; import '../../../widget/confirmDialog.dart'; import '../../../widget/loadingSpinner.dart'; -import 'chatTile.dart'; +import 'components/chatTile.dart'; +import 'components/splitViewPlaceholder.dart'; import 'joinChat.dart'; import 'searchChat.dart'; @@ -72,68 +74,72 @@ class _ChatListState extends State { Widget build(BuildContext context) { ChatListProps? latestData; - return Scaffold( - appBar: AppBar( - title: const Text("Talk"), - actions: [ - IconButton( - icon: const Icon(Icons.search), - onPressed: () async { - if(latestData == null) return; - showSearch(context: context, delegate: SearchChat(latestData!.getRoomsResponse.data.toList())); - }, - ) - ], - ), - floatingActionButton: FloatingActionButton( - heroTag: "createChat", - backgroundColor: Theme.of(context).primaryColor, - onPressed: () async { - showSearch(context: context, delegate: JoinChat()).then((username) { - if(username == null) return; - - ConfirmDialog( - title: "Chat starten", - content: "Möchtest du einen Chat mit Nutzer '$username' starten?", - confirmButton: "Chat starten", - onConfirm: () { - CreateRoom(CreateRoomParams( - roomType: 1, - invite: username, - )).run().then((value) { - _query(renew: true); - }); + return SplitView.material( + placeholder: const SplitViewPlaceholder(), + breakpoint: 1000, + child: Scaffold( + appBar: AppBar( + title: const Text("Talk"), + actions: [ + IconButton( + icon: const Icon(Icons.search), + onPressed: () async { + if(latestData == null) return; + showSearch(context: context, delegate: SearchChat(latestData!.getRoomsResponse.data.toList())); }, - ).asDialog(context); - }); - }, - child: const Icon(Icons.add_comment_outlined), - ), - body: Consumer( - builder: (context, data, child) { + ) + ], + ), + floatingActionButton: FloatingActionButton( + heroTag: "createChat", + backgroundColor: Theme.of(context).primaryColor, + onPressed: () async { + showSearch(context: context, delegate: JoinChat()).then((username) { + if(username == null) return; - if(data.primaryLoading()) return const LoadingSpinner(); - latestData = data; - List chats = []; - for (var chatRoom in data.getRoomsResponse.sortBy( - lastActivity: true, - favoritesToTop: Provider.of(context).val().talkSettings.sortFavoritesToTop, - unreadToTop: Provider.of(context).val().talkSettings.sortUnreadToTop, - ) - ) { - bool hasDraft = settings.val().talkSettings.drafts.containsKey(chatRoom.token); - chats.add(ChatTile(data: chatRoom, query: _query, hasDraft: hasDraft)); - } + ConfirmDialog( + title: "Chat starten", + content: "Möchtest du einen Chat mit Nutzer '$username' starten?", + confirmButton: "Chat starten", + onConfirm: () { + CreateRoom(CreateRoomParams( + roomType: 1, + invite: username, + )).run().then((value) { + _query(renew: true); + }); + }, + ).asDialog(context); + }); + }, + child: const Icon(Icons.add_comment_outlined), + ), + body: Consumer( + builder: (context, data, child) { - return RefreshIndicator( - color: Theme.of(context).primaryColor, - onRefresh: () { - _query(renew: true); - return Future.delayed(const Duration(seconds: 3)); - }, - child: ListView(children: chats), - ); - }, + if(data.primaryLoading()) return const LoadingSpinner(); + latestData = data; + List chats = []; + for (var chatRoom in data.getRoomsResponse.sortBy( + lastActivity: true, + favoritesToTop: Provider.of(context).val().talkSettings.sortFavoritesToTop, + unreadToTop: Provider.of(context).val().talkSettings.sortUnreadToTop, + ) + ) { + bool hasDraft = settings.val().talkSettings.drafts.containsKey(chatRoom.token); + chats.add(ChatTile(data: chatRoom, query: _query, hasDraft: hasDraft)); + } + + return RefreshIndicator( + color: Theme.of(context).primaryColor, + onRefresh: () { + _query(renew: true); + return Future.delayed(const Duration(seconds: 3)); + }, + child: ListView(children: chats), + ); + }, + ), ), ); } diff --git a/lib/view/pages/talk/chatTile.dart b/lib/view/pages/talk/chatTile.dart deleted file mode 100644 index cb219a9..0000000 --- a/lib/view/pages/talk/chatTile.dart +++ /dev/null @@ -1,185 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:jiffy/jiffy.dart'; -import 'package:marianum_mobile/widget/userAvatar.dart'; -import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -import '../../../api/marianumcloud/talk/chat/richObjectStringProcessor.dart'; -import '../../../api/marianumcloud/talk/leaveRoom/leaveRoom.dart'; -import '../../../api/marianumcloud/talk/room/getRoomResponse.dart'; -import '../../../api/marianumcloud/talk/setFavorite/setFavorite.dart'; -import '../../../api/marianumcloud/talk/setReadMarker/setReadMarker.dart'; -import '../../../api/marianumcloud/talk/setReadMarker/setReadMarkerParams.dart'; -import '../../../widget/confirmDialog.dart'; -import '../../../widget/debug/debugTile.dart'; -import 'chatView.dart'; - -class ChatTile extends StatefulWidget { - final GetRoomResponseObject data; - final void Function({bool renew}) query; - final bool disableContextActions; - final bool hasDraft; - - const ChatTile({Key? key, required this.data, required this.query, this.disableContextActions = false, this.hasDraft = 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) { - bool isGroup = widget.data.type == GetRoomResponseObjectConversationType.oneToOne; - UserAvatar circleAvatar = UserAvatar(username: widget.data.name, isGroup: isGroup); - - return ListTile( - leading: Stack( - children: [ - circleAvatar, - Visibility( - visible: widget.data.isFavorite, - child: Positioned( - right: 0, - bottom: 0, - child: Container( - padding: const EdgeInsets.all(1), - decoration: BoxDecoration( - color: Theme.of(context).primaryColor.withAlpha(200), - borderRadius: BorderRadius.circular(90.0), - ), - child: const Icon(Icons.star, color: Colors.amberAccent, size: 15), - ), - ), - ) - ], - ), - title: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text(widget.data.displayName), - if(widget.hasDraft) ...[ - const SizedBox(width: 5), - const Icon(Icons.edit_outlined, size: 15), - ], - ], - ), - 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: widget.data.unreadMessages > 0, - child: Container( - padding: const EdgeInsets.all(1), - decoration: BoxDecoration( - color: Theme.of(context).primaryColor, - borderRadius: BorderRadius.circular(30), - ), - constraints: const BoxConstraints( - minWidth: 20, - minHeight: 20, - ), - child: Text( - "${widget.data.unreadMessages}", - style: const TextStyle( - color: Colors.white, - fontSize: 15, - ), - textAlign: TextAlign.center, - ), - ), - ), - ], - ), - onTap: () async { - setCurrentAsRead(); - PersistentNavBarNavigator.pushNewScreen( - context, - 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: widget.data.unreadMessages > 0, - replacement: ListTile( - leading: const Icon(Icons.mark_chat_unread_outlined), - title: const Text("Als ungelesen markieren"), - onTap: () { - SetReadMarker(widget.data.token, false).run().then((value) => widget.query(renew: true)); - Navigator.of(context).pop(); - }, - ), - child: ListTile( - leading: const Icon(Icons.mark_chat_read_outlined), - title: const Text("Als gelesen markieren"), - onTap: () { - setCurrentAsRead(); - Navigator.of(context).pop(); - }, - ), - ), - Visibility( - visible: widget.data.isFavorite, - replacement: ListTile( - leading: const Icon(Icons.star_outline), - title: const Text("Zu Favoriten hinzufügen"), - onTap: () { - SetFavorite(widget.data.token, true).run().then((value) => widget.query(renew: true)); - Navigator.of(context).pop(); - }, - ), - child: ListTile( - leading: const Icon(Icons.stars_outlined), - title: const Text("Von Favoriten entfernen"), - onTap: () { - SetFavorite(widget.data.token, false).run().then((value) => widget.query(renew: true)); - Navigator.of(context).pop(); - }, - ), - ), - ListTile( - leading: const Icon(Icons.delete_outline), - title: const Text("Konversation verlassen"), - onTap: () { - ConfirmDialog( - title: "Chat verlassen", - content: "Du benötigst ggf. eine Einladung um erneut beizutreten.", - confirmButton: "Löschen", - onConfirm: () { - LeaveRoom(widget.data.token).run().then((value) => widget.query(renew: true)); - Navigator.of(context).pop(); - }, - ).asDialog(context); - }, - ), - DebugTile(context).jsonData(widget.data.toJson()), - ], - )); - }, - ); - } -} diff --git a/lib/view/pages/talk/chatView.dart b/lib/view/pages/talk/chatView.dart index 9acf6d7..43238a7 100644 --- a/lib/view/pages/talk/chatView.dart +++ b/lib/view/pages/talk/chatView.dart @@ -1,4 +1,6 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; import 'package:loader_overlay/loader_overlay.dart'; import 'package:provider/provider.dart'; @@ -9,8 +11,8 @@ import '../../../theming/appTheme.dart'; import '../../../model/chatList/chatProps.dart'; import '../../../widget/loadingSpinner.dart'; import '../../../widget/userAvatar.dart'; -import 'chatBubble.dart'; -import 'chatTextfield.dart'; +import 'components/chatBubble.dart'; +import 'components/chatTextfield.dart'; class ChatView extends StatefulWidget { final GetRoomResponseObject room; @@ -30,7 +32,7 @@ class _ChatViewState extends State { @override void initState() { super.initState(); - + log("init state for ${widget.room.name}"); WidgetsBinding.instance.addPostFrameCallback((timeStamp) { _query(); }); diff --git a/lib/view/pages/talk/chatBubble.dart b/lib/view/pages/talk/components/chatBubble.dart similarity index 94% rename from lib/view/pages/talk/chatBubble.dart rename to lib/view/pages/talk/components/chatBubble.dart index 805e4d8..e456d22 100644 --- a/lib/view/pages/talk/chatBubble.dart +++ b/lib/view/pages/talk/components/chatBubble.dart @@ -6,19 +6,19 @@ import 'package:flutter/services.dart'; import 'package:jiffy/jiffy.dart'; import 'package:provider/provider.dart'; -import '../../../api/marianumcloud/talk/chat/getChatResponse.dart'; -import '../../../api/marianumcloud/talk/deleteMessage/deleteMessage.dart'; -import '../../../api/marianumcloud/talk/deleteReactMessage/deleteReactMessage.dart'; -import '../../../api/marianumcloud/talk/deleteReactMessage/deleteReactMessageParams.dart'; -import '../../../api/marianumcloud/talk/reactMessage/reactMessage.dart'; -import '../../../api/marianumcloud/talk/reactMessage/reactMessageParams.dart'; -import '../../../api/marianumcloud/talk/room/getRoomResponse.dart'; -import '../../../model/chatList/chatProps.dart'; -import '../../../theming/appTheme.dart'; -import '../../../widget/debug/debugTile.dart'; -import '../files/fileElement.dart'; +import '../../../../api/marianumcloud/talk/chat/getChatResponse.dart'; +import '../../../../api/marianumcloud/talk/deleteMessage/deleteMessage.dart'; +import '../../../../api/marianumcloud/talk/deleteReactMessage/deleteReactMessage.dart'; +import '../../../../api/marianumcloud/talk/deleteReactMessage/deleteReactMessageParams.dart'; +import '../../../../api/marianumcloud/talk/reactMessage/reactMessage.dart'; +import '../../../../api/marianumcloud/talk/reactMessage/reactMessageParams.dart'; +import '../../../../api/marianumcloud/talk/room/getRoomResponse.dart'; +import '../../../../model/chatList/chatProps.dart'; +import '../../../../theming/appTheme.dart'; +import '../../../../widget/debug/debugTile.dart'; +import '../../files/fileElement.dart'; import 'chatMessage.dart'; -import 'messageReactions.dart'; +import '../messageReactions.dart'; class ChatBubble extends StatefulWidget { final BuildContext context; diff --git a/lib/view/pages/talk/chatMessage.dart b/lib/view/pages/talk/components/chatMessage.dart similarity index 87% rename from lib/view/pages/talk/chatMessage.dart rename to lib/view/pages/talk/components/chatMessage.dart index 2ecd0d7..4b220c8 100644 --- a/lib/view/pages/talk/chatMessage.dart +++ b/lib/view/pages/talk/components/chatMessage.dart @@ -4,10 +4,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:url_launcher/url_launcher_string.dart'; -import '../../../api/marianumcloud/talk/chat/getChatResponse.dart'; -import '../../../api/marianumcloud/talk/chat/richObjectStringProcessor.dart'; -import '../../../model/accountData.dart'; -import '../../../model/endpointData.dart'; +import '../../../../api/marianumcloud/talk/chat/getChatResponse.dart'; +import '../../../../api/marianumcloud/talk/chat/richObjectStringProcessor.dart'; +import '../../../../model/accountData.dart'; +import '../../../../model/endpointData.dart'; class ChatMessage { String originalMessage; diff --git a/lib/view/pages/talk/chatTextfield.dart b/lib/view/pages/talk/components/chatTextfield.dart similarity index 92% rename from lib/view/pages/talk/chatTextfield.dart rename to lib/view/pages/talk/components/chatTextfield.dart index ca7e5a8..0e2424d 100644 --- a/lib/view/pages/talk/chatTextfield.dart +++ b/lib/view/pages/talk/components/chatTextfield.dart @@ -2,18 +2,18 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:loader_overlay/loader_overlay.dart'; -import 'package:marianum_mobile/storage/base/settingsProvider.dart'; import 'package:provider/provider.dart'; import 'package:uuid/uuid.dart'; -import '../../../api/marianumcloud/files-sharing/fileSharingApi.dart'; -import '../../../api/marianumcloud/files-sharing/fileSharingApiParams.dart'; -import '../../../api/marianumcloud/talk/sendMessage/sendMessage.dart'; -import '../../../api/marianumcloud/talk/sendMessage/sendMessageParams.dart'; -import '../../../api/marianumcloud/webdav/webdavApi.dart'; -import '../../../model/chatList/chatProps.dart'; -import '../../../widget/filePick.dart'; -import '../files/fileUploadDialog.dart'; +import '../../../../api/marianumcloud/files-sharing/fileSharingApi.dart'; +import '../../../../api/marianumcloud/files-sharing/fileSharingApiParams.dart'; +import '../../../../api/marianumcloud/talk/sendMessage/sendMessage.dart'; +import '../../../../api/marianumcloud/talk/sendMessage/sendMessageParams.dart'; +import '../../../../api/marianumcloud/webdav/webdavApi.dart'; +import '../../../../model/chatList/chatProps.dart'; +import '../../../../storage/base/settingsProvider.dart'; +import '../../../../widget/filePick.dart'; +import '../../files/fileUploadDialog.dart'; class ChatTextfield extends StatefulWidget { final String sendToToken; diff --git a/lib/view/pages/talk/components/chatTile.dart b/lib/view/pages/talk/components/chatTile.dart new file mode 100644 index 0000000..d2e9524 --- /dev/null +++ b/lib/view/pages/talk/components/chatTile.dart @@ -0,0 +1,193 @@ + +import 'package:flutter/material.dart'; +import 'package:flutter_split_view/flutter_split_view.dart'; +import 'package:jiffy/jiffy.dart'; +import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import '../../../../api/marianumcloud/talk/chat/richObjectStringProcessor.dart'; +import '../../../../api/marianumcloud/talk/leaveRoom/leaveRoom.dart'; +import '../../../../api/marianumcloud/talk/room/getRoomResponse.dart'; +import '../../../../api/marianumcloud/talk/setFavorite/setFavorite.dart'; +import '../../../../api/marianumcloud/talk/setReadMarker/setReadMarker.dart'; +import '../../../../api/marianumcloud/talk/setReadMarker/setReadMarkerParams.dart'; +import '../../../../model/chatList/chatProps.dart'; +import '../../../../widget/confirmDialog.dart'; +import '../../../../widget/debug/debugTile.dart'; +import '../../../../widget/userAvatar.dart'; +import '../chatView.dart'; + +class ChatTile extends StatefulWidget { + final GetRoomResponseObject data; + final void Function({bool renew}) query; + final bool disableContextActions; + final bool hasDraft; + + const ChatTile({Key? key, required this.data, required this.query, this.disableContextActions = false, this.hasDraft = 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) { + bool isGroup = widget.data.type == GetRoomResponseObjectConversationType.oneToOne; + UserAvatar circleAvatar = UserAvatar(username: widget.data.name, isGroup: isGroup); + + return Consumer(builder: (context, chatData, child) { + return ListTile( + style: ListTileStyle.list, + tileColor: chatData.currentToken() == widget.data.token && SplitView.of(context).pageCount > 1 + ? Theme.of(context).primaryColor.withAlpha(100) + : null, + leading: Stack( + children: [ + circleAvatar, + Visibility( + visible: widget.data.isFavorite, + child: Positioned( + right: 0, + bottom: 0, + child: Container( + padding: const EdgeInsets.all(1), + decoration: BoxDecoration( + color: Theme.of(context).primaryColor.withAlpha(200), + borderRadius: BorderRadius.circular(90.0), + ), + child: const Icon(Icons.star, color: Colors.amberAccent, size: 15), + ), + ), + ) + ], + ), + title: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Flexible( + child: Text(widget.data.displayName, overflow: TextOverflow.ellipsis), + ), + if(widget.hasDraft) ...[ + const SizedBox(width: 5), + const Icon(Icons.edit_outlined, size: 15), + ], + ], + ), + 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: widget.data.unreadMessages <= 0 + ? null + : Container( + padding: const EdgeInsets.all(1), + decoration: BoxDecoration( + color: Theme.of(context).primaryColor, + borderRadius: BorderRadius.circular(30), + ), + constraints: const BoxConstraints( + minWidth: 20, + minHeight: 20, + ), + child: Text( + "${widget.data.unreadMessages}", + style: const TextStyle( + color: Colors.white, + fontSize: 15, + ), + textAlign: TextAlign.center, + ), + ), + onTap: () async { + setCurrentAsRead(); + ChatView view = ChatView(room: widget.data, selfId: username, avatar: circleAvatar); + if(SplitView.of(context).isSecondaryVisible) { + SplitView.of(context).setSecondary(view); + } else { + PersistentNavBarNavigator.pushNewScreen(context, screen: view, withNavBar: false); + } + Provider.of(context, listen: false).setQueryToken(widget.data.token); + }, + onLongPress: () { + if(widget.disableContextActions) return; + showDialog(context: context, builder: (context) => SimpleDialog( + children: [ + Visibility( + visible: widget.data.unreadMessages > 0, + replacement: ListTile( + leading: const Icon(Icons.mark_chat_unread_outlined), + title: const Text("Als ungelesen markieren"), + onTap: () { + SetReadMarker(widget.data.token, false).run().then((value) => widget.query(renew: true)); + Navigator.of(context).pop(); + }, + ), + child: ListTile( + leading: const Icon(Icons.mark_chat_read_outlined), + title: const Text("Als gelesen markieren"), + onTap: () { + setCurrentAsRead(); + Navigator.of(context).pop(); + }, + ), + ), + Visibility( + visible: widget.data.isFavorite, + replacement: ListTile( + leading: const Icon(Icons.star_outline), + title: const Text("Zu Favoriten hinzufügen"), + onTap: () { + SetFavorite(widget.data.token, true).run().then((value) => widget.query(renew: true)); + Navigator.of(context).pop(); + }, + ), + child: ListTile( + leading: const Icon(Icons.stars_outlined), + title: const Text("Von Favoriten entfernen"), + onTap: () { + SetFavorite(widget.data.token, false).run().then((value) => widget.query(renew: true)); + Navigator.of(context).pop(); + }, + ), + ), + ListTile( + leading: const Icon(Icons.delete_outline), + title: const Text("Konversation verlassen"), + onTap: () { + ConfirmDialog( + title: "Chat verlassen", + content: "Du benötigst ggf. eine Einladung um erneut beizutreten.", + confirmButton: "Löschen", + onConfirm: () { + LeaveRoom(widget.data.token).run().then((value) => widget.query(renew: true)); + Navigator.of(context).pop(); + }, + ).asDialog(context); + }, + ), + DebugTile(context).jsonData(widget.data.toJson()), + ], + )); + }, + ); + }); + } +} diff --git a/lib/view/pages/talk/components/splitViewPlaceholder.dart b/lib/view/pages/talk/components/splitViewPlaceholder.dart new file mode 100644 index 0000000..60268f4 --- /dev/null +++ b/lib/view/pages/talk/components/splitViewPlaceholder.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +class SplitViewPlaceholder extends StatelessWidget { + const SplitViewPlaceholder({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset("assets/logo/icon.png", height: 200), + const SizedBox(height: 30), + const Text("Marianum Fulda\nTalk", textAlign: TextAlign.center, style: TextStyle(fontSize: 30)), + ], + ), + ) + ); + } +} diff --git a/lib/view/pages/talk/messageReactions.dart b/lib/view/pages/talk/messageReactions.dart index 0001844..4a7af77 100644 --- a/lib/view/pages/talk/messageReactions.dart +++ b/lib/view/pages/talk/messageReactions.dart @@ -1,7 +1,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:marianum_mobile/widget/userAvatar.dart'; import '../../../api/marianumcloud/talk/getReactions/getReactions.dart'; import '../../../api/marianumcloud/talk/getReactions/getReactionsResponse.dart'; @@ -10,6 +9,7 @@ import '../../../widget/centeredLeading.dart'; import '../../../widget/loadingSpinner.dart'; import '../../../widget/placeholderView.dart'; import '../../../widget/unimplementedDialog.dart'; +import '../../../widget/userAvatar.dart'; class MessageReactions extends StatefulWidget { final String token; diff --git a/lib/view/pages/talk/searchChat.dart b/lib/view/pages/talk/searchChat.dart index c566fa9..6b3a4d9 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 '../../../api/marianumcloud/talk/room/getRoomResponse.dart'; -import 'chatTile.dart'; +import 'components/chatTile.dart'; class SearchChat extends SearchDelegate { List chats; diff --git a/pubspec.yaml b/pubspec.yaml index 5af5935..02e24e0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -88,6 +88,7 @@ dependencies: fluttertoast: ^8.2.2 fast_rsa: ^3.6.1 share_plus: ^7.1.0 + flutter_split_view: ^0.1.2 dev_dependencies: flutter_test: