implemented shared items view for Talk chats with tabbed categories and on-scroll pagination
This commit is contained in:
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user