HomeServer/frontend/lib/devices.dart
2023-10-06 08:50:31 +02:00

86 lines
2.2 KiB
Dart

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 = [];
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);
}
return categories;
} else {
throw Exception("Failed to fetch devices");
}
}
}
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)]);
}
}
class Device {
final String device_id;
String? device_descriptor;
bool led_state;
bool power_state;
double power_draw;
Device(this.device_id, this.device_descriptor, this.led_state,
this.power_state, this.power_draw);
}