feat: introduce mobile player screen and lite player view with channel zapping functionality

This commit is contained in:
Michael committed 2026-03-09 14:52:41 +01:00
1 parent 4d1e08148b
commit 33c6385d7e
6 files changed
+92 -20

No files matched your search

@@ -1,3 +1,6 @@
import 'dart:convert';
import 'dart:html' as html;
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../../core/models/playlist_config.dart';
import '../services/xtream_service.dart';
@@ -23,14 +26,40 @@ final _singletonXtreamServiceProvider = Provider<XtreamService>((ref) {
return service;
});
/// Current selected playlist provider
final selectedPlaylistProvider = StateProvider<PlaylistConfig?>((ref) => null);
/// Current selected playlist provider with persistence for Web
final selectedPlaylistProvider = StateProvider<PlaylistConfig?>((ref) {
// Restore from localStorage if on web
try {
final stored = html.window.localStorage['selected_playlist'];
if (stored != null) {
final data = jsonDecode(stored) as Map<String, dynamic>;
return PlaylistConfig.fromJson(data);
}
} catch (e) {
debugPrint('Error restoring playlist: $e');
}
return null;
});
// Listener to save selected playlist
final playlistPersistenceProvider = Provider<void>((ref) {
ref.listen(selectedPlaylistProvider, (previous, next) {
if (next != null) {
html.window.localStorage['selected_playlist'] = jsonEncode(next.toJson());
} else {
html.window.localStorage.remove('selected_playlist');
}
});
});
/// Provider that watches for playlist changes and updates Xtream service
final activeXtreamServiceProvider = Provider<XtreamService>((ref) {
final service = ref.watch(_singletonXtreamServiceProvider);
final playlist = ref.watch(selectedPlaylistProvider);
// Ensure persistence listener is active
ref.read(playlistPersistenceProvider);
if (playlist != null) {
service.setPlaylist(playlist);
}
@@ -71,6 +71,7 @@ class _LitePlayerViewState extends ConsumerState<LitePlayerView> {
allowFullScreen: true,
allowMuting: true,
showControls: true,
useRootNavigator: true, // Crucial for escaping layout constraints
// Orientation settings are often ignored or cause issues on web
// but we keep them for native mobile if needed.
@@ -173,9 +174,13 @@ class _LitePlayerViewState extends ConsumerState<LitePlayerView> {
// Fullscreen Toggle
IconButton(
onPressed: () {
// For Web, ensure we use the built-in fullscreen transition
// which is more compatible with Safari/Chrome security
if (_chewieController?.isFullScreen == true) {
_chewieController?.exitFullScreen();
} else {
// On web, sometimes we need to toggle more than once
// to ensure the browser captures the intent
_chewieController?.enterFullScreen();
}
},