Skip to content

Commit 54ffdd5

Browse files
committed
add favorites_screen and update
1 parent 3867717 commit 54ffdd5

File tree

2 files changed

+78
-34
lines changed

2 files changed

+78
-34
lines changed

lib/src/screens/favorites_screen.dart

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class FavoritesScreen extends StatefulWidget {
1717
}
1818

1919
class _FavoritesScreenState extends State<FavoritesScreen> {
20-
List<MediaItem> _favorites = [];
20+
List<MediaItemWithTimestamp> _favorites = [];
2121
bool _isLoading = true;
2222

2323
@override
@@ -26,18 +26,12 @@ class _FavoritesScreenState extends State<FavoritesScreen> {
2626
_loadFavorites();
2727
}
2828

29-
@override
30-
void didChangeDependencies() {
31-
super.didChangeDependencies();
32-
_loadFavorites();
33-
}
34-
3529
Future<void> _loadFavorites() async {
3630
setState(() {
3731
_isLoading = true;
3832
});
3933
try {
40-
final favorites = await StorageUtils.loadFavorites();
34+
final favorites = await StorageUtils.loadFavoritesWithTimestamp();
4135
setState(() {
4236
_favorites = favorites;
4337
_isLoading = false;
@@ -108,7 +102,7 @@ class _FavoritesScreenState extends State<FavoritesScreen> {
108102
Future<void> _exportFavorites() async {
109103
try {
110104
// Get favorites data
111-
final favorites = await StorageUtils.loadFavorites();
105+
final favorites = await StorageUtils.loadFavoritesWithTimestamp();
112106

113107
// Convert to JSON
114108
final jsonData = favorites.map((item) => item.toJson()).toList();
@@ -319,30 +313,33 @@ class _FavoritesScreenState extends State<FavoritesScreen> {
319313
: LayoutBuilder(
320314
builder: (context, constraints) {
321315
// Calculate cross axis count based on available width
322-
final cardWidth = 200.0;
316+
final cardWidth = 200.0; // Increased card width
323317
final spacing = 20.0;
324318
final crossAxisCount =
325319
((constraints.maxWidth + spacing) /
326320
(cardWidth + spacing))
327321
.floor()
328322
.toInt();
329323

324+
// Ensure at least 1 column and max 5 columns
330325
final count = crossAxisCount.clamp(1, 5);
331326

332327
return GridView.builder(
333-
gridDelegate:
334-
SliverGridDelegateWithFixedCrossAxisCount(
335-
crossAxisCount: count,
336-
childAspectRatio: 0.68,
337-
crossAxisSpacing: 20,
338-
mainAxisSpacing: 20,
339-
),
328+
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
329+
crossAxisCount:
330+
count, // Use dynamic count instead of fixed 5
331+
childAspectRatio:
332+
0.68, // Adjusted for the new card dimensions
333+
crossAxisSpacing: 20,
334+
mainAxisSpacing: 20,
335+
),
340336
itemCount: _favorites.length,
341337
itemBuilder: (context, index) {
342-
final mediaItem = _favorites[index];
338+
final mediaItem = _favorites[index].mediaItem;
343339
return MediaCard(
344340
mediaItem: mediaItem,
345-
showFavoriteButton: false,
341+
showFavoriteButton:
342+
false, // Don't show favorite button in favorites screen
346343
onTap: () async {
347344
// Navigate to the appropriate screen based on media type
348345
if (mediaItem.type == 'movie') {

lib/src/utils/storage_utils.dart

Lines changed: 62 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,29 @@ import 'dart:io';
33
import 'package:path_provider/path_provider.dart';
44
import '../models/media_item.dart';
55

6+
// Wrapper class to add timestamp to MediaItem for favorites
7+
class MediaItemWithTimestamp {
8+
final MediaItem mediaItem;
9+
final int timestamp;
10+
11+
MediaItemWithTimestamp(this.mediaItem, this.timestamp);
12+
13+
Map<String, dynamic> toJson() {
14+
final json = mediaItem.toJson();
15+
json['timestamp'] = timestamp;
16+
return json;
17+
}
18+
19+
static MediaItemWithTimestamp fromJson(Map<String, dynamic> json) {
20+
final timestamp = json['timestamp'] as int? ?? DateTime.now().millisecondsSinceEpoch;
21+
// Remove timestamp before creating MediaItem
22+
final jsonWithoutTimestamp = Map<String, dynamic>.from(json);
23+
jsonWithoutTimestamp.remove('timestamp');
24+
final mediaItem = MediaItem.fromJson(jsonWithoutTimestamp);
25+
return MediaItemWithTimestamp(mediaItem, timestamp);
26+
}
27+
}
28+
629
class StorageUtils {
730
static Future<String> get _localPath async {
831
final directory = await getApplicationDocumentsDirectory();
@@ -114,16 +137,23 @@ class StorageUtils {
114137
}
115138
}
116139

117-
// Add a media item to favorites
140+
// Add a media item to favorites with timestamp
118141
static Future<void> addToFavorites(MediaItem mediaItem) async {
119142
try {
120-
final favorites = await loadFavorites();
143+
final favorites = await loadFavoritesWithTimestamp();
121144
// Check if item already exists
122-
final existingIndex = favorites.indexWhere((item) => item.id == mediaItem.id && item.type == mediaItem.type);
123-
if (existingIndex == -1) {
124-
favorites.add(mediaItem);
145+
final existingIndex = favorites.indexWhere((item) => item.mediaItem.id == mediaItem.id && item.mediaItem.type == mediaItem.type);
146+
final timestamp = DateTime.now().millisecondsSinceEpoch;
147+
148+
if (existingIndex != -1) {
149+
// Update existing item's timestamp
150+
favorites.removeAt(existingIndex);
151+
favorites.insert(0, MediaItemWithTimestamp(mediaItem, timestamp));
152+
} else {
153+
// Add new item at the beginning (newest first)
154+
favorites.insert(0, MediaItemWithTimestamp(mediaItem, timestamp));
125155
}
126-
await _saveFavorites(favorites);
156+
await _saveFavoritesWithTimestamp(favorites);
127157
} catch (e) {
128158
print('Error adding to favorites: $e');
129159
}
@@ -132,22 +162,32 @@ class StorageUtils {
132162
// Remove a media item from favorites
133163
static Future<void> removeFromFavorites(int id, String type) async {
134164
try {
135-
final favorites = await loadFavorites();
136-
favorites.removeWhere((item) => item.id == id && item.type == type);
137-
await _saveFavorites(favorites);
165+
final favorites = await loadFavoritesWithTimestamp();
166+
favorites.removeWhere((item) => item.mediaItem.id == id && item.mediaItem.type == type);
167+
await _saveFavoritesWithTimestamp(favorites);
138168
} catch (e) {
139169
print('Error removing from favorites: $e');
140170
}
141171
}
142172

143-
// Load all favorites
144-
static Future<List<MediaItem>> loadFavorites() async {
173+
// Load all favorites with timestamps
174+
static Future<List<MediaItemWithTimestamp>> loadFavoritesWithTimestamp() async {
145175
try {
146176
final file = await _localFavoritesFile;
147177
if (await file.exists()) {
148178
final jsonString = await file.readAsString();
149179
final jsonArray = jsonDecode(jsonString) as List<dynamic>;
150-
return jsonArray.map((item) => MediaItem.fromJson(item as Map<String, dynamic>)).toList();
180+
final favorites = <MediaItemWithTimestamp>[];
181+
182+
for (final item in jsonArray) {
183+
final jsonMap = item as Map<String, dynamic>;
184+
final favoriteItem = MediaItemWithTimestamp.fromJson(jsonMap);
185+
favorites.add(favoriteItem);
186+
}
187+
188+
// Sort by timestamp descending (newest first)
189+
favorites.sort((a, b) => b.timestamp.compareTo(a.timestamp));
190+
return favorites;
151191
}
152192
return [];
153193
} catch (e) {
@@ -156,6 +196,12 @@ class StorageUtils {
156196
}
157197
}
158198

199+
// Load all favorites (backward compatibility)
200+
static Future<List<MediaItem>> loadFavorites() async {
201+
final favoritesWithTimestamp = await loadFavoritesWithTimestamp();
202+
return favoritesWithTimestamp.map((item) => item.mediaItem).toList();
203+
}
204+
159205
// Clear all favorites
160206
static Future<void> clearAllFavorites() async {
161207
try {
@@ -168,11 +214,12 @@ class StorageUtils {
168214
}
169215
}
170216

171-
// Save favorites to file
172-
static Future<void> _saveFavorites(List<MediaItem> favorites) async {
217+
// Save favorites to file with timestamps
218+
static Future<void> _saveFavoritesWithTimestamp(List<MediaItemWithTimestamp> favorites) async {
173219
try {
174220
final file = await _localFavoritesFile;
175-
final jsonString = jsonEncode(favorites.map((item) => item.toJson()).toList());
221+
final jsonArray = favorites.map((item) => item.toJson()).toList();
222+
final jsonString = jsonEncode(jsonArray);
176223
await file.writeAsString(jsonString);
177224
} catch (e) {
178225
print('Error saving favorites: $e');

0 commit comments

Comments
 (0)