86 lines
2.6 KiB
Dart
86 lines
2.6 KiB
Dart
import 'package:flutter/material.dart';
|
|
import '../providers/mqtt_provider.dart';
|
|
|
|
class HistoryList extends StatelessWidget {
|
|
final MQTTProvider provider;
|
|
|
|
const HistoryList({super.key, required this.provider});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
if (provider.history.isEmpty) {
|
|
return const Card(
|
|
child: Padding(
|
|
padding: EdgeInsets.all(24),
|
|
child: Center(
|
|
child: Text('Belum ada riwayat aktivitas',
|
|
style: TextStyle(color: Colors.grey))),
|
|
),
|
|
);
|
|
}
|
|
|
|
return Card(
|
|
child: ListView.separated(
|
|
shrinkWrap: true,
|
|
physics: const NeverScrollableScrollPhysics(),
|
|
itemCount: provider.history.length > 20 ? 20 : provider.history.length,
|
|
separatorBuilder: (context, index) => const Divider(height: 1),
|
|
itemBuilder: (context, index) {
|
|
final item = provider.history[index];
|
|
return ListTile(
|
|
leading: _buildIcon(item['type'], item['value']),
|
|
title: Text(item['value'], style: const TextStyle(fontSize: 13)),
|
|
subtitle: Text(
|
|
'${_formatTime(item['time'])} • ${item['mode'] == 'manual' ? 'Manual' : 'Otomatis'}',
|
|
style: const TextStyle(fontSize: 11),
|
|
),
|
|
);
|
|
},
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget _buildIcon(String type, String value) {
|
|
IconData icon;
|
|
Color color;
|
|
|
|
if (value.contains('Orang terdeteksi')) {
|
|
icon = Icons.people;
|
|
color = Colors.green;
|
|
} else if (value.contains('Ruangan kosong')) {
|
|
icon = Icons.people_outline;
|
|
color = Colors.grey;
|
|
} else if (value.contains('Menyala')) {
|
|
icon = Icons.power;
|
|
color = Colors.green;
|
|
} else if (value.contains('Mati')) {
|
|
icon = Icons.power_off;
|
|
color = Colors.red;
|
|
} else if (value.contains('Suhu')) {
|
|
icon = Icons.thermostat;
|
|
color = Colors.orange;
|
|
} else if (value.contains('Mode')) {
|
|
icon = Icons.settings;
|
|
color = Colors.blue;
|
|
} else if (value.contains('timer') || value.contains('delay')) {
|
|
icon = Icons.timer;
|
|
color = Colors.orange;
|
|
} else if (value.contains('Timer delay')) {
|
|
icon = Icons.timer_off;
|
|
color = Colors.red;
|
|
} else {
|
|
icon = Icons.info;
|
|
color = Colors.grey;
|
|
}
|
|
|
|
return CircleAvatar(
|
|
radius: 16,
|
|
backgroundColor: color.withOpacity(0.2),
|
|
child: Icon(icon, size: 16, color: color));
|
|
}
|
|
|
|
String _formatTime(DateTime time) {
|
|
return '${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}:${time.second.toString().padLeft(2, '0')}';
|
|
}
|
|
}
|