implemented shared items view for Talk chats with tabbed categories and on-scroll pagination

This commit is contained in:
2026-07-19 10:58:02 +02:00
parent f3cd7896d9
commit 75080a2c49
6 changed files with 846 additions and 2 deletions
+31 -2
View File
@@ -4,6 +4,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../../api/marianumcloud/talk/actions/talk_actions.dart';
import '../../../../api/marianumcloud/talk/get_participants/get_participants_cache.dart';
import '../../../../api/marianumcloud/talk/get_participants/get_participants_response.dart';
import '../../../../api/marianumcloud/talk/get_shared_items/get_shared_items_overview_response.dart';
import '../../../../api/marianumcloud/talk/room/get_room_response.dart';
import '../../../../state/app/modules/chat_list/bloc/chat_list_bloc.dart';
import '../../../../widget/app_progress_indicator.dart';
@@ -11,10 +12,10 @@ import '../../../../widget/async_action_button.dart';
import '../../../../widget/avatar_actions_sheet.dart';
import '../../../../widget/confirm_dialog.dart';
import '../../../../widget/large_profile_picture_view.dart';
import '../../../../widget/loading_spinner.dart';
import '../../../../widget/user_avatar.dart';
import '../talk_navigator.dart';
import 'participants_list_view.dart';
import 'shared_items_view.dart';
class ChatInfo extends StatefulWidget {
final GetRoomResponseObject room;
@@ -26,6 +27,7 @@ class ChatInfo extends StatefulWidget {
class _ChatInfoState extends State<ChatInfo> {
GetParticipantsResponse? participants;
GetSharedItemsOverviewResponse? _sharesOverview;
late bool _isFavorite;
int _avatarVersion = 0;
bool _avatarBusy = false;
@@ -42,6 +44,16 @@ class _ChatInfoState extends State<ChatInfo> {
});
},
);
_preloadShares();
}
Future<void> _preloadShares() async {
try {
final overview = await SharedItemsView.prefetchOverview(widget.room.token);
if (mounted) setState(() => _sharesOverview = overview);
} catch (_) {
// Best-effort: the shares view loads on demand if the preload fails.
}
}
void _refreshList() => context.read<ChatListBloc>().refresh();
@@ -187,7 +199,15 @@ class _ChatInfoState extends State<ChatInfo> {
),
const SizedBox(height: 30),
if (participants == null)
const Center(child: LoadingSpinner())
const ListTile(
leading: Icon(Icons.supervised_user_circle),
title: Text('Mitglieder'),
trailing: SizedBox(
width: 24,
height: 24,
child: AppProgressIndicator.small(),
),
)
else
ListTile(
leading: const Icon(Icons.supervised_user_circle),
@@ -201,6 +221,15 @@ class _ChatInfoState extends State<ChatInfo> {
),
),
),
ListTile(
leading: const Icon(Icons.perm_media_outlined),
title: const Text('Medien und Dokumente'),
trailing: const Icon(Icons.arrow_right),
onTap: () => TalkNavigator.pushSplitView(
context,
SharedItemsView(widget.room, overview: _sharesOverview),
),
),
if (_isFavorite)
AsyncListTile(
leading: const Icon(Icons.stars_outlined),