feat: add MobileMoviesTab for paginated movie display, search, and playback, introducing TvFocusable for enhanced navigation.

This commit is contained in:
Michael committed 2025-12-11 23:16:18 +01:00
1 parent 57ced00738
commit 426e763742
5 files changed
+161 -26

No files matched your search

@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:xtremflow/mobile/widgets/tv_focusable.dart';
import 'package:xtremflow/mobile/widgets/mobile_poster_card.dart';
import '../../../../core/models/playlist_config.dart';
import '../../../../core/theme/app_colors.dart';
import '../../../../core/widgets/components/hero_carousel.dart';
@@ -338,19 +339,15 @@ class _MobileMoviesTabState extends ConsumerState<MobileMoviesTab> with Automati
final movie = displayMovies[index];
final isWatched = watchHistory.isMovieWatched(movie.streamId);
return TVFocusable(
onPressed: () => _playMovie(context, movie),
child: MediaCard(
title: movie.name,
imageUrl: _getImageUrl(movie.streamIcon),
subtitle: movie.rating != null ? '${_formatRating(movie.rating)} ★' : null,
rating: _formatRating(movie.rating),
isWatched: isWatched,
onTap: () => _playMovie(context, movie),
onLongPress: () {
ref.read(mobileWatchHistoryProvider.notifier).toggleMovieWatched(movie.streamId);
},
),
return MobilePosterCard(
title: movie.name,
imageUrl: _getImageUrl(movie.streamIcon),
rating: _formatRating(movie.rating),
isWatched: isWatched,
onTap: () => _playMovie(context, movie),
onLongPress: () {
ref.read(mobileWatchHistoryProvider.notifier).toggleMovieWatched(movie.streamId);
},
);
},
childCount: displayMovies.length,
@@ -373,3 +370,5 @@ class _MobileMoviesTabState extends ConsumerState<MobileMoviesTab> with Automati
}
}
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:xtremflow/mobile/widgets/tv_focusable.dart';
import 'package:xtremflow/mobile/widgets/mobile_poster_card.dart';
import '../../../../core/models/playlist_config.dart';
import '../../../../core/theme/app_colors.dart';
import '../../../../core/widgets/components/hero_carousel.dart';
@@ -313,17 +314,12 @@ class _MobileSeriesTabState extends ConsumerState<MobileSeriesTab> with Automati
if (index >= displaySeries.length) return null;
final series = displaySeries[index];
return TVFocusable(
onPressed: () => _openSeries(series),
child: MediaCard(
title: series.name,
imageUrl: _getImageUrl(series.cover),
subtitle: series.rating != null ? '${_formatRating(series.rating)} ★' : null,
rating: _formatRating(series.rating),
placeholderIcon: Icons.tv,
onTap: () => _openSeries(series),
),
return MobilePosterCard(
title: series.name,
imageUrl: _getImageUrl(series.cover),
rating: _formatRating(series.rating),
placeholderIcon: Icons.tv,
onTap: () => _openSeries(series),
);
},
childCount: displaySeries.length,
@@ -96,7 +96,7 @@ class _MobileSettingsTabState extends ConsumerState<MobileSettingsTab> {
),
),
Text(
'Version 1.2.3',
'Version 1.2.4',
style: GoogleFonts.inter(
fontSize: 13,
color: AppColors.textSecondary,