feat: make sensor and tag lists refreshable

This commit is contained in:
2026-05-19 20:13:31 +02:00
parent 48264fb122
commit 845276bac7
2 changed files with 56 additions and 21 deletions
+28 -13
View File
@@ -40,25 +40,40 @@ class SensorListScreen extends ConsumerWidget {
error: (e, _) => Center(child: Text(e.toString())),
data: (list) {
if (list.isEmpty) {
return const Center(child: Text('No sensors enrolled yet'));
return RefreshIndicator(
onRefresh: () => ref.refresh(sensorsProvider.future),
child: const CustomScrollView(
physics: AlwaysScrollableScrollPhysics(),
slivers: [
SliverFillRemaining(
child: Center(
child: Text('No sensors enrolled yet')),
),
],
),
);
}
final unplaced =
list.where((s) => !s.isPlaced).toList();
final placed =
list.where((s) => s.isPlaced).toList();
return ListView(
children: [
if (unplaced.isNotEmpty) ...[
_SectionHeader(
label: 'Unplaced', count: unplaced.length),
...unplaced.map((s) => _SensorTile(sensor: s)),
return RefreshIndicator(
onRefresh: () => ref.refresh(sensorsProvider.future),
child: ListView(
physics: const AlwaysScrollableScrollPhysics(),
children: [
if (unplaced.isNotEmpty) ...[
_SectionHeader(
label: 'Unplaced', count: unplaced.length),
...unplaced.map((s) => _SensorTile(sensor: s)),
],
if (placed.isNotEmpty) ...[
_SectionHeader(
label: 'Placed', count: placed.length),
...placed.map((s) => _SensorTile(sensor: s)),
],
],
if (placed.isNotEmpty) ...[
_SectionHeader(
label: 'Placed', count: placed.length),
...placed.map((s) => _SensorTile(sensor: s)),
],
],
),
);
},
),
+28 -8
View File
@@ -29,15 +29,35 @@ class TagListScreen extends ConsumerWidget {
error: (e, _) => Center(child: Text(e.toString())),
data: (list) {
if (list.isEmpty) {
return const Center(child: Text('No tags enrolled yet'));
return RefreshIndicator(
onRefresh: () {
ref.invalidate(roomOccupancyProvider);
return ref.refresh(tagsProvider.future);
},
child: const CustomScrollView(
physics: AlwaysScrollableScrollPhysics(),
slivers: [
SliverFillRemaining(
child: Center(child: Text('No tags enrolled yet')),
),
],
),
);
}
return ListView(
children: list
.map((t) => _TagTile(
tag: t,
roomId: tagRoomMap[t.tagId],
))
.toList(),
return RefreshIndicator(
onRefresh: () {
ref.invalidate(roomOccupancyProvider);
return ref.refresh(tagsProvider.future);
},
child: ListView(
physics: const AlwaysScrollableScrollPhysics(),
children: list
.map((t) => _TagTile(
tag: t,
roomId: tagRoomMap[t.tagId],
))
.toList(),
),
);
},
),