mirror of
https://github.com/R0m1k3/xtremflow.git
synced 2026-10-22 22:48:04 +02:00
Rebranche les fonctionnalités codées mais inaccessibles
Onglet Enregistrements : - TabBar à 3 vues : Guide TV (programmer depuis l'EPG), liste des enregistrements, Season Passes. _EpgGuideView et _SeasonPassesView (~800 lignes fonctionnelles) n'étaient plus instanciés depuis une refonte — programmer depuis le guide et les enregistrements récurrents étaient devenus inaccessibles - Confirmation avant suppression d'un enregistrement (la corbeille supprimait immédiatement, sans retour ni annulation) - Erreur de chargement avec bouton Réessayer Favoris : - Bouton cœur sur les tuiles chaînes desktop (overlay) et mobile : toggleFavorite() n'était appelé nulle part, le filtre « Favoris » affichait toujours une liste vide Reprise de lecture : - Films et épisodes lisent playbackPositionsProvider et passent startTime au player : les positions étaient écrites mais jamais relues, tout repartait de zéro - Plus de sauvegarde de position en live (une entrée bidon par chaîne zappée) Mobile : - 5e onglet REC réutilisant RecordingsTab - IndexedStack au lieu du switch : les onglets conservent scroll et catalogues chargés (aligné sur le dashboard desktop) Dashboard : - Menu profil sur l'avatar de la sidebar (nom d'utilisateur + déconnexion) : le bouton était mort, aucune déconnexion possible depuis le dashboard desktop - Erreur de chargement des chaînes avec bouton Réessayer Validé : flutter analyze (202 issues, identique à la baseline main, 0 erreur/warning), flutter test (OK), flutter build web --release (OK). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015oEu9QayWsw7hCKhenxgVa
This commit is contained in:
10 files changed
+294
-47
No files matched your search
@@ -63,8 +63,23 @@ class _LiveTVTabState extends ConsumerState<LiveTVTab>
|
||||
body: channelsAsync.when(
|
||||
loading: () => const ThemedLoading(),
|
||||
error: (e, s) => Center(
|
||||
child: Text('Error: $e',
|
||||
style: const TextStyle(color: AppColors.onSurface)),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
const Text(
|
||||
'Impossible de charger les chaînes',
|
||||
style: TextStyle(color: AppColors.onSurface),
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
OutlinedButton.icon(
|
||||
icon: const Icon(Icons.refresh, size: 18),
|
||||
label: const Text('Réessayer'),
|
||||
onPressed: () => ref.invalidate(
|
||||
liveChannelsByPlaylistProvider(widget.playlist),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
data: (groupedChannels) {
|
||||
var categories = groupedChannels.keys.toList();
|
||||
@@ -515,6 +530,43 @@ class _LiveTVTabState extends ConsumerState<LiveTVTab>
|
||||
),
|
||||
],
|
||||
),
|
||||
// Favori (Positioned top left) — toggleFavorite n'était appelé
|
||||
// nulle part : le filtre « Favoris » affichait toujours vide.
|
||||
Positioned(
|
||||
top: 8,
|
||||
left: 8,
|
||||
child: Consumer(
|
||||
builder: (context, ref, _) {
|
||||
final isFav = ref
|
||||
.watch(favoritesProvider)
|
||||
.contains(channel.streamId);
|
||||
return TvFocusableCard(
|
||||
onTap: () => ref
|
||||
.read(favoritesProvider.notifier)
|
||||
.toggleFavorite(channel.streamId),
|
||||
borderRadius: 20,
|
||||
scaleFactor: 1.2,
|
||||
semanticLabel: isFav
|
||||
? 'Retirer ${channel.name} des favoris'
|
||||
: 'Ajouter ${channel.name} aux favoris',
|
||||
child: Container(
|
||||
padding: const EdgeInsets.all(6),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.black.withOpacity(0.5),
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
child: Icon(
|
||||
isFav ? Icons.favorite : Icons.favorite_border,
|
||||
color: isFav
|
||||
? AppColors.primary
|
||||
: AppColors.onSurface54,
|
||||
size: 16,
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
// Record Button Icon Overlay (Positioned top right)
|
||||
Positioned(
|
||||
top: 8,
|
||||
|
||||
Reference in new issue
Block a user