mirror of
https://github.com/R0m1k3/xtremflow.git
synced 2026-10-19 05:06:21 +02:00
feat: introduce mobile player screen and lite player view with channel zapping functionality
This commit is contained in:
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();
|
||||
}
|
||||
},
|
||||
|
||||
Reference in new issue
Block a user