From 482bf8dd0bc526a99b6b86da235ca819839cb8f0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Elias=20M=C3=BCller?= <elias@elias-mueller.com>
Date: Mon, 11 Sep 2023 23:00:56 +0200
Subject: [PATCH 1/2] added basic split view for tablet devices

---
 .idea/libraries/Dart_Packages.xml |   8 +
 lib/model/chatList/chatProps.dart |   4 +
 lib/view/pages/talk/chatList.dart | 121 +++++++-------
 lib/view/pages/talk/chatTile.dart | 254 +++++++++++++++---------------
 lib/view/pages/talk/chatView.dart |   4 +-
 pubspec.yaml                      |   1 +
 6 files changed, 209 insertions(+), 183 deletions(-)

diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml
index 2781667..84d9cc9 100644
--- a/.idea/libraries/Dart_Packages.xml
+++ b/.idea/libraries/Dart_Packages.xml
@@ -562,6 +562,13 @@
             </list>
           </value>
         </entry>
+        <entry key="flutter_split_view">
+          <value>
+            <list>
+              <option value="$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_split_view-0.1.2/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="flutter_test">
           <value>
             <list>
@@ -1512,6 +1519,7 @@
       <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_login-4.2.1/lib" />
       <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_native_splash-2.3.2/lib" />
       <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.16/lib" />
+      <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_split_view-0.1.2/lib" />
       <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/fluttertoast-8.2.2/lib" />
       <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/font_awesome_flutter-10.5.0/lib" />
       <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/frontend_server_client-3.2.0/lib" />
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/view/pages/talk/chatList.dart b/lib/view/pages/talk/chatList.dart
index dacee98..7de3d47 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';
@@ -72,68 +73,70 @@ class _ChatListState extends State<ChatList> {
   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(
+      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<ChatListProps>(
-        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<ChatTile> chats = [];
-          for (var chatRoom in data.getRoomsResponse.sortBy(
-            lastActivity: true,
-            favoritesToTop: Provider.of<SettingsProvider>(context).val().talkSettings.sortFavoritesToTop,
-            unreadToTop: Provider.of<SettingsProvider>(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<ChatListProps>(
+          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<ChatTile> chats = [];
+            for (var chatRoom in data.getRoomsResponse.sortBy(
+              lastActivity: true,
+              favoritesToTop: Provider.of<SettingsProvider>(context).val().talkSettings.sortFavoritesToTop,
+              unreadToTop: Provider.of<SettingsProvider>(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
index cb219a9..9d71294 100644
--- a/lib/view/pages/talk/chatTile.dart
+++ b/lib/view/pages/talk/chatTile.dart
@@ -1,7 +1,9 @@
+
 import 'package:flutter/material.dart';
+import 'package:flutter_split_view/flutter_split_view.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:provider/provider.dart';
 import 'package:shared_preferences/shared_preferences.dart';
 
 import '../../../api/marianumcloud/talk/chat/richObjectStringProcessor.dart';
@@ -10,6 +12,7 @@ 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 'chatView.dart';
@@ -52,134 +55,139 @@ class _ChatTileState extends State<ChatTile> {
     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(
+    return Consumer<ChatProps>(builder: (context, chatData, child) {
+      return ListTile(
+        style: ListTileStyle.list,
+        tileColor: chatData.currentToken() == widget.data.token
+            ? Theme.of(context).primaryColor.withAlpha(100)
+            : null,
+        leading: Stack(
           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();
-                },
-              ),
-            ),
+            circleAvatar,
             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();
-                },
+              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),
             ),
-            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));
+            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();
+          SplitView.of(context).setSecondary(ChatView(room: widget.data, selfId: username, avatar: circleAvatar));
+          Provider.of<ChatProps>(context, listen: false).setQueryToken(widget.data.token);
+
+          // 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();
                   },
-                ).asDialog(context);
-              },
-            ),
-            DebugTile(context).jsonData(widget.data.toJson()),
-          ],
-        ));
-      },
-    );
+                ),
+                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..f11b86a 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';
@@ -30,7 +32,7 @@ class _ChatViewState extends State<ChatView> {
   @override
   void initState() {
     super.initState();
-
+    log("init state for ${widget.room.name}");
     WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
       _query();
     });
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:

From 6bc4d4d2edeb176d4be9810985f7a796e1fa282d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Elias=20M=C3=BCller?= <elias@elias-mueller.com>
Date: Tue, 12 Sep 2023 09:31:34 +0200
Subject: [PATCH 2/2] Finished SplitView for Tablet devices

---
 lib/notification/notifyUpdater.dart           |  2 +-
 lib/view/pages/talk/chatList.dart             |  5 ++-
 lib/view/pages/talk/chatView.dart             |  4 +-
 .../talk/{ => components}/chatBubble.dart     | 24 ++++++------
 .../talk/{ => components}/chatMessage.dart    |  8 ++--
 .../talk/{ => components}/chatTextfield.dart  | 18 ++++-----
 .../pages/talk/{ => components}/chatTile.dart | 38 +++++++++----------
 .../talk/components/splitViewPlaceholder.dart | 22 +++++++++++
 lib/view/pages/talk/messageReactions.dart     |  2 +-
 lib/view/pages/talk/searchChat.dart           |  2 +-
 10 files changed, 75 insertions(+), 50 deletions(-)
 rename lib/view/pages/talk/{ => components}/chatBubble.dart (94%)
 rename lib/view/pages/talk/{ => components}/chatMessage.dart (87%)
 rename lib/view/pages/talk/{ => components}/chatTextfield.dart (92%)
 rename lib/view/pages/talk/{ => components}/chatTile.dart (84%)
 create mode 100644 lib/view/pages/talk/components/splitViewPlaceholder.dart

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 7de3d47..1e6e9bf 100644
--- a/lib/view/pages/talk/chatList.dart
+++ b/lib/view/pages/talk/chatList.dart
@@ -12,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';
 
@@ -74,6 +75,8 @@ class _ChatListState extends State<ChatList> {
     ChatListProps? latestData;
 
     return SplitView.material(
+      placeholder: const SplitViewPlaceholder(),
+      breakpoint: 1000,
       child: Scaffold(
         appBar: AppBar(
           title: const Text("Talk"),
diff --git a/lib/view/pages/talk/chatView.dart b/lib/view/pages/talk/chatView.dart
index f11b86a..43238a7 100644
--- a/lib/view/pages/talk/chatView.dart
+++ b/lib/view/pages/talk/chatView.dart
@@ -11,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;
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/chatTile.dart b/lib/view/pages/talk/components/chatTile.dart
similarity index 84%
rename from lib/view/pages/talk/chatTile.dart
rename to lib/view/pages/talk/components/chatTile.dart
index 9d71294..d2e9524 100644
--- a/lib/view/pages/talk/chatTile.dart
+++ b/lib/view/pages/talk/components/chatTile.dart
@@ -2,20 +2,21 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_split_view/flutter_split_view.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: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 'chatView.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;
@@ -58,7 +59,7 @@ class _ChatTileState extends State<ChatTile> {
     return Consumer<ChatProps>(builder: (context, chatData, child) {
       return ListTile(
         style: ListTileStyle.list,
-        tileColor: chatData.currentToken() == widget.data.token
+        tileColor: chatData.currentToken() == widget.data.token && SplitView.of(context).pageCount > 1
             ? Theme.of(context).primaryColor.withAlpha(100)
             : null,
         leading: Stack(
@@ -117,14 +118,13 @@ class _ChatTileState extends State<ChatTile> {
         ),
         onTap: () async {
           setCurrentAsRead();
-          SplitView.of(context).setSecondary(ChatView(room: widget.data, selfId: username, avatar: circleAvatar));
+          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<ChatProps>(context, listen: false).setQueryToken(widget.data.token);
-
-          // PersistentNavBarNavigator.pushNewScreen(
-          //     context,
-          //     screen: ChatView(room: widget.data, selfId: username, avatar: circleAvatar),
-          //     withNavBar: false
-          // );
         },
         onLongPress: () {
           if(widget.disableContextActions) return;
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<GetRoomResponseObject> chats;