feat: type remote device models

This commit is contained in:
Artem Kokos
2026-04-23 20:44:51 +07:00
parent 736a61d54b
commit fa403bfcce
9 changed files with 619 additions and 189 deletions

View File

@@ -1,13 +1,14 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../app/error_message.dart';
import '../models/ignis_group.dart';
import '../providers/providers.dart';
import 'color_picker.dart';
/// Карточка одной группы ламп с управлением:
/// вкл/выкл, яркость, температура, цвет, сцена.
class GroupCard extends ConsumerStatefulWidget {
final Map<String, dynamic> group;
final IgnisGroup group;
const GroupCard({super.key, required this.group});
@@ -29,14 +30,15 @@ class _GroupCardState extends ConsumerState<GroupCard> {
@override
Widget build(BuildContext context) {
final g = widget.group;
final id = g['id'].toString();
final name = g['name'] ?? 'Без имени';
final bool isOn = g['last_state']?['state'] ?? false;
final int bri = g['last_state']?['brightness'] ?? 100;
final int temp = g['last_state']?['temp'] ?? 4000;
final int r = g['last_state']?['r'] ?? 255;
final int gVal = g['last_state']?['g'] ?? 200;
final int b = g['last_state']?['b'] ?? 100;
final id = g.id;
final name = g.name;
final state = g.state;
final bool isOn = state.isOn;
final int bri = state.brightness;
final int temp = state.temp;
final int r = state.r;
final int gVal = state.g;
final int b = state.b;
ref.listen<GroupControlError?>(groupControlErrorProvider, (previous, next) {
if (next == null || next.groupId != id) return;
@@ -454,26 +456,13 @@ class _SceneSelectorState extends ConsumerState<_SceneSelector> {
spacing: 8,
runSpacing: 4,
children: scenes.map((scene) {
String sceneName;
String sceneId;
if (scene is String) {
sceneName = scene;
sceneId = scene;
} else if (scene is Map) {
sceneName = (scene['name'] ?? scene['id'] ?? scene.toString())
.toString();
sceneId = (scene['id'] ?? scene['name'] ?? scene.toString())
.toString();
} else {
sceneName = scene.toString();
sceneId = scene.toString();
}
return ActionChip(
label: Text(sceneName, style: const TextStyle(fontSize: 12)),
label: Text(
scene.displayName,
style: const TextStyle(fontSize: 12),
),
backgroundColor: Colors.white10,
onPressed: () => _setScene(sceneId),
onPressed: () => _setScene(scene.id),
);
}).toList(),
),