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/dialogs/dialog.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: [ Container( margin: const EdgeInsets.only(left: 12, right: 12), padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), decoration: BoxDecoration( color: AppColor.primary10, borderRadius: BorderRadius.circular(35), ), child: Row( spacing: 8, mainAxisSize: MainAxisSize.min, children: [ ("edit_icon").toSvgAsset(height: 20, width: 20, color: AppColor.background(context)), Text( "New Chat", style: AppTextStyles.bodyText2.copyWith(color: AppColor.background(context)), ), ], ), ).onPress(_startNewConversation), ], ), 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, spacing: 12, children: [ Icon(Icons.search_off, color: AppColor.icon2Color(context), size: 24), Text( "No conversations yet", style: AppTextStyles.heading6.copyWith(color: AppColor.lightTextColor(context)), ), ], ).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: SafeArea( 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: [ ("copilot_chat").toSvgAsset(height: 24, width: 24, 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 { bool result = await showDialog( context: context, builder: (_) => AAlertDialog( title: "Confirm".addTranslation, content: "Are you sure you want to delete?".addTranslation, ), ); if (result) { 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); }); } }