From 47667c50e1a62085d231ebbbbcadb7cdbdfdda5a Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Mon, 8 Dec 2025 22:02:41 +0100 Subject: [PATCH] feat: Add IPTV settings tab for managing category filters, streaming options, appearance, and admin access, and introduce a new server entry point. --- bin/server.dart | 2 +- lib/features/iptv/widgets/settings_tab.dart | 61 ++++++++++++++++++++ verify_cache_fix.txt | Bin 0 -> 18690 bytes verify_cache_fix_retry.txt | Bin 0 -> 84576 bytes 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 verify_cache_fix.txt create mode 100644 verify_cache_fix_retry.txt diff --git a/bin/server.dart b/bin/server.dart index 17efc6b..acd27a5 100644 --- a/bin/server.dart +++ b/bin/server.dart @@ -106,7 +106,7 @@ void main(List args) async { final path = request.url.path; if (path.isEmpty || path == 'index.html' || - path == 'flutter_service_worker.js' || + path.endsWith('.js') || // Disable cache for ALL JS files (main.dart.js, bootstrap, etc) path.endsWith('.json')) { // version.json etc return response.change(headers: { 'Cache-Control': 'no-store, no-cache, must-revalidate, max-age=0', diff --git a/lib/features/iptv/widgets/settings_tab.dart b/lib/features/iptv/widgets/settings_tab.dart index c2d1241..3a276cd 100644 --- a/lib/features/iptv/widgets/settings_tab.dart +++ b/lib/features/iptv/widgets/settings_tab.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'dart:html' as html; // For reloading import '../../auth/providers/auth_provider.dart'; import '../providers/settings_provider.dart'; import 'streaming_settings_tab.dart'; @@ -431,6 +432,66 @@ class _SettingsTabState extends ConsumerState with SingleTickerProv ), ), ), + const SizedBox(height: 16), + + // Maintenance Section + Container( + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.05), + borderRadius: BorderRadius.circular(16), + border: Border.all(color: Colors.orange.withOpacity(0.3)), + ), + child: ListTile( + leading: const Icon(Icons.cleaning_services, color: Colors.orange), + title: Text('Maintenance', style: GoogleFonts.roboto(color: Colors.white)), + subtitle: Text( + 'En cas de problèmes d\'affichage ou de mise à jour', + style: GoogleFonts.roboto(fontSize: 12, color: Colors.white54), + ), + trailing: FilledButton.icon( + onPressed: () { + // Show confirmation dialog + showDialog( + context: context, + builder: (context) => AlertDialog( + backgroundColor: const Color(0xFF1E1E1E), + title: const Text('Vider le cache ?', style: TextStyle(color: Colors.white)), + content: const Text( + 'Cette action va recharger l\'application et effacer les données temporaires.\n' + 'Vos réglages et favoris sont sauvegardés sur le serveur.', + style: TextStyle(color: Colors.white70), + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: const Text('Annuler'), + ), + FilledButton( + style: FilledButton.styleFrom(backgroundColor: Colors.orange), + onPressed: () { + Navigator.pop(context); + // Clear PaintingCache + PaintingBinding.instance.imageCache.clear(); + PaintingBinding.instance.imageCache.clearLiveImages(); + + // Reload application + html.window.location.reload(); + }, + child: const Text('Vider et Recharger'), + ), + ], + ) + ); + }, + icon: const Icon(Icons.refresh, size: 16), + label: const Text('Vider le Cache'), + style: FilledButton.styleFrom( + backgroundColor: Colors.orange.withOpacity(0.2), + foregroundColor: Colors.orange, + ), + ), + ), + ), const SizedBox(height: 24), // Logout button diff --git a/verify_cache_fix.txt b/verify_cache_fix.txt new file mode 100644 index 0000000000000000000000000000000000000000..9fd841325b33d96360bff30d25ec506ebab984ee GIT binary patch literal 18690 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 literal 0 HcmV?d00001 diff --git a/verify_cache_fix_retry.txt b/verify_cache_fix_retry.txt new file mode 100644 index 0000000000000000000000000000000000000000..5bae335b2377e80c8fb0084569ddaebb180d76d5 GIT binary patch literal 84576 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 JMQ0fE{{!#xbMgQH literal 0 HcmV?d00001