From 33c900b73f5b3a1271ec409eda1a4c5794896977 Mon Sep 17 00:00:00 2001 From: hunteraraujo Date: Thu, 24 Aug 2023 21:17:11 -0700 Subject: [PATCH] Add AgentMessageTile Widget with Tests This commit introduces the AgentMessageTile widget, a core component of the chat interface. The widget is designed to display agent messages, including a collapsible section for displaying a pretty-printed JSON code snippet. The following features have been implemented: - Rendering of agent title, message text, and expand/collapse button. - Expandable section for displaying a JSON code snippet, complete with copy functionality. - A minimum height constraint to ensure consistent appearance. - Widget tests to validate rendering and interaction behavior. These enhancements contribute to the overall chat functionality, providing a clear and interactive display of agent messages. --- lib/views/chat/agent_message_tile.dart | 121 +++++++++++++++++++++++++ test/agent_message_tile_test.dart | 46 ++++++++++ 2 files changed, 167 insertions(+) create mode 100644 lib/views/chat/agent_message_tile.dart create mode 100644 test/agent_message_tile_test.dart diff --git a/lib/views/chat/agent_message_tile.dart b/lib/views/chat/agent_message_tile.dart new file mode 100644 index 00000000..d34a8c6d --- /dev/null +++ b/lib/views/chat/agent_message_tile.dart @@ -0,0 +1,121 @@ +import 'package:auto_gpt_flutter_client/views/chat/json_code_snippet_view.dart'; +import 'package:flutter/material.dart'; + +class AgentMessageTile extends StatefulWidget { + final String message; + + const AgentMessageTile({ + Key? key, + required this.message, // The agent message to be displayed + }) : super(key: key); + + @override + _AgentMessageTileState createState() => _AgentMessageTileState(); +} + +class _AgentMessageTileState extends State { + bool isExpanded = false; // State variable to toggle expanded view + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + double chatViewWidth = constraints.maxWidth; // Get the chat view width + double tileWidth = (chatViewWidth >= 1000) + ? 900 + : chatViewWidth - 40; // Determine tile width + + return Align( + alignment: Alignment.center, + child: Container( + width: tileWidth, + margin: const EdgeInsets.symmetric(vertical: 8), + padding: const EdgeInsets.symmetric(horizontal: 20), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: Colors.black, width: 0.5), + borderRadius: BorderRadius.circular(4), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + // Container for Agent title, message, and controls + Container( + constraints: const BoxConstraints(minHeight: 50), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // Agent title + const Text( + "Agent", + style: TextStyle( + color: Colors.black, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(width: 20), + // Message content + Expanded( + child: Container( + padding: const EdgeInsets.fromLTRB(0, 10, 20, 10), + child: Text( + widget.message, + maxLines: null, + ), + ), + ), + // Artifacts button (static for now) + ElevatedButton( + onPressed: () {}, + style: ElevatedButton.styleFrom( + backgroundColor: Colors.white, + foregroundColor: Colors.black, + side: const BorderSide(color: Colors.black), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), + child: const Text("2 Artifacts"), + ), + const SizedBox(width: 20), + // Expand/Collapse button + IconButton( + icon: Icon(isExpanded + ? Icons.keyboard_arrow_up + : Icons.keyboard_arrow_down), + onPressed: () { + setState(() { + isExpanded = !isExpanded; // Toggle expanded view + }); + }, + ), + ], + ), + ), + // Expanded view with JSON code snippet and copy button + if (isExpanded) ...[ + const Divider(), + const ClipRect( + child: SizedBox( + height: 200, + child: Padding( + padding: EdgeInsets.only( + right: 20), // Padding for the right side + child: JsonCodeSnippetView( + // JSON code snippet view + jsonString: + "{\"input\":\"Washington\",\"additional_input\":{\"file_to_refactor\":\"models.py\"},\"task_id\":\"50da533e-3904-4401-8a07-c49adf88b5eb\",\"step_id\":\"6bb1801a-fd80-45e8-899a-4dd723cc602e\",\"name\":\"Writetofile\",\"status\":\"created\",\"output\":\"Iamgoingtousethewrite_to_filecommandandwriteWashingtontoafilecalledoutput.txt