import 'package:auto_gpt_flutter_client/models/benchmark/benchmark_task_status.dart'; import 'package:auto_gpt_flutter_client/models/test_option.dart'; import 'package:auto_gpt_flutter_client/viewmodels/chat_viewmodel.dart'; import 'package:auto_gpt_flutter_client/viewmodels/skill_tree_viewmodel.dart'; import 'package:auto_gpt_flutter_client/viewmodels/task_queue_viewmodel.dart'; import 'package:auto_gpt_flutter_client/viewmodels/task_viewmodel.dart'; import 'package:auto_gpt_flutter_client/views/task_queue/test_suite_button.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class TaskQueueView extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: This should be injected instead final viewModel = Provider.of(context); // Node hierarchy final nodeHierarchy = viewModel.selectedNodeHierarchy ?? []; return Material( color: Colors.white, child: Column( children: [ // The list of tasks (tiles) Expanded( child: ListView.builder( itemCount: nodeHierarchy.length, itemBuilder: (context, index) { final node = nodeHierarchy[index]; // Choose the appropriate leading widget based on the task status Widget leadingWidget; switch (viewModel.benchmarkStatusMap[node]) { case null: case BenchmarkTaskStatus.notStarted: leadingWidget = CircleAvatar( radius: 12, backgroundColor: Colors.grey, child: CircleAvatar( radius: 6, backgroundColor: Colors.white, ), ); break; case BenchmarkTaskStatus.inProgress: leadingWidget = SizedBox( width: 24, height: 24, child: CircularProgressIndicator( strokeWidth: 2, ), ); break; case BenchmarkTaskStatus.success: leadingWidget = CircleAvatar( radius: 12, backgroundColor: Colors.green, child: CircleAvatar( radius: 6, backgroundColor: Colors.white, ), ); break; case BenchmarkTaskStatus.failure: leadingWidget = CircleAvatar( radius: 12, backgroundColor: Colors.red, child: CircleAvatar( radius: 6, backgroundColor: Colors.white, ), ); break; } return Container( margin: EdgeInsets.fromLTRB(20, 5, 20, 5), decoration: BoxDecoration( color: Colors.white, border: Border.all(color: Colors.black, width: 1), borderRadius: BorderRadius.circular(4), ), child: ListTile( leading: leadingWidget, title: Center(child: Text('${node.label}')), subtitle: Center(child: Text('${node.data.info.description}')), ), ); }, ), ), // Buttons at the bottom Padding( padding: EdgeInsets.all(20), child: Column( children: [ // TestSuiteButton TestSuiteButton( isDisabled: viewModel.isBenchmarkRunning, selectedOptionString: viewModel.selectedOption.description, onOptionSelected: (selectedOption) { print('Option Selected: $selectedOption'); final skillTreeViewModel = Provider.of(context, listen: false); viewModel.updateSelectedNodeHierarchyBasedOnOption( TestOptionExtension.fromDescription(selectedOption)!, skillTreeViewModel.selectedNode, skillTreeViewModel.skillTreeNodes, skillTreeViewModel.skillTreeEdges); }, onPlayPressed: (selectedOption) { print('Starting benchmark with option: $selectedOption'); final chatViewModel = Provider.of(context, listen: false); final taskViewModel = Provider.of(context, listen: false); chatViewModel.clearCurrentTaskAndChats(); viewModel.runBenchmark(chatViewModel, taskViewModel); }, ), SizedBox(height: 8), // Gap of 8 points between buttons ], ), ), ], ), ); } }