diff --git a/lib/view/pages/talk/details/chat_info.dart b/lib/view/pages/talk/details/chat_info.dart index 6eae5c7..08a22ca 100644 --- a/lib/view/pages/talk/details/chat_info.dart +++ b/lib/view/pages/talk/details/chat_info.dart @@ -1,8 +1,13 @@ import 'package:flutter/material.dart'; +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/room/get_room_response.dart'; +import '../../../../state/app/modules/chat_list/bloc/chat_list_bloc.dart'; +import '../../../../widget/async_action_button.dart'; +import '../../../../widget/confirm_dialog.dart'; import '../../../../widget/large_profile_picture_view.dart'; import '../../../../widget/loading_spinner.dart'; import '../../../../widget/user_avatar.dart'; @@ -19,9 +24,12 @@ class ChatInfo extends StatefulWidget { class _ChatInfoState extends State { GetParticipantsResponse? participants; + late bool _isFavorite; @override void initState() { + super.initState(); + _isFavorite = widget.room.isFavorite; GetParticipantsCache( chatToken: widget.room.token, onUpdate: (GetParticipantsResponse data) { @@ -30,7 +38,32 @@ class _ChatInfoState extends State { }); }, ); - super.initState(); + } + + void _refreshList() => context.read().refresh(); + + Future _toggleFavorite() async { + final next = !_isFavorite; + await SetFavorite(widget.room.token, next).run(); + if (!mounted) return; + setState(() => _isFavorite = next); + _refreshList(); + } + + Future _confirmLeave() async { + final closed = await showDialog( + context: context, + builder: (_) => ConfirmDialog( + title: 'Talk-Chat verlassen', + content: 'Du benötigst ggf. eine Einladung um erneut beizutreten.', + confirmButton: 'Verlassen', + onConfirmAsync: () async { + await LeaveRoom(widget.room.token).run(); + if (mounted) _refreshList(); + }, + ), + ); + if (closed == true && mounted) Navigator.of(context).pop(); } @override @@ -39,12 +72,11 @@ class _ChatInfoState extends State { widget.room.type != GetRoomResponseObjectConversationType.oneToOne; return Scaffold( appBar: AppBar(title: Text(widget.room.displayName)), - body: Center( - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - const SizedBox(height: 30), - GestureDetector( + body: ListView( + children: [ + const SizedBox(height: 30), + Center( + child: GestureDetector( child: UserAvatar( id: isGroup ? widget.room.token : widget.room.name, isGroup: isGroup, @@ -58,34 +90,65 @@ class _ChatInfoState extends State { ), ), ), - const SizedBox(height: 30), - Text( - widget.room.displayName, - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 30), + ), + const SizedBox(height: 30), + Text( + widget.room.displayName, + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 30), + ), + if (!isGroup) + Text(widget.room.name, textAlign: TextAlign.center), + const SizedBox(height: 10), + if (isGroup) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Text( + widget.room.description, + textAlign: TextAlign.center, + ), ), - if (!isGroup) Text(widget.room.name), - const SizedBox(height: 10), - if (isGroup) - Text(widget.room.description, textAlign: TextAlign.center), - const SizedBox(height: 30), - if (participants == null) const LoadingSpinner(), - if (participants != null) ...[ - ListTile( - leading: const Icon(Icons.supervised_user_circle), - title: Text('${participants!.data.length} Mitglieder'), - trailing: const Icon(Icons.arrow_right), - onTap: () => TalkNavigator.pushSplitView( - context, - ParticipantsListView( - participants!, - showDirectMessageAction: isGroup, - ), + const SizedBox(height: 30), + if (participants == null) + const Center(child: LoadingSpinner()) + else + ListTile( + leading: const Icon(Icons.supervised_user_circle), + title: Text('${participants!.data.length} Mitglieder'), + trailing: const Icon(Icons.arrow_right), + onTap: () => TalkNavigator.pushSplitView( + context, + ParticipantsListView( + participants!, + showDirectMessageAction: isGroup, ), ), - ], - ], - ), + ), + if (_isFavorite) + AsyncListTile( + leading: const Icon(Icons.stars_outlined), + title: const Text('Von Favoriten entfernen'), + onPressed: _toggleFavorite, + ) + else + AsyncListTile( + leading: const Icon(Icons.star_outline), + title: const Text('Zu Favoriten hinzufügen'), + onPressed: _toggleFavorite, + ), + const Divider(), + ListTile( + leading: Icon( + Icons.delete_outline, + color: Theme.of(context).colorScheme.error, + ), + title: Text( + 'Talk-Chat verlassen', + style: TextStyle(color: Theme.of(context).colorScheme.error), + ), + onTap: _confirmLeave, + ), + ], ), ); }