added basic split view for tablet devices

This commit is contained in:
Elias Müller 2023-09-11 23:00:56 +02:00
parent e01bb38af7
commit 482bf8dd0b
6 changed files with 209 additions and 183 deletions

View File

@ -562,6 +562,13 @@
</list> </list>
</value> </value>
</entry> </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"> <entry key="flutter_test">
<value> <value>
<list> <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_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_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_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/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/font_awesome_flutter-10.5.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/frontend_server_client-3.2.0/lib" /> <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/frontend_server_client-3.2.0/lib" />

View File

@ -32,4 +32,8 @@ class ChatProps extends DataHolder {
run(); run();
} }
String currentToken() {
return _queryToken;
}
} }

View File

@ -2,6 +2,7 @@
import 'dart:async'; import 'dart:async';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_split_view/flutter_split_view.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../../api/marianumcloud/talk/createRoom/createRoom.dart'; import '../../../api/marianumcloud/talk/createRoom/createRoom.dart';
@ -72,7 +73,8 @@ class _ChatListState extends State<ChatList> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
ChatListProps? latestData; ChatListProps? latestData;
return Scaffold( return SplitView.material(
child: Scaffold(
appBar: AppBar( appBar: AppBar(
title: const Text("Talk"), title: const Text("Talk"),
actions: [ actions: [
@ -135,6 +137,7 @@ class _ChatListState extends State<ChatList> {
); );
}, },
), ),
),
); );
} }
} }

View File

@ -1,7 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_split_view/flutter_split_view.dart';
import 'package:jiffy/jiffy.dart'; import 'package:jiffy/jiffy.dart';
import 'package:marianum_mobile/widget/userAvatar.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 'package:shared_preferences/shared_preferences.dart';
import '../../../api/marianumcloud/talk/chat/richObjectStringProcessor.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/setFavorite/setFavorite.dart';
import '../../../api/marianumcloud/talk/setReadMarker/setReadMarker.dart'; import '../../../api/marianumcloud/talk/setReadMarker/setReadMarker.dart';
import '../../../api/marianumcloud/talk/setReadMarker/setReadMarkerParams.dart'; import '../../../api/marianumcloud/talk/setReadMarker/setReadMarkerParams.dart';
import '../../../model/chatList/chatProps.dart';
import '../../../widget/confirmDialog.dart'; import '../../../widget/confirmDialog.dart';
import '../../../widget/debug/debugTile.dart'; import '../../../widget/debug/debugTile.dart';
import 'chatView.dart'; import 'chatView.dart';
@ -52,7 +55,12 @@ class _ChatTileState extends State<ChatTile> {
bool isGroup = widget.data.type == GetRoomResponseObjectConversationType.oneToOne; bool isGroup = widget.data.type == GetRoomResponseObjectConversationType.oneToOne;
UserAvatar circleAvatar = UserAvatar(username: widget.data.name, isGroup: isGroup); UserAvatar circleAvatar = UserAvatar(username: widget.data.name, isGroup: isGroup);
return Consumer<ChatProps>(builder: (context, chatData, child) {
return ListTile( return ListTile(
style: ListTileStyle.list,
tileColor: chatData.currentToken() == widget.data.token
? Theme.of(context).primaryColor.withAlpha(100)
: null,
leading: Stack( leading: Stack(
children: [ children: [
circleAvatar, circleAvatar,
@ -76,7 +84,9 @@ class _ChatTileState extends State<ChatTile> {
title: Row( title: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Text(widget.data.displayName), Flexible(
child: Text(widget.data.displayName, overflow: TextOverflow.ellipsis),
),
if(widget.hasDraft) ...[ if(widget.hasDraft) ...[
const SizedBox(width: 5), const SizedBox(width: 5),
const Icon(Icons.edit_outlined, size: 15), const Icon(Icons.edit_outlined, size: 15),
@ -84,12 +94,9 @@ class _ChatTileState extends State<ChatTile> {
], ],
), ),
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), 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( trailing: widget.data.unreadMessages <= 0
mainAxisSize: MainAxisSize.min, ? null
children: [ : Container(
Visibility(
visible: widget.data.unreadMessages > 0,
child: Container(
padding: const EdgeInsets.all(1), padding: const EdgeInsets.all(1),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Theme.of(context).primaryColor, color: Theme.of(context).primaryColor,
@ -108,16 +115,16 @@ class _ChatTileState extends State<ChatTile> {
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
), ),
),
],
),
onTap: () async { onTap: () async {
setCurrentAsRead(); setCurrentAsRead();
PersistentNavBarNavigator.pushNewScreen( SplitView.of(context).setSecondary(ChatView(room: widget.data, selfId: username, avatar: circleAvatar));
context, Provider.of<ChatProps>(context, listen: false).setQueryToken(widget.data.token);
screen: ChatView(room: widget.data, selfId: username, avatar: circleAvatar),
withNavBar: false // PersistentNavBarNavigator.pushNewScreen(
); // context,
// screen: ChatView(room: widget.data, selfId: username, avatar: circleAvatar),
// withNavBar: false
// );
}, },
onLongPress: () { onLongPress: () {
if(widget.disableContextActions) return; if(widget.disableContextActions) return;
@ -181,5 +188,6 @@ class _ChatTileState extends State<ChatTile> {
)); ));
}, },
); );
});
} }
} }

View File

@ -1,4 +1,6 @@
import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:loader_overlay/loader_overlay.dart'; import 'package:loader_overlay/loader_overlay.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -30,7 +32,7 @@ class _ChatViewState extends State<ChatView> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
log("init state for ${widget.room.name}");
WidgetsBinding.instance.addPostFrameCallback((timeStamp) { WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
_query(); _query();
}); });

View File

@ -88,6 +88,7 @@ dependencies:
fluttertoast: ^8.2.2 fluttertoast: ^8.2.2
fast_rsa: ^3.6.1 fast_rsa: ^3.6.1
share_plus: ^7.1.0 share_plus: ^7.1.0
flutter_split_view: ^0.1.2
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: