diff --git a/lib/pangea/activity_sessions/activity_session_chat/activity_role_tooltip.dart b/lib/pangea/activity_sessions/activity_session_chat/activity_role_tooltip.dart new file mode 100644 index 000000000..ed4f804a8 --- /dev/null +++ b/lib/pangea/activity_sessions/activity_session_chat/activity_role_tooltip.dart @@ -0,0 +1,89 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pangea/activity_sessions/activity_room_extension.dart'; +import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart'; + +class ActivityRoleTooltip extends StatefulWidget { + final Choreographer choreographer; + + const ActivityRoleTooltip({ + required this.choreographer, + super.key, + }); + + @override + State createState() => ActivityRoleTooltipState(); +} + +class ActivityRoleTooltipState extends State { + Room get room => widget.choreographer.chatController.room; + StreamSubscription? _choreoSub; + + @override + void initState() { + super.initState(); + _choreoSub = widget.choreographer.stateStream.stream.listen((event) { + if (mounted) setState(() {}); + }); + } + + @override + void dispose() { + _choreoSub?.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + if (widget.choreographer.itController.willOpen || + room.showActivityChatUI && room.ownRole?.goal != null) { + return const SizedBox(); + } + + return Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surface, + border: Border( + top: BorderSide( + color: Theme.of(context).colorScheme.outline, + width: 0.1, + ), + ), + ), + child: AnimatedSize( + duration: FluffyThemes.animationDuration, + child: room.hasDismissedGoalTooltip + ? const SizedBox() + : Padding( + padding: const EdgeInsets.all(12.0), + child: Row( + spacing: 10.0, + children: [ + Expanded( + child: Text( + room.ownRole!.goal!, + style: const TextStyle( + fontSize: 12.0, + ), + textAlign: TextAlign.center, + ), + ), + IconButton( + icon: const Icon(Icons.close), + onPressed: () async { + await room.dismissGoalTooltip(); + if (mounted) setState(() {}); + }, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/pangea/chat/widgets/chat_input_bar.dart b/lib/pangea/chat/widgets/chat_input_bar.dart index 1890f6f53..11dc6d7dc 100644 --- a/lib/pangea/chat/widgets/chat_input_bar.dart +++ b/lib/pangea/chat/widgets/chat_input_bar.dart @@ -6,7 +6,7 @@ import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/chat/chat.dart'; import 'package:fluffychat/pages/chat/chat_emoji_picker.dart'; import 'package:fluffychat/pages/chat/reply_display.dart'; -import 'package:fluffychat/pangea/activity_sessions/activity_room_extension.dart'; +import 'package:fluffychat/pangea/activity_sessions/activity_session_chat/activity_role_tooltip.dart'; import 'package:fluffychat/pangea/chat/widgets/pangea_chat_input_row.dart'; import 'package:fluffychat/pangea/choreographer/widgets/it_bar.dart'; @@ -57,49 +57,9 @@ class ChatInputBarState extends State { child: SizeChangedLayoutNotifier( child: Column( children: [ - if (widget.controller.room.showActivityChatUI && - widget.controller.room.ownRole?.goal != null) - Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.surface, - border: Border( - top: BorderSide( - color: Theme.of(context).colorScheme.outline, - width: 0.1, - ), - ), - ), - child: AnimatedSize( - duration: FluffyThemes.animationDuration, - child: widget.controller.room.hasDismissedGoalTooltip - ? const SizedBox() - : Padding( - padding: const EdgeInsets.all(12.0), - child: Row( - spacing: 10.0, - children: [ - Expanded( - child: Text( - widget.controller.room.ownRole!.goal!, - style: const TextStyle( - fontSize: 12.0, - ), - textAlign: TextAlign.center, - ), - ), - IconButton( - icon: const Icon(Icons.close), - onPressed: () async { - await widget.controller.room - .dismissGoalTooltip(); - if (mounted) setState(() {}); - }, - ), - ], - ), - ), - ), - ), + ActivityRoleTooltip( + choreographer: widget.controller.choreographer, + ), Container( padding: EdgeInsets.only( bottom: widget.padding,