diff --git a/lib/config/routes.dart b/lib/config/routes.dart index d9d60f0..690d62a 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -177,9 +177,9 @@ class _ScaffoldWithNav extends ConsumerWidget { label: 'Discover', ), BottomNavigationBarItem( - icon: Icon(Icons.download_outlined), - activeIcon: Icon(Icons.download), - label: 'Downloads', + icon: Icon(Icons.offline_pin_outlined), + activeIcon: Icon(Icons.offline_pin), + label: 'Offline', ), BottomNavigationBarItem( icon: Icon(Icons.settings_outlined), diff --git a/lib/providers/download_progress_provider.dart b/lib/providers/download_progress_provider.dart deleted file mode 100644 index 45990c2..0000000 --- a/lib/providers/download_progress_provider.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; - -/// Ephemeral map of video_id → download percentage (0.0–100.0). -/// Updated via WebSocket events, not persisted. -class DownloadProgressNotifier extends Notifier> { - @override - Map build() => {}; - - void updateProgress(String videoId, double pct) { - state = {...state, videoId: pct}; - } - - void removeProgress(String videoId) { - final current = Map.from(state); - current.remove(videoId); - state = current; - } -} - -final downloadProgressProvider = - NotifierProvider>( - DownloadProgressNotifier.new, - ); diff --git a/lib/providers/websocket_provider.dart b/lib/providers/websocket_provider.dart index 0f8a3aa..054c53e 100644 --- a/lib/providers/websocket_provider.dart +++ b/lib/providers/websocket_provider.dart @@ -6,7 +6,6 @@ import '../services/offline_service.dart'; import '../services/api_service.dart'; import 'auth_provider.dart'; import 'channel_provider.dart'; -import 'download_progress_provider.dart'; import 'feed_provider.dart'; import 'discover_provider.dart'; import 'offline_provider.dart'; @@ -43,18 +42,12 @@ final webSocketConnectionProvider = Provider((ref) { final subscription = wsService.events.listen((event) { switch (event.type) { case WebSocketEventType.downloadProgress: - final videoId = event.data['video_id'] as String?; - final pct = (event.data['percentage'] as num?)?.toDouble(); - if (videoId != null && pct != null) { - ref - .read(downloadProgressProvider.notifier) - .updateProgress(videoId, pct); - } + // Caching is invisible — download progress is no longer surfaced. + break; case WebSocketEventType.downloadComplete: final videoId = event.data['video_id'] as String?; final channelId = event.data['channel_id'] as String?; if (videoId != null) { - ref.read(downloadProgressProvider.notifier).removeProgress(videoId); ref.invalidate(videoDetailProvider(videoId)); } if (channelId != null) { diff --git a/lib/screens/channel_detail_screen.dart b/lib/screens/channel_detail_screen.dart index 156bed3..4a2ca33 100644 --- a/lib/screens/channel_detail_screen.dart +++ b/lib/screens/channel_detail_screen.dart @@ -1,14 +1,10 @@ -import 'dart:async'; - import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:cached_network_image/cached_network_image.dart'; import '../models/video.dart'; import '../providers/channel_provider.dart'; -import '../providers/download_progress_provider.dart'; import '../providers/feed_provider.dart'; -import '../providers/settings_provider.dart'; import '../services/api_service.dart'; import '../services/storage_service.dart'; import '../widgets/queue_action.dart'; @@ -26,9 +22,6 @@ class ChannelDetailScreen extends ConsumerStatefulWidget { } class _ChannelDetailScreenState extends ConsumerState { - Timer? _pollTimer; - final Set _pendingVideoIds = {}; - @override void initState() { super.initState(); @@ -62,52 +55,6 @@ class _ChannelDetailScreenState extends ConsumerState { } } - @override - void dispose() { - _pollTimer?.cancel(); - super.dispose(); - } - - void _startPolling() { - if (_pollTimer?.isActive ?? false) return; - _pollTimer = Timer.periodic(const Duration(seconds: 5), (_) { - ref.invalidate(channelVideosProvider(widget.channelId)); - }); - } - - void _stopPolling() { - _pollTimer?.cancel(); - _pollTimer = null; - } - - void _checkPollingNeeded(List