diff --git a/lib/components/list_items/presence_list_item.dart b/lib/components/list_items/presence_list_item.dart index c9c9fb1..5e4a939 100644 --- a/lib/components/list_items/presence_list_item.dart +++ b/lib/components/list_items/presence_list_item.dart @@ -1,7 +1,7 @@ import 'package:famedlysdk/famedlysdk.dart'; -import 'package:fluffychat/components/dialogs/presence_dialog.dart'; import 'package:fluffychat/utils/app_route.dart'; import 'package:fluffychat/views/chat.dart'; +import 'package:fluffychat/views/presence_view.dart'; import 'package:flutter/material.dart'; import '../avatar.dart'; import '../matrix.dart'; @@ -33,13 +33,22 @@ class PresenceListItem extends StatelessWidget { borderRadius: BorderRadius.circular(8), onTap: () => presence?.presence?.statusMsg == null ? _startChatAction(context, user.id) - : showDialog( + : /*showDialog( context: context, builder: (_) => PresenceDialog( presence, avatarUrl: user.avatarUrl, displayname: user.calcDisplayname(), ), + ),*/ + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => PresenceView( + presence: presence, + avatarUrl: user.avatarUrl, + displayname: user.calcDisplayname(), + ), + ), ), child: Container( width: 76, diff --git a/lib/views/chat.dart b/lib/views/chat.dart index 7abda92..ad726c4 100644 --- a/lib/views/chat.dart +++ b/lib/views/chat.dart @@ -8,7 +8,6 @@ import 'package:fluffychat/components/adaptive_page_layout.dart'; import 'package:fluffychat/components/avatar.dart'; import 'package:fluffychat/components/chat_settings_popup_menu.dart'; import 'package:fluffychat/components/connection_status_header.dart'; -import 'package:fluffychat/components/dialogs/presence_dialog.dart'; import 'package:fluffychat/components/dialogs/recording_dialog.dart'; import 'package:fluffychat/components/dialogs/simple_dialogs.dart'; import 'package:fluffychat/components/encryption_button.dart'; @@ -460,24 +459,16 @@ class _ChatState extends State<_Chat> { return ListTile( leading: Avatar(room.avatar, room.displayname), contentPadding: EdgeInsets.zero, - onTap: () => - room.isDirectChat && room.directChatPresence == null + onTap: room.isDirectChat && room.directChatPresence == null + ? null + : room.isDirectChat ? null - : room.isDirectChat - ? showDialog( - context: context, - builder: (c) => PresenceDialog( - room.directChatPresence, - avatarUrl: room.avatar, - displayname: room.displayname, - ), - ) - : Navigator.of(context).push( - AppRoute.defaultRoute( - context, - ChatDetails(room), - ), + : () => Navigator.of(context).push( + AppRoute.defaultRoute( + context, + ChatDetails(room), ), + ), title: Text( room.getLocalizedDisplayname( MatrixLocals(L10n.of(context))), diff --git a/lib/views/chat_list.dart b/lib/views/chat_list.dart index 7e24b48..1bbfe18 100644 --- a/lib/views/chat_list.dart +++ b/lib/views/chat_list.dart @@ -8,6 +8,7 @@ import 'package:fluffychat/components/dialogs/simple_dialogs.dart'; import 'package:fluffychat/components/list_items/presence_list_item.dart'; import 'package:fluffychat/components/list_items/public_room_list_item.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/views/presence_view.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; @@ -198,18 +199,20 @@ class _ChatListState extends State { void _setStatus(BuildContext context) async { Navigator.of(context).pop(); - final status = await SimpleDialogs(context).enterText( - multiLine: true, - titleText: L10n.of(context).setStatus, - labelText: L10n.of(context).setStatus, - hintText: L10n.of(context).statusExampleMessage, - ); - if (status?.isEmpty ?? true) return; - await SimpleDialogs(context).tryRequestWithLoadingDialog( - Matrix.of(context).client.sendPresence( - Matrix.of(context).client.userID, PresenceType.online, - statusMsg: status), - ); + final ownProfile = await SimpleDialogs(context) + .tryRequestWithLoadingDialog(Matrix.of(context).client.ownProfile); + if (ownProfile is Profile) { + await Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => PresenceView( + composeMode: true, + avatarUrl: ownProfile.avatarUrl, + displayname: ownProfile.displayname, + ), + ), + ); + } + return; } @override diff --git a/lib/views/presence_view.dart b/lib/views/presence_view.dart new file mode 100644 index 0000000..d48c1de --- /dev/null +++ b/lib/views/presence_view.dart @@ -0,0 +1,147 @@ +import 'package:famedlysdk/famedlysdk.dart'; +import 'package:fluffychat/components/avatar.dart'; +import 'package:fluffychat/components/dialogs/simple_dialogs.dart'; +import 'package:fluffychat/components/matrix.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:fluffychat/utils/app_route.dart'; +import 'package:fluffychat/utils/string_color.dart'; +import 'package:flutter/material.dart'; +import 'package:fluffychat/utils/presence_extension.dart'; + +import 'chat.dart'; + +class PresenceView extends StatelessWidget { + final Uri avatarUrl; + final String displayname; + final Presence presence; + final bool composeMode; + final TextEditingController _composeController = TextEditingController(); + + PresenceView({ + this.composeMode = false, + this.presence, + this.avatarUrl, + this.displayname, + Key key, + }) : super(key: key); + + void _sendMessageAction(BuildContext context) async { + final roomId = await User( + presence.senderId, + room: Room(id: '', client: Matrix.of(context).client), + ).startDirectChat(); + await Navigator.of(context).pushAndRemoveUntil( + AppRoute.defaultRoute( + context, + ChatView(roomId), + ), + (Route r) => r.isFirst); + } + + void _setStatusAction(BuildContext context) async { + if (_composeController.text.isEmpty) return; + await SimpleDialogs(context).tryRequestWithLoadingDialog( + Matrix.of(context).client.sendPresence( + Matrix.of(context).client.userID, PresenceType.online, + statusMsg: _composeController.text), + ); + await Navigator.of(context).popUntil((Route r) => r.isFirst); + } + + @override + Widget build(BuildContext context) { + if (composeMode == false && presence == null) { + throw ('If composeMode is null then the presence must be not null!'); + } + final padding = const EdgeInsets.only( + top: 16.0, + right: 16.0, + left: 16.0, + bottom: 64.0, + ); + return Scaffold( + backgroundColor: displayname.color, + extendBody: true, + appBar: AppBar( + brightness: Brightness.dark, + leading: IconButton( + icon: Icon( + Icons.close, + color: Colors.white, + ), + onPressed: Navigator.of(context).pop, + ), + backgroundColor: Colors.transparent, + elevation: 1, + title: ListTile( + contentPadding: EdgeInsets.zero, + leading: Avatar(avatarUrl, displayname), + title: Text( + displayname, + style: TextStyle(color: Colors.white), + ), + subtitle: Text( + presence?.senderId ?? Matrix.of(context).client.userID, + style: TextStyle(color: Colors.white), + ), + ), + ), + body: Container( + alignment: Alignment.center, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + displayname.color, + Theme.of(context).primaryColor, + displayname.color, + ], + ), + ), + child: composeMode + ? Padding( + padding: padding, + child: TextField( + controller: _composeController, + autofocus: true, + minLines: 1, + maxLines: 20, + style: TextStyle( + fontSize: 30, + color: Colors.white, + ), + textAlign: TextAlign.center, + decoration: InputDecoration( + border: InputBorder.none, + ), + ), + ) + : ListView( + shrinkWrap: true, + padding: padding, + children: [ + Text( + presence.getLocalizedStatusMessage(context), + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 30, + color: Colors.white, + ), + ), + ], + ), + ), + floatingActionButton: FloatingActionButton.extended( + backgroundColor: Theme.of(context).primaryColor, + icon: Icon(composeMode ? Icons.edit : Icons.message_outlined), + label: Text(composeMode + ? L10n.of(context).setStatus + : L10n.of(context).sendAMessage), + onPressed: () => composeMode + ? _setStatusAction(context) + : _sendMessageAction(context), + ), + ); + } +}