AutoGPT/frontend/lib/views/task_queue/task_queue_view.dart

132 lines
5.2 KiB
Dart

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<TaskQueueViewModel>(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<SkillTreeViewModel>(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<ChatViewModel>(context, listen: false);
final taskViewModel =
Provider.of<TaskViewModel>(context, listen: false);
chatViewModel.clearCurrentTaskAndChats();
viewModel.runBenchmark(chatViewModel, taskViewModel);
},
),
SizedBox(height: 8), // Gap of 8 points between buttons
],
),
),
],
),
);
}
}