@@ -3,6 +3,29 @@ import 'dart:io';
33import 'package:path_provider/path_provider.dart' ;
44import '../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+
629class 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