mirror of
https://github.com/R0m1k3/xtremflow.git
synced 2026-10-19 21:18:06 +02:00
Multi-IPTV : persister l'IPTV choisie dès le clic
Déconnecter Auto NBA sur une IPTV la déconnectait sur l'autre : les deux tombaient en fait sur la même règle. L'en-tête X-Playlist-Id était absent, donc le serveur repliait sur la playlist la plus récente, pour la lecture comme pour l'écriture. AuthedHttp lit localStorage['selected_playlist'], écrit jusqu'ici par le seul ref.listen de playlistPersistenceProvider. Or ce listener n'existe qu'une fois activeXtreamServiceProvider lu, c'est-à-dire une fois le tableau de bord construit : le premier choix d'une session changeait l'état avant que quiconque n'écoute, et n'était jamais écrit. - persistSelectedPlaylist écrit l'entrée ; le listener l'appelle. - selectPlaylist persiste puis pose l'état ; les deux écrans de sélection (web et mobile) passent par lui. Non vérifié localement : le SDK Flutter de cette machine (3.10.3) est antérieur au ^3.13.0 exigé par le projet. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
f45c2af677
commit
5169d0843a
3 files changed
+30
-11
No files matched your search
@@ -57,14 +57,35 @@ final selectedPlaylistProvider = StateProvider<PlaylistConfig?>((ref) {
|
|||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/// Écrit l'IPTV courante là où `AuthedHttp` la relit pour poser l'en-tête
|
||||||
|
/// `X-Playlist-Id`.
|
||||||
|
void persistSelectedPlaylist(PlaylistConfig? playlist) {
|
||||||
|
if (playlist != null) {
|
||||||
|
html.window.localStorage['selected_playlist'] =
|
||||||
|
jsonEncode(playlist.toJson());
|
||||||
|
} else {
|
||||||
|
html.window.localStorage.remove('selected_playlist');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Choisit l'IPTV courante et la persiste dans le même temps.
|
||||||
|
///
|
||||||
|
/// Écrire par le seul `playlistPersistenceProvider` ne suffit pas : son
|
||||||
|
/// `ref.listen` n'existe qu'une fois `activeXtreamServiceProvider` lu, c'est
|
||||||
|
/// à dire une fois le tableau de bord construit. Le tout premier choix d'une
|
||||||
|
/// session partait donc sans être écrit, `AuthedHttp` n'envoyait aucun
|
||||||
|
/// en-tête, et le serveur repliait sur la playlist la plus récente — les deux
|
||||||
|
/// IPTV retombaient alors sur la même, d'où une seule règle Auto NBA pour
|
||||||
|
/// les deux.
|
||||||
|
void selectPlaylist(WidgetRef ref, PlaylistConfig playlist) {
|
||||||
|
persistSelectedPlaylist(playlist);
|
||||||
|
ref.read(selectedPlaylistProvider.notifier).state = playlist;
|
||||||
|
}
|
||||||
|
|
||||||
// Listener to save selected playlist
|
// Listener to save selected playlist
|
||||||
final playlistPersistenceProvider = Provider<void>((ref) {
|
final playlistPersistenceProvider = Provider<void>((ref) {
|
||||||
ref.listen(selectedPlaylistProvider, (previous, next) {
|
ref.listen(selectedPlaylistProvider, (previous, next) {
|
||||||
if (next != null) {
|
persistSelectedPlaylist(next);
|
||||||
html.window.localStorage['selected_playlist'] = jsonEncode(next.toJson());
|
|
||||||
} else {
|
|
||||||
html.window.localStorage.remove('selected_playlist');
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -163,9 +163,7 @@ class PlaylistSelectionScreen extends ConsumerWidget {
|
|||||||
child: _PlaylistCard(
|
child: _PlaylistCard(
|
||||||
playlist: playlist,
|
playlist: playlist,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
ref
|
selectPlaylist(ref, playlist);
|
||||||
.read(selectedPlaylistProvider.notifier)
|
|
||||||
.state = playlist;
|
|
||||||
context.go('/dashboard');
|
context.go('/dashboard');
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -108,9 +108,9 @@ class MobilePlaylistSelectionScreen extends ConsumerWidget {
|
|||||||
return _MobilePlaylistCard(
|
return _MobilePlaylistCard(
|
||||||
playlist: playlist,
|
playlist: playlist,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
// Update provider which will be persisted
|
// Choix + persistance dans le même geste : l'en-tête
|
||||||
ref.read(selectedPlaylistProvider.notifier).state =
|
// X-Playlist-Id doit partir dès la première requête.
|
||||||
playlist;
|
selectPlaylist(ref, playlist);
|
||||||
// Navigate without extra (it will be picked up from provider)
|
// Navigate without extra (it will be picked up from provider)
|
||||||
context.go('/dashboard');
|
context.go('/dashboard');
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in new issue
Block a user