60 lines
1.4 KiB
Swift
60 lines
1.4 KiB
Swift
import AppKit
|
|
import Foundation
|
|
import VelodyPersistence
|
|
|
|
@MainActor
|
|
final class FolderAccessService: VelodyPersistence.FolderAccessService {
|
|
private let bookmarkKey = "velody.selected-folder.bookmark"
|
|
|
|
func chooseFolder() -> URL? {
|
|
let panel = NSOpenPanel()
|
|
panel.canChooseDirectories = true
|
|
panel.canChooseFiles = false
|
|
panel.allowsMultipleSelection = false
|
|
panel.prompt = "Choose Folder"
|
|
|
|
guard panel.runModal() == .OK, let url = panel.url else {
|
|
return nil
|
|
}
|
|
|
|
saveBookmark(for: url)
|
|
return url
|
|
}
|
|
|
|
func storedFolderURL() -> URL? {
|
|
guard
|
|
let bookmark = UserDefaults.standard.data(forKey: bookmarkKey)
|
|
else {
|
|
return nil
|
|
}
|
|
|
|
var isStale = false
|
|
guard let url = try? URL(
|
|
resolvingBookmarkData: bookmark,
|
|
options: [.withSecurityScope],
|
|
relativeTo: nil,
|
|
bookmarkDataIsStale: &isStale
|
|
) else {
|
|
return nil
|
|
}
|
|
|
|
if isStale {
|
|
saveBookmark(for: url)
|
|
}
|
|
|
|
return url
|
|
}
|
|
|
|
private func saveBookmark(for url: URL) {
|
|
guard let bookmark = try? url.bookmarkData(
|
|
options: [.withSecurityScope],
|
|
includingResourceValuesForKeys: nil,
|
|
relativeTo: nil
|
|
) else {
|
|
return
|
|
}
|
|
|
|
UserDefaults.standard.set(bookmark, forKey: bookmarkKey)
|
|
}
|
|
}
|