monitor2/lib/homepage/screen_homepage.dart
supercodeur 822418fe54
All checks were successful
continuous-integration/drone/push Build is passing
[VERSION CONTROL] - Add the killswitch
2025-05-24 20:39:35 +02:00

115 lines
3.5 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/material.dart';
import '../log/screen_logspage.dart';
import '../log/class_sitecheck.dart';
import '../log/class_sitelog.dart';
import 'dialog_addsite.dart';
class HomePage extends StatelessWidget {
final List<SiteCheck> sites;
final List<SiteLog> logs;
final Function(String) addSite;
final Function(int) removeSite;
final VoidCallback forceCheck;
final bool isChecking;
const HomePage({
super.key,
required this.sites,
required this.logs,
required this.addSite,
required this.removeSite,
required this.forceCheck,
required this.isChecking,
});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('🌐 Surveillance de sites'),
actions: [
IconButton(
icon: Icon(Icons.list_alt),
tooltip: 'Voir tous les logs',
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (_) => LogsPage(logs: logs)),
);
},
),
IconButton(
icon: isChecking
? SizedBox(
width: 24,
height: 24,
child: CircularProgressIndicator(
color: Colors.white,
strokeWidth: 3,
),
)
: Icon(Icons.refresh),
tooltip: isChecking
? 'Vérification en cours...'
: 'Forcer les tests',
onPressed: isChecking ? null : forceCheck,
),
],
),
body: ListView.builder(
itemCount: sites.length,
itemBuilder: (context, index) {
final site = sites[index];
final lastLog = logs.lastWhere(
(l) => l.url == site.url,
orElse: () => SiteLog(DateTime.now(), site.url, 0),
);
final isOk = lastLog.statusCode == 200;
return Card(
child: ListTile(
leading: Text(isOk ? '' : '', style: TextStyle(fontSize: 24)),
title: Text(site.url),
subtitle: lastLog.statusCode == 0
? Text('Aucune vérification')
: Text(
isOk ? 'OK' : 'Erreur: ${lastLog.statusCode}',
style: TextStyle(
color: isOk ? Colors.black : Colors.red.withAlpha(10),
fontWeight: isOk ? FontWeight.normal : FontWeight.bold,
),
),
tileColor: isOk ? null : Colors.red.withAlpha(10),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => LogsPage(
logs: logs.where((l) => l.url == site.url).toList(),
),
),
);
},
trailing: IconButton(
icon: Icon(Icons.delete, color: Colors.grey),
onPressed: () => removeSite(index),
),
),
);
},
),
floatingActionButton: FloatingActionButton(
child: Text('', style: TextStyle(fontSize: 24)),
onPressed: () async {
final url = await showDialog<String>(
context: context,
builder: (context) => AddSiteDialog(),
);
if (url != null && url.isNotEmpty) {
addSite(url);
}
},
),
);
}
}