2023-10-05 12:54:11 +00:00
|
|
|
import 'dart:async';
|
|
|
|
import 'dart:convert';
|
|
|
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:http/http.dart' as http;
|
|
|
|
|
|
|
|
class Category {
|
|
|
|
final String name;
|
|
|
|
List<Device> devices;
|
|
|
|
|
|
|
|
Category(this.name) : devices = [];
|
|
|
|
|
|
|
|
static Future<List<Category>> fetch(String base_url) async {
|
|
|
|
final response = await http.get(Uri.parse("$base_url/devices"));
|
|
|
|
|
|
|
|
if (response.statusCode == 200) {
|
|
|
|
List<Category> categories = [];
|
|
|
|
|
2023-10-06 06:50:31 +00:00
|
|
|
Map<String, List<Map<String, dynamic>>> json = jsonDecode(response.body);
|
|
|
|
|
|
|
|
for (MapEntry<String, List<Map<String, dynamic>>> category_entry
|
|
|
|
in json.entries) {
|
|
|
|
Category category = Category(category_entry.key);
|
|
|
|
|
|
|
|
for (Map<String, dynamic> device_map in category_entry.value) {
|
|
|
|
Device device = Device(
|
|
|
|
device_map["device_id"],
|
|
|
|
device_map["device_descriptor"],
|
|
|
|
device_map["led"],
|
|
|
|
device_map["power"],
|
|
|
|
device_map["power_draw"]);
|
|
|
|
|
|
|
|
category.devices.add(device);
|
|
|
|
}
|
|
|
|
|
|
|
|
categories.add(category);
|
|
|
|
}
|
2023-10-05 12:54:11 +00:00
|
|
|
|
|
|
|
return categories;
|
|
|
|
} else {
|
|
|
|
throw Exception("Failed to fetch devices");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-10-06 06:50:31 +00:00
|
|
|
class CategoryWidget extends StatelessWidget {
|
|
|
|
Category category;
|
|
|
|
|
|
|
|
CategoryWidget({super.key, required this.category});
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
var list = category.devices
|
|
|
|
.map((device) => TableRow(children: [
|
|
|
|
Text(device.device_descriptor ?? device.device_id),
|
|
|
|
Text(device.led_state.toString()),
|
|
|
|
Text(device.power_state.toString()),
|
|
|
|
Text("${device.power_draw.toString()} W")
|
|
|
|
]))
|
|
|
|
.toList();
|
|
|
|
|
|
|
|
list.insert(
|
|
|
|
0,
|
|
|
|
const TableRow(children: [
|
|
|
|
Text("Name"),
|
|
|
|
Text("LED"),
|
|
|
|
Text("Power"),
|
|
|
|
Text("Power Draw"),
|
|
|
|
]));
|
|
|
|
|
|
|
|
return Column(
|
|
|
|
children: <Widget>[Text(category.name), Table(children: list)]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-10-05 12:54:11 +00:00
|
|
|
class Device {
|
2023-10-06 06:50:31 +00:00
|
|
|
final String device_id;
|
|
|
|
String? device_descriptor;
|
2023-10-05 12:54:11 +00:00
|
|
|
bool led_state;
|
|
|
|
bool power_state;
|
|
|
|
double power_draw;
|
|
|
|
|
2023-10-06 06:50:31 +00:00
|
|
|
Device(this.device_id, this.device_descriptor, this.led_state,
|
|
|
|
this.power_state, this.power_draw);
|
2023-10-05 12:54:11 +00:00
|
|
|
}
|