import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/modules/copilot/model/copilot_message_model.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/item_views/info_header_widget.dart'; import 'package:test_sa/views/widgets/item_views/info_text_widget.dart'; import '../controller/copilot_provider.dart'; import 'copilot_chat_page.dart' show CopilotChatPage; class CopilotHistoryPage extends StatefulWidget { static const String routeName = "/copilot-history"; const CopilotHistoryPage({Key? key}) : super(key: key); @override State createState() => _CopilotHistoryPageState(); } class _CopilotHistoryPageState extends State { String _searchQuery = ''; @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { context.read().loadHistory(); }); } void _openConversation(String threadId) { context.read().loadConversation(threadId); Navigator.pop(context); } void _startNewConversation() { context.read().startNewConversation(); Navigator.pop(context); } List _filteredHistory(List history) { final query = _searchQuery.trim().toLowerCase(); if (query.isEmpty) { return history; } return history.where((item) { return item.firstHumanMessage.toLowerCase().contains(query); }).toList(); } @override Widget build(BuildContext context) { return Scaffold( appBar: DefaultAppBar( title: "Copilot History", actions: [ IconButton( onPressed: _startNewConversation, style: const ButtonStyle(tapTargetSize: MaterialTapTargetSize.shrinkWrap), icon: Icon(Icons.chat_bubble, color: AppColor.icon2Color(context)), constraints: const BoxConstraints(), tooltip: "New Chat", ), ], ), body: Consumer( builder: (context, provider, _) { if (provider.historyLoading) { return const Center( child: CircularProgressIndicator(), ); } if (provider.history.isEmpty) { return Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( "No conversations yet", style: AppTextStyles.heading6.copyWith( color: AppColor.neutral120, ), ), 24.height, AppFilledButton( label: "Start a new conversation", maxWidth: true, buttonColor: AppColor.primary10, onPressed: _startNewConversation, ).paddingOnly( start: 48, end: 48, ), ], ).center; } final filteredHistory = _filteredHistory(provider.history); return Column( spacing: 8, children: [ _buildSearchBar(context), if (filteredHistory.isEmpty) Expanded( child: Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ Icon(Icons.search_off, color: AppColor.icon2Color(context), size: 20), 12.height, Text( "No conversations found", style: AppTextStyles.heading6.copyWith(color: AppColor.lightTextColor(context)), ), ], ).center, ) else Expanded( child: ListView.separated( padding: const EdgeInsets.all(16), itemCount: filteredHistory.length, separatorBuilder: (context, index) => 12.height, itemBuilder: (context, index) { final item = filteredHistory[index]; return messageHistoryCard(item: item, provider: provider); }, ), ), ], ); }, ), ); } Widget _buildSearchBar(BuildContext context) { return SearchBar( // focusNode: searchFocusNode, elevation: WidgetStateProperty.all(0), backgroundColor: WidgetStateProperty.all(AppColor.background(context)), leading: Icon(Icons.search, color: AppColor.iconColor(context)), textStyle: WidgetStateProperty.all( TextStyle(color: AppColor.textColor(context), fontSize: 16.0), ), hintStyle: WidgetStateProperty.all( TextStyle(color: AppColor.textColor(context), fontSize: 14.0), ), hintText: 'Search', onChanged: (queryString) { _searchQuery = queryString; setState(() {}); }, ).paddingOnly(top: 16, start: 16, end: 16); } Widget messageHistoryCard({required CopilotHistoryItem item, required CopilotProvider provider}) { return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, spacing: 12, children: [ Icon( Icons.chat_bubble, color: AppColor.icon2Color(context), ), Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, spacing: 4, children: [ InfoHeaderWidget(item.firstHumanMessage), InfoTextLabelWidget(label: item.updatedAt.toServiceRequestDetailsFormat), ], ).expanded, IconButton( onPressed: () async { Utils.showLoading(context); await provider.deleteHistory(item.threadId); Utils.hideLoading(context); }, style: const ButtonStyle(tapTargetSize: MaterialTapTargetSize.shrinkWrap), icon: "delete_icon".toSvgAsset(width: 20, height: 20), constraints: const BoxConstraints(), ), ], ).toShadowContainer(context).onPress(() { _openConversation(item.threadId); }); } }