diff --git a/ios/brave-ios/Sources/Data/models/PlaylistItem.swift b/ios/brave-ios/Sources/Data/models/PlaylistItem.swift index 850c16dc765b..229d88bd3603 100644 --- a/ios/brave-ios/Sources/Data/models/PlaylistItem.swift +++ b/ios/brave-ios/Sources/Data/models/PlaylistItem.swift @@ -6,6 +6,7 @@ import CoreData import Foundation import Shared +import SwiftUI import os.log @objc(PlaylistItem) @@ -164,7 +165,7 @@ final public class PlaylistItem: NSManagedObject, CRUD, Identifiable { context: context ) - PlaylistItem.reorderItems(context: context) + PlaylistItem.reorderItems(context: context, folderUUID: folderUUID) PlaylistItem.saveContext(context) DispatchQueue.main.async { @@ -200,7 +201,7 @@ final public class PlaylistItem: NSManagedObject, CRUD, Identifiable { playlistItem.playlistFolder = folder } - PlaylistItem.reorderItems(context: context) + PlaylistItem.reorderItems(context: context, folderUUID: folderUUID) PlaylistItem.saveContext(context) DispatchQueue.main.async { @@ -209,6 +210,31 @@ final public class PlaylistItem: NSManagedObject, CRUD, Identifiable { } } + public static func reorderItems( + in folder: PlaylistFolder, + fromOffsets indexSet: IndexSet, + toOffset offset: Int + ) { + let frc = PlaylistItem.frc(parentFolder: folder) + try? frc.performFetch() + guard var objects = frc.fetchedObjects else { + return + } + frc.managedObjectContext.perform { + objects.move(fromOffsets: indexSet, toOffset: offset) + + for (order, item) in objects.enumerated().reversed() { + item.order = Int32(order) + } + + do { + try frc.managedObjectContext.save() + } catch { + Logger.module.error("\(error.localizedDescription)") + } + } + } + public static func addInMemoryItems( _ items: [PlaylistInfo], folderUUID: String, @@ -235,7 +261,7 @@ final public class PlaylistItem: NSManagedObject, CRUD, Identifiable { playlistItem.playlistFolder = folder }) - PlaylistItem.reorderItems(context: context) + PlaylistItem.reorderItems(context: context, folderUUID: folderUUID) PlaylistItem.saveContext(context) DispatchQueue.main.async { @@ -269,7 +295,7 @@ final public class PlaylistItem: NSManagedObject, CRUD, Identifiable { playlistItem.playlistFolder = folder }) - PlaylistItem.reorderItems(context: context) + PlaylistItem.reorderItems(context: context, folderUUID: folderUUID) // Issue #6243 The policy change is added to prevent merge conflicts // Occasionally saving context will give error @@ -451,7 +477,7 @@ final public class PlaylistItem: NSManagedObject, CRUD, Identifiable { playlistItem.playlistFolder = folder } - PlaylistItem.reorderItems(context: context) + PlaylistItem.reorderItems(context: context, folderUUID: folderUUID) PlaylistItem.saveContext(context) DispatchQueue.main.async { @@ -532,12 +558,18 @@ final public class PlaylistItem: NSManagedObject, CRUD, Identifiable { } // MARK: - Internal - private static func reorderItems(context: NSManagedObjectContext) { + private static func reorderItems(context: NSManagedObjectContext, folderUUID: String?) { DataController.perform(context: .existing(context), save: true) { context in let request = NSFetchRequest() request.entity = PlaylistItem.entity(context) request.fetchBatchSize = 20 + if let folderUUID = folderUUID { + request.predicate = NSPredicate(format: "playlistFolder.uuid == %@", folderUUID) + } else { + request.predicate = NSPredicate(format: "playlistFolder == nil") + } + let orderSort = NSSortDescriptor(key: "order", ascending: true) let items = PlaylistItem.all(sortDescriptors: [orderSort], context: context) ?? [] diff --git a/ios/brave-ios/Sources/Playlist/PlaylistManager.swift b/ios/brave-ios/Sources/Playlist/PlaylistManager.swift index 0b7777f39b4d..a01d67d97ce2 100644 --- a/ios/brave-ios/Sources/Playlist/PlaylistManager.swift +++ b/ios/brave-ios/Sources/Playlist/PlaylistManager.swift @@ -187,30 +187,6 @@ public class PlaylistManager: NSObject { frc.fetchedObjects?.firstIndex(where: { $0.uuid == itemId }) } - public func reorderItems( - fromOffsets indexSet: IndexSet, - toOffset offset: Int - ) { - guard var objects = frc.fetchedObjects else { - return - } - frc.managedObjectContext.perform { [weak self] in - guard let self = self else { return } - - objects.move(fromOffsets: indexSet, toOffset: offset) - - for (order, item) in objects.enumerated().reversed() { - item.order = Int32(order) - } - - do { - try self.frc.managedObjectContext.save() - } catch { - Logger.module.error("\(error.localizedDescription)") - } - } - } - public func reorderItems( from sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath, diff --git a/ios/brave-ios/Sources/PlaylistUI/EditFolderView.swift b/ios/brave-ios/Sources/PlaylistUI/EditFolderView.swift index 455a428293ae..f5c64e8da342 100644 --- a/ios/brave-ios/Sources/PlaylistUI/EditFolderView.swift +++ b/ios/brave-ios/Sources/PlaylistUI/EditFolderView.swift @@ -57,7 +57,7 @@ struct EditFolderView: View { ) } .onMove { indexSet, offset in - PlaylistManager.shared.reorderItems(fromOffsets: indexSet, toOffset: offset) + PlaylistItem.reorderItems(in: folder, fromOffsets: indexSet, toOffset: offset) } .listRowBackground(Color.clear) .listRowSeparator(.hidden)